From b43a0c2713171d62154098fe34d8afbfabc6f702 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 12:32:02 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .dockerignore | 5 + .eslintignore | 11 + .gitattributes | 2 + .github/FUNDING.yml | 13 + .github/ISSUE_TEMPLATE/----.md | 12 + .github/ISSUE_TEMPLATE/bug---.md | 14 + .gitignore | 24 + .husky/pre-commit | 4 + .npmrc | 1 + .prettierignore | 9 + .prettierrc | 12 + .stylelintrc.js | 110 + Dockerfile | 26 + LICENSE | 21 + README.md | 56 + README.wehub.md | 7 + build-output.sh | 82 + config/dev.yaml | 74 + config/docker-prod-sample.yaml | 75 + docker-compose.yml | 60 + docker/start.sh | 8 + dynamic.yaml | 12 + how-to-use-docker.md | 178 + let-us-start.md | 126 + nginx.conf.sample | 69 + package.json | 65 + packages/client/.eslintrc.js | 75 + packages/client/.gitignore | 42 + packages/client/README.md | 3 + packages/client/copy-diagram-resources.js | 85 + packages/client/dev-server.js | 12 + packages/client/global.d.ts | 6 + packages/client/next-env.d.ts | 5 + packages/client/next.config.js | 43 + packages/client/package.json | 133 + packages/client/prod-server.js | 12 + packages/client/public/diagram.min.js | 3 + .../client/public/diagram/ styles/default.xml | 203 + .../client/public/diagram/ styles/sprites.png | Bin 0 -> 10155 bytes .../client/public/diagram/images/button.gif | Bin 0 -> 137 bytes .../public/diagram/images/checkmark.gif | Bin 0 -> 1253 bytes .../client/public/diagram/images/clear.gif | Bin 0 -> 1114 bytes .../client/public/diagram/images/close.gif | Bin 0 -> 70 bytes .../client/public/diagram/images/close.png | Bin 0 -> 118 bytes .../public/diagram/images/collapsed.gif | Bin 0 -> 877 bytes .../client/public/diagram/images/dropdown.gif | Bin 0 -> 1110 bytes .../client/public/diagram/images/dropdown.png | Bin 0 -> 206 bytes .../client/public/diagram/images/edit.gif | Bin 0 -> 66 bytes .../client/public/diagram/images/error.gif | Bin 0 -> 907 bytes .../client/public/diagram/images/expanded.gif | Bin 0 -> 878 bytes .../client/public/diagram/images/grid.gif | Bin 0 -> 56 bytes .../public/diagram/images/handle-fixed.png | Bin 0 -> 1293 bytes .../public/diagram/images/handle-main.png | Bin 0 -> 379 bytes .../public/diagram/images/handle-rotate.png | Bin 0 -> 298 bytes .../diagram/images/handle-secondary.png | Bin 0 -> 1270 bytes .../public/diagram/images/handle-terminal.png | Bin 0 -> 1286 bytes .../client/public/diagram/images/help.png | Bin 0 -> 338 bytes .../client/public/diagram/images/locked.png | Bin 0 -> 1020 bytes .../client/public/diagram/images/logo.png | Bin 0 -> 8999 bytes .../client/public/diagram/images/maximize.gif | Bin 0 -> 843 bytes .../client/public/diagram/images/minimize.gif | Bin 0 -> 64 bytes .../client/public/diagram/images/move.png | Bin 0 -> 300 bytes .../client/public/diagram/images/nocolor.png | Bin 0 -> 948 bytes .../public/diagram/images/normalize.gif | Bin 0 -> 845 bytes .../client/public/diagram/images/point.gif | Bin 0 -> 55 bytes .../client/public/diagram/images/refresh.png | Bin 0 -> 522 bytes .../client/public/diagram/images/resize.gif | Bin 0 -> 74 bytes .../public/diagram/images/round-drop.png | Bin 0 -> 1216 bytes .../client/public/diagram/images/search.png | Bin 0 -> 404 bytes .../public/diagram/images/separator.gif | Bin 0 -> 146 bytes .../client/public/diagram/images/submenu.gif | Bin 0 -> 56 bytes .../public/diagram/images/transparent.gif | Bin 0 -> 90 bytes .../public/diagram/images/triangle-down.png | Bin 0 -> 1104 bytes .../public/diagram/images/triangle-left.png | Bin 0 -> 1123 bytes .../public/diagram/images/triangle-right.png | Bin 0 -> 1103 bytes .../public/diagram/images/triangle-up.png | Bin 0 -> 1086 bytes .../client/public/diagram/images/unlocked.png | Bin 0 -> 1024 bytes .../client/public/diagram/images/warning.gif | Bin 0 -> 276 bytes .../client/public/diagram/images/warning.png | Bin 0 -> 425 bytes .../public/diagram/images/window-title.gif | Bin 0 -> 275 bytes .../client/public/diagram/images/window.gif | Bin 0 -> 75 bytes .../public/diagram/resources/editor.txt | 5 + .../client/public/diagram/resources/graph.txt | 1200 + .../client/public/diagram/stencils/arrows.xml | 849 + .../public/diagram/stencils/atlassian.xml | 713 + .../client/public/diagram/stencils/basic.xml | 1028 + .../client/public/diagram/stencils/bpmn.xml | 1162 + .../client/public/diagram/stencils/citrix.xml | 19709 +++ .../stencils/clipart/Credit_Card_128x128.png | Bin 0 -> 15493 bytes .../stencils/clipart/Database_128x128.png | Bin 0 -> 10455 bytes .../stencils/clipart/Doctor1_128x128.png | Bin 0 -> 9441 bytes .../stencils/clipart/Earth_globe_128x128.png | Bin 0 -> 14646 bytes .../stencils/clipart/Email_128x128.png | Bin 0 -> 7410 bytes .../stencils/clipart/Empty_Folder_128x128.png | Bin 0 -> 8093 bytes .../stencils/clipart/Firewall_02_128x128.png | Bin 0 -> 8428 bytes .../stencils/clipart/Full_Folder_128x128.png | Bin 0 -> 9568 bytes .../diagram/stencils/clipart/Gear_128x128.png | Bin 0 -> 9193 bytes .../stencils/clipart/Graph_128x128.png | Bin 0 -> 8045 bytes .../stencils/clipart/Laptop_128x128.png | Bin 0 -> 12593 bytes .../diagram/stencils/clipart/Lock_128x128.png | Bin 0 -> 13233 bytes .../stencils/clipart/MacBook_128x128.png | Bin 0 -> 12713 bytes .../clipart/Monitor_Tower_128x128.png | Bin 0 -> 10301 bytes .../stencils/clipart/Piggy_Bank_128x128.png | Bin 0 -> 12780 bytes .../stencils/clipart/Pilot1_128x128.png | Bin 0 -> 10147 bytes .../stencils/clipart/Printer_128x128.png | Bin 0 -> 12104 bytes .../stencils/clipart/Router_Icon_128x128.png | Bin 0 -> 5670 bytes .../diagram/stencils/clipart/Safe_128x128.png | Bin 0 -> 8876 bytes .../stencils/clipart/Security1_128x128.png | Bin 0 -> 10400 bytes .../stencils/clipart/Server_Tower_128x128.png | Bin 0 -> 13352 bytes .../clipart/Shopping_Cart_128x128.png | Bin 0 -> 13803 bytes .../stencils/clipart/Software_128x128.png | Bin 0 -> 11020 bytes .../stencils/clipart/Soldier1_128x128.png | Bin 0 -> 13540 bytes .../stencils/clipart/Suit1_128x128.png | Bin 0 -> 9128 bytes .../stencils/clipart/Suit2_128x128.png | Bin 0 -> 8925 bytes .../stencils/clipart/Suit3_128x128.png | Bin 0 -> 8326 bytes .../stencils/clipart/Tech1_128x128.png | Bin 0 -> 7146 bytes .../stencils/clipart/Telesales1_128x128.png | Bin 0 -> 8257 bytes .../clipart/Virtual_Machine_128x128.png | Bin 0 -> 16557 bytes .../stencils/clipart/Virus_128x128.png | Bin 0 -> 11358 bytes .../clipart/Wireless_Router_N_128x128.png | Bin 0 -> 7468 bytes .../stencils/clipart/Worker1_128x128.png | Bin 0 -> 9519 bytes .../stencils/clipart/Workstation_128x128.png | Bin 0 -> 13635 bytes .../diagram/stencils/clipart/iMac_128x128.png | Bin 0 -> 13149 bytes .../diagram/stencils/clipart/iPad_128x128.png | Bin 0 -> 11727 bytes .../public/diagram/stencils/flowchart.xml | 920 + .../client/public/diagram/styles/default.xml | 203 + .../client/public/diagram/styles/sprites.png | Bin 0 -> 10155 bytes packages/client/public/favicon.ico | Bin 0 -> 15406 bytes packages/client/public/icon120.png | Bin 0 -> 3235 bytes packages/client/public/icon128.png | Bin 0 -> 2627 bytes packages/client/public/icon144.png | Bin 0 -> 4314 bytes packages/client/public/icon152.png | Bin 0 -> 4580 bytes packages/client/public/icon180.png | Bin 0 -> 6001 bytes packages/client/public/icon192.png | Bin 0 -> 6600 bytes packages/client/public/icon384.png | Bin 0 -> 16046 bytes packages/client/public/icon512.png | Bin 0 -> 29400 bytes packages/client/public/icon72.png | Bin 0 -> 1472 bytes packages/client/public/icon96.png | Bin 0 -> 2243 bytes packages/client/public/maskable.png | Bin 0 -> 7280 bytes packages/client/pwa-cache.js | 143 + .../admin/system-config/ad/index.tsx | 141 + .../components/admin/system-config/index.tsx | 36 + .../admin/system-config/mail/index.tsx | 92 + .../admin/system-config/system/index.tsx | 74 + packages/client/src/components/author.tsx | 26 + .../client/src/components/banner/index.tsx | 34 + .../src/components/color-picker/index.tsx | 151 + .../components/color-picker/style.module.scss | 73 + .../src/components/data-render/constant.tsx | 47 + .../src/components/data-render/index.tsx | 44 + .../src/components/data-render/loading.tsx | 34 + packages/client/src/components/divider.tsx | 20 + .../src/components/document-creator/index.tsx | 35 + .../document/actions/index.module.scss | 8 + .../src/components/document/actions/index.tsx | 229 + .../document/card/index.module.scss | 39 + .../src/components/document/card/index.tsx | 126 + .../document/collaboration/index.tsx | 160 + .../document/comments/comments/index.tsx | 57 + .../comments/comments/item/index.module.scss | 25 + .../document/comments/comments/item/index.tsx | 92 + .../document/comments/index.module.scss | 43 + .../components/document/comments/index.tsx | 200 + .../document/create/index.module.scss | 3 + .../src/components/document/create/index.tsx | 111 + .../src/components/document/delete/index.tsx | 67 + .../src/components/document/editor/editor.tsx | 53 + .../document/editor/index.module.scss | 33 + .../src/components/document/editor/index.tsx | 150 + .../document/export/index.module.scss | 16 + .../src/components/document/export/index.tsx | 186 + .../src/components/document/export/pdf.ts | 56 + .../document/fullscreen/index.module.scss | 143 + .../components/document/fullscreen/index.tsx | 156 + .../src/components/document/link/index.tsx | 41 + .../src/components/document/reader/author.tsx | 45 + .../document/reader/index.module.scss | 32 + .../src/components/document/reader/index.tsx | 172 + .../document/reader/public/index.module.scss | 33 + .../document/reader/public/index.tsx | 257 + .../src/components/document/share/index.tsx | 169 + .../src/components/document/star/index.tsx | 67 + .../document/style/index.module.scss | 17 + .../src/components/document/style/index.tsx | 63 + .../document/version/index.module.scss | 126 + .../src/components/document/version/index.tsx | 217 + .../src/components/emoji-picker/constants.ts | 562 + .../src/components/emoji-picker/emoji.json | 4792 + .../components/emoji-picker/index.module.scss | 19 + .../src/components/emoji-picker/index.tsx | 148 + packages/client/src/components/empty.tsx | 28 + .../src/components/grid-select/grid-cell.tsx | 61 + .../components/grid-select/grid-select.tsx | 122 + .../src/components/grid-select/index.tsx | 1 + .../components/icons/IconAddColumnAfter.tsx | 14 + .../components/icons/IconAddColumnBefore.tsx | 14 + .../src/components/icons/IconAddRowAfter.tsx | 17 + .../src/components/icons/IconAddRowBefore.tsx | 17 + .../src/components/icons/IconAttachment.tsx | 18 + .../src/components/icons/IconCallout.tsx | 14 + .../src/components/icons/IconCenter.tsx | 18 + .../client/src/components/icons/IconClear.tsx | 17 + .../src/components/icons/IconCodeBlock.tsx | 21 + .../src/components/icons/IconColumns.tsx | 43 + .../src/components/icons/IconCountdown.tsx | 16 + .../src/components/icons/IconDeleteColumn.tsx | 14 + .../src/components/icons/IconDeleteRow.tsx | 14 + .../src/components/icons/IconDeleteTable.tsx | 14 + .../src/components/icons/IconDocument.tsx | 21 + .../src/components/icons/IconDocumentFill.tsx | 20 + .../src/components/icons/IconDrawBoard.tsx | 32 + .../client/src/components/icons/IconEmoji.tsx | 18 + .../client/src/components/icons/IconFlow.tsx | 17 + .../client/src/components/icons/IconFont.tsx | 18 + .../client/src/components/icons/IconFull.tsx | 17 + .../src/components/icons/IconFullscreen.tsx | 18 + .../client/src/components/icons/IconGlobe.tsx | 27 + .../client/src/components/icons/IconHalf.tsx | 17 + .../src/components/icons/IconHeading1.tsx | 14 + .../src/components/icons/IconHeading2.tsx | 14 + .../src/components/icons/IconHeading3.tsx | 14 + .../components/icons/IconHorizontalRule.tsx | 16 + .../client/src/components/icons/IconImage.tsx | 31 + .../client/src/components/icons/IconInfo.tsx | 20 + .../client/src/components/icons/IconJSON.tsx | 43 + .../src/components/icons/IconLayout.tsx | 20 + .../client/src/components/icons/IconLeft.tsx | 18 + .../src/components/icons/IconLineHeight.tsx | 17 + .../client/src/components/icons/IconLink.tsx | 18 + .../client/src/components/icons/IconList.tsx | 21 + .../src/components/icons/IconMarkdown.tsx | 30 + .../client/src/components/icons/IconMath.tsx | 18 + .../src/components/icons/IconMergeCell.tsx | 14 + .../src/components/icons/IconMessage.tsx | 20 + .../client/src/components/icons/IconMind.tsx | 18 + .../src/components/icons/IconMindCenter.tsx | 21 + .../src/components/icons/IconMindFull.tsx | 17 + .../src/components/icons/IconMindLeft.tsx | 17 + .../src/components/icons/IconMindRight.tsx | 17 + .../src/components/icons/IconMindSide.tsx | 14 + .../src/components/icons/IconOrderedList.tsx | 16 + .../src/components/icons/IconOverview.tsx | 20 + .../client/src/components/icons/IconPDF.tsx | 51 + .../client/src/components/icons/IconPPT.tsx | 15 + .../src/components/icons/IconPencil.tsx | 26 + .../client/src/components/icons/IconQuote.tsx | 31 + .../client/src/components/icons/IconRight.tsx | 18 + .../src/components/icons/IconSearch.tsx | 19 + .../components/icons/IconSearchReplace.tsx | 21 + .../src/components/icons/IconSetting.tsx | 20 + .../client/src/components/icons/IconShare.tsx | 23 + .../client/src/components/icons/IconSheet.tsx | 15 + .../src/components/icons/IconSplitCell.tsx | 14 + .../src/components/icons/IconStatus.tsx | 20 + .../src/components/icons/IconStructure.tsx | 14 + .../client/src/components/icons/IconSub.tsx | 22 + .../client/src/components/icons/IconSup.tsx | 22 + .../client/src/components/icons/IconTable.tsx | 21 + .../components/icons/IconTableHeaderCell.tsx | 17 + .../icons/IconTableHeaderColumn.tsx | 14 + .../components/icons/IconTableHeaderRow.tsx | 15 + .../components/icons/IconTableOfContents.tsx | 17 + .../client/src/components/icons/IconTask.tsx | 25 + .../client/src/components/icons/IconWord.tsx | 51 + .../src/components/icons/IconZoomIn.tsx | 15 + .../src/components/icons/IconZoomOut.tsx | 15 + .../client/src/components/icons/index.tsx | 70 + .../image-uploader/index.module.scss | 29 + .../src/components/image-uploader/index.tsx | 160 + .../client/src/components/image-viewer.tsx | 32 + .../src/components/locale-time/index.tsx | 45 + .../src/components/logo/index.module.scss | 16 + packages/client/src/components/logo/index.tsx | 51 + .../client/src/components/members/add.tsx | 62 + .../client/src/components/members/edit.tsx | 49 + .../src/components/members/index.module.scss | 6 + .../client/src/components/members/index.tsx | 117 + .../src/components/message/index.module.scss | 54 + .../client/src/components/message/index.tsx | 247 + .../src/components/message/placeholder.tsx | 16 + .../components/organization/delete/index.tsx | 52 + .../components/organization/index.module.scss | 16 + .../src/components/organization/index.tsx | 67 + .../public-switcher/index.module.scss | 4 + .../organization/public-switcher/index.tsx | 24 + .../setting/base/index.module.scss | 9 + .../organization/setting/base/index.tsx | 119 + .../components/organization/setting/index.tsx | 44 + .../organization/setting/members/index.tsx | 14 + .../organization/setting/more/index.tsx | 24 + .../organization/switcher/index.module.scss | 4 + .../organization/switcher/index.tsx | 163 + .../src/components/resizeable/index.tsx | 1 + .../src/components/resizeable/resizeable.tsx | 173 + .../components/resizeable/style.module.scss | 63 + .../src/components/search/index.module.scss | 40 + .../client/src/components/search/index.tsx | 198 + packages/client/src/components/seo.tsx | 27 + .../client/src/components/size-setter.tsx | 48 + .../template/card/index.module.scss | 64 + .../src/components/template/card/index.tsx | 196 + .../template/editor/index.module.scss | 26 + .../src/components/template/editor/index.tsx | 101 + .../src/components/template/list/index.tsx | 99 + .../src/components/template/reader/index.tsx | 37 + .../client/src/components/theme/index.tsx | 49 + .../client/src/components/tooltip/index.tsx | 34 + .../client/src/components/upload/index.tsx | 47 + packages/client/src/components/user/index.tsx | 84 + .../components/user/reset-password/index.tsx | 122 + .../src/components/user/setting/index.tsx | 142 + .../src/components/wiki-creator/index.tsx | 21 + .../wiki-or-document-creator/index.tsx | 55 + .../components/wiki/card/index.module.scss | 39 + .../client/src/components/wiki/card/index.tsx | 111 + .../src/components/wiki/create/index.tsx | 61 + .../src/components/wiki/delete/index.tsx | 52 + .../wiki/documents-share/index.module.scss | 58 + .../components/wiki/documents-share/index.tsx | 107 + .../wiki/pin-card/index.module.scss | 39 + .../src/components/wiki/pin-card/index.tsx | 82 + .../src/components/wiki/placeholder/index.tsx | 22 + .../wiki/setting/base/index.module.scss | 15 + .../components/wiki/setting/base/index.tsx | 109 + .../components/wiki/setting/import/index.tsx | 121 + .../components/wiki/setting/import/parser.tsx | 58 + .../src/components/wiki/setting/index.tsx | 67 + .../components/wiki/setting/more/index.tsx | 28 + .../wiki/setting/privacy/index.module.scss | 64 + .../components/wiki/setting/privacy/index.tsx | 163 + .../components/wiki/setting/users/index.tsx | 18 + .../client/src/components/wiki/star/index.tsx | 43 + .../components/wiki/tocs/index.module.scss | 174 + .../client/src/components/wiki/tocs/index.tsx | 316 + .../wiki/tocs/manager/index.module.scss | 14 + .../components/wiki/tocs/manager/index.tsx | 143 + .../src/components/wiki/tocs/nav-item.tsx | 58 + .../src/components/wiki/tocs/public.tsx | 136 + .../client/src/components/wiki/tocs/tree.tsx | 160 + .../client/src/components/wiki/tocs/utils.tsx | 35 + packages/client/src/data/ad.ts | 42 + packages/client/src/data/comment.ts | 96 + packages/client/src/data/document.ts | 362 + packages/client/src/data/message.ts | 89 + packages/client/src/data/organization.ts | 204 + packages/client/src/data/star.ts | 229 + packages/client/src/data/template.ts | 150 + packages/client/src/data/user.ts | 194 + packages/client/src/data/wiki.ts | 473 + packages/client/src/event/index.ts | 68 + packages/client/src/helpers/chunk.ts | 10 + packages/client/src/helpers/clamp.ts | 9 + packages/client/src/helpers/color.ts | 66 + .../client/src/helpers/copy-to-clipboard.js | 69 + packages/client/src/helpers/copy.ts | 7 + packages/client/src/helpers/env.ts | 23 + packages/client/src/helpers/event-emitter.ts | 41 + packages/client/src/helpers/generate-html.ts | 13 + packages/client/src/helpers/json.ts | 17 + packages/client/src/helpers/lru-cache.ts | 143 + packages/client/src/helpers/pick.ts | 3 + packages/client/src/helpers/storage.ts | 15 + packages/client/src/helpers/throttle.ts | 35 + packages/client/src/helpers/tree.ts | 18 + packages/client/src/helpers/url.ts | 16 + packages/client/src/helpers/validator.ts | 7 + .../client/src/hooks/create-global-hook.tsx | 33 + .../client/src/hooks/use-async-loading.tsx | 36 + .../client/src/hooks/use-click-outside.tsx | 20 + packages/client/src/hooks/use-cursor.tsx | 107 + .../client/src/hooks/use-document-style.tsx | 57 + .../client/src/hooks/use-document-version.tsx | 16 + .../client/src/hooks/use-dragable-width.tsx | 80 + packages/client/src/hooks/use-interval.tsx | 34 + .../hooks/use-isomorphic-layout-effect.tsx | 3 + packages/client/src/hooks/use-mount.tsx | 15 + packages/client/src/hooks/use-network.tsx | 35 + packages/client/src/hooks/use-on-mobile.tsx | 29 + .../client/src/hooks/use-router-query.tsx | 7 + .../client/src/hooks/use-runtime-config.tsx | 21 + packages/client/src/hooks/use-theme.tsx | 96 + packages/client/src/hooks/use-toggle.tsx | 15 + packages/client/src/hooks/use-window-size.tsx | 29 + .../src/illustrations/create-document.tsx | 158 + .../client/src/illustrations/create-wiki.tsx | 305 + .../client/src/illustrations/empty-box.tsx | 272 + packages/client/src/illustrations/empty.tsx | 158 + .../client/src/illustrations/forbidden.tsx | 225 + .../src/illustrations/secure-document.tsx | 188 + packages/client/src/illustrations/share.tsx | 130 + .../client/src/illustrations/team-work.tsx | 229 + .../app-double-column/index.module.scss | 46 + .../src/layouts/app-double-column/index.tsx | 54 + .../app-router-header/index.module.scss | 42 + .../src/layouts/app-router-header/index.tsx | 147 + .../layouts/app-router-header/placeholder.tsx | 16 + .../src/layouts/app-router-header/recent.tsx | 140 + .../src/layouts/app-router-header/wiki.tsx | 205 + .../app-single-column/index.module.scss | 11 + .../src/layouts/app-single-column/index.tsx | 27 + .../layouts/double-column/index.module.scss | 46 + .../src/layouts/double-column/index.tsx | 54 + .../public-double-column/index.module.scss | 37 + .../layouts/public-double-column/index.tsx | 49 + .../layouts/router-header/index.module.scss | 42 + .../src/layouts/router-header/index.tsx | 104 + .../layouts/single-column/index.module.scss | 11 + .../src/layouts/single-column/index.tsx | 27 + packages/client/src/pages/_app.tsx | 119 + .../client/src/pages/admin/index.module.scss | 12 + packages/client/src/pages/admin/index.tsx | 58 + packages/client/src/pages/api/config.ts | 7 + packages/client/src/pages/app/index.tsx | 109 + .../org/[organizationId]/index.module.scss | 12 + .../pages/app/org/[organizationId]/index.tsx | 203 + .../org/[organizationId]/setting/index.tsx | 53 + .../[organizationId]/star/index.module.scss | 12 + .../app/org/[organizationId]/star/index.tsx | 145 + .../[wikiId]/doc/[documentId]/edit/index.tsx | 31 + .../wiki/[wikiId]/doc/[documentId]/index.tsx | 43 + .../wiki/[wikiId]/index.module.scss | 41 + .../[organizationId]/wiki/[wikiId]/index.tsx | 64 + .../wiki/[wikiId]/setting/index.tsx | 62 + .../[organizationId]/wiki/index.module.scss | 12 + .../app/org/[organizationId]/wiki/index.tsx | 100 + .../pages/app/org/create/index.module.scss | 9 + .../client/src/pages/app/org/create/index.tsx | 124 + .../client/src/pages/feature/csrf/index.tsx | 22 + .../client/src/pages/feature/editor/index.tsx | 31 + packages/client/src/pages/find/index.tsx | 86 + .../pages/forgetPassword/index.module.scss | 35 + .../client/src/pages/forgetPassword/index.tsx | 69 + packages/client/src/pages/index.module.scss | 26 + packages/client/src/pages/index.tsx | 66 + .../client/src/pages/login/index.module.scss | 35 + packages/client/src/pages/login/index.tsx | 106 + .../src/pages/register/index.module.scss | 36 + packages/client/src/pages/register/index.tsx | 186 + .../document/[documentId]/index.module.scss | 31 + .../share/document/[documentId]/index.tsx | 31 + .../document/[documentId]/index.module.scss | 31 + .../[wikiId]/document/[documentId]/index.tsx | 45 + .../src/pages/share/wiki/[wikiId]/index.tsx | 58 + .../src/pages/template/[templateId]/index.tsx | 27 + .../src/pages/template/index.module.scss | 13 + packages/client/src/pages/template/index.tsx | 60 + packages/client/src/services/file.ts | 214 + packages/client/src/services/http-client.ts | 80 + .../client/src/services/server-prefetcher.ts | 33 + packages/client/src/services/spark-md5.js | 31 + packages/client/src/services/user.ts | 24 + packages/client/src/styles/globals.scss | 147 + packages/client/src/styles/reset.scss | 101 + packages/client/src/styles/var.scss | 5 + .../src/thirtypart/array-prototype-at.js | 8 + .../client/src/thirtypart/diagram/README.md | 5 + .../client/src/thirtypart/diagram/diagram.js | 136783 +++++++++++++++ .../client/src/thirtypart/diagram/index.js | 64 + .../src/thirtypart/kityminder/README.md | 3 + .../thirtypart/kityminder/hotbox/expose.js | 4 + .../thirtypart/kityminder/hotbox/hotbox.js | 647 + .../src/thirtypart/kityminder/hotbox/key.js | 62 + .../kityminder/hotbox/keycontrol.js | 70 + .../thirtypart/kityminder/hotbox/keymap.js | 82 + .../client/src/thirtypart/kityminder/index.ts | 49 + .../kityminder/kity-core/connect/arc.js | 50 + .../kityminder/kity-core/connect/arc_tp.js | 81 + .../kityminder/kity-core/connect/bezier.js | 42 + .../kity-core/connect/fish-bone-master.js | 33 + .../kityminder/kity-core/connect/l.js | 34 + .../kityminder/kity-core/connect/poly.js | 62 + .../kityminder/kity-core/connect/under.js | 49 + .../kityminder/kity-core/core/_boxv.js | 34 + .../kityminder/kity-core/core/animate.js | 44 + .../kityminder/kity-core/core/command.js | 176 + .../kity-core/core/compatibility.js | 97 + .../kityminder/kity-core/core/connect.js | 122 + .../kityminder/kity-core/core/data.js | 366 + .../kityminder/kity-core/core/event.js | 267 + .../kityminder/kity-core/core/focus.js | 48 + .../kityminder/kity-core/core/keymap.js | 129 + .../kityminder/kity-core/core/keyreceiver.js | 84 + .../kityminder/kity-core/core/kity.js | 12 + .../kityminder/kity-core/core/layout.js | 529 + .../kityminder/kity-core/core/minder.js | 41 + .../kityminder/kity-core/core/module.js | 150 + .../kityminder/kity-core/core/node.js | 404 + .../kityminder/kity-core/core/option.js | 35 + .../kityminder/kity-core/core/paper.js | 75 + .../kityminder/kity-core/core/patch.js | 109 + .../kityminder/kity-core/core/promise.js | 207 + .../kityminder/kity-core/core/readonly.js | 63 + .../kityminder/kity-core/core/render.js | 255 + .../kityminder/kity-core/core/select.js | 146 + .../kityminder/kity-core/core/shortcut.js | 156 + .../kityminder/kity-core/core/status.js | 59 + .../kityminder/kity-core/core/template.js | 102 + .../kityminder/kity-core/core/theme.js | 171 + .../kityminder/kity-core/core/utils.js | 68 + .../kityminder/kity-core/expose-kityminder.js | 4 + .../kityminder/kity-core/kityminder.js | 107 + .../kityminder/kity-core/layout/btree.js | 145 + .../kityminder/kity-core/layout/filetree.js | 90 + .../kity-core/layout/fish-bone-master.js | 68 + .../kity-core/layout/fish-bone-slave.js | 76 + .../kityminder/kity-core/layout/mind.js | 66 + .../kityminder/kity-core/layout/tianpan.js | 80 + .../kityminder/kity-core/module/arrange.js | 166 + .../kityminder/kity-core/module/basestyle.js | 123 + .../kityminder/kity-core/module/clipboard.js | 172 + .../kityminder/kity-core/module/dragtree.js | 403 + .../kityminder/kity-core/module/expand.js | 301 + .../kityminder/kity-core/module/font.js | 158 + .../kityminder/kity-core/module/hyperlink.js | 127 + .../kity-core/module/image-viewer.js | 113 + .../kityminder/kity-core/module/image.js | 144 + .../kityminder/kity-core/module/keynav.js | 171 + .../kityminder/kity-core/module/layout.js | 95 + .../kityminder/kity-core/module/node.js | 150 + .../kityminder/kity-core/module/note.js | 114 + .../kityminder/kity-core/module/outline.js | 154 + .../kityminder/kity-core/module/priority.js | 161 + .../kityminder/kity-core/module/progress.js | 150 + .../kityminder/kity-core/module/resource.js | 404 + .../kityminder/kity-core/module/select.js | 185 + .../kityminder/kity-core/module/style.js | 114 + .../kityminder/kity-core/module/text.js | 285 + .../kityminder/kity-core/module/view.js | 405 + .../kityminder/kity-core/module/zoom.js | 201 + .../kityminder/kity-core/protocol/json.js | 22 + .../kityminder/kity-core/protocol/markdown.js | 168 + .../kityminder/kity-core/protocol/png.js | 290 + .../kityminder/kity-core/protocol/svg.js | 260 + .../kityminder/kity-core/protocol/text.js | 243 + .../kityminder/kity-core/template/default.js | 37 + .../kityminder/kity-core/template/filetree.js | 28 + .../kity-core/template/fish-bone.js | 43 + .../kityminder/kity-core/template/right.js | 23 + .../kity-core/template/structure.js | 22 + .../kityminder/kity-core/template/tianpan.js | 30 + .../kityminder/kity-core/theme/default.js | 68 + .../kityminder/kity-core/theme/fish.js | 59 + .../kityminder/kity-core/theme/fresh.js | 78 + .../kityminder/kity-core/theme/snow.js | 64 + .../kityminder/kity-core/theme/tianpan.js | 71 + .../kityminder/kity-core/theme/wire.js | 35 + .../kityminder/kity-editor/editor.js | 39 + .../kityminder/kity-editor/expose-editor.js | 12 + .../kityminder/kity-editor/hotbox.js | 6 + .../thirtypart/kityminder/kity-editor/lang.js | 2 + .../kityminder/kity-editor/minder.js | 4 + .../kityminder/kity-editor/tool/debug.js | 52 + .../kityminder/kity-editor/tool/format.js | 12 + .../kityminder/kity-editor/tool/innertext.js | 55 + .../kityminder/kity-editor/tool/jsondiff.js | 89 + .../kityminder/kity-editor/tool/key.js | 72 + .../kityminder/kity-editor/tool/keymap.js | 82 + packages/client/src/tiptap/core/all-kit.ts | 129 + .../core/bubble-menu/bubble-menu-plugin.tsx | 302 + .../src/tiptap/core/bubble-menu/index.tsx | 52 + packages/client/src/tiptap/core/constants.ts | 6 + .../src/tiptap/core/extensions/attachment.ts | 85 + .../core/extensions/background-color.ts | 63 + .../src/tiptap/core/extensions/blockquote.ts | 31 + .../client/src/tiptap/core/extensions/bold.ts | 1 + .../src/tiptap/core/extensions/bullet-list.ts | 17 + .../src/tiptap/core/extensions/callout.ts | 84 + .../src/tiptap/core/extensions/clipboard.ts | 106 + .../src/tiptap/core/extensions/code-block.ts | 202 + .../client/src/tiptap/core/extensions/code.ts | 22 + .../cursor-plugin/index.ts | 193 + .../extensions/collaboration-cursor/index.ts | 196 + .../extensions/collaboration/collaboration.ts | 117 + .../collaboration/helpers/is-change-origin.ts | 7 + .../core/extensions/collaboration/index.ts | 2 + .../core/extensions/color-highlighter.ts | 28 + .../src/tiptap/core/extensions/color.ts | 3 + .../src/tiptap/core/extensions/column.ts | 36 + .../src/tiptap/core/extensions/columns.ts | 111 + .../src/tiptap/core/extensions/countdown.ts | 93 + .../core/extensions/document-children.ts | 69 + .../core/extensions/document-reference.ts | 90 + .../src/tiptap/core/extensions/document.ts | 1 + .../src/tiptap/core/extensions/dragable.ts | 396 + .../src/tiptap/core/extensions/dropcursor.ts | 1 + .../src/tiptap/core/extensions/emoji.ts | 152 + .../tiptap/core/extensions/event-emitter.ts | 20 + .../src/tiptap/core/extensions/excalidraw.ts | 115 + .../client/src/tiptap/core/extensions/flow.ts | 120 + .../src/tiptap/core/extensions/focus.ts | 91 + .../src/tiptap/core/extensions/font-family.ts | 59 + .../src/tiptap/core/extensions/font-size.ts | 63 + .../src/tiptap/core/extensions/gapcursor.ts | 1 + .../src/tiptap/core/extensions/hard-break.ts | 3 + .../src/tiptap/core/extensions/heading.ts | 111 + .../tiptap/core/extensions/horizontal-rule.ts | 77 + .../src/tiptap/core/extensions/html-marks.ts | 55 + .../src/tiptap/core/extensions/iframe.ts | 114 + .../src/tiptap/core/extensions/image.ts | 79 + .../src/tiptap/core/extensions/indent.ts | 161 + .../src/tiptap/core/extensions/italic.ts | 1 + .../src/tiptap/core/extensions/katex.ts | 94 + .../src/tiptap/core/extensions/line-height.ts | 58 + .../client/src/tiptap/core/extensions/link.ts | 63 + .../src/tiptap/core/extensions/listItem.ts | 1 + .../src/tiptap/core/extensions/loading.ts | 41 + .../src/tiptap/core/extensions/mention.ts | 82 + .../client/src/tiptap/core/extensions/mind.ts | 131 + .../tiptap/core/extensions/ordered-list.ts | 14 + .../src/tiptap/core/extensions/paragraph.ts | 62 + .../src/tiptap/core/extensions/paste.ts | 249 + .../src/tiptap/core/extensions/placeholder.ts | 116 + .../core/extensions/scroll-to-cursor.ts | 128 + .../src/tiptap/core/extensions/search.ts | 373 + .../src/tiptap/core/extensions/selection.ts | 152 + .../src/tiptap/core/extensions/slash.ts | 144 + .../src/tiptap/core/extensions/status.ts | 94 + .../src/tiptap/core/extensions/strike.ts | 1 + .../src/tiptap/core/extensions/subscript.ts | 3 + .../src/tiptap/core/extensions/superscript.ts | 3 + .../src/tiptap/core/extensions/table-cell.tsx | 178 + .../tiptap/core/extensions/table-header.tsx | 139 + .../core/extensions/table-of-contents.ts | 83 + .../src/tiptap/core/extensions/table-row.ts | 5 + .../src/tiptap/core/extensions/table.ts | 152 + .../src/tiptap/core/extensions/task-item.ts | 178 + .../src/tiptap/core/extensions/task-list.ts | 36 + .../src/tiptap/core/extensions/text-align.ts | 5 + .../src/tiptap/core/extensions/text-style.ts | 3 + .../client/src/tiptap/core/extensions/text.ts | 1 + .../src/tiptap/core/extensions/title.ts | 192 + .../tiptap/core/extensions/trailing-node.ts | 76 + .../src/tiptap/core/extensions/underline.ts | 3 + .../src/tiptap/core/hooks/use-active.tsx | 26 + .../src/tiptap/core/hooks/use-attributes.tsx | 45 + packages/client/src/tiptap/core/index.tsx | 82 + .../client/src/tiptap/core/menus/_event.ts | 53 + .../src/tiptap/core/menus/align/index.tsx | 66 + .../tiptap/core/menus/attachment/bubble.tsx | 38 + .../tiptap/core/menus/attachment/index.tsx | 13 + .../core/menus/background-color/index.tsx | 55 + .../tiptap/core/menus/blockquote/index.tsx | 30 + .../src/tiptap/core/menus/bold/index.tsx | 30 + .../tiptap/core/menus/bullet-list/index.tsx | 30 + .../core/menus/callout/bubble.module.scss | 24 + .../src/tiptap/core/menus/callout/bubble.tsx | 130 + .../src/tiptap/core/menus/callout/index.tsx | 13 + .../core/menus/clear-node-and-marks/index.tsx | 21 + .../tiptap/core/menus/code-block/bubble.tsx | 54 + .../tiptap/core/menus/code-block/index.tsx | 13 + .../src/tiptap/core/menus/code/index.tsx | 30 + .../src/tiptap/core/menus/columns/bubble.tsx | 71 + .../src/tiptap/core/menus/columns/index.tsx | 13 + .../client/src/tiptap/core/menus/commands.tsx | 271 + .../tiptap/core/menus/countdown/bubble.tsx | 51 + .../src/tiptap/core/menus/countdown/index.tsx | 15 + .../src/tiptap/core/menus/countdown/modal.tsx | 54 + .../tiptap/core/menus/countdown/service.ts | 11 + .../core/menus/document-children/bubble.tsx | 39 + .../core/menus/document-children/index.tsx | 13 + .../core/menus/document-reference/bubble.tsx | 124 + .../core/menus/document-reference/index.tsx | 13 + .../src/tiptap/core/menus/emoji/index.tsx | 30 + .../tiptap/core/menus/excalidraw/bubble.tsx | 85 + .../tiptap/core/menus/excalidraw/index.tsx | 15 + .../tiptap/core/menus/excalidraw/modal.tsx | 111 + .../src/tiptap/core/menus/flow/bubble.tsx | 80 + .../src/tiptap/core/menus/flow/index.tsx | 15 + .../src/tiptap/core/menus/flow/modal.tsx | 86 + .../tiptap/core/menus/fontfamily/index.tsx | 50 + .../src/tiptap/core/menus/fontsize/index.tsx | 43 + .../src/tiptap/core/menus/heading/index.tsx | 70 + .../core/menus/horizontal-rule/index.tsx | 28 + .../src/tiptap/core/menus/ident/index.tsx | 46 + .../src/tiptap/core/menus/iframe/bubble.tsx | 145 + .../src/tiptap/core/menus/iframe/index.tsx | 13 + .../src/tiptap/core/menus/image/bubble.tsx | 127 + .../src/tiptap/core/menus/image/index.tsx | 13 + .../src/tiptap/core/menus/insert/index.tsx | 93 + .../src/tiptap/core/menus/italic/index.tsx | 30 + .../src/tiptap/core/menus/katex/bubble.tsx | 107 + .../src/tiptap/core/menus/katex/index.tsx | 13 + .../tiptap/core/menus/lineheight/index.tsx | 51 + .../src/tiptap/core/menus/link/bubble.tsx | 105 + .../src/tiptap/core/menus/link/index.tsx | 38 + .../src/tiptap/core/menus/link/modal.tsx | 74 + .../src/tiptap/core/menus/link/service.ts | 22 + .../src/tiptap/core/menus/mind/bubble.tsx | 89 + .../src/tiptap/core/menus/mind/constant.ts | 146 + .../src/tiptap/core/menus/mind/index.tsx | 15 + .../src/tiptap/core/menus/mind/modal.tsx | 120 + .../tiptap/core/menus/mind/style.module.scss | 13 + .../core/menus/mind/toolbar/bgcolor.tsx | 40 + .../core/menus/mind/toolbar/font-color.tsx | 40 + .../tiptap/core/menus/mind/toolbar/help.tsx | 33 + .../tiptap/core/menus/mind/toolbar/image.tsx | 58 + .../core/menus/mind/toolbar/index.module.scss | 46 + .../tiptap/core/menus/mind/toolbar/index.tsx | 316 + .../tiptap/core/menus/mind/toolbar/link.tsx | 51 + .../core/menus/mind/toolbar/priority.tsx | 29 + .../core/menus/mind/toolbar/progress.tsx | 29 + .../core/menus/mind/toolbar/template.tsx | 43 + .../tiptap/core/menus/mind/toolbar/theme.tsx | 44 + .../tiptap/core/menus/ordered-list/index.tsx | 30 + .../src/tiptap/core/menus/redo/index.tsx | 18 + .../src/tiptap/core/menus/search/index.tsx | 157 + .../src/tiptap/core/menus/strike/index.tsx | 30 + .../src/tiptap/core/menus/subscript/index.tsx | 29 + .../tiptap/core/menus/superscript/index.tsx | 29 + .../src/tiptap/core/menus/table/bubble.tsx | 165 + .../tiptap/core/menus/table/col-bubble.tsx | 73 + .../src/tiptap/core/menus/table/index.tsx | 17 + .../tiptap/core/menus/table/row-bubble.tsx | 62 + .../src/tiptap/core/menus/task-list/index.tsx | 30 + .../tiptap/core/menus/text-color/index.tsx | 58 + .../src/tiptap/core/menus/text/index.tsx | 91 + .../src/tiptap/core/menus/underline/index.tsx | 30 + .../src/tiptap/core/menus/undo/index.tsx | 18 + .../client/src/tiptap/core/styles/base.scss | 130 + .../client/src/tiptap/core/styles/code.scss | 281 + .../src/tiptap/core/styles/collaboration.scss | 24 + .../client/src/tiptap/core/styles/color.scss | 16 + .../src/tiptap/core/styles/columns.scss | 21 + .../client/src/tiptap/core/styles/drag.scss | 31 + .../client/src/tiptap/core/styles/flow.scss | 1997 + .../src/tiptap/core/styles/heading.scss | 40 + .../client/src/tiptap/core/styles/index.scss | 21 + .../client/src/tiptap/core/styles/katex.scss | 1165 + .../src/tiptap/core/styles/kityminder.scss | 2137 + .../client/src/tiptap/core/styles/list.scss | 111 + .../client/src/tiptap/core/styles/lock.scss | 23 + .../src/tiptap/core/styles/mention.scss | 7 + .../client/src/tiptap/core/styles/menu.scss | 25 + .../client/src/tiptap/core/styles/node.scss | 96 + .../src/tiptap/core/styles/placeholder.scss | 19 + .../client/src/tiptap/core/styles/search.scss | 9 + .../src/tiptap/core/styles/selection.scss | 137 + .../client/src/tiptap/core/styles/table.scss | 296 + .../client/src/tiptap/core/styles/title.scss | 41 + .../client/src/tiptap/core/styles/var.scss | 22 + .../src/tiptap/core/thritypart/y-indexeddb.js | 189 + .../core/thritypart/y-prosemirror/lib.js | 317 + .../y-prosemirror/plugins/awareness.js | 308 + .../y-prosemirror/plugins/cursor-plugin.js | 184 + .../thritypart/y-prosemirror/plugins/keys.js | 22 + .../y-prosemirror/plugins/sync-plugin.js | 919 + .../y-prosemirror/plugins/undo-plugin.js | 100 + .../thritypart/y-prosemirror/y-prosemirror.js | 13 + .../core/wrappers/attachment/file-icon.tsx | 40 + .../wrappers/attachment/index.module.scss | 27 + .../tiptap/core/wrappers/attachment/index.tsx | 163 + .../attachment/player/index.module.scss | 21 + .../core/wrappers/attachment/player/index.tsx | 60 + .../player/pdf-player/index.module.scss | 16 + .../attachment/player/pdf-player/index.tsx | 20 + .../core/wrappers/callout/index.module.scss | 53 + .../tiptap/core/wrappers/callout/index.tsx | 53 + .../wrappers/code-block/index.module.scss | 21 + .../tiptap/core/wrappers/code-block/index.tsx | 52 + .../core/wrappers/countdown/index.module.scss | 12 + .../tiptap/core/wrappers/countdown/index.tsx | 45 + .../document-children/index.module.scss | 37 + .../core/wrappers/document-children/index.tsx | 85 + .../document-reference/index.module.scss | 31 + .../wrappers/document-reference/index.tsx | 59 + .../tiptap/core/wrappers/emoji-list/emojis.ts | 1858 + .../wrappers/emoji-list/index.module.scss | 38 + .../tiptap/core/wrappers/emoji-list/index.tsx | 87 + .../wrappers/excalidraw/index.module.scss | 45 + .../tiptap/core/wrappers/excalidraw/index.tsx | 177 + .../core/wrappers/flow/index.module.scss | 56 + .../src/tiptap/core/wrappers/flow/index.tsx | 158 + .../core/wrappers/iframe/index.module.scss | 40 + .../src/tiptap/core/wrappers/iframe/index.tsx | 44 + .../core/wrappers/image/index.module.scss | 23 + .../src/tiptap/core/wrappers/image/index.tsx | 148 + .../core/wrappers/katex/index.module.scss | 8 + .../src/tiptap/core/wrappers/katex/index.tsx | 48 + .../src/tiptap/core/wrappers/loading.tsx | 27 + .../wrappers/mention-list/index.module.scss | 38 + .../core/wrappers/mention-list/index.tsx | 88 + .../core/wrappers/menu-list/index.module.scss | 38 + .../tiptap/core/wrappers/menu-list/index.tsx | 102 + .../core/wrappers/mind/index.module.scss | 45 + .../src/tiptap/core/wrappers/mind/index.tsx | 189 + .../core/wrappers/status/index.module.scss | 6 + .../src/tiptap/core/wrappers/status/index.tsx | 134 + .../table-of-contents/index.module.scss | 50 + .../core/wrappers/table-of-contents/index.tsx | 100 + .../core/wrappers/task-item/index.module.scss | 5 + .../tiptap/core/wrappers/task-item/index.tsx | 16 + .../core/wrappers/title/index.module.scss | 38 + .../src/tiptap/core/wrappers/title/index.tsx | 105 + .../collaboration/collaboration/editor.tsx | 228 + .../collaboration/index.module.scss | 76 + .../collaboration/collaboration/index.tsx | 150 + .../collaboration/collaboration/menubar.tsx | 131 + .../collaboration/collaboration/type.ts | 59 + .../src/tiptap/editor/collaboration/index.tsx | 3 + .../src/tiptap/editor/collaboration/kit.ts | 196 + .../client/src/tiptap/editor/comment/index.ts | 2 + .../client/src/tiptap/editor/comment/kit.ts | 108 + .../src/tiptap/editor/comment/menubar.tsx | 49 + packages/client/src/tiptap/editor/index.tsx | 3 + .../tiptap/editor/reader/index.module.scss | 33 + .../client/src/tiptap/editor/reader/index.tsx | 57 + .../src/tiptap/editor/tocs/index.module.scss | 9 + .../client/src/tiptap/editor/tocs/index.tsx | 182 + .../client/src/tiptap/editor/tocs/util.ts | 38 + packages/client/src/tiptap/fix-match-nodes.ts | 6 + packages/client/src/tiptap/image-load.js | 374 + .../markdown/html-to-prosemirror/index.ts | 18 + .../html-to-prosemirror/index.ts | 110 + .../html-to-prosemirror/marks/bold.ts | 13 + .../html-to-prosemirror/marks/code.ts | 17 + .../html-to-prosemirror/marks/italic.ts | 12 + .../html-to-prosemirror/marks/link.ts | 15 + .../html-to-prosemirror/marks/mark.ts | 21 + .../html-to-prosemirror/marks/subscript.ts | 13 + .../html-to-prosemirror/marks/superscript.ts | 13 + .../html-to-prosemirror/marks/underline.ts | 13 + .../html-to-prosemirror/nodes/attachment.ts | 9 + .../html-to-prosemirror/nodes/blockquote.ts | 9 + .../html-to-prosemirror/nodes/bullet-list.ts | 9 + .../html-to-prosemirror/nodes/callout.ts | 9 + .../nodes/code-block-wrapper.ts | 11 + .../html-to-prosemirror/nodes/code-block.ts | 9 + .../html-to-prosemirror/nodes/countdown.ts | 9 + .../nodes/document-children.ts | 9 + .../nodes/document-reference.ts | 9 + .../html-to-prosemirror/nodes/excalidraw.ts | 9 + .../html-to-prosemirror/nodes/flow.ts | 9 + .../html-to-prosemirror/nodes/hard-break.ts | 9 + .../html-to-prosemirror/nodes/heading.ts | 22 + .../nodes/horizontal-rule.ts | 9 + .../html-to-prosemirror/nodes/iframe.ts | 9 + .../html-to-prosemirror/nodes/image.ts | 21 + .../html-to-prosemirror/nodes/katex.ts | 9 + .../html-to-prosemirror/nodes/list-item.ts | 16 + .../html-to-prosemirror/nodes/mention.ts | 9 + .../html-to-prosemirror/nodes/mind.ts | 9 + .../html-to-prosemirror/nodes/node.ts | 27 + .../html-to-prosemirror/nodes/ordered-list.ts | 9 + .../html-to-prosemirror/nodes/paragraph.ts | 8 + .../html-to-prosemirror/nodes/status.ts | 9 + .../html-to-prosemirror/nodes/table-cell.ts | 9 + .../html-to-prosemirror/nodes/table-header.ts | 9 + .../nodes/table-of-contents.ts | 9 + .../html-to-prosemirror/nodes/table-row.ts | 9 + .../html-to-prosemirror/nodes/table.ts | 9 + .../nodes/task-list-item.ts | 9 + .../html-to-prosemirror/nodes/task-list.ts | 9 + .../html-to-prosemirror/nodes/text.ts | 20 + .../html-to-prosemirror/nodes/title.ts | 9 + .../html-to-prosemirror/renderer.ts | 221 + .../html-to-prosemirror/utils.ts | 62 + .../markdown-to-prosemirror/index.tsx | 41 + .../markdown-to-html/index.ts | 57 + .../markdown-to-html/markdownCallout.ts | 27 + .../markdown-to-html/markdownItContainer.ts | 38 + .../markdown-to-html/markdownKatex.ts | 226 + .../markdown-to-html/markdownTable.ts | 285 + .../markdown-to-html/markdownTaskList.ts | 175 + .../markdown-to-html/markdownUnderline.ts | 22 + .../markedownSplitMixedList.ts | 64 + .../prosemirror-to-markdown/helpers.ts | 362 + .../markdown/prosemirror-to-markdown/index.ts | 183 + packages/client/src/tiptap/preload.ts | 13 + .../client/src/tiptap/prose-utils/active.ts | 19 + .../client/src/tiptap/prose-utils/clamp.ts | 1 + .../client/src/tiptap/prose-utils/code.ts | 23 + .../client/src/tiptap/prose-utils/color.ts | 28 + .../client/src/tiptap/prose-utils/columns.ts | 142 + .../src/tiptap/prose-utils/copy-node.ts | 67 + .../src/tiptap/prose-utils/create-node.ts | 237 + .../client/src/tiptap/prose-utils/debug.ts | 7 + .../src/tiptap/prose-utils/delete-node.ts | 45 + .../client/src/tiptap/prose-utils/document.ts | 19 + .../src/tiptap/prose-utils/dom-dataset.ts | 121 + packages/client/src/tiptap/prose-utils/dom.ts | 31 + .../client/src/tiptap/prose-utils/download.ts | 6 + .../prose-utils/editor-container-size.ts | 28 + .../client/src/tiptap/prose-utils/file.ts | 91 + .../client/src/tiptap/prose-utils/html.ts | 42 + .../client/src/tiptap/prose-utils/index.ts | 30 + .../src/tiptap/prose-utils/lowlight-plugin.ts | 140 + .../client/src/tiptap/prose-utils/mark.ts | 36 + .../tiptap/prose-utils/markdown-source-map.ts | 42 + .../client/src/tiptap/prose-utils/markdown.ts | 50 + .../client/src/tiptap/prose-utils/mention.ts | 22 + .../client/src/tiptap/prose-utils/node.ts | 91 + .../client/src/tiptap/prose-utils/position.ts | 68 + .../tiptap/prose-utils/select-node-by-dom.ts | 166 + .../client/src/tiptap/prose-utils/table.ts | 283 + .../client/src/tiptap/prose-utils/text.ts | 16 + .../client/src/tiptap/prose-utils/type.ts | 13 + .../client/src/tiptap/prose-utils/upload.ts | 132 + packages/client/src/tiptap/prose-utils/url.ts | 12 + .../client/src/tiptap/prose-utils/uuid.ts | 15 + packages/client/tsconfig.json | 36 + packages/config/.gitignore | 39 + packages/config/README.md | 3 + packages/config/lib/index.d.ts | 2 + packages/config/lib/index.js | 32 + packages/config/lib/index.js.map | 1 + packages/config/package.json | 28 + packages/config/src/index.ts | 37 + packages/constants/lib/index.d.ts | 9 + packages/constants/lib/index.js | 23 + packages/constants/lib/index.js.map | 1 + packages/constants/package.json | 24 + packages/constants/src/index.ts | 24 + packages/domains/lib/api/ad.d.ts | 23 + packages/domains/lib/api/ad.js | 26 + packages/domains/lib/api/comment.d.ts | 35 + packages/domains/lib/api/comment.js | 37 + packages/domains/lib/api/document.d.ts | 131 + packages/domains/lib/api/document.js | 133 + packages/domains/lib/api/file.d.ts | 59 + packages/domains/lib/api/file.js | 62 + packages/domains/lib/api/index.d.ts | 11 + packages/domains/lib/api/index.js | 27 + packages/domains/lib/api/message.d.ts | 35 + packages/domains/lib/api/message.js | 37 + packages/domains/lib/api/organization.d.ts | 83 + packages/domains/lib/api/organization.js | 85 + packages/domains/lib/api/star.d.ts | 42 + packages/domains/lib/api/star.js | 45 + packages/domains/lib/api/system.d.ts | 7 + packages/domains/lib/api/system.js | 10 + packages/domains/lib/api/template.d.ts | 51 + packages/domains/lib/api/template.js | 53 + packages/domains/lib/api/user.d.ts | 90 + packages/domains/lib/api/user.js | 93 + packages/domains/lib/api/wiki.d.ts | 163 + packages/domains/lib/api/wiki.js | 165 + packages/domains/lib/index.d.ts | 3 + packages/domains/lib/index.js | 19 + packages/domains/lib/models/ad.d.ts | 10 + packages/domains/lib/models/ad.js | 8 + packages/domains/lib/models/auth.d.ts | 26 + packages/domains/lib/models/auth.js | 21 + packages/domains/lib/models/comment.d.ts | 19 + packages/domains/lib/models/comment.js | 2 + packages/domains/lib/models/document.d.ts | 42 + packages/domains/lib/models/document.js | 11 + packages/domains/lib/models/index.d.ts | 11 + packages/domains/lib/models/index.js | 27 + packages/domains/lib/models/message.d.ts | 24 + packages/domains/lib/models/message.js | 25 + packages/domains/lib/models/organization.d.ts | 12 + packages/domains/lib/models/organization.js | 2 + packages/domains/lib/models/pagination.d.ts | 4 + packages/domains/lib/models/pagination.js | 2 + packages/domains/lib/models/system.d.ts | 8 + packages/domains/lib/models/system.js | 2 + packages/domains/lib/models/template.d.ts | 16 + packages/domains/lib/models/template.js | 2 + packages/domains/lib/models/user.d.ts | 25 + packages/domains/lib/models/user.js | 11 + packages/domains/lib/models/wiki.d.ts | 26 + packages/domains/lib/models/wiki.js | 11 + packages/domains/lib/util.d.ts | 40 + packages/domains/lib/util.js | 66 + packages/domains/package.json | 24 + packages/domains/src/api/ad.ts | 25 + packages/domains/src/api/comment.ts | 39 + packages/domains/src/api/document.ts | 147 + packages/domains/src/api/file.ts | 66 + packages/domains/src/api/index.ts | 11 + packages/domains/src/api/message.ts | 39 + packages/domains/src/api/organization.ts | 93 + packages/domains/src/api/star.ts | 46 + packages/domains/src/api/system.ts | 7 + packages/domains/src/api/template.ts | 57 + packages/domains/src/api/user.ts | 100 + packages/domains/src/api/wiki.ts | 183 + packages/domains/src/index.ts | 3 + packages/domains/src/models/ad.ts | 11 + packages/domains/src/models/auth.ts | 30 + packages/domains/src/models/comment.ts | 20 + packages/domains/src/models/document.ts | 45 + packages/domains/src/models/index.ts | 11 + packages/domains/src/models/message.ts | 44 + packages/domains/src/models/organization.ts | 13 + packages/domains/src/models/pagination.ts | 4 + packages/domains/src/models/system.ts | 8 + packages/domains/src/models/template.ts | 17 + packages/domains/src/models/user.ts | 27 + packages/domains/src/models/wiki.ts | 28 + packages/domains/src/util.ts | 66 + packages/server/.eslintrc.js | 40 + packages/server/.gitignore | 38 + packages/server/README.md | 3 + packages/server/nest-cli.json | 4 + packages/server/package.json | 117 + packages/server/src/app-cluster.service.ts | 30 + packages/server/src/app.module.ts | 127 + packages/server/src/constants/index.ts | 6 + .../server/src/controllers/ad.controller.ts | 48 + .../server/src/controllers/auth.controller.ts | 8 + .../src/controllers/comment.controller.ts | 74 + .../src/controllers/document.controller.ts | 257 + .../server/src/controllers/file.controller.ts | 94 + .../src/controllers/message.controller.ts | 67 + .../controllers/organization.controller.ts | 170 + .../server/src/controllers/star.controller.ts | 80 + .../src/controllers/system.controller.ts | 17 + .../src/controllers/template.controller.ts | 92 + .../server/src/controllers/user.controller.ts | 148 + .../src/controllers/verify.controller.ts | 25 + .../server/src/controllers/view.controller.ts | 8 + .../server/src/controllers/wiki.controller.ts | 302 + packages/server/src/dtos/ad.dto.ts | 17 + packages/server/src/dtos/auth.dto.ts | 29 + packages/server/src/dtos/comment.dto.ts | 23 + .../server/src/dtos/create-document.dto.ts | 27 + packages/server/src/dtos/create-user.dto.ts | 51 + packages/server/src/dtos/create-wiki.dto.ts | 19 + packages/server/src/dtos/login-user.dto.ts | 13 + packages/server/src/dtos/organization.dto.ts | 21 + .../server/src/dtos/share-document.dto.ts | 7 + packages/server/src/dtos/share-wiki.dto.ts | 17 + packages/server/src/dtos/star.dto.ts | 13 + packages/server/src/dtos/template.dto.ts | 18 + .../server/src/dtos/update-document.dto.ts | 15 + packages/server/src/dtos/update-user.dto.ts | 17 + packages/server/src/dtos/update-wiki.dto.ts | 20 + packages/server/src/entities/ad.entity.ts | 37 + packages/server/src/entities/auth.entity.ts | 58 + .../server/src/entities/comment.entity.ts | 42 + .../server/src/entities/document.entity.ts | 72 + .../server/src/entities/message.entity.ts | 36 + .../src/entities/organization.entity.ts | 57 + packages/server/src/entities/star.entity.ts | 33 + packages/server/src/entities/system.entity.ts | 61 + .../server/src/entities/template.entity.ts | 45 + packages/server/src/entities/user.entity.ts | 62 + packages/server/src/entities/wiki.entity.ts | 60 + .../src/exceptions/http-response.exception.ts | 21 + .../server/src/guard/document-auth.guard.ts | 61 + .../server/src/guard/document-status.guard.ts | 46 + packages/server/src/guard/jwt.guard.ts | 18 + packages/server/src/guard/user.guard.ts | 17 + .../server/src/guard/wiki-status.guard.ts | 37 + packages/server/src/guard/wiki-user.guard.ts | 51 + .../server/src/helpers/date.helper.spec.ts | 8 + packages/server/src/helpers/date.helper.ts | 11 + packages/server/src/helpers/env.helper.ts | 1 + .../src/helpers/file.helper/aliyun.client.ts | 166 + .../server/src/helpers/file.helper/index.ts | 15 + .../src/helpers/file.helper/local.client.ts | 172 + .../src/helpers/file.helper/oss.client.ts | 99 + .../src/helpers/file.helper/s3.client.ts | 306 + .../src/helpers/file.helper/tencent.client.ts | 303 + packages/server/src/helpers/log.helper.ts | 7 + packages/server/src/helpers/redis.helper.ts | 33 + .../server/src/helpers/shortid.herlper.ts | 43 + packages/server/src/helpers/tree.helper.ts | 26 + packages/server/src/helpers/ua.helper.ts | 36 + .../server/src/helpers/uniqueid.helper.ts | 5 + packages/server/src/main.ts | 64 + packages/server/src/modules/ad.module.ts | 16 + packages/server/src/modules/auth.module.ts | 16 + packages/server/src/modules/comment.module.ts | 26 + .../server/src/modules/document.module.ts | 32 + packages/server/src/modules/file.module.ts | 12 + packages/server/src/modules/message.module.ts | 15 + .../server/src/modules/organization.module.ts | 24 + packages/server/src/modules/star.module.ts | 26 + packages/server/src/modules/system.module.ts | 14 + .../server/src/modules/template.module.ts | 24 + packages/server/src/modules/user.module.ts | 79 + packages/server/src/modules/verify.module.ts | 13 + packages/server/src/modules/view.module.ts | 11 + packages/server/src/modules/wiki.module.ts | 30 + packages/server/src/pipes/validation.pipe.ts | 26 + packages/server/src/services/ad.service.ts | 47 + packages/server/src/services/auth.service.ts | 516 + .../src/services/collaboration.service.ts | 299 + .../server/src/services/comment.service.ts | 252 + .../src/services/document-version.service.ts | 123 + .../server/src/services/document.service.ts | 783 + packages/server/src/services/file.service.ts | 67 + .../server/src/services/message.service.ts | 114 + .../src/services/organization.service.ts | 304 + packages/server/src/services/star.service.ts | 162 + .../server/src/services/system.service.ts | 127 + .../server/src/services/template.service.ts | 172 + packages/server/src/services/user.service.ts | 363 + .../server/src/services/verify.service.ts | 72 + packages/server/src/services/view.service.ts | 171 + packages/server/src/services/wiki.service.ts | 704 + .../src/transforms/http-response.transform.ts | 31 + packages/server/test/app.e2e-spec.ts | 23 + packages/server/test/jest-e2e.json | 9 + packages/server/tsconfig.build.json | 4 + packages/server/tsconfig.json | 32 + pnpm-lock.yaml | 16660 ++ pnpm-workspace.yaml | 2 + scripts/README.md | 89 + scripts/deploy.sh | 12 + 1102 files changed, 261576 insertions(+) create mode 100644 .dockerignore create mode 100644 .eslintignore create mode 100644 .gitattributes create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/----.md create mode 100644 .github/ISSUE_TEMPLATE/bug---.md create mode 100644 .gitignore create mode 100755 .husky/pre-commit create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .stylelintrc.js create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.wehub.md create mode 100755 build-output.sh create mode 100644 config/dev.yaml create mode 100644 config/docker-prod-sample.yaml create mode 100644 docker-compose.yml create mode 100644 docker/start.sh create mode 100644 dynamic.yaml create mode 100644 how-to-use-docker.md create mode 100644 let-us-start.md create mode 100644 nginx.conf.sample create mode 100644 package.json create mode 100644 packages/client/.eslintrc.js create mode 100644 packages/client/.gitignore create mode 100644 packages/client/README.md create mode 100755 packages/client/copy-diagram-resources.js create mode 100755 packages/client/dev-server.js create mode 100644 packages/client/global.d.ts create mode 100644 packages/client/next-env.d.ts create mode 100644 packages/client/next.config.js create mode 100644 packages/client/package.json create mode 100755 packages/client/prod-server.js create mode 100644 packages/client/public/diagram.min.js create mode 100644 packages/client/public/diagram/ styles/default.xml create mode 100644 packages/client/public/diagram/ styles/sprites.png create mode 100644 packages/client/public/diagram/images/button.gif create mode 100644 packages/client/public/diagram/images/checkmark.gif create mode 100644 packages/client/public/diagram/images/clear.gif create mode 100644 packages/client/public/diagram/images/close.gif create mode 100644 packages/client/public/diagram/images/close.png create mode 100644 packages/client/public/diagram/images/collapsed.gif create mode 100644 packages/client/public/diagram/images/dropdown.gif create mode 100644 packages/client/public/diagram/images/dropdown.png create mode 100644 packages/client/public/diagram/images/edit.gif create mode 100644 packages/client/public/diagram/images/error.gif create mode 100644 packages/client/public/diagram/images/expanded.gif create mode 100644 packages/client/public/diagram/images/grid.gif create mode 100644 packages/client/public/diagram/images/handle-fixed.png create mode 100644 packages/client/public/diagram/images/handle-main.png create mode 100644 packages/client/public/diagram/images/handle-rotate.png create mode 100644 packages/client/public/diagram/images/handle-secondary.png create mode 100644 packages/client/public/diagram/images/handle-terminal.png create mode 100644 packages/client/public/diagram/images/help.png create mode 100644 packages/client/public/diagram/images/locked.png create mode 100644 packages/client/public/diagram/images/logo.png create mode 100644 packages/client/public/diagram/images/maximize.gif create mode 100644 packages/client/public/diagram/images/minimize.gif create mode 100644 packages/client/public/diagram/images/move.png create mode 100644 packages/client/public/diagram/images/nocolor.png create mode 100644 packages/client/public/diagram/images/normalize.gif create mode 100644 packages/client/public/diagram/images/point.gif create mode 100644 packages/client/public/diagram/images/refresh.png create mode 100644 packages/client/public/diagram/images/resize.gif create mode 100644 packages/client/public/diagram/images/round-drop.png create mode 100644 packages/client/public/diagram/images/search.png create mode 100644 packages/client/public/diagram/images/separator.gif create mode 100644 packages/client/public/diagram/images/submenu.gif create mode 100644 packages/client/public/diagram/images/transparent.gif create mode 100644 packages/client/public/diagram/images/triangle-down.png create mode 100644 packages/client/public/diagram/images/triangle-left.png create mode 100644 packages/client/public/diagram/images/triangle-right.png create mode 100644 packages/client/public/diagram/images/triangle-up.png create mode 100644 packages/client/public/diagram/images/unlocked.png create mode 100644 packages/client/public/diagram/images/warning.gif create mode 100644 packages/client/public/diagram/images/warning.png create mode 100644 packages/client/public/diagram/images/window-title.gif create mode 100644 packages/client/public/diagram/images/window.gif create mode 100644 packages/client/public/diagram/resources/editor.txt create mode 100644 packages/client/public/diagram/resources/graph.txt create mode 100644 packages/client/public/diagram/stencils/arrows.xml create mode 100644 packages/client/public/diagram/stencils/atlassian.xml create mode 100644 packages/client/public/diagram/stencils/basic.xml create mode 100644 packages/client/public/diagram/stencils/bpmn.xml create mode 100644 packages/client/public/diagram/stencils/citrix.xml create mode 100644 packages/client/public/diagram/stencils/clipart/Credit_Card_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Database_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Doctor1_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Earth_globe_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Email_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Empty_Folder_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Firewall_02_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Full_Folder_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Gear_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Graph_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Laptop_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Lock_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/MacBook_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Monitor_Tower_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Piggy_Bank_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Pilot1_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Printer_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Router_Icon_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Safe_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Security1_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Server_Tower_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Shopping_Cart_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Software_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Soldier1_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Suit1_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Suit2_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Suit3_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Tech1_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Telesales1_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Virtual_Machine_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Virus_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Wireless_Router_N_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Worker1_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/Workstation_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/iMac_128x128.png create mode 100644 packages/client/public/diagram/stencils/clipart/iPad_128x128.png create mode 100644 packages/client/public/diagram/stencils/flowchart.xml create mode 100644 packages/client/public/diagram/styles/default.xml create mode 100644 packages/client/public/diagram/styles/sprites.png create mode 100644 packages/client/public/favicon.ico create mode 100644 packages/client/public/icon120.png create mode 100644 packages/client/public/icon128.png create mode 100644 packages/client/public/icon144.png create mode 100644 packages/client/public/icon152.png create mode 100644 packages/client/public/icon180.png create mode 100644 packages/client/public/icon192.png create mode 100644 packages/client/public/icon384.png create mode 100644 packages/client/public/icon512.png create mode 100644 packages/client/public/icon72.png create mode 100644 packages/client/public/icon96.png create mode 100644 packages/client/public/maskable.png create mode 100644 packages/client/pwa-cache.js create mode 100644 packages/client/src/components/admin/system-config/ad/index.tsx create mode 100644 packages/client/src/components/admin/system-config/index.tsx create mode 100644 packages/client/src/components/admin/system-config/mail/index.tsx create mode 100644 packages/client/src/components/admin/system-config/system/index.tsx create mode 100644 packages/client/src/components/author.tsx create mode 100644 packages/client/src/components/banner/index.tsx create mode 100644 packages/client/src/components/color-picker/index.tsx create mode 100644 packages/client/src/components/color-picker/style.module.scss create mode 100644 packages/client/src/components/data-render/constant.tsx create mode 100644 packages/client/src/components/data-render/index.tsx create mode 100644 packages/client/src/components/data-render/loading.tsx create mode 100644 packages/client/src/components/divider.tsx create mode 100644 packages/client/src/components/document-creator/index.tsx create mode 100644 packages/client/src/components/document/actions/index.module.scss create mode 100644 packages/client/src/components/document/actions/index.tsx create mode 100644 packages/client/src/components/document/card/index.module.scss create mode 100644 packages/client/src/components/document/card/index.tsx create mode 100644 packages/client/src/components/document/collaboration/index.tsx create mode 100644 packages/client/src/components/document/comments/comments/index.tsx create mode 100644 packages/client/src/components/document/comments/comments/item/index.module.scss create mode 100644 packages/client/src/components/document/comments/comments/item/index.tsx create mode 100644 packages/client/src/components/document/comments/index.module.scss create mode 100644 packages/client/src/components/document/comments/index.tsx create mode 100644 packages/client/src/components/document/create/index.module.scss create mode 100644 packages/client/src/components/document/create/index.tsx create mode 100644 packages/client/src/components/document/delete/index.tsx create mode 100644 packages/client/src/components/document/editor/editor.tsx create mode 100644 packages/client/src/components/document/editor/index.module.scss create mode 100644 packages/client/src/components/document/editor/index.tsx create mode 100644 packages/client/src/components/document/export/index.module.scss create mode 100644 packages/client/src/components/document/export/index.tsx create mode 100644 packages/client/src/components/document/export/pdf.ts create mode 100644 packages/client/src/components/document/fullscreen/index.module.scss create mode 100644 packages/client/src/components/document/fullscreen/index.tsx create mode 100644 packages/client/src/components/document/link/index.tsx create mode 100644 packages/client/src/components/document/reader/author.tsx create mode 100644 packages/client/src/components/document/reader/index.module.scss create mode 100644 packages/client/src/components/document/reader/index.tsx create mode 100644 packages/client/src/components/document/reader/public/index.module.scss create mode 100644 packages/client/src/components/document/reader/public/index.tsx create mode 100644 packages/client/src/components/document/share/index.tsx create mode 100644 packages/client/src/components/document/star/index.tsx create mode 100644 packages/client/src/components/document/style/index.module.scss create mode 100644 packages/client/src/components/document/style/index.tsx create mode 100644 packages/client/src/components/document/version/index.module.scss create mode 100644 packages/client/src/components/document/version/index.tsx create mode 100644 packages/client/src/components/emoji-picker/constants.ts create mode 100644 packages/client/src/components/emoji-picker/emoji.json create mode 100644 packages/client/src/components/emoji-picker/index.module.scss create mode 100644 packages/client/src/components/emoji-picker/index.tsx create mode 100644 packages/client/src/components/empty.tsx create mode 100644 packages/client/src/components/grid-select/grid-cell.tsx create mode 100644 packages/client/src/components/grid-select/grid-select.tsx create mode 100644 packages/client/src/components/grid-select/index.tsx create mode 100644 packages/client/src/components/icons/IconAddColumnAfter.tsx create mode 100644 packages/client/src/components/icons/IconAddColumnBefore.tsx create mode 100644 packages/client/src/components/icons/IconAddRowAfter.tsx create mode 100644 packages/client/src/components/icons/IconAddRowBefore.tsx create mode 100644 packages/client/src/components/icons/IconAttachment.tsx create mode 100644 packages/client/src/components/icons/IconCallout.tsx create mode 100644 packages/client/src/components/icons/IconCenter.tsx create mode 100644 packages/client/src/components/icons/IconClear.tsx create mode 100644 packages/client/src/components/icons/IconCodeBlock.tsx create mode 100644 packages/client/src/components/icons/IconColumns.tsx create mode 100644 packages/client/src/components/icons/IconCountdown.tsx create mode 100644 packages/client/src/components/icons/IconDeleteColumn.tsx create mode 100644 packages/client/src/components/icons/IconDeleteRow.tsx create mode 100644 packages/client/src/components/icons/IconDeleteTable.tsx create mode 100644 packages/client/src/components/icons/IconDocument.tsx create mode 100644 packages/client/src/components/icons/IconDocumentFill.tsx create mode 100644 packages/client/src/components/icons/IconDrawBoard.tsx create mode 100644 packages/client/src/components/icons/IconEmoji.tsx create mode 100644 packages/client/src/components/icons/IconFlow.tsx create mode 100644 packages/client/src/components/icons/IconFont.tsx create mode 100644 packages/client/src/components/icons/IconFull.tsx create mode 100644 packages/client/src/components/icons/IconFullscreen.tsx create mode 100644 packages/client/src/components/icons/IconGlobe.tsx create mode 100644 packages/client/src/components/icons/IconHalf.tsx create mode 100644 packages/client/src/components/icons/IconHeading1.tsx create mode 100644 packages/client/src/components/icons/IconHeading2.tsx create mode 100644 packages/client/src/components/icons/IconHeading3.tsx create mode 100644 packages/client/src/components/icons/IconHorizontalRule.tsx create mode 100644 packages/client/src/components/icons/IconImage.tsx create mode 100644 packages/client/src/components/icons/IconInfo.tsx create mode 100644 packages/client/src/components/icons/IconJSON.tsx create mode 100644 packages/client/src/components/icons/IconLayout.tsx create mode 100644 packages/client/src/components/icons/IconLeft.tsx create mode 100644 packages/client/src/components/icons/IconLineHeight.tsx create mode 100644 packages/client/src/components/icons/IconLink.tsx create mode 100644 packages/client/src/components/icons/IconList.tsx create mode 100644 packages/client/src/components/icons/IconMarkdown.tsx create mode 100644 packages/client/src/components/icons/IconMath.tsx create mode 100644 packages/client/src/components/icons/IconMergeCell.tsx create mode 100644 packages/client/src/components/icons/IconMessage.tsx create mode 100644 packages/client/src/components/icons/IconMind.tsx create mode 100644 packages/client/src/components/icons/IconMindCenter.tsx create mode 100644 packages/client/src/components/icons/IconMindFull.tsx create mode 100644 packages/client/src/components/icons/IconMindLeft.tsx create mode 100644 packages/client/src/components/icons/IconMindRight.tsx create mode 100644 packages/client/src/components/icons/IconMindSide.tsx create mode 100644 packages/client/src/components/icons/IconOrderedList.tsx create mode 100644 packages/client/src/components/icons/IconOverview.tsx create mode 100644 packages/client/src/components/icons/IconPDF.tsx create mode 100644 packages/client/src/components/icons/IconPPT.tsx create mode 100644 packages/client/src/components/icons/IconPencil.tsx create mode 100644 packages/client/src/components/icons/IconQuote.tsx create mode 100644 packages/client/src/components/icons/IconRight.tsx create mode 100644 packages/client/src/components/icons/IconSearch.tsx create mode 100644 packages/client/src/components/icons/IconSearchReplace.tsx create mode 100644 packages/client/src/components/icons/IconSetting.tsx create mode 100644 packages/client/src/components/icons/IconShare.tsx create mode 100644 packages/client/src/components/icons/IconSheet.tsx create mode 100644 packages/client/src/components/icons/IconSplitCell.tsx create mode 100644 packages/client/src/components/icons/IconStatus.tsx create mode 100644 packages/client/src/components/icons/IconStructure.tsx create mode 100644 packages/client/src/components/icons/IconSub.tsx create mode 100644 packages/client/src/components/icons/IconSup.tsx create mode 100644 packages/client/src/components/icons/IconTable.tsx create mode 100644 packages/client/src/components/icons/IconTableHeaderCell.tsx create mode 100644 packages/client/src/components/icons/IconTableHeaderColumn.tsx create mode 100644 packages/client/src/components/icons/IconTableHeaderRow.tsx create mode 100644 packages/client/src/components/icons/IconTableOfContents.tsx create mode 100644 packages/client/src/components/icons/IconTask.tsx create mode 100644 packages/client/src/components/icons/IconWord.tsx create mode 100644 packages/client/src/components/icons/IconZoomIn.tsx create mode 100644 packages/client/src/components/icons/IconZoomOut.tsx create mode 100644 packages/client/src/components/icons/index.tsx create mode 100644 packages/client/src/components/image-uploader/index.module.scss create mode 100644 packages/client/src/components/image-uploader/index.tsx create mode 100644 packages/client/src/components/image-viewer.tsx create mode 100644 packages/client/src/components/locale-time/index.tsx create mode 100644 packages/client/src/components/logo/index.module.scss create mode 100644 packages/client/src/components/logo/index.tsx create mode 100644 packages/client/src/components/members/add.tsx create mode 100644 packages/client/src/components/members/edit.tsx create mode 100644 packages/client/src/components/members/index.module.scss create mode 100644 packages/client/src/components/members/index.tsx create mode 100644 packages/client/src/components/message/index.module.scss create mode 100644 packages/client/src/components/message/index.tsx create mode 100644 packages/client/src/components/message/placeholder.tsx create mode 100644 packages/client/src/components/organization/delete/index.tsx create mode 100644 packages/client/src/components/organization/index.module.scss create mode 100644 packages/client/src/components/organization/index.tsx create mode 100644 packages/client/src/components/organization/public-switcher/index.module.scss create mode 100644 packages/client/src/components/organization/public-switcher/index.tsx create mode 100644 packages/client/src/components/organization/setting/base/index.module.scss create mode 100644 packages/client/src/components/organization/setting/base/index.tsx create mode 100644 packages/client/src/components/organization/setting/index.tsx create mode 100644 packages/client/src/components/organization/setting/members/index.tsx create mode 100644 packages/client/src/components/organization/setting/more/index.tsx create mode 100644 packages/client/src/components/organization/switcher/index.module.scss create mode 100644 packages/client/src/components/organization/switcher/index.tsx create mode 100644 packages/client/src/components/resizeable/index.tsx create mode 100644 packages/client/src/components/resizeable/resizeable.tsx create mode 100644 packages/client/src/components/resizeable/style.module.scss create mode 100644 packages/client/src/components/search/index.module.scss create mode 100644 packages/client/src/components/search/index.tsx create mode 100644 packages/client/src/components/seo.tsx create mode 100644 packages/client/src/components/size-setter.tsx create mode 100644 packages/client/src/components/template/card/index.module.scss create mode 100644 packages/client/src/components/template/card/index.tsx create mode 100644 packages/client/src/components/template/editor/index.module.scss create mode 100644 packages/client/src/components/template/editor/index.tsx create mode 100644 packages/client/src/components/template/list/index.tsx create mode 100644 packages/client/src/components/template/reader/index.tsx create mode 100644 packages/client/src/components/theme/index.tsx create mode 100644 packages/client/src/components/tooltip/index.tsx create mode 100644 packages/client/src/components/upload/index.tsx create mode 100644 packages/client/src/components/user/index.tsx create mode 100644 packages/client/src/components/user/reset-password/index.tsx create mode 100644 packages/client/src/components/user/setting/index.tsx create mode 100644 packages/client/src/components/wiki-creator/index.tsx create mode 100644 packages/client/src/components/wiki-or-document-creator/index.tsx create mode 100644 packages/client/src/components/wiki/card/index.module.scss create mode 100644 packages/client/src/components/wiki/card/index.tsx create mode 100644 packages/client/src/components/wiki/create/index.tsx create mode 100644 packages/client/src/components/wiki/delete/index.tsx create mode 100644 packages/client/src/components/wiki/documents-share/index.module.scss create mode 100644 packages/client/src/components/wiki/documents-share/index.tsx create mode 100644 packages/client/src/components/wiki/pin-card/index.module.scss create mode 100644 packages/client/src/components/wiki/pin-card/index.tsx create mode 100644 packages/client/src/components/wiki/placeholder/index.tsx create mode 100644 packages/client/src/components/wiki/setting/base/index.module.scss create mode 100644 packages/client/src/components/wiki/setting/base/index.tsx create mode 100644 packages/client/src/components/wiki/setting/import/index.tsx create mode 100644 packages/client/src/components/wiki/setting/import/parser.tsx create mode 100644 packages/client/src/components/wiki/setting/index.tsx create mode 100644 packages/client/src/components/wiki/setting/more/index.tsx create mode 100644 packages/client/src/components/wiki/setting/privacy/index.module.scss create mode 100644 packages/client/src/components/wiki/setting/privacy/index.tsx create mode 100644 packages/client/src/components/wiki/setting/users/index.tsx create mode 100644 packages/client/src/components/wiki/star/index.tsx create mode 100644 packages/client/src/components/wiki/tocs/index.module.scss create mode 100644 packages/client/src/components/wiki/tocs/index.tsx create mode 100644 packages/client/src/components/wiki/tocs/manager/index.module.scss create mode 100644 packages/client/src/components/wiki/tocs/manager/index.tsx create mode 100644 packages/client/src/components/wiki/tocs/nav-item.tsx create mode 100644 packages/client/src/components/wiki/tocs/public.tsx create mode 100644 packages/client/src/components/wiki/tocs/tree.tsx create mode 100644 packages/client/src/components/wiki/tocs/utils.tsx create mode 100644 packages/client/src/data/ad.ts create mode 100644 packages/client/src/data/comment.ts create mode 100644 packages/client/src/data/document.ts create mode 100644 packages/client/src/data/message.ts create mode 100644 packages/client/src/data/organization.ts create mode 100644 packages/client/src/data/star.ts create mode 100644 packages/client/src/data/template.ts create mode 100644 packages/client/src/data/user.ts create mode 100644 packages/client/src/data/wiki.ts create mode 100644 packages/client/src/event/index.ts create mode 100644 packages/client/src/helpers/chunk.ts create mode 100644 packages/client/src/helpers/clamp.ts create mode 100644 packages/client/src/helpers/color.ts create mode 100644 packages/client/src/helpers/copy-to-clipboard.js create mode 100644 packages/client/src/helpers/copy.ts create mode 100644 packages/client/src/helpers/env.ts create mode 100644 packages/client/src/helpers/event-emitter.ts create mode 100644 packages/client/src/helpers/generate-html.ts create mode 100644 packages/client/src/helpers/json.ts create mode 100644 packages/client/src/helpers/lru-cache.ts create mode 100644 packages/client/src/helpers/pick.ts create mode 100644 packages/client/src/helpers/storage.ts create mode 100644 packages/client/src/helpers/throttle.ts create mode 100644 packages/client/src/helpers/tree.ts create mode 100644 packages/client/src/helpers/url.ts create mode 100644 packages/client/src/helpers/validator.ts create mode 100644 packages/client/src/hooks/create-global-hook.tsx create mode 100644 packages/client/src/hooks/use-async-loading.tsx create mode 100644 packages/client/src/hooks/use-click-outside.tsx create mode 100644 packages/client/src/hooks/use-cursor.tsx create mode 100644 packages/client/src/hooks/use-document-style.tsx create mode 100644 packages/client/src/hooks/use-document-version.tsx create mode 100644 packages/client/src/hooks/use-dragable-width.tsx create mode 100644 packages/client/src/hooks/use-interval.tsx create mode 100644 packages/client/src/hooks/use-isomorphic-layout-effect.tsx create mode 100644 packages/client/src/hooks/use-mount.tsx create mode 100644 packages/client/src/hooks/use-network.tsx create mode 100644 packages/client/src/hooks/use-on-mobile.tsx create mode 100644 packages/client/src/hooks/use-router-query.tsx create mode 100644 packages/client/src/hooks/use-runtime-config.tsx create mode 100644 packages/client/src/hooks/use-theme.tsx create mode 100644 packages/client/src/hooks/use-toggle.tsx create mode 100644 packages/client/src/hooks/use-window-size.tsx create mode 100644 packages/client/src/illustrations/create-document.tsx create mode 100644 packages/client/src/illustrations/create-wiki.tsx create mode 100644 packages/client/src/illustrations/empty-box.tsx create mode 100644 packages/client/src/illustrations/empty.tsx create mode 100644 packages/client/src/illustrations/forbidden.tsx create mode 100644 packages/client/src/illustrations/secure-document.tsx create mode 100644 packages/client/src/illustrations/share.tsx create mode 100644 packages/client/src/illustrations/team-work.tsx create mode 100644 packages/client/src/layouts/app-double-column/index.module.scss create mode 100644 packages/client/src/layouts/app-double-column/index.tsx create mode 100644 packages/client/src/layouts/app-router-header/index.module.scss create mode 100644 packages/client/src/layouts/app-router-header/index.tsx create mode 100644 packages/client/src/layouts/app-router-header/placeholder.tsx create mode 100644 packages/client/src/layouts/app-router-header/recent.tsx create mode 100644 packages/client/src/layouts/app-router-header/wiki.tsx create mode 100644 packages/client/src/layouts/app-single-column/index.module.scss create mode 100644 packages/client/src/layouts/app-single-column/index.tsx create mode 100644 packages/client/src/layouts/double-column/index.module.scss create mode 100644 packages/client/src/layouts/double-column/index.tsx create mode 100644 packages/client/src/layouts/public-double-column/index.module.scss create mode 100644 packages/client/src/layouts/public-double-column/index.tsx create mode 100644 packages/client/src/layouts/router-header/index.module.scss create mode 100644 packages/client/src/layouts/router-header/index.tsx create mode 100644 packages/client/src/layouts/single-column/index.module.scss create mode 100644 packages/client/src/layouts/single-column/index.tsx create mode 100644 packages/client/src/pages/_app.tsx create mode 100644 packages/client/src/pages/admin/index.module.scss create mode 100644 packages/client/src/pages/admin/index.tsx create mode 100644 packages/client/src/pages/api/config.ts create mode 100644 packages/client/src/pages/app/index.tsx create mode 100644 packages/client/src/pages/app/org/[organizationId]/index.module.scss create mode 100644 packages/client/src/pages/app/org/[organizationId]/index.tsx create mode 100644 packages/client/src/pages/app/org/[organizationId]/setting/index.tsx create mode 100644 packages/client/src/pages/app/org/[organizationId]/star/index.module.scss create mode 100644 packages/client/src/pages/app/org/[organizationId]/star/index.tsx create mode 100644 packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]/edit/index.tsx create mode 100644 packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]/index.tsx create mode 100644 packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/index.module.scss create mode 100644 packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/index.tsx create mode 100644 packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/setting/index.tsx create mode 100644 packages/client/src/pages/app/org/[organizationId]/wiki/index.module.scss create mode 100644 packages/client/src/pages/app/org/[organizationId]/wiki/index.tsx create mode 100644 packages/client/src/pages/app/org/create/index.module.scss create mode 100644 packages/client/src/pages/app/org/create/index.tsx create mode 100644 packages/client/src/pages/feature/csrf/index.tsx create mode 100644 packages/client/src/pages/feature/editor/index.tsx create mode 100644 packages/client/src/pages/find/index.tsx create mode 100644 packages/client/src/pages/forgetPassword/index.module.scss create mode 100644 packages/client/src/pages/forgetPassword/index.tsx create mode 100644 packages/client/src/pages/index.module.scss create mode 100644 packages/client/src/pages/index.tsx create mode 100644 packages/client/src/pages/login/index.module.scss create mode 100644 packages/client/src/pages/login/index.tsx create mode 100644 packages/client/src/pages/register/index.module.scss create mode 100644 packages/client/src/pages/register/index.tsx create mode 100644 packages/client/src/pages/share/document/[documentId]/index.module.scss create mode 100644 packages/client/src/pages/share/document/[documentId]/index.tsx create mode 100644 packages/client/src/pages/share/wiki/[wikiId]/document/[documentId]/index.module.scss create mode 100644 packages/client/src/pages/share/wiki/[wikiId]/document/[documentId]/index.tsx create mode 100644 packages/client/src/pages/share/wiki/[wikiId]/index.tsx create mode 100644 packages/client/src/pages/template/[templateId]/index.tsx create mode 100644 packages/client/src/pages/template/index.module.scss create mode 100644 packages/client/src/pages/template/index.tsx create mode 100644 packages/client/src/services/file.ts create mode 100644 packages/client/src/services/http-client.ts create mode 100644 packages/client/src/services/server-prefetcher.ts create mode 100644 packages/client/src/services/spark-md5.js create mode 100644 packages/client/src/services/user.ts create mode 100644 packages/client/src/styles/globals.scss create mode 100644 packages/client/src/styles/reset.scss create mode 100644 packages/client/src/styles/var.scss create mode 100644 packages/client/src/thirtypart/array-prototype-at.js create mode 100644 packages/client/src/thirtypart/diagram/README.md create mode 100644 packages/client/src/thirtypart/diagram/diagram.js create mode 100644 packages/client/src/thirtypart/diagram/index.js create mode 100644 packages/client/src/thirtypart/kityminder/README.md create mode 100644 packages/client/src/thirtypart/kityminder/hotbox/expose.js create mode 100644 packages/client/src/thirtypart/kityminder/hotbox/hotbox.js create mode 100644 packages/client/src/thirtypart/kityminder/hotbox/key.js create mode 100644 packages/client/src/thirtypart/kityminder/hotbox/keycontrol.js create mode 100644 packages/client/src/thirtypart/kityminder/hotbox/keymap.js create mode 100644 packages/client/src/thirtypart/kityminder/index.ts create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/connect/arc.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/connect/arc_tp.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/connect/bezier.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/connect/fish-bone-master.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/connect/l.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/connect/poly.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/connect/under.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/_boxv.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/animate.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/command.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/compatibility.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/connect.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/data.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/event.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/focus.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/keymap.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/keyreceiver.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/kity.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/layout.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/minder.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/module.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/node.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/option.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/paper.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/patch.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/promise.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/readonly.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/render.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/select.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/shortcut.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/status.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/template.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/theme.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/core/utils.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/expose-kityminder.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/kityminder.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/layout/btree.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/layout/filetree.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/layout/fish-bone-master.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/layout/fish-bone-slave.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/layout/mind.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/layout/tianpan.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/arrange.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/basestyle.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/clipboard.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/dragtree.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/expand.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/font.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/hyperlink.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/image-viewer.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/image.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/keynav.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/layout.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/node.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/note.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/outline.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/priority.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/progress.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/resource.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/select.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/style.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/text.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/view.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/module/zoom.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/protocol/json.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/protocol/markdown.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/protocol/png.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/protocol/svg.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/protocol/text.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/template/default.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/template/filetree.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/template/fish-bone.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/template/right.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/template/structure.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/template/tianpan.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/theme/default.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/theme/fish.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/theme/fresh.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/theme/snow.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/theme/tianpan.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-core/theme/wire.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/editor.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/expose-editor.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/hotbox.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/lang.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/minder.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/tool/debug.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/tool/format.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/tool/innertext.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/tool/jsondiff.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/tool/key.js create mode 100644 packages/client/src/thirtypart/kityminder/kity-editor/tool/keymap.js create mode 100644 packages/client/src/tiptap/core/all-kit.ts create mode 100644 packages/client/src/tiptap/core/bubble-menu/bubble-menu-plugin.tsx create mode 100644 packages/client/src/tiptap/core/bubble-menu/index.tsx create mode 100644 packages/client/src/tiptap/core/constants.ts create mode 100644 packages/client/src/tiptap/core/extensions/attachment.ts create mode 100644 packages/client/src/tiptap/core/extensions/background-color.ts create mode 100644 packages/client/src/tiptap/core/extensions/blockquote.ts create mode 100644 packages/client/src/tiptap/core/extensions/bold.ts create mode 100644 packages/client/src/tiptap/core/extensions/bullet-list.ts create mode 100644 packages/client/src/tiptap/core/extensions/callout.ts create mode 100644 packages/client/src/tiptap/core/extensions/clipboard.ts create mode 100644 packages/client/src/tiptap/core/extensions/code-block.ts create mode 100644 packages/client/src/tiptap/core/extensions/code.ts create mode 100644 packages/client/src/tiptap/core/extensions/collaboration-cursor/cursor-plugin/index.ts create mode 100644 packages/client/src/tiptap/core/extensions/collaboration-cursor/index.ts create mode 100644 packages/client/src/tiptap/core/extensions/collaboration/collaboration.ts create mode 100644 packages/client/src/tiptap/core/extensions/collaboration/helpers/is-change-origin.ts create mode 100644 packages/client/src/tiptap/core/extensions/collaboration/index.ts create mode 100644 packages/client/src/tiptap/core/extensions/color-highlighter.ts create mode 100644 packages/client/src/tiptap/core/extensions/color.ts create mode 100644 packages/client/src/tiptap/core/extensions/column.ts create mode 100644 packages/client/src/tiptap/core/extensions/columns.ts create mode 100644 packages/client/src/tiptap/core/extensions/countdown.ts create mode 100644 packages/client/src/tiptap/core/extensions/document-children.ts create mode 100644 packages/client/src/tiptap/core/extensions/document-reference.ts create mode 100644 packages/client/src/tiptap/core/extensions/document.ts create mode 100644 packages/client/src/tiptap/core/extensions/dragable.ts create mode 100644 packages/client/src/tiptap/core/extensions/dropcursor.ts create mode 100644 packages/client/src/tiptap/core/extensions/emoji.ts create mode 100644 packages/client/src/tiptap/core/extensions/event-emitter.ts create mode 100644 packages/client/src/tiptap/core/extensions/excalidraw.ts create mode 100644 packages/client/src/tiptap/core/extensions/flow.ts create mode 100644 packages/client/src/tiptap/core/extensions/focus.ts create mode 100644 packages/client/src/tiptap/core/extensions/font-family.ts create mode 100644 packages/client/src/tiptap/core/extensions/font-size.ts create mode 100644 packages/client/src/tiptap/core/extensions/gapcursor.ts create mode 100644 packages/client/src/tiptap/core/extensions/hard-break.ts create mode 100644 packages/client/src/tiptap/core/extensions/heading.ts create mode 100644 packages/client/src/tiptap/core/extensions/horizontal-rule.ts create mode 100644 packages/client/src/tiptap/core/extensions/html-marks.ts create mode 100644 packages/client/src/tiptap/core/extensions/iframe.ts create mode 100644 packages/client/src/tiptap/core/extensions/image.ts create mode 100644 packages/client/src/tiptap/core/extensions/indent.ts create mode 100644 packages/client/src/tiptap/core/extensions/italic.ts create mode 100644 packages/client/src/tiptap/core/extensions/katex.ts create mode 100644 packages/client/src/tiptap/core/extensions/line-height.ts create mode 100644 packages/client/src/tiptap/core/extensions/link.ts create mode 100644 packages/client/src/tiptap/core/extensions/listItem.ts create mode 100644 packages/client/src/tiptap/core/extensions/loading.ts create mode 100644 packages/client/src/tiptap/core/extensions/mention.ts create mode 100644 packages/client/src/tiptap/core/extensions/mind.ts create mode 100644 packages/client/src/tiptap/core/extensions/ordered-list.ts create mode 100644 packages/client/src/tiptap/core/extensions/paragraph.ts create mode 100644 packages/client/src/tiptap/core/extensions/paste.ts create mode 100644 packages/client/src/tiptap/core/extensions/placeholder.ts create mode 100644 packages/client/src/tiptap/core/extensions/scroll-to-cursor.ts create mode 100644 packages/client/src/tiptap/core/extensions/search.ts create mode 100644 packages/client/src/tiptap/core/extensions/selection.ts create mode 100644 packages/client/src/tiptap/core/extensions/slash.ts create mode 100644 packages/client/src/tiptap/core/extensions/status.ts create mode 100644 packages/client/src/tiptap/core/extensions/strike.ts create mode 100644 packages/client/src/tiptap/core/extensions/subscript.ts create mode 100644 packages/client/src/tiptap/core/extensions/superscript.ts create mode 100644 packages/client/src/tiptap/core/extensions/table-cell.tsx create mode 100644 packages/client/src/tiptap/core/extensions/table-header.tsx create mode 100644 packages/client/src/tiptap/core/extensions/table-of-contents.ts create mode 100644 packages/client/src/tiptap/core/extensions/table-row.ts create mode 100644 packages/client/src/tiptap/core/extensions/table.ts create mode 100644 packages/client/src/tiptap/core/extensions/task-item.ts create mode 100644 packages/client/src/tiptap/core/extensions/task-list.ts create mode 100644 packages/client/src/tiptap/core/extensions/text-align.ts create mode 100644 packages/client/src/tiptap/core/extensions/text-style.ts create mode 100644 packages/client/src/tiptap/core/extensions/text.ts create mode 100644 packages/client/src/tiptap/core/extensions/title.ts create mode 100644 packages/client/src/tiptap/core/extensions/trailing-node.ts create mode 100644 packages/client/src/tiptap/core/extensions/underline.ts create mode 100644 packages/client/src/tiptap/core/hooks/use-active.tsx create mode 100644 packages/client/src/tiptap/core/hooks/use-attributes.tsx create mode 100644 packages/client/src/tiptap/core/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/_event.ts create mode 100644 packages/client/src/tiptap/core/menus/align/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/attachment/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/attachment/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/background-color/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/blockquote/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/bold/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/bullet-list/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/callout/bubble.module.scss create mode 100644 packages/client/src/tiptap/core/menus/callout/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/callout/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/clear-node-and-marks/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/code-block/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/code-block/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/code/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/columns/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/columns/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/commands.tsx create mode 100644 packages/client/src/tiptap/core/menus/countdown/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/countdown/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/countdown/modal.tsx create mode 100644 packages/client/src/tiptap/core/menus/countdown/service.ts create mode 100644 packages/client/src/tiptap/core/menus/document-children/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/document-children/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/document-reference/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/document-reference/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/emoji/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/excalidraw/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/excalidraw/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/excalidraw/modal.tsx create mode 100644 packages/client/src/tiptap/core/menus/flow/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/flow/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/flow/modal.tsx create mode 100644 packages/client/src/tiptap/core/menus/fontfamily/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/fontsize/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/heading/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/horizontal-rule/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/ident/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/iframe/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/iframe/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/image/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/image/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/insert/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/italic/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/katex/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/katex/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/lineheight/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/link/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/link/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/link/modal.tsx create mode 100644 packages/client/src/tiptap/core/menus/link/service.ts create mode 100644 packages/client/src/tiptap/core/menus/mind/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/constant.ts create mode 100644 packages/client/src/tiptap/core/menus/mind/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/modal.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/style.module.scss create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/bgcolor.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/font-color.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/help.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/image.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/index.module.scss create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/link.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/priority.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/progress.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/template.tsx create mode 100644 packages/client/src/tiptap/core/menus/mind/toolbar/theme.tsx create mode 100644 packages/client/src/tiptap/core/menus/ordered-list/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/redo/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/search/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/strike/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/subscript/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/superscript/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/table/bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/table/col-bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/table/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/table/row-bubble.tsx create mode 100644 packages/client/src/tiptap/core/menus/task-list/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/text-color/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/text/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/underline/index.tsx create mode 100644 packages/client/src/tiptap/core/menus/undo/index.tsx create mode 100644 packages/client/src/tiptap/core/styles/base.scss create mode 100644 packages/client/src/tiptap/core/styles/code.scss create mode 100644 packages/client/src/tiptap/core/styles/collaboration.scss create mode 100644 packages/client/src/tiptap/core/styles/color.scss create mode 100644 packages/client/src/tiptap/core/styles/columns.scss create mode 100644 packages/client/src/tiptap/core/styles/drag.scss create mode 100644 packages/client/src/tiptap/core/styles/flow.scss create mode 100644 packages/client/src/tiptap/core/styles/heading.scss create mode 100644 packages/client/src/tiptap/core/styles/index.scss create mode 100644 packages/client/src/tiptap/core/styles/katex.scss create mode 100644 packages/client/src/tiptap/core/styles/kityminder.scss create mode 100644 packages/client/src/tiptap/core/styles/list.scss create mode 100644 packages/client/src/tiptap/core/styles/lock.scss create mode 100644 packages/client/src/tiptap/core/styles/mention.scss create mode 100644 packages/client/src/tiptap/core/styles/menu.scss create mode 100644 packages/client/src/tiptap/core/styles/node.scss create mode 100644 packages/client/src/tiptap/core/styles/placeholder.scss create mode 100644 packages/client/src/tiptap/core/styles/search.scss create mode 100644 packages/client/src/tiptap/core/styles/selection.scss create mode 100644 packages/client/src/tiptap/core/styles/table.scss create mode 100644 packages/client/src/tiptap/core/styles/title.scss create mode 100644 packages/client/src/tiptap/core/styles/var.scss create mode 100644 packages/client/src/tiptap/core/thritypart/y-indexeddb.js create mode 100644 packages/client/src/tiptap/core/thritypart/y-prosemirror/lib.js create mode 100644 packages/client/src/tiptap/core/thritypart/y-prosemirror/plugins/awareness.js create mode 100644 packages/client/src/tiptap/core/thritypart/y-prosemirror/plugins/cursor-plugin.js create mode 100644 packages/client/src/tiptap/core/thritypart/y-prosemirror/plugins/keys.js create mode 100644 packages/client/src/tiptap/core/thritypart/y-prosemirror/plugins/sync-plugin.js create mode 100644 packages/client/src/tiptap/core/thritypart/y-prosemirror/plugins/undo-plugin.js create mode 100644 packages/client/src/tiptap/core/thritypart/y-prosemirror/y-prosemirror.js create mode 100644 packages/client/src/tiptap/core/wrappers/attachment/file-icon.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/attachment/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/attachment/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/attachment/player/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/attachment/player/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/attachment/player/pdf-player/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/attachment/player/pdf-player/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/callout/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/callout/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/code-block/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/code-block/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/countdown/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/countdown/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/document-children/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/document-children/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/document-reference/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/document-reference/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/emoji-list/emojis.ts create mode 100644 packages/client/src/tiptap/core/wrappers/emoji-list/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/emoji-list/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/excalidraw/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/excalidraw/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/flow/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/flow/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/iframe/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/iframe/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/image/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/image/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/katex/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/katex/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/loading.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/mention-list/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/mention-list/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/menu-list/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/menu-list/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/mind/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/mind/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/status/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/status/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/table-of-contents/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/table-of-contents/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/task-item/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/task-item/index.tsx create mode 100644 packages/client/src/tiptap/core/wrappers/title/index.module.scss create mode 100644 packages/client/src/tiptap/core/wrappers/title/index.tsx create mode 100644 packages/client/src/tiptap/editor/collaboration/collaboration/editor.tsx create mode 100644 packages/client/src/tiptap/editor/collaboration/collaboration/index.module.scss create mode 100644 packages/client/src/tiptap/editor/collaboration/collaboration/index.tsx create mode 100644 packages/client/src/tiptap/editor/collaboration/collaboration/menubar.tsx create mode 100644 packages/client/src/tiptap/editor/collaboration/collaboration/type.ts create mode 100644 packages/client/src/tiptap/editor/collaboration/index.tsx create mode 100644 packages/client/src/tiptap/editor/collaboration/kit.ts create mode 100644 packages/client/src/tiptap/editor/comment/index.ts create mode 100644 packages/client/src/tiptap/editor/comment/kit.ts create mode 100644 packages/client/src/tiptap/editor/comment/menubar.tsx create mode 100644 packages/client/src/tiptap/editor/index.tsx create mode 100644 packages/client/src/tiptap/editor/reader/index.module.scss create mode 100644 packages/client/src/tiptap/editor/reader/index.tsx create mode 100644 packages/client/src/tiptap/editor/tocs/index.module.scss create mode 100644 packages/client/src/tiptap/editor/tocs/index.tsx create mode 100644 packages/client/src/tiptap/editor/tocs/util.ts create mode 100644 packages/client/src/tiptap/fix-match-nodes.ts create mode 100644 packages/client/src/tiptap/image-load.js create mode 100644 packages/client/src/tiptap/markdown/html-to-prosemirror/index.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/index.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/marks/bold.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/marks/code.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/marks/italic.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/marks/link.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/marks/mark.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/marks/subscript.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/marks/superscript.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/marks/underline.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/attachment.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/blockquote.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/bullet-list.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/callout.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/code-block-wrapper.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/code-block.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/countdown.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/document-children.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/document-reference.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/excalidraw.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/flow.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/hard-break.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/heading.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/horizontal-rule.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/iframe.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/image.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/katex.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/list-item.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/mention.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/mind.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/node.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/ordered-list.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/paragraph.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/status.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/table-cell.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/table-header.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/table-of-contents.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/table-row.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/table.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/task-list-item.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/task-list.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/text.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/nodes/title.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/renderer.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/html-to-prosemirror/utils.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/index.tsx create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/markdown-to-html/index.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/markdown-to-html/markdownCallout.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/markdown-to-html/markdownItContainer.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/markdown-to-html/markdownKatex.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/markdown-to-html/markdownTable.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/markdown-to-html/markdownTaskList.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/markdown-to-html/markdownUnderline.ts create mode 100644 packages/client/src/tiptap/markdown/markdown-to-prosemirror/markdown-to-html/markedownSplitMixedList.ts create mode 100644 packages/client/src/tiptap/markdown/prosemirror-to-markdown/helpers.ts create mode 100644 packages/client/src/tiptap/markdown/prosemirror-to-markdown/index.ts create mode 100644 packages/client/src/tiptap/preload.ts create mode 100644 packages/client/src/tiptap/prose-utils/active.ts create mode 100644 packages/client/src/tiptap/prose-utils/clamp.ts create mode 100644 packages/client/src/tiptap/prose-utils/code.ts create mode 100644 packages/client/src/tiptap/prose-utils/color.ts create mode 100644 packages/client/src/tiptap/prose-utils/columns.ts create mode 100644 packages/client/src/tiptap/prose-utils/copy-node.ts create mode 100644 packages/client/src/tiptap/prose-utils/create-node.ts create mode 100644 packages/client/src/tiptap/prose-utils/debug.ts create mode 100644 packages/client/src/tiptap/prose-utils/delete-node.ts create mode 100644 packages/client/src/tiptap/prose-utils/document.ts create mode 100644 packages/client/src/tiptap/prose-utils/dom-dataset.ts create mode 100644 packages/client/src/tiptap/prose-utils/dom.ts create mode 100644 packages/client/src/tiptap/prose-utils/download.ts create mode 100644 packages/client/src/tiptap/prose-utils/editor-container-size.ts create mode 100644 packages/client/src/tiptap/prose-utils/file.ts create mode 100644 packages/client/src/tiptap/prose-utils/html.ts create mode 100644 packages/client/src/tiptap/prose-utils/index.ts create mode 100644 packages/client/src/tiptap/prose-utils/lowlight-plugin.ts create mode 100644 packages/client/src/tiptap/prose-utils/mark.ts create mode 100644 packages/client/src/tiptap/prose-utils/markdown-source-map.ts create mode 100644 packages/client/src/tiptap/prose-utils/markdown.ts create mode 100644 packages/client/src/tiptap/prose-utils/mention.ts create mode 100644 packages/client/src/tiptap/prose-utils/node.ts create mode 100644 packages/client/src/tiptap/prose-utils/position.ts create mode 100644 packages/client/src/tiptap/prose-utils/select-node-by-dom.ts create mode 100644 packages/client/src/tiptap/prose-utils/table.ts create mode 100644 packages/client/src/tiptap/prose-utils/text.ts create mode 100644 packages/client/src/tiptap/prose-utils/type.ts create mode 100644 packages/client/src/tiptap/prose-utils/upload.ts create mode 100644 packages/client/src/tiptap/prose-utils/url.ts create mode 100644 packages/client/src/tiptap/prose-utils/uuid.ts create mode 100644 packages/client/tsconfig.json create mode 100644 packages/config/.gitignore create mode 100644 packages/config/README.md create mode 100644 packages/config/lib/index.d.ts create mode 100644 packages/config/lib/index.js create mode 100644 packages/config/lib/index.js.map create mode 100644 packages/config/package.json create mode 100644 packages/config/src/index.ts create mode 100644 packages/constants/lib/index.d.ts create mode 100644 packages/constants/lib/index.js create mode 100644 packages/constants/lib/index.js.map create mode 100644 packages/constants/package.json create mode 100644 packages/constants/src/index.ts create mode 100644 packages/domains/lib/api/ad.d.ts create mode 100644 packages/domains/lib/api/ad.js create mode 100644 packages/domains/lib/api/comment.d.ts create mode 100644 packages/domains/lib/api/comment.js create mode 100644 packages/domains/lib/api/document.d.ts create mode 100644 packages/domains/lib/api/document.js create mode 100644 packages/domains/lib/api/file.d.ts create mode 100644 packages/domains/lib/api/file.js create mode 100644 packages/domains/lib/api/index.d.ts create mode 100644 packages/domains/lib/api/index.js create mode 100644 packages/domains/lib/api/message.d.ts create mode 100644 packages/domains/lib/api/message.js create mode 100644 packages/domains/lib/api/organization.d.ts create mode 100644 packages/domains/lib/api/organization.js create mode 100644 packages/domains/lib/api/star.d.ts create mode 100644 packages/domains/lib/api/star.js create mode 100644 packages/domains/lib/api/system.d.ts create mode 100644 packages/domains/lib/api/system.js create mode 100644 packages/domains/lib/api/template.d.ts create mode 100644 packages/domains/lib/api/template.js create mode 100644 packages/domains/lib/api/user.d.ts create mode 100644 packages/domains/lib/api/user.js create mode 100644 packages/domains/lib/api/wiki.d.ts create mode 100644 packages/domains/lib/api/wiki.js create mode 100644 packages/domains/lib/index.d.ts create mode 100644 packages/domains/lib/index.js create mode 100644 packages/domains/lib/models/ad.d.ts create mode 100644 packages/domains/lib/models/ad.js create mode 100644 packages/domains/lib/models/auth.d.ts create mode 100644 packages/domains/lib/models/auth.js create mode 100644 packages/domains/lib/models/comment.d.ts create mode 100644 packages/domains/lib/models/comment.js create mode 100644 packages/domains/lib/models/document.d.ts create mode 100644 packages/domains/lib/models/document.js create mode 100644 packages/domains/lib/models/index.d.ts create mode 100644 packages/domains/lib/models/index.js create mode 100644 packages/domains/lib/models/message.d.ts create mode 100644 packages/domains/lib/models/message.js create mode 100644 packages/domains/lib/models/organization.d.ts create mode 100644 packages/domains/lib/models/organization.js create mode 100644 packages/domains/lib/models/pagination.d.ts create mode 100644 packages/domains/lib/models/pagination.js create mode 100644 packages/domains/lib/models/system.d.ts create mode 100644 packages/domains/lib/models/system.js create mode 100644 packages/domains/lib/models/template.d.ts create mode 100644 packages/domains/lib/models/template.js create mode 100644 packages/domains/lib/models/user.d.ts create mode 100644 packages/domains/lib/models/user.js create mode 100644 packages/domains/lib/models/wiki.d.ts create mode 100644 packages/domains/lib/models/wiki.js create mode 100644 packages/domains/lib/util.d.ts create mode 100644 packages/domains/lib/util.js create mode 100644 packages/domains/package.json create mode 100644 packages/domains/src/api/ad.ts create mode 100644 packages/domains/src/api/comment.ts create mode 100644 packages/domains/src/api/document.ts create mode 100644 packages/domains/src/api/file.ts create mode 100644 packages/domains/src/api/index.ts create mode 100644 packages/domains/src/api/message.ts create mode 100644 packages/domains/src/api/organization.ts create mode 100644 packages/domains/src/api/star.ts create mode 100644 packages/domains/src/api/system.ts create mode 100644 packages/domains/src/api/template.ts create mode 100644 packages/domains/src/api/user.ts create mode 100644 packages/domains/src/api/wiki.ts create mode 100644 packages/domains/src/index.ts create mode 100644 packages/domains/src/models/ad.ts create mode 100644 packages/domains/src/models/auth.ts create mode 100644 packages/domains/src/models/comment.ts create mode 100644 packages/domains/src/models/document.ts create mode 100644 packages/domains/src/models/index.ts create mode 100644 packages/domains/src/models/message.ts create mode 100644 packages/domains/src/models/organization.ts create mode 100644 packages/domains/src/models/pagination.ts create mode 100644 packages/domains/src/models/system.ts create mode 100644 packages/domains/src/models/template.ts create mode 100644 packages/domains/src/models/user.ts create mode 100644 packages/domains/src/models/wiki.ts create mode 100644 packages/domains/src/util.ts create mode 100644 packages/server/.eslintrc.js create mode 100644 packages/server/.gitignore create mode 100644 packages/server/README.md create mode 100644 packages/server/nest-cli.json create mode 100644 packages/server/package.json create mode 100644 packages/server/src/app-cluster.service.ts create mode 100644 packages/server/src/app.module.ts create mode 100644 packages/server/src/constants/index.ts create mode 100644 packages/server/src/controllers/ad.controller.ts create mode 100644 packages/server/src/controllers/auth.controller.ts create mode 100644 packages/server/src/controllers/comment.controller.ts create mode 100644 packages/server/src/controllers/document.controller.ts create mode 100644 packages/server/src/controllers/file.controller.ts create mode 100644 packages/server/src/controllers/message.controller.ts create mode 100644 packages/server/src/controllers/organization.controller.ts create mode 100644 packages/server/src/controllers/star.controller.ts create mode 100644 packages/server/src/controllers/system.controller.ts create mode 100644 packages/server/src/controllers/template.controller.ts create mode 100644 packages/server/src/controllers/user.controller.ts create mode 100644 packages/server/src/controllers/verify.controller.ts create mode 100644 packages/server/src/controllers/view.controller.ts create mode 100644 packages/server/src/controllers/wiki.controller.ts create mode 100644 packages/server/src/dtos/ad.dto.ts create mode 100644 packages/server/src/dtos/auth.dto.ts create mode 100644 packages/server/src/dtos/comment.dto.ts create mode 100644 packages/server/src/dtos/create-document.dto.ts create mode 100644 packages/server/src/dtos/create-user.dto.ts create mode 100644 packages/server/src/dtos/create-wiki.dto.ts create mode 100644 packages/server/src/dtos/login-user.dto.ts create mode 100644 packages/server/src/dtos/organization.dto.ts create mode 100644 packages/server/src/dtos/share-document.dto.ts create mode 100644 packages/server/src/dtos/share-wiki.dto.ts create mode 100644 packages/server/src/dtos/star.dto.ts create mode 100644 packages/server/src/dtos/template.dto.ts create mode 100644 packages/server/src/dtos/update-document.dto.ts create mode 100644 packages/server/src/dtos/update-user.dto.ts create mode 100644 packages/server/src/dtos/update-wiki.dto.ts create mode 100644 packages/server/src/entities/ad.entity.ts create mode 100644 packages/server/src/entities/auth.entity.ts create mode 100644 packages/server/src/entities/comment.entity.ts create mode 100644 packages/server/src/entities/document.entity.ts create mode 100644 packages/server/src/entities/message.entity.ts create mode 100644 packages/server/src/entities/organization.entity.ts create mode 100644 packages/server/src/entities/star.entity.ts create mode 100644 packages/server/src/entities/system.entity.ts create mode 100644 packages/server/src/entities/template.entity.ts create mode 100644 packages/server/src/entities/user.entity.ts create mode 100644 packages/server/src/entities/wiki.entity.ts create mode 100644 packages/server/src/exceptions/http-response.exception.ts create mode 100644 packages/server/src/guard/document-auth.guard.ts create mode 100644 packages/server/src/guard/document-status.guard.ts create mode 100644 packages/server/src/guard/jwt.guard.ts create mode 100644 packages/server/src/guard/user.guard.ts create mode 100644 packages/server/src/guard/wiki-status.guard.ts create mode 100644 packages/server/src/guard/wiki-user.guard.ts create mode 100644 packages/server/src/helpers/date.helper.spec.ts create mode 100644 packages/server/src/helpers/date.helper.ts create mode 100644 packages/server/src/helpers/env.helper.ts create mode 100644 packages/server/src/helpers/file.helper/aliyun.client.ts create mode 100644 packages/server/src/helpers/file.helper/index.ts create mode 100644 packages/server/src/helpers/file.helper/local.client.ts create mode 100644 packages/server/src/helpers/file.helper/oss.client.ts create mode 100644 packages/server/src/helpers/file.helper/s3.client.ts create mode 100644 packages/server/src/helpers/file.helper/tencent.client.ts create mode 100644 packages/server/src/helpers/log.helper.ts create mode 100644 packages/server/src/helpers/redis.helper.ts create mode 100644 packages/server/src/helpers/shortid.herlper.ts create mode 100644 packages/server/src/helpers/tree.helper.ts create mode 100644 packages/server/src/helpers/ua.helper.ts create mode 100644 packages/server/src/helpers/uniqueid.helper.ts create mode 100644 packages/server/src/main.ts create mode 100644 packages/server/src/modules/ad.module.ts create mode 100644 packages/server/src/modules/auth.module.ts create mode 100644 packages/server/src/modules/comment.module.ts create mode 100644 packages/server/src/modules/document.module.ts create mode 100644 packages/server/src/modules/file.module.ts create mode 100644 packages/server/src/modules/message.module.ts create mode 100644 packages/server/src/modules/organization.module.ts create mode 100644 packages/server/src/modules/star.module.ts create mode 100644 packages/server/src/modules/system.module.ts create mode 100644 packages/server/src/modules/template.module.ts create mode 100644 packages/server/src/modules/user.module.ts create mode 100644 packages/server/src/modules/verify.module.ts create mode 100644 packages/server/src/modules/view.module.ts create mode 100644 packages/server/src/modules/wiki.module.ts create mode 100644 packages/server/src/pipes/validation.pipe.ts create mode 100644 packages/server/src/services/ad.service.ts create mode 100644 packages/server/src/services/auth.service.ts create mode 100644 packages/server/src/services/collaboration.service.ts create mode 100644 packages/server/src/services/comment.service.ts create mode 100644 packages/server/src/services/document-version.service.ts create mode 100644 packages/server/src/services/document.service.ts create mode 100644 packages/server/src/services/file.service.ts create mode 100644 packages/server/src/services/message.service.ts create mode 100644 packages/server/src/services/organization.service.ts create mode 100644 packages/server/src/services/star.service.ts create mode 100644 packages/server/src/services/system.service.ts create mode 100644 packages/server/src/services/template.service.ts create mode 100644 packages/server/src/services/user.service.ts create mode 100644 packages/server/src/services/verify.service.ts create mode 100644 packages/server/src/services/view.service.ts create mode 100644 packages/server/src/services/wiki.service.ts create mode 100644 packages/server/src/transforms/http-response.transform.ts create mode 100644 packages/server/test/app.e2e-spec.ts create mode 100644 packages/server/test/jest-e2e.json create mode 100644 packages/server/tsconfig.build.json create mode 100644 packages/server/tsconfig.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 scripts/README.md create mode 100755 scripts/deploy.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..2fa621c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +.idea +runtime +.git + +**/node_modules/** \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..3966754 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,11 @@ +node_modules +.next +dist +lib + +**/.next/** +**/dist/** +**/static/** +**/build/** +**/public/** +**/diagram.js diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1a659da --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# 第三方依赖太多,导致项目主语言被冲散 +*.js linguist-language=typescript \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..9ea56ed --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: ['https://think-1256095494.cos.ap-shanghai.myqcloud.com/think-wechat.jpg', 'https://think-1256095494.cos.ap-shanghai.myqcloud.com/think-alipay.jpg'] diff --git a/.github/ISSUE_TEMPLATE/----.md b/.github/ISSUE_TEMPLATE/----.md new file mode 100644 index 0000000..aa12d98 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/----.md @@ -0,0 +1,12 @@ +--- +name: 功能请求 +about: 为项目提供想法 +title: "[FEATURE]" +labels: '' +assignees: '' + +--- + +## 请描述功能点 + +## 也可提供功能的实现方案 diff --git a/.github/ISSUE_TEMPLATE/bug---.md b/.github/ISSUE_TEMPLATE/bug---.md new file mode 100644 index 0000000..5f1879c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug---.md @@ -0,0 +1,14 @@ +--- +name: Bug 反馈 +about: 反馈 Bug 以改善项目 +title: "[BUG]" +labels: '' +assignees: '' + +--- + +## 1. 问题的表现是怎样的? + +## 2. 问题的复现路径 + +## 3. 预期是什么? diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44719a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +node_modules +.DS_Store +.idea + +dist +dist-ssr +coverage +test-results +.pnpm-store +tsconfig.tsbuildinfo + +.env +*.local +*.cache +*error.log +*debug.log +*.conf + +**/prod.yaml + +scripts/update.sh + +output +runtime diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..799c304 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +pnpm run precommit diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..fa4e095 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +strict-peer-dependencies=false \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..46f82f1 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +node_modules +.next +dist +lib + +**/.next/** +**/dist/** +**/build/** +**/public/** diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..0a2f166 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "singleQuote": true, + "quoteProps": "consistent", + "bracketSpacing": true, + "jsxBracketSameLine": false, + "arrowParens": "always", + "trailingComma": "es5", + "tabWidth": 2, + "semi": true, + "printWidth": 120, + "endOfLine": "lf" +} \ No newline at end of file diff --git a/.stylelintrc.js b/.stylelintrc.js new file mode 100644 index 0000000..d640c2f --- /dev/null +++ b/.stylelintrc.js @@ -0,0 +1,110 @@ +module.exports = { + processors: [], + plugins: ['stylelint-order'], + extends: ['stylelint-config-standard', 'stylelint-config-css-modules'], + rules: { + 'selector-class-pattern': [ + // 命名规范 - + '(.)+$', + { + message: 'Expected class selector to be kebab-case', + }, + ], + 'string-quotes': 'single', // 单引号 + 'at-rule-empty-line-before': null, + 'at-rule-no-unknown': null, + 'at-rule-name-case': 'lower', // 指定@规则名的大小写 + 'length-zero-no-unit': true, // 禁止零长度的单位(可自动修复) + 'shorthand-property-no-redundant-values': true, // 简写属性 + 'number-leading-zero': 'always', // 小数不带0 + 'declaration-block-no-duplicate-properties': true, // 禁止声明快重复属性 + 'no-descending-specificity': true, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器。 + 'selector-max-id': 3, // 限制一个选择器中 ID 选择器的数量 + 'max-nesting-depth': 5, + 'indentation': [ + 2, + { + // 指定缩进 warning 提醒 + severity: 'warning', + }, + ], + 'order/properties-order': [ + // 规则顺序 + 'position', + 'top', + 'right', + 'bottom', + 'left', + 'z-index', + 'display', + 'float', + 'width', + 'height', + 'max-width', + 'max-height', + 'min-width', + 'min-height', + 'padding', + 'padding-top', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'margin', + 'margin-top', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'margin-collapse', + 'margin-top-collapse', + 'margin-right-collapse', + 'margin-bottom-collapse', + 'margin-left-collapse', + 'overflow', + 'overflow-x', + 'overflow-y', + 'clip', + 'clear', + 'font', + 'font-family', + 'font-size', + 'font-smoothing', + 'osx-font-smoothing', + 'font-style', + 'font-weight', + 'line-height', + 'letter-spacing', + 'word-spacing', + 'color', + 'text-align', + 'text-decoration', + 'text-indent', + 'text-overflow', + 'text-rendering', + 'text-size-adjust', + 'text-shadow', + 'text-transform', + 'word-break', + 'word-wrap', + 'white-space', + 'vertical-align', + 'list-style', + 'list-style-type', + 'list-style-position', + 'list-style-image', + 'pointer-events', + 'cursor', + 'background', + 'background-color', + 'border', + 'border-radius', + 'content', + 'outline', + 'outline-offset', + 'opacity', + 'filter', + 'visibility', + 'size', + 'transform', + ], + }, +}; diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..45bd75a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +FROM node:18-alpine as builder +COPY . /app/ +WORKDIR /app +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories +RUN npm config set registry http://mirrors.cloud.tencent.com/npm/ +RUN npm i -g pm2 @nestjs/cli pnpm +RUN apk --no-cache add bash dos2unix \ + && find . -name "*.sh" -exec dos2unix {} \; \ + && apk del dos2unix +RUN bash build-output.sh + +FROM node:18-alpine as prod +ENV TZ=Asia/Shanghai +COPY --from=builder /app/docker/* /app/docker/ +COPY --from=builder /app/output/ /app/ +WORKDIR /app +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories +RUN npm config set registry http://mirrors.cloud.tencent.com/npm/ +RUN set -x \ + && apk update \ + && apk add --no-cache tzdata redis \ + && chmod +x /app/docker/start.sh \ + && npm i -g pm2 @nestjs/cli pnpm \ + && rm -rf /var/cache/apk/* + +ENTRYPOINT sh /app/docker/start.sh diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..debeabf --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 fantasticit + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f1dfb5c --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +# think + +## 声明 + +1. 请先阅读[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md) +2. 如果希望参与独立编辑器开发,可以到[这个仓库](https://github.com/fantasticit/sailkit)参与 +3. 由于服务器成本和免费的 SSL 证书也没了,网站不定期会挂,敬请谅解 + +## 简介 + +Think 是一款开源知识管理工具。通过独立的知识库空间,结构化地组织在线协作文档,实现知识的积累与沉淀,促进知识的复用与流通。同时支持多人协作文档。使用的技术如下: + +- `MySQL`:数据存储 +- `next.js`:前端页面框架 +- `nest.js`:服务端框架 +- `tiptap`:编辑器及文档协作 + +可访问[云策文档帮助中心](https://think.codingit.cn/share/wiki/WoiR8N5uj4i7),查看更多功能文档。 + +## 链接 + +[云策文档](https://think.codingit.cn)已经部署上线,可前往注册使用。 + +## 预览 + +
+ 查看预览图 + 知识库 + 新建文档 + 编辑器 +
+ +## 项目开发 + +[项目开发说明](./let-us-start.md)。 + +## 自动化部署 + +> 思路:在服务器部署 webhook,然后在 github setting 中配置相应钩子,实现自动化部署 + +参考:[webhook](https://github.com/adnanh/webhook/blob/master/docs/Hook-Examples.md#incoming-github-webhook) + +## 赞助 + +如果这个项目对您有帮助,并且您希望支持该项目的开发和维护,请随时扫描一下二维码进行捐赠。非常感谢您的捐款,谢谢! + +
+ alipay + wechat +
+ +## 贡献者 + +感谢所有为本项目作出贡献的同学! + + diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..89332b8 --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`fantasticit/think` +- 原始仓库:https://github.com/fantasticit/think +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/build-output.sh b/build-output.sh new file mode 100755 index 0000000..ed23432 --- /dev/null +++ b/build-output.sh @@ -0,0 +1,82 @@ +#! /bin/bash +# 该脚本只保留生产环境运行所需文件到统一目录 +if [ ! -f './config/prod.yaml' ]; then + echo "缺少 config/prod.yaml 文件,可参考 docker-prod-sample.yaml 进行配置" + exit 1 +fi + +# 构建 +pnpm fetch --prod +pnpm install +pnpm run build + +outputDir="output" + +# 新建输出目录 +if [ -d ${outputDir} ]; then + rm -rfv ${outputDir} +fi +mkdir -p ${outputDir} +cd ${outputDir} +mkdir -p packages +mkdir -p packages/config +mkdir -p packages/constants +mkdir -p packages/domains +mkdir -p packages/client +mkdir -p packages/server +cd ../ + +# 复制文件 +cp -v -L -r config ${outputDir} +cd ${outputDir}/config +rm -f dev.yaml +cd ../../ +cp -v -L package.json ${outputDir} +cp -v -L pnpm-lock.yaml ${outputDir} +cp -v -L pnpm-workspace.yaml ${outputDir} + +# packages/config +cd packages/config +configOutput="../../${outputDir}/packages/config" +cp -v -L package.json ${configOutput} +cp -v -L -r lib ${configOutput} +cd ../../ + +# packages/constants +cd packages/constants +constantsOutput="../../${outputDir}/packages/constants" +cp -v -L package.json ${constantsOutput} +cp -v -L -r lib ${constantsOutput} +cd ../../ + +# packages/domains +cd packages/domains +domainsOutput="../../${outputDir}/packages/domains" +cp -v -L package.json ${domainsOutput} +cp -v -L -r lib ${domainsOutput} +cd ../../ + +# packages/client +cd packages/client +clientOutput="../../${outputDir}/packages/client" +cp -v -L package.json ${clientOutput} +cp -v -L prod-server.js ${clientOutput} +cp -v -L -r public ${clientOutput} +cp -v -L -r .next ${clientOutput} +cd ../../ + +# packages/server +cd packages/server +serverOutput="../../${outputDir}/packages/server" +cp -v -L package.json ${serverOutput} +cp -v -L nest-cli.json ${serverOutput} +cp -v -L -r dist ${serverOutput} +cd ../../ + +# @see https://github.com/typicode/husky/issues/914#issuecomment-826768549 +cd ${outputDir} +npm set-script prepare "" +pnpm install -r --offline --prod +cd ../ + +echo "${outputDir} 打包完成" diff --git a/config/dev.yaml b/config/dev.yaml new file mode 100644 index 0000000..b0e3900 --- /dev/null +++ b/config/dev.yaml @@ -0,0 +1,74 @@ +# 开发环境配置 +client: + port: 5001 + assetPrefix: '/' + apiUrl: 'http://localhost:5002/api' + collaborationUrl: 'ws://localhost:5003' + # 预先连接的来源,空格分割(比如图片存储服务器) + dnsPrefetch: '//wipi.oss-cn-shanghai.aliyuncs.com' + # 站点地址(如:https://think.codingit.cn/),一定要设置,否则会出现 cookie、跨域等问题 + siteUrl: + 'http://localhost:5001' + # 一定要设置,否则会出现 cookie、跨域等问题,注意如果网页部署在 https://think.codingit.cn,那这里的值应当为 .codingit.cn(没有 think) + siteDomain: '' + +server: + prefix: '/api' + port: 5002 + collaborationPort: 5003 + maxDocumentVersion: 20 # 最大版本记录数 + logRetainDays: 3 # 日志保留天数,比如只保留近三天日志 + enableRateLimit: true # 是否限流 + rateLimitWindowMs: 60000 # 限流时间 + rateLimitMax: 1000 # 单位限流时间内单个 ip 最大访问数量 + email: # 邮箱服务,参考 http://help.163.com/09/1223/14/5R7P6CJ600753VB8.html?servCode=6010376 获取 SMTP 配置 + host: '' + port: 465 + user: '' + password: '' + admin: + name: 'admin' # 注意修改 + password: 'admin' # 注意修改 + email: 'admin@think.com' # 注意修改为真实邮箱地址 + +# 数据库配置 +db: + mysql: + host: '127.0.0.1' + username: 'think' + password: 'think' + database: 'think' + port: 3306 + charset: 'utf8mb4' + timezone: '+08:00' + synchronize: true + redis: + host: '127.0.0.1' + port: '6379' + password: 'root' + db: 0 + +# oss 文件存储服务 +oss: + local: + enable: true + # 线上更改为服务端地址(如:https://api.codingit.cn) + server: 'http://localhost:5002' + s3: + enable: false + config: + # isp 提供商,可选 minio,s3,aliyun,tencent + cloudisp: 'minio' + accessKeyId: '' + secretAccessKey: '' + bucket: '' + region: '' + # 仅cloudisp 的值为 minio/s3 时配置,其它提供商为空 + forcePathStyle: false + # 仅cloudisp 的值为 minio 时配置,其它提供商为空 + endpoint: '' + +# jwt 配置 +jwt: + secretkey: 'zA_Think+KNOWLEDGE+WIKI+DOCUMENTS@2022' + expiresIn: '6h' diff --git a/config/docker-prod-sample.yaml b/config/docker-prod-sample.yaml new file mode 100644 index 0000000..e60c2c9 --- /dev/null +++ b/config/docker-prod-sample.yaml @@ -0,0 +1,75 @@ +# 开发环境配置 +client: + port: 5001 + assetPrefix: '/' + apiUrl: 'http://localhost:5002/api' + collaborationUrl: 'ws://localhost:5003' + # 以下为页面 meta 配置 + seoAppName: '云策文档' + seoDescription: '云策文档是一款开源知识管理工具。通过独立的知识库空间,结构化地组织在线协作文档,实现知识的积累与沉淀,促进知识的复用与流通。' + seoKeywords: '云策文档,协作,文档,fantasticit,https://github.com/fantasticit/think' + # 预先连接的来源,空格分割(比如图片存储服务器) + dnsPrefetch: '//wipi.oss-cn-shanghai.aliyuncs.com' + # 站点地址(如:http://think.codingit.cn/),一定要设置,否则会出现 cookie、跨域等问题 + siteUrl: 'http://localhost:5001' + siteDomain: '' + +server: + prefix: '/api' + port: 5002 + collaborationPort: 5003 + maxDocumentVersion: 20 # 最大版本记录数 + logRetainDays: 3 # 日志保留天数,比如只保留近三天日志 + enableRateLimit: true # 是否限流 + rateLimitWindowMs: 60000 # 限流时间 + rateLimitMax: 1000 # 单位限流时间内单个 ip 最大访问数量 + email: # 邮箱服务,参考 http://help.163.com/09/1223/14/5R7P6CJ600753VB8.html?servCode=6010376 获取 SMTP 配置 + host: '' + port: 465 + user: '' + password: '' + admin: + name: 'admin' # 注意修改 + password: 'admin' # 注意修改 + email: 'admin@think.com' # 注意修改为真实邮箱地址 + +# 数据库配置 +db: + mysql: + host: 'mysql-for-think' + username: 'think' + password: 'think' + database: 'think' + port: 3306 + charset: 'utf8mb4' + timezone: '+08:00' + synchronize: true + redis: + host: 'redis-for-think' + port: '6379' + password: 'root' + +# oss 文件存储服务 +oss: + local: + enable: true + # 线上更改为服务端地址(如:https://api.codingit.cn) + server: 'http://localhost:5002' + s3: + enable: true + config: + # isp 提供商,可选 minio,s3,aliyun,tencent + cloudisp: 'minio' + accessKeyId: '' + secretAccessKey: '' + bucket: '' + region: '' + # 仅cloudisp 的值为 minio/s3 时配置,其它提供商为空 + forcePathStyle: false + # 仅cloudisp 的值为 minio 时配置,其它提供商为空 + endpoint: '' + +# jwt 配置 +jwt: + secretkey: 'zA_Think+KNOWLEDGE+WIKI+DOCUMENTS@2022' + expiresIn: '6h' diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..488956b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,60 @@ +version: '3' +services: + think: + build: + context: . + image: think + container_name: think + volumes: + - ./config:/app/config + - ./runtime/static:/app/packages/server/static + environment: + - TZ=Asia/Shanghai + expose: + - '5001-5003' + ports: + - '5001-5003:5001-5003' + depends_on: + - mysql + - redis + networks: + - think + mysql: + image: mysql:5.7 + restart: always + container_name: mysql-for-think + volumes: + - ./runtime/mysql:/var/lib/mysql + environment: + - TZ=Asia/Shanghai + - MYSQL_ROOT_PASSWORD=root + - MYSQL_DATABASE=think + - MYSQL_USER=think + - MYSQL_PASSWORD=think + expose: + - '3306' + ports: + - '3306:3306' + command: + - '--character-set-server=utf8mb4' + - '--collation-server=utf8mb4_unicode_ci' + networks: + - think + redis: + image: redis:latest + restart: always + container_name: redis-for-think + command: > + --requirepass root + expose: + - '6379' + ports: + - '6379:6379' + volumes: + - ./runtime/redis:/data + privileged: true + networks: + - think +networks: + think: + driver: bridge diff --git a/docker/start.sh b/docker/start.sh new file mode 100644 index 0000000..821e6cc --- /dev/null +++ b/docker/start.sh @@ -0,0 +1,8 @@ +#!/bin/sh +### Author:jonnyan404 +### date:2022年5月22日 + +pnpm run pm2 +pm2 startup +pm2 save +pm2 logs diff --git a/dynamic.yaml b/dynamic.yaml new file mode 100644 index 0000000..d3d3434 --- /dev/null +++ b/dynamic.yaml @@ -0,0 +1,12 @@ +# 以下为前台动态渲染的配置,修改后,无需打包,重启服务即可 +dynamic: + # 输入 logo 的图片地址 + logo: '' + appName: '云策文档' + appDescription: '云策文档是一款开源知识管理工具。通过独立的知识库空间,结构化地组织在线协作文档,实现知识的积累与沉淀,促进知识的复用与流通。' + appKeywords: '云策文档,协作,文档,fantasticit,https://github.com/fantasticit/think' + # 版权信息,可以是 HTML + copyrightInformation: '

Develop by fantasticit

' + # 外部跳转按钮配置 + externalButtonText: 'Github' + externalButtonURL: 'https://github.com/fantasticit/think' diff --git a/how-to-use-docker.md b/how-to-use-docker.md new file mode 100644 index 0000000..97e82b8 --- /dev/null +++ b/how-to-use-docker.md @@ -0,0 +1,178 @@ +# 使用 docker-compose 进行项目部署 + +> 目标:使用 http://dev.think.codingit.cn 访问客户端;使用 http://dev.api.codingit.cn 访问服务端。 + +## 1. 新建 config/prod.yaml + +```yaml +# 开发环境配置 +client: + port: 5001 + assetPrefix: '/' + apiUrl: 'http://dev.api.codingit.cn/api' + collaborationUrl: 'ws://dev.api.codingit.cn/think/wss' + # 以下为页面 meta 配置 + seoAppName: '云策文档' + seoDescription: '云策文档是一款开源知识管理工具。通过独立的知识库空间,结构化地组织在线协作文档,实现知识的积累与沉淀,促进知识的复用与流通。' + seoKeywords: '云策文档,协作,文档,fantasticit,https://github.com/fantasticit/think' + # 预先连接的来源,空格分割(比如图片存储服务器) + dnsPrefetch: '//wipi.oss-cn-shanghai.aliyuncs.com' + # 站点地址(如:http://think.codingit.cn/),一定要设置,否则会出现 cookie、跨域等问题 + siteUrl: 'http://dev.think.codingit.cn' + siteDomain: '' + +server: + prefix: '/api' + port: 5002 + collaborationPort: 5003 + maxDocumentVersion: 20 # 最大版本记录数 + logRetainDays: 3 # 日志保留天数,比如只保留近三天日志 + enableRateLimit: true # 是否限流 + rateLimitWindowMs: 60000 # 限流时间 + rateLimitMax: 1000 # 单位限流时间内单个 ip 最大访问数量 + email: # 邮箱服务,参考 http://help.163.com/09/1223/14/5R7P6CJ600753VB8.html?servCode=6010376 获取 SMTP 配置 + host: '' + port: 465 + user: '' + password: '' + admin: + name: 'admin' # 注意修改 + password: 'admin' # 注意修改 + email: 'admin@think.com' # 注意修改为真实邮箱地址 + +# 数据库配置 +db: + mysql: + host: 'mysql-for-think' + username: 'think' + password: 'think' + database: 'think' + port: 3306 + charset: 'utf8mb4' + timezone: '+08:00' + synchronize: true + redis: + host: 'redis-for-think' + port: '6379' + password: 'root' + +# oss 文件存储服务 +oss: + local: + enable: true + # 线上更改为服务端地址(如:https://api.codingit.cn) + server: 'http://dev.api.codingit.cn' + # 以下为各厂商 sdk 配置,不要修改字段,填入值即可 + tencent: + enable: false + config: + SecretId: '' + SecretKey: '' + Bucket: '' + Region: '' + aliyun: + enable: false + config: + accessKeyId: '' + accessKeySecret: '' + bucket: '' + https: true + region: '' + +# jwt 配置 +jwt: + secretkey: 'zA_Think+KNOWLEDGE+WIKI+DOCUMENTS@2022' + expiresIn: '6h' +``` + +## 2. 新建 nginx.conf + +```shell +upstream think_client { + server 127.0.0.1:5001; + keepalive 64; +} + +upstream think_server { + server 127.0.0.1:5002; + keepalive 64; +} + +upstream think_wss { + server 127.0.0.1:5003; + keepalive 64; +} + +server { + listen 80; + server_name dev.api.codingit.cn; + + client_max_body_size 100m; + + location /api { + proxy_pass http://think_server; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + } + + location /think/wss { + proxy_pass http://think_wss; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + } + + location /static/ { + proxy_pass http://think_server; + } +} + +server { + listen 80; + server_name dev.think.codingit.cn; + + location / { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header X-Nginx-Proxy true; + proxy_cache_bypass $http_upgrade; + proxy_pass http://think_client; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +3. 构建项目 + +```shell +cd think +docker-compose up -d +``` + +4. 可选:配置 hosts + +```shell +127.0.0.1 dev.api.codingit.cn +127.0.0.1 dev.think.codingit.cn +``` + +5. 访问 + +浏览器访问:http://dev.think.codingit.cn。 diff --git a/let-us-start.md b/let-us-start.md new file mode 100644 index 0000000..5dbce13 --- /dev/null +++ b/let-us-start.md @@ -0,0 +1,126 @@ +# think + +## 项目结构 + +本项目依赖 pnpm 使用 monorepo 形式进行代码组织,分包如下: + +- `@think/config`: 客户端、服务端、OSS、MySQL、Redis 等配置管理 +- `@think/domains`:领域模型数据定义 +- `@think/constants`:常量配置 +- `@think/server`:服务端 +- `@think/client`:客户端 + +## 项目依赖 + +为了将项目运行起来,至少需要以下依赖。 + +- nodejs >=16.5.0:推荐使用 nvm 安装 +- pnpm:安装 nodejs 后,运行 `npm i -g pnpm` 即可安装 +- pm2:安装 nodejs 后,运行 `npm i -g pm2` 即可安装 +- MySQL 5.7 +- Redis + +## 配置文件 + +项目所有的配置文件都在 `config` 目录下,其中 `dev.yaml` 中各字段均有解释,生产环境打包依赖 `prod.yaml`(需要自行修改为所需配置)。如果运行不起来,请对比 `dev.yaml` 检查配置。 + +**如果部署遇到问题,首先请确认相应配置是否正确!** + +## 项目运行 + +无论是开发环境,还是生产环境,项目运行成功后会在 3 个端口启动相应服务(默认 5001、5002、5003),具体端口号由 `config` 文件夹下的配置文件决定。 + +- 前台页面地址:`http://localhost:5001` +- 服务接口地址:`http://localhost:5002` +- 协作接口地址:`http://localhost:5003` + +### 本地开发 + +1. 安装数据库 + +首先安装 `MySQL` 和 `Redis`,推荐使用 docker 进行安装。 + +```bash +docker image pull mysql:5.7 +# m1 的 mac 可以用:docker image pull --platform linux/x86_64 mysql:5.7 +docker run -d --restart=always --name mysql-for-think-dev -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=think -e MYSQL_PASSWORD=think -e MYSQL_DATABASE=think mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci + +docker pull redis:latest +docker run --name redis-for-think-dev -p 6379:6379 -d redis --appendonly yes --requirepass "root" +``` + +2. 安装依赖并运行 + +```bash +git clone https://github.com/fantasticit/think.git +cd think +pnpm install +pnpm run build:dep +pnpm run dev +``` + +### 生产部署 + +首先确认在 `config` 文件夹下新建 `prod.yaml` 配置文件,然后运行以下命令。 + +**编译打包过程比较吃内存(大约 2G),小内存服务器建议本地构建后上传,可以在配置文件完成后,运行 build-output.sh,将打包后的 output 压缩发送到服务器后运行**。 + +```bash +git clone https://github.com/fantasticit/think.git +cd think +pnpm install # 安装依赖 +pnpm run build # 项目打包 + +# 以下如果没有安装 pm2,直接 pnpm run start,推荐使用 pm2 +pnpm run pm2 +pm2 startup +pm2 save +``` + +#### swc 导致打包失败 + +要么根据报错安装相关系统环境依赖,要么在`think/packages/client`目录下加入 **.babelrc** 文件。 + +文件内容: + +``` +{ + "presets": ["next/babel"] +} +``` + +### docker-compose + +也可以使用 docker-compose 进行项目部署。首先,根据需要修改 `docker-compose.yml` 中的数据库、Redis 相关用户名、密码等配置,然后,从 `config/docker-prod-sample.yaml` 复制出 `config/prod.yaml` 并修改其中对应的配置。 + +```bash +# 首次安装 +git clone https://github.com/fantasticit/think.git +cd think +docker-compose up -d + +# 二次更新升级 +cd think +git pull +docker-compose build +docker-compose up -d + +# 如果二次更新有问题 +docker-compose kill +docker-compose rm +docker image rm think # 删掉构建的镜像 +docker-compose up -d +``` + +更多细节可以查看 [how-to-use-docker.md](./how-to-use-docker.md)。 + +### nginx 配置参考 + +无论以何种方式进行项目部署,项目运行成功后会在 3 个端口启动服务(默认 5001、5002、5003,具体由配置文件决定)。`nginx` 配置参考 <[think/nginx.conf.sample](https://github.com/fantasticit/think/blob/main/nginx.conf.sample)>。 + +特别强调,在 `config` 文件夹的配置中 `client.siteUrl` 一定要配置正确,否则客户端可能无法正常运行。 + +```yaml +# 站点地址(如:http://think.codingit.cn/),一定要设置,否则会出现 cookie、跨域等问题 +siteUrl: 'http://localhost:5001' +``` diff --git a/nginx.conf.sample b/nginx.conf.sample new file mode 100644 index 0000000..4a9ba25 --- /dev/null +++ b/nginx.conf.sample @@ -0,0 +1,69 @@ +upstream think_client { + server 127.0.0.1:5001; + keepalive 64; +} + +upstream think_server { + server 127.0.0.1:5002; + keepalive 64; +} + +upstream think_wss { + server 127.0.0.1:5003; + keepalive 64; +} + +server { + listen 80; + server_name dev.api.codingit.cn; + + client_max_body_size 100m; + + location /api { + proxy_pass http://think_server; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + } + + location /think/wss { + proxy_pass http://think_wss; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + } + + location /static/ { + proxy_pass http://think_server; + } +} + +server { + listen 80; + server_name dev.think.codingit.cn; + + location / { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header X-Nginx-Proxy true; + proxy_cache_bypass $http_upgrade; + proxy_pass http://think_client; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e02235f --- /dev/null +++ b/package.json @@ -0,0 +1,65 @@ +{ + "name": "think", + "private": true, + "author": "fantasticit", + "scripts": { + "clean": "npx rimraf ./node_modules ./packages/**/node_modules ./packages/**/.next", + "dev": "concurrently 'pnpm:dev:*'", + "dev:server": "pnpm run --dir packages/server dev", + "dev:client": "pnpm run --dir packages/client dev", + "build": "pnpm build:dep && pnpm build:server && pnpm build:client", + "build:dep": "pnpm build:constants && pnpm build:domains && pnpm build:config", + "build:constants": "pnpm run --dir packages/constants build", + "build:domains": "pnpm run --dir packages/domains build", + "build:config": "pnpm run --dir packages/config build", + "build:server": "pnpm run --dir packages/server build", + "build:client": "pnpm run --dir packages/client build", + "start": "concurrently 'pnpm:start:*'", + "start:server": "pnpm run --dir packages/server start", + "start:client": "pnpm run --dir packages/client start", + "pm2": "pnpm run pm2:server && pnpm run pm2:client", + "pm2:server": "pnpm run --dir packages/server pm2", + "pm2:client": "pnpm run --dir packages/client pm2", + "lint": "concurrently 'pnpm:lint:*'", + "lint:client": "eslint --fix './packages/client/**/*.{ts,tsx,js,jsx}'", + "lint:server": "eslint --fix './packages/server/**/*.{ts,js}'", + "format": "concurrently 'pnpm:format:*'", + "format:ts": "prettier --write --parser typescript 'packages/**/*.{ts,tsx,js,jsx}'", + "format:css": "stylelint --fix --formatter verbose --allow-empty-input 'packages/**/*.{css,scss,sass}'", + "prepare": "husky install", + "precommit": "lint-staged" + }, + "dependencies": { + "concurrently": "^7.0.0", + "cross-env": "^7.0.3", + "fs-extra": "^10.0.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=16.5.0" + }, + "devDependencies": { + "@types/node": "^17.0.35", + "husky": "^7.0.4", + "lint-staged": "^12.4.1", + "prettier": "^2.3.2", + "stylelint": "^14.6.1", + "stylelint-config-css-modules": "^4.1.0", + "stylelint-config-prettier": "^9.0.3", + "stylelint-config-standard": "^25.0.0", + "stylelint-config-standard-scss": "^3.0.0", + "stylelint-order": "^5.0.0", + "stylelint-prettier": "^2.0.0", + "typescript": "^4.5.5" + }, + "lint-staged": { + "*.{ts,tsx,js,jsx}": "prettier --write", + "./packages/client/**/*.{ts,tsx,js,jsx}": [ + "eslint --fix" + ], + "./packages/server/src/*.{ts,js}": [ + "eslint --fix" + ], + "*.{css,scss,sass}": "stylelint --fix --formatter verbose --allow-empty-input" + } +} \ No newline at end of file diff --git a/packages/client/.eslintrc.js b/packages/client/.eslintrc.js new file mode 100644 index 0000000..1646ab3 --- /dev/null +++ b/packages/client/.eslintrc.js @@ -0,0 +1,75 @@ +module.exports = { + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'react-hooks', 'simple-import-sort', 'prettier'], + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + overrides: [ + { + files: ['*.ts', '*.tsx', '.js', '.jsx'], + parserOptions: { + project: ['./tsconfig.json'], + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + }, + ], + settings: { + 'react': { + version: 'detect', + }, + 'import/resolver': { + node: { + paths: ['src'], + extensions: ['.js', '.jsx', '.ts', '.tsx'], + }, + }, + }, + env: { + es6: true, + browser: true, + node: true, + }, + rules: { + 'func-names': 0, + 'no-shadow': 0, + '@typescript-eslint/no-shadow': 0, + '@typescript-eslint/no-unused-vars': [0, { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-use-before-define': 0, + '@typescript-eslint/ban-ts-ignore': 0, + '@typescript-eslint/no-empty-function': 0, + '@typescript-eslint/ban-ts-comment': 0, + '@typescript-eslint/no-var-requires': 0, + '@typescript-eslint/no-explicit-any': 0, + '@typescript-eslint/no-this-alias': 0, + '@typescript-eslint/explicit-module-boundary-types': 0, + '@typescript-eslint/ban-types': 0, + 'react-hooks/rules-of-hooks': 2, + 'react-hooks/exhaustive-deps': 2, + 'testing-library/no-unnecessary-act': 0, + 'prettier/prettier': ['error', {}, { usePrettierrc: true }], + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + 'simple-import-sort/imports': [ + 'error', + { + groups: [ + ['react'], + ['@douyinfe(.*)$'], + ['(@)?think(.*)$'], + ['(@)?tiptap(.*)$'], + ['^@?\\w'], + ['@/(.*)'], + ['^[./]'], + ['(.*).module.scss'], + ], + }, + ], + 'simple-import-sort/exports': 'error', + }, + ignorePatterns: ['dist/', 'node_modules', 'scripts', 'examples'], +}; diff --git a/packages/client/.gitignore b/packages/client/.gitignore new file mode 100644 index 0000000..a6e11c6 --- /dev/null +++ b/packages/client/.gitignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo + +# service-worker.js +/public/manifest.json +/public/service-worker.js +/public/workbox-*.js diff --git a/packages/client/README.md b/packages/client/README.md new file mode 100644 index 0000000..b5d08bd --- /dev/null +++ b/packages/client/README.md @@ -0,0 +1,3 @@ +# @think/client + +> 客户端。 diff --git a/packages/client/copy-diagram-resources.js b/packages/client/copy-diagram-resources.js new file mode 100755 index 0000000..581ab16 --- /dev/null +++ b/packages/client/copy-diagram-resources.js @@ -0,0 +1,85 @@ +/** + * 将流程图编辑器所需的资源拷贝到 .next 目录中,配合 nginx 运行 + */ +const fs = require('fs-extra'); +const { getConfig } = require('@think/config'); +const config = getConfig(); + +const buildManifestJson = () => { + return JSON.stringify({ + name: config.client.seoAppName, + short_name: config.client.seoAppName, + display: 'standalone', + start_url: '/', + theme_color: '#ffffff', + background_color: '#ffffff', + icons: [ + { + src: '/icon72.png', + sizes: '72x72', + type: 'image/png', + }, + { + src: '/icon96.png', + sizes: '96x96', + type: 'image/png', + }, + { + src: '/icon120.png', + sizes: '120x120', + type: 'image/png', + }, + { + src: '/icon128.png', + sizes: '128x128', + type: 'image/png', + }, + { + src: '/icon144.png', + sizes: '144x144', + type: 'image/png', + }, + { + src: '/icon152.png', + sizes: '152x152', + type: 'image/png', + }, + { + src: '/icon180.png', + sizes: '180x180', + type: 'image/png', + }, + { + src: '/icon192.png', + sizes: '192x192', + type: 'image/png', + }, + { + src: '/icon384.png', + sizes: '384x384', + type: 'image/png', + }, + { + src: '/icon512.png', + sizes: '512x512', + type: 'image/png', + }, + { + src: '/maskable.png', + sizes: '192x192', + type: 'image/png', + purpose: 'maskable', + }, + ], + }); +}; + +fs.copySync('./public', './.next', { + filter: (src) => { + // 生产环境使用 diagram.min.js + return !/diagram.js$/.test(src); + }, +}); + +fs.outputFileSync('./.next/manifest.json', buildManifestJson()); +fs.outputFileSync('./public/manifest.json', buildManifestJson()); diff --git a/packages/client/dev-server.js b/packages/client/dev-server.js new file mode 100755 index 0000000..bb30baa --- /dev/null +++ b/packages/client/dev-server.js @@ -0,0 +1,12 @@ +const { getConfig } = require('@think/config'); +const config = getConfig(); +const cli = require('next/dist/cli/next-dev'); + +const port = (config.client && config.client.port) || 5001; + +try { + cli.nextDev(['-p', port]); + console.log(`[think] 客户端已启动,端口:${port}`); +} catch (err) { + console.log(`[think] 客户端启动失败!${err.message || err}`); +} diff --git a/packages/client/global.d.ts b/packages/client/global.d.ts new file mode 100644 index 0000000..c449ed4 --- /dev/null +++ b/packages/client/global.d.ts @@ -0,0 +1,6 @@ +interface Window { + // drawio 绘图 + GraphViewer: any; + // 百度脑图 + kityminder: any; +} diff --git a/packages/client/next-env.d.ts b/packages/client/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/packages/client/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/packages/client/next.config.js b/packages/client/next.config.js new file mode 100644 index 0000000..35dd319 --- /dev/null +++ b/packages/client/next.config.js @@ -0,0 +1,43 @@ +const semi = require('@douyinfe/semi-next').default({}); +const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin'); + +const { getConfig } = require('@think/config'); +const config = getConfig(); + +const pwaRuntimeCaching = require('./pwa-cache'); +const withPWA = require('next-pwa')({ + disable: process.env.NODE_ENV !== 'production', + dest: 'public', + sw: 'service-worker.js', + runtimeCaching: pwaRuntimeCaching, +}); + +/** @type {import('next').NextConfig} */ +const nextConfig = semi({ + experimental: { + scrollRestoration: true, + legacyBrowsers: false, + browsersListForSwc: true, + }, + assetPrefix: config.assetPrefix, + env: { + SERVER_API_URL: config.client.apiUrl, + COLLABORATION_API_URL: config.client.collaborationUrl, + ENABLE_OSS_S3: config.oss.s3?.enable, + DNS_PREFETCH: (config.client.dnsPrefetch || '').split(' '), + SITE_URL: config.client.siteUrl, + }, + webpack: (config, { dev, isServer }) => { + config.resolve.plugins.push(new TsconfigPathsPlugin()); + return config; + }, + eslint: { + ignoreDuringBuilds: true, + }, + // FIXME: douyinfe 的第三方包存在 ts 类型错误! + typescript: { + ignoreBuildErrors: true, + }, +}); + +module.exports = withPWA(nextConfig); diff --git a/packages/client/package.json b/packages/client/package.json new file mode 100644 index 0000000..0975bc4 --- /dev/null +++ b/packages/client/package.json @@ -0,0 +1,133 @@ +{ + "name": "@think/client", + "private": true, + "scripts": { + "build": "rimraf .next && npx next telemetry disable && next build && node copy-diagram-resources.js", + "dev": "node dev-server.js", + "start": "cross-env NODE_ENV=production node prod-server.js", + "pm2": "pm2 start npm --name @think/client -- start" + }, + "dependencies": { + "@douyinfe/semi-icons": "^2.18.0", + "@douyinfe/semi-next": "^2.18.0", + "@douyinfe/semi-ui": "^2.18.0", + "@excalidraw/excalidraw": "^0.12.0", + "@hocuspocus/provider": "^1.0.0-alpha.29", + "@react-pdf-viewer/core": "3.9.0", + "@react-pdf-viewer/default-layout": "3.9.0", + "@react-pdf-viewer/locales": "^1.0.0", + "@think/config": "workspace:^1.0.0", + "@think/constants": "workspace:^1.0.0", + "@think/domains": "workspace:^1.0.0", + "@tiptap/core": "^2.0.0-beta.171", + "@tiptap/extension-blockquote": "^2.0.0-beta.26", + "@tiptap/extension-bold": "^2.0.0-beta.25", + "@tiptap/extension-bullet-list": "^2.0.0-beta.26", + "@tiptap/extension-code": "^2.0.0-beta.26", + "@tiptap/extension-code-block": "^2.0.0-beta.37", + "@tiptap/extension-code-block-lowlight": "^2.0.0-beta.68", + "@tiptap/extension-color": "^2.0.0-beta.9", + "@tiptap/extension-document": "^2.0.0-beta.15", + "@tiptap/extension-dropcursor": "^2.0.0-beta.25", + "@tiptap/extension-gapcursor": "^2.0.0-beta.34", + "@tiptap/extension-hard-break": "^2.0.0-beta.30", + "@tiptap/extension-heading": "^2.0.0-beta.26", + "@tiptap/extension-highlight": "^2.0.0-beta.33", + "@tiptap/extension-history": "^2.0.0-beta.21", + "@tiptap/extension-image": "^2.0.0-beta.25", + "@tiptap/extension-italic": "^2.0.0-beta.25", + "@tiptap/extension-link": "^2.0.0-beta.36", + "@tiptap/extension-list-item": "^2.0.0-beta.20", + "@tiptap/extension-mention": "^2.0.0-beta.95", + "@tiptap/extension-ordered-list": "^2.0.0-beta.27", + "@tiptap/extension-paragraph": "^2.0.0-beta.23", + "@tiptap/extension-placeholder": "^2.0.0-beta.47", + "@tiptap/extension-strike": "^2.0.0-beta.27", + "@tiptap/extension-subscript": "^2.0.0-beta.10", + "@tiptap/extension-superscript": "^2.0.0-beta.10", + "@tiptap/extension-table": "^2.0.0-beta.48", + "@tiptap/extension-table-cell": "^2.0.0-beta.20", + "@tiptap/extension-table-header": "^2.0.0-beta.22", + "@tiptap/extension-table-row": "^2.0.0-beta.19", + "@tiptap/extension-task-item": "^2.0.0-beta.31", + "@tiptap/extension-task-list": "^2.0.0-beta.26", + "@tiptap/extension-text": "^2.0.0-beta.15", + "@tiptap/extension-text-align": "^2.0.0-beta.29", + "@tiptap/extension-text-style": "^2.0.0-beta.23", + "@tiptap/extension-underline": "^2.0.0-beta.23", + "@tiptap/react": "^2.0.0-beta.107", + "@tiptap/suggestion": "^2.0.0-beta.90", + "axios": "^0.25.0", + "buffer-image-size": "^0.6.4", + "classnames": "^2.3.1", + "clone": "^2.1.2", + "cross-env": "^7.0.3", + "deep-equal": "^2.0.5", + "dompurify": "^2.3.5", + "file-saver": "^2.0.5", + "htmldiff-js": "^1.0.5", + "interactjs": "^1.10.11", + "katex": "^0.15.2", + "kity": "^2.0.4", + "lib0": "^0.2.47", + "lodash.pick": "^4.4.0", + "lowlight": "^2.5.0", + "markdown-it": "^12.3.2", + "markdown-it-anchor": "^8.4.1", + "markdown-it-container": "^3.0.0", + "markdown-it-emoji": "^2.0.0", + "markdown-it-sub": "^1.0.0", + "markdown-it-sup": "^1.0.0", + "next": "12.1.0", + "next-pwa": "^5.6.0", + "pdfjs-dist": "3.1.81", + "prosemirror-codemark": "^0.4.2", + "prosemirror-commands": "^1.3.0", + "prosemirror-markdown": "^1.7.0", + "prosemirror-model": "^1.16.1", + "prosemirror-schema-list": "^1.1.6", + "prosemirror-state": "^1.3.4", + "prosemirror-tables": "^1.1.1", + "prosemirror-utils": "^0.9.6", + "prosemirror-view": "^1.23.6", + "react": "17.0.2", + "react-countdown": "^2.3.2", + "react-dom": "17.0.2", + "react-full-screen": "^1.1.1", + "react-helmet": "^6.1.0", + "react-lazy-load-image-component": "^1.5.4", + "react-query": "^3.39.0", + "react-split-pane": "^0.1.92", + "react-visibility-sensor": "^5.1.1", + "requestidlecallback-polyfill": "^1.0.2", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.29", + "spark-md5": "^3.0.2", + "timeago.js": "^4.0.2", + "tippy.js": "^6.3.7", + "toggle-selection": "^1.0.6", + "viewerjs": "^1.10.4", + "yjs": "^13.5.24" + }, + "devDependencies": { + "@types/deep-equal": "^1.0.4", + "@types/lodash.pick": "^4.4.9", + "@types/node": "17.0.13", + "@types/react": "17.0.38", + "@types/react-dom": "17.0.11", + "@types/react-lazy-load-image-component": "^1.6.3", + "@typescript-eslint/eslint-plugin": "^5.21.0", + "@typescript-eslint/parser": "^5.21.0", + "copy-webpack-plugin": "11.0.0", + "eslint": "^8.14.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.29.4", + "eslint-plugin-react-hooks": "^4.5.0", + "eslint-plugin-simple-import-sort": "^7.0.0", + "fs-extra": "^10.0.0", + "tsconfig-paths-webpack-plugin": "^3.5.2", + "typescript": "^4.8.4" + } +} diff --git a/packages/client/prod-server.js b/packages/client/prod-server.js new file mode 100755 index 0000000..88dbd11 --- /dev/null +++ b/packages/client/prod-server.js @@ -0,0 +1,12 @@ +const { getConfig } = require('@think/config'); +const config = getConfig(); +const cli = require('next/dist/cli/next-start'); + +const port = (config.client && config.client.port) || 5001; + +try { + cli.nextStart(['-p', port]); + console.log(`[think] 客户端已启动,端口:${port}`); +} catch (err) { + console.log(`[think] 客户端启动失败!${err.message || err}`); +} diff --git a/packages/client/public/diagram.min.js b/packages/client/public/diagram.min.js new file mode 100644 index 0000000..5be0237 --- /dev/null +++ b/packages/client/public/diagram.min.js @@ -0,0 +1,3 @@ +window.urlParams=window.urlParams||{},window.MAX_REQUEST_SIZE=window.MAX_REQUEST_SIZE||10485760,window.MAX_AREA=window.MAX_AREA||225e6,window.mxBasePath="/diagram",window.RESOURCES_PATH="/diagram/resources",window.STENCIL_PATH="/diagram/stencils",window.IMAGE_PATH="/diagram/images",window.STYLE_PATH="/diagram/styles",window.CSS_PATH="/diagram/styles";var HoverIcons=function(){},mxCellEditorGetInitialValue=function(){},mxCellEditorGetCurrentValue=function(){},mxGraphHandlerIsValidDropTarget=function(){},Format=function(){},BaseFormatPanel=function(){},ArrangePanel=function(){},TextFormatPanel=function(){},StyleFormatPanel=function(){},DiagramStylePanel=function(){},DiagramFormatPanel=function(){},Menus=function(){},mxJSColor={dir:"",bindClass:"color",binding:!0,preloading:!0,install:function(){},init:function(){mxJSColor.preloading&&mxJSColor.preload()},getDir:function(){var t;return mxJSColor.dir||(t=mxJSColor.detectDir(),mxJSColor.dir=!1!==t?t:"jscolor/"),mxJSColor.dir},detectDir:function(){for(var t=location.href,e=document.getElementsByTagName("base"),n=0;no[t]&&-s[t]+i[t]+l[t]/2>o[t]/2&&0<=i[t]+l[t]-r[t]?(i[t],l[t],r[t]):i[t],-s[e]+i[e]+l[e]+r[e]-a+a*n>o[e]?-s[e]+i[e]+l[e]/2>o[e]/2&&0<=i[e]+l[e]-a-a*n?(i[e],l[e]):(i[e],l[e]):0<=i[e]+l[e]-a+a*n?(i[e],l[e]):(i[e],l[e])):(i[t],i[e],l[e]),drawPicker(0,0)}},this.importColor=function(){valueElement?this.adjust?!this.required&&/^\s*$/.test(valueElement.value)?(valueElement.value="",styleElement.style.backgroundImage=styleElement.jscStyle.backgroundImage,styleElement.style.backgroundColor=styleElement.jscStyle.backgroundColor,styleElement.style.color=styleElement.jscStyle.color,this.exportColor(leaveValue|leaveStyle)):this.fromString(valueElement.value)||this.exportColor():this.fromString(valueElement.value,leaveValue)||(styleElement.style.backgroundImage=styleElement.jscStyle.backgroundImage,styleElement.style.backgroundColor=styleElement.jscStyle.backgroundColor,styleElement.style.color=styleElement.jscStyle.color,this.exportColor(leaveValue|leaveStyle)):this.exportColor()},this.exportColor=function(t){var e;t&leaveValue||!valueElement||(e=this.toString(),this.caps&&(e=e.toUpperCase()),this.hash&&(e="#"+e),valueElement.value=e),t&leaveStyle||!styleElement||(styleElement.style.backgroundImage="none",styleElement.style.backgroundColor="#"+this.toString(),styleElement.style.color=.213*this.rgb[0]+.715*this.rgb[1]+.072*this.rgb[2]<.5?"#FFF":"#000"),t&leavePad||!isPickerOwner()||redrawPad(),t&leaveSld||!isPickerOwner()||redrawSld()},this.fromHSV=function(t,e,n,i){t<0&&(t=0)||6>>6:(n<65536?e[l++]=224|n>>>12:(e[l++]=240|n>>>18,e[l++]=128|n>>>12&63),e[l++]=128|n>>>6&63),e[l++]=128|63&n);return e},n.buf2binstring=function(t){return d(t,t.length)},n.binstring2buf=function(t){for(var e=new a.Buf8(t.length),n=0,i=e.length;n>10&1023,o[n++]=56320|1023&i)}return d(o,n)},n.utf8border=function(t,e){var n;for((e=e||t.length)>t.length&&(e=t.length),n=e-1;0<=n&&128==(192&t[n]);)n--;return!(n<0)&&0!==n&&n+h[t[n]]>e?n:e}},{"./common":3}],5:[function(t,e,n){"use strict";e.exports=function(t,e,n,i){for(var l=65535&t|0,s=t>>>16&65535|0,o=0;0!==n;){for(n-=o=2e3>>1:t>>>1;e[n]=t}return e}();e.exports=function(t,e,n,i){var l=r,s=i+n;t^=-1;for(var o=i;o>>8^l[255&(t^e[o])];return-1^t}},{}],8:[function(t,e,n){"use strict";var r,u=t("../utils/common"),a=t("./trees"),p=t("./adler32"),m=t("./crc32"),i=t("./messages"),h=0,d=0,c=-2,l=2,g=8,s=286,o=30,x=19,y=2*s+1,f=15,C=3,v=258,E=v+C+1,S=42,w=113;function b(t,e){return t.msg=i[e],e}function T(t){return(t<<1)-(4t.avail_out&&(n=t.avail_out),0!==n&&(u.arraySet(t.output,e.pending_buf,e.pending_out,n,t.next_out),t.next_out+=n,e.pending_out+=n,t.total_out+=n,t.avail_out-=n,e.pending-=n,0===e.pending&&(e.pending_out=0))}function I(t,e){a._tr_flush_block(t,0<=t.block_start?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,L(t.strm)}function M(t,e){t.pending_buf[t.pending++]=e}function R(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function P(t,e){var n,i,l=t.max_chain_length,s=t.strstart,o=t.prev_length,r=t.nice_match,a=t.strstart>t.w_size-E?t.strstart-(t.w_size-E):0,h=t.window,d=t.w_mask,u=t.prev,p=t.strstart+v,m=h[s+o-1],c=h[s+o];t.prev_length>=t.good_match&&(l>>=2),r>t.lookahead&&(r=t.lookahead);do{if(h[(n=e)+o]===c&&h[n+o-1]===m&&h[n]===h[s]&&h[++n]===h[s+1]){for(s+=2,n++;h[++s]===h[++n]&&h[++s]===h[++n]&&h[++s]===h[++n]&&h[++s]===h[++n]&&h[++s]===h[++n]&&h[++s]===h[++n]&&h[++s]===h[++n]&&h[++s]===h[++n]&&sa&&0!=--l);return o<=t.lookahead?o:t.lookahead}function U(t){var e,n,i,l,s,o,r,a,h,d=t.w_size;do{if(l=t.window_size-t.lookahead-t.strstart,t.strstart>=d+(d-E)){for(u.arraySet(t.window,t.window,d,d,0),t.match_start-=d,t.strstart-=d,t.block_start-=d,e=n=t.hash_size;i=t.head[--e],t.head[e]=d<=i?i-d:0,--n;);for(e=n=d;i=t.prev[--e],t.prev[e]=d<=i?i-d:0,--n;);l+=d}if(0===t.strm.avail_in)break;if(o=t.strm,r=t.window,a=t.strstart+t.lookahead,h=void 0,l<(h=o.avail_in)&&(h=l),n=0===h?0:(o.avail_in-=h,u.arraySet(r,o.input,o.next_in,h,a),1===o.state.wrap?o.adler=p(o.adler,r,h,a):2===o.state.wrap&&(o.adler=m(o.adler,r,h,a)),o.next_in+=h,o.total_in+=h,h),t.lookahead+=n,t.lookahead+t.insert>=C)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=(t.ins_h<=C&&(t.ins_h=(t.ins_h<=C)if(i=a._tr_tally(t,t.strstart-t.match_start,t.match_length-C),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=C){for(t.match_length--;t.strstart++,t.ins_h=(t.ins_h<=C&&(t.ins_h=(t.ins_h<=C&&t.match_length<=t.prev_length){for(l=t.strstart+t.lookahead-C,i=a._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-C),t.lookahead-=t.prev_length-1,t.prev_length-=2;++t.strstart<=l&&(t.ins_h=(t.ins_h<t.pending_buf_size-5&&(n=t.pending_buf_size-5);;){if(t.lookahead<=1){if(U(t),0===t.lookahead&&e===h)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var i=t.block_start+n;if((0===t.strstart||t.strstart>=i)&&(t.lookahead=t.strstart-i,t.strstart=i,I(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-E&&(I(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?(I(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&(I(t,!1),t.strm.avail_out),1)}),new H(4,4,8,4,O),new H(4,5,16,8,O),new H(4,6,32,32,O),new H(4,4,16,16,N),new H(8,16,32,32,N),new H(8,16,128,128,N),new H(8,32,128,256,N),new H(32,128,258,1024,N),new H(32,258,258,4096,N)],n.deflateInit=function(t,e){return k(t,e,g,15,8,0)},n.deflateInit2=k,n.deflateReset=G,n.deflateResetKeep=D,n.deflateSetHeader=function(t,e){return!t||!t.state||2!==t.state.wrap?c:(t.state.gzhead=e,d)},n.deflate=function(t,e){var n,i,l,s;if(!t||!t.state||5>8&255),M(n,n.gzhead.time>>16&255),M(n,n.gzhead.time>>24&255),M(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),M(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(M(n,255&n.gzhead.extra.length),M(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(t.adler=m(t.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(M(n,0),M(n,0),M(n,0),M(n,0),M(n,0),M(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),M(n,3),n.status=w)):(s=g+(n.w_bits-8<<4)<<8,s|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(s|=32),s+=31-s%31,n.status=w,R(n,s),0!==n.strstart&&(R(n,t.adler>>>16),R(n,65535&t.adler)),t.adler=1)),69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(t.adler=m(t.adler,n.pending_buf,n.pending-i,i)),L(t),i=n.pending,n.pending!==n.pending_buf_size));)M(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(t.adler=m(t.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(t.adler=m(t.adler,n.pending_buf,n.pending-i,i)),L(t),i=n.pending,n.pending===n.pending_buf_size)){l=1;break}}while(M(n,l=n.gzindexi&&(t.adler=m(t.adler,n.pending_buf,n.pending-i,i)),0===l&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(t.adler=m(t.adler,n.pending_buf,n.pending-i,i)),L(t),i=n.pending,n.pending===n.pending_buf_size)){l=1;break}}while(M(n,l=n.gzindexi&&(t.adler=m(t.adler,n.pending_buf,n.pending-i,i)),0===l&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&L(t),n.pending+2<=n.pending_buf_size&&(M(n,255&t.adler),M(n,t.adler>>8&255),t.adler=0,n.status=w)):n.status=w),0!==n.pending){if(L(t),0===t.avail_out)return n.last_flush=-1,d}else if(0===t.avail_in&&T(e)<=T(o)&&4!==e)return b(t,-5);if(666===n.status&&0!==t.avail_in)return b(t,-5);if(0!==t.avail_in||0!==n.lookahead||e!==h&&666!==n.status){var o=2===n.strategy?function(t,e){for(var n;;){if(0===t.lookahead&&(U(t),0===t.lookahead)){if(e===h)return 1;break}if(t.match_length=0,n=a._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,n&&(I(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?(I(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(I(t,!1),0===t.strm.avail_out)?1:2}(n,e):3===n.strategy?function(t,e){for(var n,i,l,s,o=t.window;;){if(t.lookahead<=v){if(U(t),t.lookahead<=v&&e===h)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=C&&0t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=C?(n=a._tr_tally(t,1,t.match_length-C),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(n=a._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),n&&(I(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?(I(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(I(t,!1),0===t.strm.avail_out)?1:2}(n,e):r[n.level].func(n,e);if(3!==o&&4!==o||(n.status=666),1===o||3===o)return 0===t.avail_out&&(n.last_flush=-1),d;if(2===o&&(1===e?a._tr_align(n):5!==e&&(a._tr_stored_block(n,0,0,!1),3===e&&(A(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),L(t),0===t.avail_out))return n.last_flush=-1,d}return 4!==e?d:n.wrap<=0?1:(2===n.wrap?(M(n,255&t.adler),M(n,t.adler>>8&255),M(n,t.adler>>16&255),M(n,t.adler>>24&255),M(n,255&t.total_in),M(n,t.total_in>>8&255),M(n,t.total_in>>16&255),M(n,t.total_in>>24&255)):(R(n,t.adler>>>16),R(n,65535&t.adler)),L(t),0=n.w_size&&(0===s&&(A(n.head),n.strstart=0,n.block_start=0,n.insert=0),a=new u.Buf8(n.w_size),u.arraySet(a,e,h-n.w_size,n.w_size,0),e=a,h=n.w_size),o=t.avail_in,r=t.next_in,a=t.input,t.avail_in=h,t.next_in=0,t.input=e,U(n);n.lookahead>=C;){for(i=n.strstart,l=n.lookahead-(C-1);n.ins_h=(n.ins_h<>>=i=n>>>24,S-=i,0==(i=n>>>16&255))m[p++]=65535&n;else{if(!(16&i)){if(0==(64&i)){n=w[(65535&n)+(E&(1<>>=i,S-=i),S<15&&(E+=d[h++]<>>=i=n>>>24,S-=i,!(16&(i=n>>>16&255))){if(0==(64&i)){n=b[(65535&n)+(E&(1<>>=i,S-=i,(i=p-c)>3,E&=(1<<(S-=l<<3))-1,t.next_in=h,t.next_out=p,t.avail_in=h>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new M.Buf16(320),this.work=new M.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=G,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new M.Buf32(i),e.distcode=e.distdyn=new M.Buf32(l),e.sane=1,e.back=-1,_):D}function r(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,o(t)):D}function a(t,e){var n,i;return t&&t.state?(i=t.state,e<0?(n=0,e=-e):(n=1+(e>>4),e<48&&(e&=15)),e&&(e<8||15=l.wsize?(M.arraySet(l.window,e,n-l.wsize,l.wsize,0),l.wnext=0,l.whave=l.wsize):(i<(t=l.wsize-l.wnext)&&(t=i),M.arraySet(l.window,e,n-i,t,l.wnext),(i-=t)?(M.arraySet(l.window,e,n-i,i,0),l.wnext=i,l.whave=l.wsize):(l.wnext+=t,l.wnext===l.wsize&&(l.wnext=0),l.whave>>8&255,n.check=P(n.check,L,2,0),d=h=0,n.mode=2;break}if(n.flags=0,n.head&&(n.head.done=!1),!(1&n.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",n.mode=30;break}if(8!=(15&h)){t.msg="unknown compression method",n.mode=30;break}if(d-=4,S=8+(15&(h>>>=4)),0===n.wbits)n.wbits=S;else if(S>n.wbits){t.msg="invalid window size",n.mode=30;break}n.dmax=1<>8&1),512&n.flags&&(L[0]=255&h,L[1]=h>>>8&255,n.check=P(n.check,L,2,0)),d=h=0,n.mode=3;case 3:for(;d<32;){if(0===r)break t;r--,h+=i[s++]<>>8&255,L[2]=h>>>16&255,L[3]=h>>>24&255,n.check=P(n.check,L,4,0)),d=h=0,n.mode=4;case 4:for(;d<16;){if(0===r)break t;r--,h+=i[s++]<>8),512&n.flags&&(L[0]=255&h,L[1]=h>>>8&255,n.check=P(n.check,L,2,0)),d=h=0,n.mode=5;case 5:if(1024&n.flags){for(;d<16;){if(0===r)break t;r--,h+=i[s++]<>>8&255,n.check=P(n.check,L,2,0)),d=h=0}else n.head&&(n.head.extra=null);n.mode=6;case 6:if(1024&n.flags&&(r<(m=n.length)&&(m=r),m&&(n.head&&(S=n.head.extra_len-n.length,n.head.extra||(n.head.extra=new Array(n.head.extra_len)),M.arraySet(n.head.extra,i,s,m,S)),512&n.flags&&(n.check=P(n.check,i,m,s)),r-=m,s+=m,n.length-=m),n.length))break t;n.length=0,n.mode=7;case 7:if(2048&n.flags){if(0===r)break t;for(m=0;S=i[s+m++],n.head&&S&&n.length<65536&&(n.head.name+=String.fromCharCode(S)),S&&m>9&1,n.head.done=!0),t.adler=n.check=0,n.mode=12;break;case 10:for(;d<32;){if(0===r)break t;r--,h+=i[s++]<>>=7&d,d-=7&d,n.mode=27;break}for(;d<3;){if(0===r)break t;r--,h+=i[s++]<>>=1)){case 0:n.mode=14;break;case 1:if(function(t){if(B){var e;for(V=new M.Buf32(512),F=new M.Buf32(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(O(N,t.lens,0,288,V,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;O(H,t.lens,0,32,F,0,t.work,{bits:5}),B=!1}t.lencode=V,t.lenbits=9,t.distcode=F,t.distbits=5}(n),n.mode=20,6!==e)break;h>>>=2,d-=2;break t;case 2:n.mode=17;break;case 3:t.msg="invalid block type",n.mode=30}h>>>=2,d-=2;break;case 14:for(h>>>=7&d,d-=7&d;d<32;){if(0===r)break t;r--,h+=i[s++]<>>16^65535)){t.msg="invalid stored block lengths",n.mode=30;break}if(n.length=65535&h,d=h=0,n.mode=15,6===e)break t;case 15:n.mode=16;case 16:if(m=n.length){if(r>>=5,d-=5,n.ndist=1+(31&h),h>>>=5,d-=5,n.ncode=4+(15&h),h>>>=4,d-=4,286>>=3,d-=3}for(;n.have<19;)n.lens[I[n.have++]]=0;if(n.lencode=n.lendyn,n.lenbits=7,b={bits:n.lenbits},w=O(0,n.lens,0,19,n.lencode,0,n.work,b),n.lenbits=b.bits,w){t.msg="invalid code lengths set",n.mode=30;break}n.have=0,n.mode=19;case 19:for(;n.have>>16&255,f=65535&A,!((x=A>>>24)<=d);){if(0===r)break t;r--,h+=i[s++]<>>=x,d-=x,n.lens[n.have++]=f;else{if(16===f){for(T=x+2;d>>=x,d-=x,0===n.have){t.msg="invalid bit length repeat",n.mode=30;break}S=n.lens[n.have-1],m=3+(3&h),h>>>=2,d-=2}else if(17===f){for(T=x+3;d>>=x)),h>>>=3,d-=3}else{for(T=x+7;d>>=x)),h>>>=7,d-=7}if(n.have+m>n.nlen+n.ndist){t.msg="invalid bit length repeat",n.mode=30;break}for(;m--;)n.lens[n.have++]=S}}if(30===n.mode)break;if(0===n.lens[256]){t.msg="invalid code -- missing end-of-block",n.mode=30;break}if(n.lenbits=9,b={bits:n.lenbits},w=O(N,n.lens,0,n.nlen,n.lencode,0,n.work,b),n.lenbits=b.bits,w){t.msg="invalid literal/lengths set",n.mode=30;break}if(n.distbits=6,n.distcode=n.distdyn,b={bits:n.distbits},w=O(H,n.lens,n.nlen,n.ndist,n.distcode,0,n.work,b),n.distbits=b.bits,w){t.msg="invalid distances set",n.mode=30;break}if(n.mode=20,6===e)break t;case 20:n.mode=21;case 21:if(6<=r&&258<=a){t.next_out=o,t.avail_out=a,t.next_in=s,t.avail_in=r,n.hold=h,n.bits=d,U(t,p),o=t.next_out,l=t.output,a=t.avail_out,s=t.next_in,i=t.input,r=t.avail_in,h=n.hold,d=n.bits,12===n.mode&&(n.back=-1);break}for(n.back=0;y=(A=n.lencode[h&(1<>>16&255,f=65535&A,!((x=A>>>24)<=d);){if(0===r)break t;r--,h+=i[s++]<>C)])>>>16&255,f=65535&A,!(C+(x=A>>>24)<=d);){if(0===r)break t;r--,h+=i[s++]<>>=C,d-=C,n.back+=C}if(h>>>=x,d-=x,n.back+=x,n.length=f,0===y){n.mode=26;break}if(32&y){n.back=-1,n.mode=12;break}if(64&y){t.msg="invalid literal/length code",n.mode=30;break}n.extra=15&y,n.mode=22;case 22:if(n.extra){for(T=n.extra;d>>=n.extra,d-=n.extra,n.back+=n.extra}n.was=n.length,n.mode=23;case 23:for(;y=(A=n.distcode[h&(1<>>16&255,f=65535&A,!((x=A>>>24)<=d);){if(0===r)break t;r--,h+=i[s++]<>C)])>>>16&255,f=65535&A,!(C+(x=A>>>24)<=d);){if(0===r)break t;r--,h+=i[s++]<>>=C,d-=C,n.back+=C}if(h>>>=x,d-=x,n.back+=x,64&y){t.msg="invalid distance code",n.mode=30;break}n.offset=f,n.extra=15&y,n.mode=24;case 24:if(n.extra){for(T=n.extra;d>>=n.extra,d-=n.extra,n.back+=n.extra}if(n.offset>n.dmax){t.msg="invalid distance too far back",n.mode=30;break}n.mode=25;case 25:if(0===a)break t;if(m=p-a,n.offset>m){if((m=n.offset-m)>n.whave&&n.sane){t.msg="invalid distance too far back",n.mode=30;break}c=m>n.wnext?(m-=n.wnext,n.wsize-m):n.wnext-m,m>n.length&&(m=n.length),g=n.window}else g=l,c=o-n.offset,m=n.length;for(am?(g=U[O+o[C]],I[M+o[C]]):(g=96,0),a=1<>b)+(h-=a)]=c<<24|g<<16|x|0,0!==h;);for(a=1<>=1;if(0!==a?(L&=a-1,L+=a):L=0,C++,0==--R[f]){if(f===E)break;f=e[n+o[C]]}if(S>>7)]}function w(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function b(t,e,n){t.bi_valid>s-n?(t.bi_buf|=e<>s-t.bi_valid,t.bi_valid+=n-s):(t.bi_buf|=e<>>=1,n<<=1,0<--e;);return n>>>1}function L(t,e,n){for(var i,l=new Array(x+1),s=0,o=1;o<=x;o++)l[o]=s=s+n[o-1]<<1;for(i=0;i<=e;i++){var r=t[2*i+1];0!==r&&(t[2*i]=A(l[r]++,r))}}function I(t){for(var e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0}function M(t){8>1;1<=e;e--)P(t,l,e);for(i=r;e=t.heap[1],t.heap[1]=t.heap[t.heap_len--],P(t,l,1),n=t.heap[1],t.heap[--t.heap_max]=e,t.heap[--t.heap_max]=n,l[2*i]=l[2*e]+l[2*n],t.depth[i]=(t.depth[e]>=t.depth[n]?t.depth[e]:t.depth[n])+1,l[2*e+1]=l[2*n+1]=i,t.heap[1]=i++,P(t,l,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t){for(var e,n,i,l,s,o=g.dyn_tree,r=g.max_code,a=g.stat_desc.static_tree,h=g.stat_desc.has_stree,d=g.stat_desc.extra_bits,u=g.stat_desc.extra_base,p=g.stat_desc.max_length,m=0,c=0;c<=x;c++)t.bl_count[c]=0;for(o[2*t.heap[t.heap_max]+1]=0,e=t.heap_max+1;e<573;e++)p<(c=o[2*o[2*(n=t.heap[e])+1]+1]+1)&&(c=p,m++),o[2*n+1]=c,r>=7;s<30;s++)for(C[s]=i<<7,t=0;t<1<>>=1)if(1&e&&0!==t.dyn_ltree[2*n])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(n=32;n<256;n++)if(0!==t.dyn_ltree[2*n])return 1;return 0}(t)),O(t,t.l_desc),O(t,t.d_desc),o=function(t){var e;for(N(t,t.dyn_ltree,t.l_desc.max_code),N(t,t.dyn_dtree,t.d_desc.max_code),O(t,t.bl_desc),e=18;3<=e&&0===t.bl_tree[2*r[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),l=t.opt_len+3+7>>>3,(s=t.static_len+3+7>>>3)<=l&&(l=s)):l=s=n+5,n+4<=l&&-1!==e?D(t,e,n,i):4===t.strategy||s===l?(b(t,2+(i?1:0),3),U(t,d,u)):(b(t,4+(i?1:0),3),function(t,e,n,i){var l;for(b(t,e-257,5),b(t,n-1,5),b(t,i-4,4),l=0;l>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&n,t.last_lit++,0===e?t.dyn_ltree[2*n]++:(t.matches++,e--,t.dyn_ltree[2*(m[n]+256+1)]++,t.dyn_dtree[2*S(e)]++),t.last_lit===t.lit_bufsize-1},n._tr_align=function(t){b(t,2,3),T(t,256,d),16===(t=t).bi_valid?(w(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}},{"../utils/common":3}],15:[function(t,e,n){"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],"/":[function(t,e,n){"use strict";var i={};(0,t("./lib/utils/common").assign)(i,t("./lib/deflate"),t("./lib/inflate"),t("./lib/zlib/constants")),e.exports=i},{"./lib/deflate":1,"./lib/inflate":2,"./lib/utils/common":3,"./lib/zlib/constants":6}]},{},[])("/")});var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(t,e){var n,i,l,s,o,r,a="",h=0;for((e=null!=e&&e)||(t=Base64._utf8_encode(t));h>2,s=(3&r)<<4|(n=t.charCodeAt(h++))>>4,o=(15&n)<<2|(i=t.charCodeAt(h++))>>6,r=63&i,isNaN(n)?o=r=64:isNaN(i)&&(r=64),a=a+this._keyStr.charAt(l)+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(r);return a},decode:function(t,e){e=null!=e&&e;var n,i,l,s,o,r="",a=0;for(t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");a>4,i=(15&l)<<4|(s=this._keyStr.indexOf(t.charAt(a++)))>>2,l=(3&s)<<6|(o=this._keyStr.indexOf(t.charAt(a++))),r+=String.fromCharCode(n),64!=s&&(r+=String.fromCharCode(i)),64!=o&&(r+=String.fromCharCode(l));return e||(r=Base64._utf8_decode(r)),r},_utf8_encode:function(t){t=t.replace(/\r\n/g,"\n");for(var e="",n=0;n>6|192):(e+=String.fromCharCode(i>>12|224),e+=String.fromCharCode(i>>6&63|128)),e+=String.fromCharCode(63&i|128))}return e},_utf8_decode:function(t){for(var e="",n=0,i=c1=c2=0;n>10),56320+(1023&e))):e==e?String.fromCharCode(e):t[1]<" "?"":t[1]}function d(t,e){return'"'+t.replace(/[\u0000-\u001f\\\"<>]/g,e)+'"'}function u(t){return e[t]||(e[t]="\\"+t.charCodeAt(0).toString(16)+" ")}function p(t){return n[t]||(n[t]=(t<""?"%0":"%")+t.charCodeAt(0).toString(16))}"undefined"!=typeof window&&(window.cssSchema=M),e={"\\":"\\\\"},n={"\\":"%5c"},a=RegExp("\\uFEFF|U[+][0-9A-F?]{1,6}(?:-[0-9A-F]{1,6})?|url[(][\\t\\n\\f ]*(?:\"(?:'|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*\"|'(?:\"|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*'|(?:[\\t\\x21\\x23-\\x26\\x28-\\x5b\\x5d-\\x7e]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*)[\\t\\n\\f ]*[)]|(?!url[(])-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*[(]|(?:@?-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))|#)(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*|\"(?:'|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*\"|'(?:\"|[^'\"\\n\\f\\\\]|\\\\[\\s\\S])*'|[-+]?(?:[0-9]+(?:[.][0-9]+)?|[.][0-9]+)(?:%|-?(?:[a-zA-Z_]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))(?:[a-zA-Z0-9_-]|[\\u0080-\\ud7ff\\ue000-\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]|\\\\(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff]))*)?|\x3c!--|--\x3e|[\\t\\n\\f ]+|/(?:[*][^*]*[*]+(?:[^/][^*]*[*]+)*/|/[^\\n\\f]*)|[~|^$*]=|[^\"'\\\\/]|/(?![/*])","gi"),i=RegExp("\\\\(?:(?:[0-9a-fA-F]{1,6}[\\t\\n\\f ]?|[\\u0020-\\u007e\\u0080-\\ud7ff\\ue000\\ufffd]|[\\ud800-\\udbff][\\udc00-\\udfff])|[\\n\\f])","g"),h=RegExp("^url\\([\\t\\n\\f ]*[\"']?|[\"']?[\\t\\n\\f ]*\\)$","gi"),I=function(t){return t.replace(i,l)},s=function(t){for(var e=0,n=" ",i=0,l=(t=(""+t).replace(/\r\n?/g,"\n").match(a)||[]).length;i>4&15)+"0123456789ABCDEF".charAt(15&t)}function o(t){if(t===F)return F;for(var e,t=t.replace(/(^|\/)\.(?:\/|$)/g,"$1").replace(/\/{2,}/g,"/"),n=l;(e=t.replace(n,"$1"))!=t;t=e);return t}function i(t,e){var n=t.T(),i=e.K();i?n.ga(e.j):i=e.X(),i?n.da(e.n):i=e.Y(),i?n.ea(e.k):i=e.$();var l=e.g,s=o(l);return i?(n.ca(e.V()),s=s&&s.replace(d,"")):(i=!!l)?47!==s.charCodeAt(0)&&(s=o(n.g||"").replace(d,""),s=o(((t=s.lastIndexOf("/")+1)?s.substring(0,t):"")+o(l)).replace(d,"")):(s=s&&s.replace(d,""))!==l&&n.G(s),i?n.G(s):i=e.aa(),i?n.O(e.l):i=e.Z(),i&&n.fa(e.o),n}function h(t,e,n,i,l,s,o){this.j=t,this.n=e,this.k=n,this.h=i,this.g=l,this.l=s,this.o=o}function e(t){return"string"==typeof t&&0]/g,i={"\n":"%0a","\f":"%0c","\r":"%0d",'"':"%22","'":"%27","(":"%28",")":"%29","*":"%2a","<":"%3c",">":"%3e"},l=/^(?:([^:/?# ]+):)?/,s=/^(?:https?|mailto|data)$/i;L={},C=function t(e,n,i,l,s){var e=A(e),o=M[e];if(o&&"object"==typeof o){for(var r=o.cssPropBits,a=80&r,h=1536&r,d=NaN,u=0,p=0;u"]=d["+"]=d["~"]=d,v=function(c,g,r){function t(t,e){function n(t,e,n){var i,l,s,o=V,r="";t])/g,i=t+"";if(N)i=i.split(n);else{for(var l,s=[],o=0;(l=n.exec(i))!==F;)s.push(i.substring(o,l.index)),s.push(l[0]),o=l.index+l[0].length;s.push(i.substring(o)),i=s}a(r,i,0,{r:B,C:B},e)}}function v(t,e,n,i,l){return function(){a(t,e,n,i,l)}}function a(t,e,n,i,l){try{t.H&&0==n&&t.H(l);for(var s,o,r,a=e.length;n"===e[n+1]?(n+=2,r=s[1].toLowerCase(),t.t&&t.t(r,l,_,v(t,e,n,i,l))):(m=t,c=l,g=_,h=i,n=(d=S(u=e,p=n))?(m.t&&m.t(d.name,c,g,v(m,u,p,h,c)),d.next):u.length):t.e&&t.e("</",l,_,v(t,e,n,i,l));break;case"<":(s=/^([-\w:]+)\s*\/?/.exec(f))?s[0].length===f.length&&">"===e[n+1]?(n+=2,r=s[1].toLowerCase(),t.w&&t.w(r,[],l,_,v(t,e,n,i,l)),(d=C.f[r])&H&&(n=E(e,{name:r,next:n,c:d},t,l,_,i))):(p=t,m=l,c=_,g=i,n=(x=S(u=e,n))?(p.w&&p.w(x.name,x.R,m,c,v(p,u,x.next,g,m)),x.c&H?E(u,x,p,m,c,g):x.next):u.length):t.e&&t.e("<",l,_,v(t,e,n,i,l));break;case"\x3c!--":if(!i.C){for(o=n+1;o"!==e[o]||!/--$/.test(e[o-1]));o++);o"!==e[o];o++);o"!==e[o];o++);o":t.e&&t.e(">",l,_,v(t,e,n,i,l));break;case"":break;default:t.e&&t.e(y,l,_,v(t,e,n,i,l))}}t.B&&t.B(l)}catch(t){if(t!==_)throw t}}function E(t,e,n,i,l,s){var o=t.length;D.hasOwnProperty(e.name)||(D[e.name]=RegExp("^"+e.name+"(?:[\\s\\/]|$)","i"));for(var r=D[e.name],a=e.next,h=e.next+1;h"!==t[s];s++)l+=t[s];if(!(o<=s)){for(var r=[];""!==l;)if(n=O.exec(l))if(n[4]&&!n[5]||n[6]&&!n[7]){for(var n=n[4]||n[6],a=B,l=[l,t[s++]];s"===t[s])break}else 0<=t[s].indexOf(n)&&(a=V);l.push(t[s])}if(o<=s)break;l=l.join("")}else{var h,a=n[1].toLowerCase(),d=n[2]?(34!==(h=(d=n[3]).charCodeAt(0))&&39!==h||(d=d.substr(1,d.length-2)),u(d.replace(T,""))):"";r.push(a,d),l=l.substr(n[0].length)}else l=l.replace(/^[\s\S][^a-z\s]*/,"");return i.R=r,i.next=s+1,i}}function i(h){function t(t,e){u||e.push(t)}var d,u;return n({startDoc:function(){d=[],u=B},startTag:function(t,e,n){if(!u&&C.f.hasOwnProperty(t)){var i=C.f[t];if(!(i&C.c.FOLDABLE)){var l,s,o=h(t,e);if(o){if("object"!=typeof o)throw Error("tagPolicy did not return object (old API?)");if(!("attribs"in o))throw Error("tagPolicy gave no attribs");e=o.attribs,o="tagName"in o?(l=o.tagName,C.f[l]):(l=t,i),i&C.c.OPTIONAL_ENDTAG&&(!(s=d[d.length-1])||s.D!==t||s.v===l&&t===l||n.push("")),i&C.c.EMPTY||d.push({D:t,v:l}),n.push("<",l),t=0;for(s=e.length;t"),i&C.c.EMPTY&&!(o&C.c.EMPTY)&&n.push("")}else u=!(i&C.c.EMPTY)}}},endTag:function(t,e){if(u)u=B;else if(C.f.hasOwnProperty(t)){var n=C.f[t];if(!(n&(C.c.EMPTY|C.c.FOLDABLE))){if(n&C.c.OPTIONAL_ENDTAG)for(n=d.length;0<=--n;){var i=d[n].D;if(i===t)break;if(!(C.f[i]&C.c.OPTIONAL_ENDTAG))return}else for(n=d.length;0<=--n&&d[n].D!==t;);if(!(n<0)){for(i=d.length;--i>n;){var l=d[i].v;C.f[l]&C.c.OPTIONAL_ENDTAG||e.push("")}n")}}}},pcdata:t,rcdata:t,cdata:t,endDoc:function(t){for(;d.length;d.length--)t.push("")}})}function m(t,e,n,i,l){if(!l)return F;try{var s=z.parse(""+t);if(s&&(!s.K()||G.test(s.W()))){s=l(s,e,n,i);return s?s.toString():F}}catch(t){}return F}function c(t,e,n,i,l){var s;n||t(e+" removed",{S:"removed",tagName:e}),i!==l&&(s="changed",i&&!l?s="removed":!i&&l&&(s="added"),t(e+"."+n+" "+s,{S:s,tagName:e,la:n,oldValue:i,newValue:l}))}function g(t,e,n){return e=e+"::"+n,t.hasOwnProperty(e)?t[e]:(e="*::"+n,t.hasOwnProperty(e)?t[e]:void 0)}function s(t,e,i,n,l){for(var s=0;s",GT:">",amp:"&",AMP:"&",quot:'"',apos:"'",nbsp:" "},h=/^#(\d+)$/,f=/^#x([0-9A-Fa-f]+)$/,w=/^[A-Za-z][A-za-z0-9]+$/,b="undefined"!=typeof window&&window.document?window.document.createElement("textarea"):F,T=/\0/g,A=/&(#[0-9]+|#[xX][0-9A-Fa-f]+|\w+);/g,L=/^(#[0-9]+|#[xX][0-9A-Fa-f]+|\w+);/,I=/&/g,M=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi,R=/[<]/g,P=/>/g,U=/\"/g,O=/^\s*([-.:\w]+)(?:\s*(=)\s*((")[^"]*("|$)|(')[^']*('|$)|(?=[a-z][-\w]*\s*=)|[^"'\s]*))?/i,N=3==="a,b".split(/(,)/).length,H=C.c.CDATA|C.c.RCDATA,_={},D={},G=/^(?:https?|mailto|data)$/i,t={};return t.pa=t.escapeAttrib=p,t.ra=t.makeHtmlSanitizer=i,t.sa=t.makeSaxParser=n,t.ta=t.makeTagPolicy=l,t.wa=t.normalizeRCData=d,t.xa=t.sanitize=function(t,e,n,i){return o(t,l(e,n,i))},t.ya=t.sanitizeAttribs=s,t.za=t.sanitizeWithPolicy=o,t.Ba=t.unescapeEntities=u,t}(S),c=r.sanitize;"undefined"!=typeof window&&(window.html=r,window.html_sanitize=c)}();var mxClient={VERSION:"4.2.2",IS_IE:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE"),IS_IE6:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE 6"),IS_IE11:null!=navigator.userAgent&&!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:null!=navigator.userAgent&&!!navigator.userAgent.match(/Edge\//),IS_QUIRKS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("MSIE")&&(null==document.documentMode||5==document.documentMode),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Mozilla/")&&navigator.userAgent.indexOf("MSIE")<0&&navigator.userAgent.indexOf("Edge/")<0,IS_OP:null!=navigator.userAgent&&(0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/")),IS_OT:null!=navigator.userAgent&&0<=navigator.userAgent.indexOf("Presto/")&&navigator.userAgent.indexOf("Presto/2.4.")<0&&navigator.userAgent.indexOf("Presto/2.3.")<0&&navigator.userAgent.indexOf("Presto/2.2.")<0&&navigator.userAgent.indexOf("Presto/2.1.")<0&&navigator.userAgent.indexOf("Presto/2.0.")<0&&navigator.userAgent.indexOf("Presto/1.")<0,IS_SF:/Apple Computer, Inc/.test(navigator.vendor),IS_ANDROID:0<=navigator.appVersion.indexOf("Android"),IS_IOS:/iP(hone|od|ad)/.test(navigator.platform),IS_GC:/Google Inc/.test(navigator.vendor),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:"undefined"!=typeof InstallTrigger,IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&navigator.userAgent.indexOf("Firefox/1.")<0&&navigator.userAgent.indexOf("Firefox/2.")<0||0<=navigator.userAgent.indexOf("Iceweasel/")&&navigator.userAgent.indexOf("Iceweasel/1.")<0&&navigator.userAgent.indexOf("Iceweasel/2.")<0||0<=navigator.userAgent.indexOf("SeaMonkey/")&&navigator.userAgent.indexOf("SeaMonkey/1.")<0||0<=navigator.userAgent.indexOf("Iceape/")&&navigator.userAgent.indexOf("Iceape/1.")<0,IS_VML:"MICROSOFT INTERNET EXPLORER"==navigator.appName.toUpperCase(),IS_SVG:"MICROSOFT INTERNET EXPLORER"!=navigator.appName.toUpperCase(),NO_FO:!document.createElementNS||"[object SVGForeignObjectElement]"!=document.createElementNS("http://www.w3.org/2000/svg","foreignObject")||0<=navigator.userAgent.indexOf("Opera/"),IS_WIN:0'):((l=n.createElement("link")).setAttribute("rel",t),l.setAttribute("href",e),l.setAttribute("charset","UTF-8"),l.setAttribute("type","text/css"),i&&l.setAttribute("id",i),n.getElementsByTagName("head")[0].appendChild(l))},loadResources:function(t,e){var n=mxClient.defaultBundles.length;function i(){0==--n&&t()}for(var l=0;l<\/script>')}};"undefined"==typeof mxLoadResources&&(window.mxLoadResources=!0),"undefined"==typeof mxForceIncludes&&(window.mxForceIncludes=!1),"undefined"==typeof mxResourceExtension&&(window.mxResourceExtension=".txt"),"undefined"==typeof mxLoadStylesheets&&(window.mxLoadStylesheets=!0),mxClient.basePath=window.mxBasePath||".","undefined"!=typeof mxImageBasePath&&0/g,">"),null!=e&&!e||(t=t.replace(/\n/g," ")),t},isVml:function(t){return null!=t&&"urn:schemas-microsoft-com:vml"==t.tagUrn},getXml:function(t,e){var n="";return mxClient.IS_IE||mxClient.IS_IE11?n=mxUtils.getPrettyXml(t,"","",""):null!=window.XMLSerializer?n=(new XMLSerializer).serializeToString(t):null!=t.xml&&(n=t.xml.replace(/\r\n\t[\t]*/g,"").replace(/>\r\n/g,">").replace(/\r\n/g,"\n")),e=e||" ",n=n.replace(/\n/g,e)},getPrettyXml:function(t,e,n,i,l){var s,o=[];if(null!=t)if(e=null!=e?e:" ",n=null!=n?n:"",i=null!=i?i:"\n",null!=t.namespaceURI&&t.namespaceURI!=l&&(l=t.namespaceURI,null==t.getAttribute("xmlns")&&t.setAttribute("xmlns",t.namespaceURI)),t.nodeType==mxConstants.NODETYPE_DOCUMENT)o.push(mxUtils.getPrettyXml(t.documentElement,e,n,i,l));else if(t.nodeType==mxConstants.NODETYPE_DOCUMENT_FRAGMENT){if(null!=(r=t.firstChild))for(;null!=r;)o.push(mxUtils.getPrettyXml(r,e,n,i,l)),r=r.nextSibling}else if(t.nodeType==mxConstants.NODETYPE_COMMENT)0<(s=mxUtils.getTextContent(t)).length&&o.push(n+"\x3c!--"+s+"--\x3e"+i);else if(t.nodeType==mxConstants.NODETYPE_TEXT)0<(s=mxUtils.trim(mxUtils.getTextContent(t))).length&&o.push(n+mxUtils.htmlEntities(s,!1)+i);else if(t.nodeType==mxConstants.NODETYPE_CDATA)0<(s=mxUtils.getTextContent(t)).length&&o.push(n+""+i);null!=r;)o.push(mxUtils.getPrettyXml(r,e,n+e,i,l)),r=r.nextSibling;o.push(n+""+i)}else o.push(" />"+i)}return o.join("")},extractTextWithWhitespace:function(t){var l=["BLOCKQUOTE","DIV","H1","H2","H3","H4","H5","H6","OL","P","PRE","TABLE","UL"],s=[];return function t(e){if(1!=e.length||"BR"!=e[0].nodeName&&"\n"!=e[0].innerHTML)for(var n=0;n"==i.innerHTML.toLowerCase()?s.push("\n"):(3===i.nodeType||4===i.nodeType?0"):(e.push(">"),e.push(t.innerHTML),e.push("")),e.join("")}:function(t){return null==t?"":(new XMLSerializer).serializeToString(t)},write:function(t,e){e=t.ownerDocument.createTextNode(e);return null!=t&&t.appendChild(e),e},writeln:function(t,e){e=t.ownerDocument.createTextNode(e);return null!=t&&(t.appendChild(e),t.appendChild(document.createElement("br"))),e},br:function(t,e){e=e||1;for(var n=null,i=0;i [Function]\n":"object"==typeof t[e]?n+=e+" => ["+mxUtils.getFunctionName(t[e].constructor)+"]\n":n+=e+" = "+t[e]+"\n"}catch(t){n+=e+"="+t.message}return n},toRadians:function(t){return Math.PI*t/180},toDegree:function(t){return 180*t/Math.PI},arcToCurves:function(t,e,n,i,l,s,o,r,a){if(r-=t,a-=e,0===n||0===i)return O;var h=o,d=l;n=Math.abs(n),i=Math.abs(i);var u=-r/2,p=-a/2,m=Math.cos(d*Math.PI/180),c=Math.sin(d*Math.PI/180),g=m*u+c*p,x=-1*c*u+m*p,o=g*g,l=x*x,d=n*n,u=i*i,p=o/d+l/u,o=(u=1>1,e|=(t&mxConstants.DIRECTION_MASK_EAST)>>3},findNearestSegment:function(t,e,n){var i=-1;if(0s.distSq)&&(i=s))}return null!=i?i.p:null},rectangleIntersectsSegment:function(t,e,n){var i=t.y,l=t.x,s=i+t.height,o=l+t.width,r=e.x,a=n.x;if(e.x>n.x&&(r=n.x,a=e.x),o=e&&t.y<=n&&t.y+t.height>=n},intersects:function(t,e){var n=t.width,i=t.height,l=e.width,s=e.height;if(l<=0||s<=0||n<=0||i<=0)return!1;var o=t.x,r=t.y,t=e.x,e=e.y;return s+=e,n+=o,i+=r,((l+=t)",d=document.getElementsByTagName("base"),u=0;u";for(u=0;u',h+='
',h+=t.container.innerHTML,h+="
",e.writeln(h),e.close()}else{e.writeln("");for(d=document.getElementsByTagName("base"),u=0;u'),e.close();var c=e.createElement("div");c.position="absolute",c.overflow="hidden",c.style.width=l+"px",c.style.height=s+"px";var g=e.createElement("div");g.style.position="absolute",g.style.left=r+"px",g.style.top=a+"px";for(var x=t.container.firstChild,y=null;null!=x;){var f=x.cloneNode(!0);x==t.view.drawPane.ownerSVGElement?(c.appendChild(f),y=f):g.appendChild(f),x=x.nextSibling}e.body.appendChild(c),null!=g.firstChild&&e.body.appendChild(g),null!=y&&(y.style.minWidth="",y.style.minHeight="",y.firstChild.setAttribute("transform","translate("+r+","+a+")"))}return mxUtils.removeCursors(e.body),e},printScreen:function(t){var e=window.open();t.getGraphBounds();mxUtils.show(t,e.document);t=function(){e.focus(),e.print(),e.close()};mxClient.IS_GC?e.setTimeout(t,500):t()},popup:function(t,e){var n,i;e?((n=document.createElement("div")).style.overflow="scroll",n.style.width="636px",n.style.height="460px",(i=document.createElement("pre")).innerHTML=mxUtils.htmlEntities(t,!1).replace(/\n/g,"
").replace(/ /g," "),n.appendChild(i),(n=new mxWindow("Popup Window",n,document.body.clientWidth/2-320,Math.max(document.body.clientHeight||0,document.documentElement.clientHeight)/2-240,640,480,!1,!0)).setClosable(!0),n.setVisible(!0)):mxClient.IS_NS?((n=window.open()).document.writeln("
"+mxUtils.htmlEntities(t)+"").replace(/ /g," "),n.document.body.appendChild(i))},alert:function(t){alert(t)},prompt:function(t,e){return prompt(t,null!=e?e:"")},confirm:function(t){return confirm(t)},error:function(t,e,n,i){var l=document.createElement("div");l.style.padding="20px";var s=document.createElement("img");s.setAttribute("src",i||mxUtils.errorImage),s.setAttribute("valign","bottom"),s.style.verticalAlign="middle",l.appendChild(s),l.appendChild(document.createTextNode(" ")),l.appendChild(document.createTextNode(" ")),l.appendChild(document.createTextNode(" ")),mxUtils.write(l,t);var s=document.body.clientWidth,t=document.body.clientHeight||document.documentElement.clientHeight,o=new mxWindow(mxResources.get(mxUtils.errorResource)||mxUtils.errorResource,l,(s-e)/2,t/4,e,null,!1,!0);return n&&(mxUtils.br(l),e=document.createElement("p"),n=document.createElement("button"),mxClient.IS_IE?n.style.cssText="float:right":n.setAttribute("style","float:right"),mxEvent.addListener(n,"click",function(t){o.destroy()}),mxUtils.write(n,mxResources.get(mxUtils.closeResource)||mxUtils.closeResource),e.appendChild(n),l.appendChild(e),mxUtils.br(l),o.setClosable(!0)),o.setVisible(!0),o},makeDraggable:function(t,e,n,l,i,s,o,r,a,h){n=new mxDragSource(t,n);return n.dragOffset=new mxPoint(null!=i?i:0,null!=s?s:mxConstants.TOOLTIP_VERTICAL_OFFSET),n.autoscroll=o,n.setGuidesEnabled(!1),null!=a&&(n.highlightDropTargets=a),null!=h&&(n.getDropTarget=h),n.getGraphForEvent=function(t){return"function"==typeof e?e(t):e},null!=l&&(n.createDragElement=function(){return l.cloneNode(!0)},r&&(n.createPreviewElement=function(t){var e=l.cloneNode(!0),n=parseInt(e.style.width),i=parseInt(e.style.height);return e.style.width=Math.round(n*t.view.scale)+"px",e.style.height=Math.round(i*t.view.scale)+"px",e})),n}},mxConstants={DEFAULT_HOTSPOT:.3,MIN_HOTSPOT_SIZE:8,MAX_HOTSPOT_SIZE:0,RENDERING_HINT_EXACT:"exact",RENDERING_HINT_FASTER:"faster",RENDERING_HINT_FASTEST:"fastest",DIALECT_SVG:"svg",DIALECT_VML:"vml",DIALECT_MIXEDHTML:"mixedHtml",DIALECT_PREFERHTML:"preferHtml",DIALECT_STRICTHTML:"strictHtml",NS_SVG:"http://www.w3.org/2000/svg",NS_XHTML:"http://www.w3.org/1999/xhtml",NS_XLINK:"http://www.w3.org/1999/xlink",SHADOWCOLOR:"gray",VML_SHADOWCOLOR:"gray",SHADOW_OFFSET_X:2,SHADOW_OFFSET_Y:3,SHADOW_OPACITY:1,NODETYPE_ELEMENT:1,NODETYPE_ATTRIBUTE:2,NODETYPE_TEXT:3,NODETYPE_CDATA:4,NODETYPE_ENTITY_REFERENCE:5,NODETYPE_ENTITY:6,NODETYPE_PROCESSING_INSTRUCTION:7,NODETYPE_COMMENT:8,NODETYPE_DOCUMENT:9,NODETYPE_DOCUMENTTYPE:10,NODETYPE_DOCUMENT_FRAGMENT:11,NODETYPE_NOTATION:12,TOOLTIP_VERTICAL_OFFSET:16,DEFAULT_VALID_COLOR:"#00FF00",DEFAULT_INVALID_COLOR:"#FF0000",OUTLINE_HIGHLIGHT_COLOR:"#00FF00",OUTLINE_HIGHLIGHT_STROKEWIDTH:5,HIGHLIGHT_STROKEWIDTH:3,HIGHLIGHT_SIZE:2,HIGHLIGHT_OPACITY:100,CURSOR_MOVABLE_VERTEX:"move",CURSOR_MOVABLE_EDGE:"move",CURSOR_LABEL_HANDLE:"default",CURSOR_TERMINAL_HANDLE:"pointer",CURSOR_BEND_HANDLE:"crosshair",CURSOR_VIRTUAL_BEND_HANDLE:"crosshair",CURSOR_CONNECT:"pointer",HIGHLIGHT_COLOR:"#00FF00",CONNECT_TARGET_COLOR:"#0000FF",INVALID_CONNECT_TARGET_COLOR:"#FF0000",DROP_TARGET_COLOR:"#0000FF",VALID_COLOR:"#00FF00",INVALID_COLOR:"#FF0000",EDGE_SELECTION_COLOR:"#00FF00",VERTEX_SELECTION_COLOR:"#00FF00",VERTEX_SELECTION_STROKEWIDTH:1,EDGE_SELECTION_STROKEWIDTH:1,VERTEX_SELECTION_DASHED:!0,EDGE_SELECTION_DASHED:!0,GUIDE_COLOR:"#FF0000",GUIDE_STROKEWIDTH:1,OUTLINE_COLOR:"#0099FF",OUTLINE_STROKEWIDTH:mxClient.IS_IE?2:3,HANDLE_SIZE:6,LABEL_HANDLE_SIZE:4,HANDLE_FILLCOLOR:"#00FF00",HANDLE_STROKECOLOR:"black",LABEL_HANDLE_FILLCOLOR:"yellow",CONNECT_HANDLE_FILLCOLOR:"#0000FF",LOCKED_HANDLE_FILLCOLOR:"#FF0000",OUTLINE_HANDLE_FILLCOLOR:"#00FFFF",OUTLINE_HANDLE_STROKECOLOR:"#0033FF",DEFAULT_FONTFAMILY:"Arial,Helvetica",DEFAULT_FONTSIZE:11,DEFAULT_TEXT_DIRECTION:"",LINE_HEIGHT:1.2,WORD_WRAP:"normal",ABSOLUTE_LINE_HEIGHT:!1,DEFAULT_FONTSTYLE:0,DEFAULT_STARTSIZE:40,DEFAULT_MARKERSIZE:6,DEFAULT_IMAGESIZE:24,ENTITY_SEGMENT:30,RECTANGLE_ROUNDING_FACTOR:.15,LINE_ARCSIZE:20,ARROW_SPACING:0,ARROW_WIDTH:30,ARROW_SIZE:30,PAGE_FORMAT_A4_PORTRAIT:new mxRectangle(0,0,827,1169),PAGE_FORMAT_A4_LANDSCAPE:new mxRectangle(0,0,1169,827),PAGE_FORMAT_LETTER_PORTRAIT:new mxRectangle(0,0,850,1100),PAGE_FORMAT_LETTER_LANDSCAPE:new mxRectangle(0,0,1100,850),NONE:"none",STYLE_PERIMETER:"perimeter",STYLE_SOURCE_PORT:"sourcePort",STYLE_TARGET_PORT:"targetPort",STYLE_PORT_CONSTRAINT:"portConstraint",STYLE_PORT_CONSTRAINT_ROTATION:"portConstraintRotation",STYLE_SOURCE_PORT_CONSTRAINT:"sourcePortConstraint",STYLE_TARGET_PORT_CONSTRAINT:"targetPortConstraint",STYLE_OPACITY:"opacity",STYLE_FILL_OPACITY:"fillOpacity",STYLE_STROKE_OPACITY:"strokeOpacity",STYLE_TEXT_OPACITY:"textOpacity",STYLE_TEXT_DIRECTION:"textDirection",STYLE_OVERFLOW:"overflow",STYLE_ORTHOGONAL:"orthogonal",STYLE_EXIT_X:"exitX",STYLE_EXIT_Y:"exitY",STYLE_EXIT_DX:"exitDx",STYLE_EXIT_DY:"exitDy",STYLE_EXIT_PERIMETER:"exitPerimeter",STYLE_ENTRY_X:"entryX",STYLE_ENTRY_Y:"entryY",STYLE_ENTRY_DX:"entryDx",STYLE_ENTRY_DY:"entryDy",STYLE_ENTRY_PERIMETER:"entryPerimeter",STYLE_WHITE_SPACE:"whiteSpace",STYLE_ROTATION:"rotation",STYLE_FILLCOLOR:"fillColor",STYLE_POINTER_EVENTS:"pointerEvents",STYLE_SWIMLANE_FILLCOLOR:"swimlaneFillColor",STYLE_MARGIN:"margin",STYLE_GRADIENTCOLOR:"gradientColor",STYLE_GRADIENT_DIRECTION:"gradientDirection",STYLE_STROKECOLOR:"strokeColor",STYLE_SEPARATORCOLOR:"separatorColor",STYLE_STROKEWIDTH:"strokeWidth",STYLE_ALIGN:"align",STYLE_VERTICAL_ALIGN:"verticalAlign",STYLE_LABEL_WIDTH:"labelWidth",STYLE_LABEL_POSITION:"labelPosition",STYLE_VERTICAL_LABEL_POSITION:"verticalLabelPosition",STYLE_IMAGE_ASPECT:"imageAspect",STYLE_IMAGE_ALIGN:"imageAlign",STYLE_IMAGE_VERTICAL_ALIGN:"imageVerticalAlign",STYLE_GLASS:"glass",STYLE_IMAGE:"image",STYLE_IMAGE_WIDTH:"imageWidth",STYLE_IMAGE_HEIGHT:"imageHeight",STYLE_IMAGE_BACKGROUND:"imageBackground",STYLE_IMAGE_BORDER:"imageBorder",STYLE_FLIPH:"flipH",STYLE_FLIPV:"flipV",STYLE_NOLABEL:"noLabel",STYLE_NOEDGESTYLE:"noEdgeStyle",STYLE_LABEL_BACKGROUNDCOLOR:"labelBackgroundColor",STYLE_LABEL_BORDERCOLOR:"labelBorderColor",STYLE_LABEL_PADDING:"labelPadding",STYLE_INDICATOR_SHAPE:"indicatorShape",STYLE_INDICATOR_IMAGE:"indicatorImage",STYLE_INDICATOR_COLOR:"indicatorColor",STYLE_INDICATOR_STROKECOLOR:"indicatorStrokeColor",STYLE_INDICATOR_GRADIENTCOLOR:"indicatorGradientColor",STYLE_INDICATOR_SPACING:"indicatorSpacing",STYLE_INDICATOR_WIDTH:"indicatorWidth",STYLE_INDICATOR_HEIGHT:"indicatorHeight",STYLE_INDICATOR_DIRECTION:"indicatorDirection",STYLE_SHADOW:"shadow",STYLE_SEGMENT:"segment",STYLE_ENDARROW:"endArrow",STYLE_STARTARROW:"startArrow",STYLE_ENDSIZE:"endSize",STYLE_STARTSIZE:"startSize",STYLE_SWIMLANE_LINE:"swimlaneLine",STYLE_ENDFILL:"endFill",STYLE_STARTFILL:"startFill",STYLE_DASHED:"dashed",STYLE_DASH_PATTERN:"dashPattern",STYLE_FIX_DASH:"fixDash",STYLE_ROUNDED:"rounded",STYLE_CURVED:"curved",STYLE_ARCSIZE:"arcSize",STYLE_ABSOLUTE_ARCSIZE:"absoluteArcSize",STYLE_SOURCE_PERIMETER_SPACING:"sourcePerimeterSpacing",STYLE_TARGET_PERIMETER_SPACING:"targetPerimeterSpacing",STYLE_PERIMETER_SPACING:"perimeterSpacing",STYLE_SPACING:"spacing",STYLE_SPACING_TOP:"spacingTop",STYLE_SPACING_LEFT:"spacingLeft",STYLE_SPACING_BOTTOM:"spacingBottom",STYLE_SPACING_RIGHT:"spacingRight",STYLE_HORIZONTAL:"horizontal",STYLE_DIRECTION:"direction",STYLE_ANCHOR_POINT_DIRECTION:"anchorPointDirection",STYLE_ELBOW:"elbow",STYLE_FONTCOLOR:"fontColor",STYLE_FONTFAMILY:"fontFamily",STYLE_FONTSIZE:"fontSize",STYLE_FONTSTYLE:"fontStyle",STYLE_ASPECT:"aspect",STYLE_AUTOSIZE:"autosize",STYLE_FOLDABLE:"foldable",STYLE_EDITABLE:"editable",STYLE_BACKGROUND_OUTLINE:"backgroundOutline",STYLE_BENDABLE:"bendable",STYLE_MOVABLE:"movable",STYLE_RESIZABLE:"resizable",STYLE_RESIZE_WIDTH:"resizeWidth",STYLE_RESIZE_HEIGHT:"resizeHeight",STYLE_ROTATABLE:"rotatable",STYLE_CLONEABLE:"cloneable",STYLE_DELETABLE:"deletable",STYLE_SHAPE:"shape",STYLE_EDGE:"edgeStyle",STYLE_JETTY_SIZE:"jettySize",STYLE_SOURCE_JETTY_SIZE:"sourceJettySize",STYLE_TARGET_JETTY_SIZE:"targetJettySize",STYLE_LOOP:"loopStyle",STYLE_ORTHOGONAL_LOOP:"orthogonalLoop",STYLE_ROUTING_CENTER_X:"routingCenterX",STYLE_ROUTING_CENTER_Y:"routingCenterY",FONT_BOLD:1,FONT_ITALIC:2,FONT_UNDERLINE:4,FONT_STRIKETHROUGH:8,SHAPE_RECTANGLE:"rectangle",SHAPE_ELLIPSE:"ellipse",SHAPE_DOUBLE_ELLIPSE:"doubleEllipse",SHAPE_RHOMBUS:"rhombus",SHAPE_LINE:"line",SHAPE_IMAGE:"image",SHAPE_ARROW:"arrow",SHAPE_ARROW_CONNECTOR:"arrowConnector",SHAPE_LABEL:"label",SHAPE_CYLINDER:"cylinder",SHAPE_SWIMLANE:"swimlane",SHAPE_CONNECTOR:"connector",SHAPE_ACTOR:"actor",SHAPE_CLOUD:"cloud",SHAPE_TRIANGLE:"triangle",SHAPE_HEXAGON:"hexagon",ARROW_CLASSIC:"classic",ARROW_CLASSIC_THIN:"classicThin",ARROW_BLOCK:"block",ARROW_BLOCK_THIN:"blockThin",ARROW_OPEN:"open",ARROW_OPEN_THIN:"openThin",ARROW_OVAL:"oval",ARROW_DIAMOND:"diamond",ARROW_DIAMOND_THIN:"diamondThin",ALIGN_LEFT:"left",ALIGN_CENTER:"center",ALIGN_RIGHT:"right",ALIGN_TOP:"top",ALIGN_MIDDLE:"middle",ALIGN_BOTTOM:"bottom",DIRECTION_NORTH:"north",DIRECTION_SOUTH:"south",DIRECTION_EAST:"east",DIRECTION_WEST:"west",TEXT_DIRECTION_DEFAULT:"",TEXT_DIRECTION_AUTO:"auto",TEXT_DIRECTION_LTR:"ltr",TEXT_DIRECTION_RTL:"rtl",DIRECTION_MASK_NONE:0,DIRECTION_MASK_WEST:1,DIRECTION_MASK_NORTH:2,DIRECTION_MASK_SOUTH:4,DIRECTION_MASK_EAST:8,DIRECTION_MASK_ALL:15,ELBOW_VERTICAL:"vertical",ELBOW_HORIZONTAL:"horizontal",EDGESTYLE_ELBOW:"elbowEdgeStyle",EDGESTYLE_ENTITY_RELATION:"entityRelationEdgeStyle",EDGESTYLE_LOOP:"loopEdgeStyle",EDGESTYLE_SIDETOSIDE:"sideToSideEdgeStyle",EDGESTYLE_TOPTOBOTTOM:"topToBottomEdgeStyle",EDGESTYLE_ORTHOGONAL:"orthogonalEdgeStyle",EDGESTYLE_SEGMENT:"segmentEdgeStyle",PERIMETER_ELLIPSE:"ellipsePerimeter",PERIMETER_RECTANGLE:"rectanglePerimeter",PERIMETER_RHOMBUS:"rhombusPerimeter",PERIMETER_HEXAGON:"hexagonPerimeter",PERIMETER_TRIANGLE:"trianglePerimeter"};function mxEventObject(t){this.name=t,this.properties=[];for(var e=1;emxEvent.PINCH_THRESHOLD||r>mxEvent.PINCH_THRESHOLD)&&(n=h[0].clientX+(h[1].clientX-h[0].clientX)/2,i=h[0].clientY+(h[1].clientY-h[0].clientY)/2,a(h[0],r=l.x-s.x&&i>=l.y-s.y&&n<=l.x-s.x+t.container.offsetWidth&&i<=l.y-s.y+t.container.offsetHeight},mxDragSource.prototype.mouseMove=function(t){var e,n,i=this.getGraphForEvent(t);null==i||this.graphContainsEvent(i,t)||(i=null),i!=this.currentGraph&&(null!=this.currentGraph&&this.dragExit(this.currentGraph,t),this.currentGraph=i,null!=this.currentGraph&&this.dragEnter(this.currentGraph,t)),null!=this.currentGraph&&this.dragOver(this.currentGraph,t),null==this.dragElement||null!=this.previewElement&&"visible"==this.previewElement.style.visibility?null!=this.dragElement&&(this.dragElement.style.visibility="hidden"):(e=mxEvent.getClientX(t),n=mxEvent.getClientY(t),null==this.dragElement.parentNode&&document.body.appendChild(this.dragElement),this.dragElement.style.visibility="visible",null!=this.dragOffset&&(e+=this.dragOffset.x,n+=this.dragOffset.y),i=mxUtils.getDocumentScrollOrigin(document),this.dragElement.style.left=e+i.x+"px",this.dragElement.style.top=n+i.y+"px"),mxEvent.consume(t)},mxDragSource.prototype.mouseUp=function(t){var e,n,i;null!=this.currentGraph&&(null==this.currentPoint||null!=this.previewElement&&"hidden"==this.previewElement.style.visibility||(e=this.currentGraph.view.scale,i=this.currentGraph.view.translate,n=this.currentPoint.x/e-i.x,i=this.currentPoint.y/e-i.y,this.drop(this.currentGraph,t,this.currentDropTarget,n,i)),this.dragExit(this.currentGraph),this.currentGraph=null),this.stopDrag(),this.removeListeners(),mxEvent.consume(t)},mxDragSource.prototype.removeListeners=function(){null!=this.eventSource&&(mxEvent.removeGestureListeners(this.eventSource,null,this.mouseMoveHandler,this.mouseUpHandler),this.eventSource=null),mxEvent.removeGestureListeners(document,null,this.mouseMoveHandler,this.mouseUpHandler),this.mouseMoveHandler=null,this.mouseUpHandler=null},mxDragSource.prototype.dragEnter=function(t,e){t.isMouseDown=!0,t.isMouseTrigger=mxEvent.isMouseEvent(e),this.previewElement=this.createPreviewElement(t),null!=this.previewElement&&this.checkEventSource&&mxClient.IS_SVG&&(this.previewElement.style.pointerEvents="none"),this.isGuidesEnabled()&&null!=this.previewElement&&(this.currentGuide=new mxGuide(t,t.graphHandler.getGuideStates())),this.highlightDropTargets&&(this.currentHighlight=new mxCellHighlight(t,mxConstants.DROP_TARGET_COLOR)),t.addListener(mxEvent.FIRE_MOUSE_EVENT,this.eventConsumer)},mxDragSource.prototype.dragExit=function(t,e){this.currentDropTarget=null,this.currentPoint=null,t.isMouseDown=!1,t.removeListener(this.eventConsumer),null!=this.previewElement&&(null!=this.previewElement.parentNode&&this.previewElement.parentNode.removeChild(this.previewElement),this.previewElement=null),null!=this.currentGuide&&(this.currentGuide.destroy(),this.currentGuide=null),null!=this.currentHighlight&&(this.currentHighlight.destroy(),this.currentHighlight=null)},mxDragSource.prototype.dragOver=function(t,e){var n,i,l,s=mxUtils.getOffset(t.container),o=mxUtils.getScrollOrigin(t.container),r=mxEvent.getClientX(e)-s.x+o.x-t.panDx,s=mxEvent.getClientY(e)-s.y+o.y-t.panDy;t.autoScroll&&(null==this.autoscroll||this.autoscroll)&&t.scrollPointToVisible(r,s,t.autoExtend),null!=this.currentHighlight&&t.isDropEnabled()&&(this.currentDropTarget=this.getDropTarget(t,r,s,e),n=t.getView().getState(this.currentDropTarget),this.currentHighlight.highlight(n)),null!=this.previewElement&&(null==this.previewElement.parentNode&&(t.container.appendChild(this.previewElement),this.previewElement.style.zIndex="3",this.previewElement.style.position="absolute"),o=this.isGridEnabled()&&t.isGridEnabledEvent(e),n=!0,null!=this.currentGuide&&this.currentGuide.isEnabledForEvent(e)?(i=new mxRectangle(0,0,parseInt(this.previewElement.style.width),parseInt(this.previewElement.style.height)),l=new mxPoint(r,s),n=!1,r=(l=this.currentGuide.move(i,l,o,!0)).x,s=l.y):o&&(i=t.view.scale,l=t.view.translate,o=t.gridSize/2,r=(t.snap(r/i-l.x-o)+l.x)*i,s=(t.snap(s/i-l.y-o)+l.y)*i),null!=this.currentGuide&&n&&this.currentGuide.hide(),null!=this.previewOffset&&(r+=this.previewOffset.x,s+=this.previewOffset.y),this.previewElement.style.left=Math.round(r)+"px",this.previewElement.style.top=Math.round(s)+"px",this.previewElement.style.visibility="visible"),this.currentPoint=new mxPoint(r,s)},mxDragSource.prototype.drop=function(t,e,n,i,l){this.dropHandler.apply(this,arguments),"hidden"!=t.container.style.visibility&&t.container.focus()},mxToolbar.prototype=new mxEventSource,mxToolbar.prototype.constructor=mxToolbar,mxToolbar.prototype.container=null,mxToolbar.prototype.enabled=!0,mxToolbar.prototype.noReset=!1,mxToolbar.prototype.updateDefaultMode=!0,mxToolbar.prototype.addItem=function(t,e,n,i,l,s){var o=document.createElement(null!=e?"img":"button"),r=l||(null!=s?"mxToolbarMode":"mxToolbarItem");o.className=r,o.setAttribute("src",e),null!=t&&(null!=e?o.setAttribute("title",t):mxUtils.write(o,t)),this.container.appendChild(o),null!=n&&(mxEvent.addListener(o,"click",n),mxClient.IS_TOUCH&&mxEvent.addListener(o,"touchend",n));n=mxUtils.bind(this,function(t){null!=i?o.setAttribute("src",e):o.style.backgroundColor=""});return mxEvent.addGestureListeners(o,mxUtils.bind(this,function(t){var e;null!=i?o.setAttribute("src",i):o.style.backgroundColor="gray",null!=s&&(null==this.menu&&(this.menu=new mxPopupMenu,this.menu.init()),e=this.currentImg,this.menu.isMenuShowing()&&this.menu.hideMenu(),e!=o&&(this.currentImg=o,this.menu.factoryMethod=s,e=new mxPoint(o.offsetLeft,o.offsetTop+o.offsetHeight),this.menu.popup(e.x,e.y,null,t),this.menu.isMenuShowing()&&(o.className=r+"Selected",this.menu.hideMenu=function(){mxPopupMenu.prototype.hideMenu.apply(this),o.className=r,this.currentImg=null})))}),null,n),mxEvent.addListener(o,"mouseout",n),o},mxToolbar.prototype.addCombo=function(t){var e=document.createElement("div");e.style.display="inline",e.className="mxToolbarComboContainer";var n=document.createElement("select");return n.className=t||"mxToolbarCombo",e.appendChild(n),this.container.appendChild(e),n},mxToolbar.prototype.addActionCombo=function(t,e){var n=document.createElement("select");return n.className=e||"mxToolbarCombo",this.addOption(n,t,null),mxEvent.addListener(n,"change",function(t){var e=n.options[n.selectedIndex];n.selectedIndex=0,null!=e.funct&&e.funct(t)}),this.container.appendChild(n),n},mxToolbar.prototype.addOption=function(t,e,n){var i=document.createElement("option");return mxUtils.writeln(i,e),"function"==typeof n?i.funct=n:i.setAttribute("value",n),t.appendChild(i),i},mxToolbar.prototype.addSwitchMode=function(t,e,n,i,l){var s=document.createElement("img");return s.initialClassName=l||"mxToolbarMode",s.className=s.initialClassName,s.setAttribute("src",e),s.altIcon=i,null!=t&&s.setAttribute("title",t),mxEvent.addListener(s,"click",mxUtils.bind(this,function(t){var e=this.selectedMode.altIcon;null!=e?(this.selectedMode.altIcon=this.selectedMode.getAttribute("src"),this.selectedMode.setAttribute("src",e)):this.selectedMode.className=this.selectedMode.initialClassName,this.updateDefaultMode&&(this.defaultMode=s),null!=(e=(this.selectedMode=s).altIcon)?(s.altIcon=s.getAttribute("src"),s.setAttribute("src",e)):s.className=s.initialClassName+"Selected",this.fireEvent(new mxEventObject(mxEvent.SELECT)),n()})),this.container.appendChild(s),null==this.defaultMode&&(this.defaultMode=s,this.selectMode(s),n()),s},mxToolbar.prototype.addMode=function(t,e,n,i,l,s){s=null==s||s;var o=document.createElement(null!=e?"img":"button");return o.initialClassName=l||"mxToolbarMode",o.className=o.initialClassName,o.setAttribute("src",e),o.altIcon=i,null!=t&&o.setAttribute("title",t),this.enabled&&s&&(mxEvent.addListener(o,"click",mxUtils.bind(this,function(t){this.selectMode(o,n),this.noReset=!1})),mxEvent.addListener(o,"dblclick",mxUtils.bind(this,function(t){this.selectMode(o,n),this.noReset=!0})),null==this.defaultMode&&(this.defaultMode=o,this.defaultFunction=n,this.selectMode(o,n))),this.container.appendChild(o),o},mxToolbar.prototype.selectMode=function(t,e){var n;this.selectedMode!=t&&(null!=this.selectedMode&&(null!=(n=this.selectedMode.altIcon)?(this.selectedMode.altIcon=this.selectedMode.getAttribute("src"),this.selectedMode.setAttribute("src",n)):this.selectedMode.className=this.selectedMode.initialClassName),this.selectedMode=t,null!=(n=this.selectedMode.altIcon)?(this.selectedMode.altIcon=this.selectedMode.getAttribute("src"),this.selectedMode.setAttribute("src",n)):this.selectedMode.className=this.selectedMode.initialClassName+"Selected",this.fireEvent(new mxEventObject(mxEvent.SELECT,"function",e)))},mxToolbar.prototype.resetMode=function(t){!t&&this.noReset||this.selectedMode==this.defaultMode||this.selectMode(this.defaultMode,this.defaultFunction)},mxToolbar.prototype.addSeparator=function(t){return this.addItem(null,t,null)},mxToolbar.prototype.addBreak=function(){mxUtils.br(this.container)},mxToolbar.prototype.addLine=function(){var t=document.createElement("hr");t.style.marginRight="6px",t.setAttribute("size","1"),this.container.appendChild(t)},mxToolbar.prototype.destroy=function(){mxEvent.release(this.container),this.container=null,this.defaultMode=null,this.defaultFunction=null,(this.selectedMode=null)!=this.menu&&this.menu.destroy()},mxUndoableEdit.prototype.source=null,mxUndoableEdit.prototype.changes=null,mxUndoableEdit.prototype.significant=null,mxUndoableEdit.prototype.undone=!1,mxUndoableEdit.prototype.redone=!1,mxUndoableEdit.prototype.isEmpty=function(){return 0==this.changes.length},mxUndoableEdit.prototype.isSignificant=function(){return this.significant},mxUndoableEdit.prototype.add=function(t){this.changes.push(t)},mxUndoableEdit.prototype.notify=function(){},mxUndoableEdit.prototype.die=function(){},mxUndoableEdit.prototype.undo=function(){if(!this.undone){this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));for(var t=this.changes.length-1;0<=t;t--){var e=this.changes[t];null!=e.execute?e.execute():null!=e.undo&&e.undo(),this.source.fireEvent(new mxEventObject(mxEvent.EXECUTED,"change",e))}this.undone=!0,this.redone=!1,this.source.fireEvent(new mxEventObject(mxEvent.END_EDIT))}this.notify()},mxUndoableEdit.prototype.redo=function(){if(!this.redone){this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));for(var t=this.changes.length,e=0;ethis.indexOfNextAdd)for(var t=this.history.splice(this.indexOfNextAdd,this.history.length-this.indexOfNextAdd),e=0;ethis.autoSaveDelay||this.ignoredChanges>=this.autoSaveThreshold&&e>this.autoSaveThrottle?(this.save(),this.reset()):this.ignoredChanges++},mxAutoSaveManager.prototype.reset=function(){this.lastSnapshot=(new Date).getTime(),this.ignoredChanges=0},mxAutoSaveManager.prototype.destroy=function(){this.setGraph(null)},mxAnimation.prototype=new mxEventSource,mxAnimation.prototype.constructor=mxAnimation,mxAnimation.prototype.delay=null,mxAnimation.prototype.thread=null,mxAnimation.prototype.isRunning=function(){return null!=this.thread},mxAnimation.prototype.startAnimation=function(){null==this.thread&&(this.thread=window.setInterval(mxUtils.bind(this,this.updateAnimation),this.delay))},mxAnimation.prototype.updateAnimation=function(){this.fireEvent(new mxEventObject(mxEvent.EXECUTE))},mxAnimation.prototype.stopAnimation=function(){null!=this.thread&&(window.clearInterval(this.thread),this.thread=null,this.fireEvent(new mxEventObject(mxEvent.DONE)))},mxMorphing.prototype=new mxAnimation,mxMorphing.prototype.constructor=mxMorphing,mxMorphing.prototype.graph=null,mxMorphing.prototype.steps=null,mxMorphing.prototype.step=0,mxMorphing.prototype.ease=null,mxMorphing.prototype.cells=null,mxMorphing.prototype.updateAnimation=function(){mxAnimation.prototype.updateAnimation.apply(this,arguments);var t=new mxCellStatePreview(this.graph);if(null!=this.cells)for(var e=0;e=this.steps)&&this.stopAnimation()},mxMorphing.prototype.show=function(t){t.show()},mxMorphing.prototype.animateCell=function(t,e,n){var i,l,s=this.graph.getView().getState(t),o=null;if(null!=s&&(o=this.getDelta(s),!this.graph.getModel().isVertex(t)||0==o.x&&0==o.y||(i=this.graph.view.getTranslate(),l=this.graph.view.getScale(),o.x+=i.x*l,o.y+=i.y*l,e.moveState(s,-o.x/this.ease,-o.y/this.ease))),n&&!this.stopRecursion(s,o))for(var r=this.graph.getModel().getChildCount(t),a=0;a",5)+1)),""==t.substring(t.length-7,t.length)&&(t=t.substring(0,t.length-7)))}else{if(null!=document.implementation&&null!=document.implementation.createDocument){var n=document.implementation.createDocument("http://www.w3.org/1999/xhtml","html",null),i=n.createElement("body");n.documentElement.appendChild(i);var l=document.createElement("div");l.innerHTML=t;for(var s=l.firstChild;null!=s;){var o=s.nextSibling;i.appendChild(n.adoptNode(s)),s=o}return i.innerHTML}l=document.createElement("textarea");l.innerHTML=t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(//g,">"),t=l.value.replace(/&/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/
/g,"
").replace(/
/g,"
").replace(/(]+)>/gm,"$1 />")}return t},mxSvgCanvas2D.prototype.createDiv=function(t){var e=t;if(mxUtils.isNode(e)||(e="
"+this.convertHtml(e)+"
"),mxClient.IS_IE||mxClient.IS_IE11||!document.createElementNS)return mxUtils.isNode(e)&&(e="
"+mxUtils.getXml(e)+"
"),e='
'+e+"
",mxUtils.parseXml(e).documentElement;var n,i=document.createElementNS("http://www.w3.org/1999/xhtml","div");return mxUtils.isNode(e)?(t=(n=document.createElement("div")).cloneNode(!1),this.root.ownerDocument!=document?n.appendChild(e.cloneNode(!0)):n.appendChild(e),t.appendChild(n),i.appendChild(t)):i.innerHTML=e,i},mxSvgCanvas2D.prototype.updateText=function(t,e,n,i,l,s,o,r,a,h,d){null!=d&&null!=d.firstChild&&null!=d.firstChild.firstChild&&this.updateTextNodes(t,e,n,i,l,s,o,r,a,h,d.firstChild)},mxSvgCanvas2D.prototype.addForeignObject=function(t,e,n,i,l,s,o,r,a,h,d,u,p,m,c){var g=this.createElement("g"),x=this.createElement("foreignObject");x.setAttribute("style","overflow: visible; text-align: left;"),x.setAttribute("pointer-events","none"),m.ownerDocument!=document&&(m=mxUtils.importNodeImplementation(x.ownerDocument,m,!0)),x.appendChild(m),g.appendChild(x),this.updateTextNodes(t,e,n,i,s,o,r,h,d,u,g),this.root.ownerDocument==document||null!=(d=this.createAlternateContent(x,t,e,n,i,l,s,o,r,a,h,d,u))&&(x.setAttribute("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility"),(u=this.createElement("switch")).appendChild(x),u.appendChild(d),g.appendChild(u)),c.appendChild(g)},mxSvgCanvas2D.prototype.updateTextNodes=function(u,p,t,e,n,i,l,s,o,m,c){var g=this.state.scale;mxSvgCanvas2D.createCss(t+2,e,n,i,l,s,o,null!=this.state.fontBackgroundColor?this.state.fontBackgroundColor:null,null!=this.state.fontBorderColor?this.state.fontBorderColor:null,"display: flex; align-items: unsafe "+(i==mxConstants.ALIGN_TOP?"flex-start":i==mxConstants.ALIGN_BOTTOM?"flex-end":"center")+"; justify-content: unsafe "+(n==mxConstants.ALIGN_LEFT?"flex-start":n==mxConstants.ALIGN_RIGHT?"flex-end":"center")+"; ",this.getTextCss(),g,mxUtils.bind(this,function(t,e,n,i,l){u+=this.state.dx,p+=this.state.dy;var s=c.firstChild,o=s.firstChild,r=o.firstChild,a=r.firstChild,h=(this.rotateHtml?this.state.rotation:0)+(null!=m?m:0),d=(0!=this.foOffset?"translate("+this.foOffset+" "+this.foOffset+")":"")+(1!=g?"scale("+g+")":"");a.setAttribute("style",l),r.setAttribute("style",i),s.setAttribute("width",Math.ceil(1/Math.min(1,g)*100)+"%"),s.setAttribute("height",Math.ceil(1/Math.min(1,g)*100)+"%");e=Math.round(p+e);e<0?s.setAttribute("y",e):(s.removeAttribute("y"),n+="padding-top: "+e+"px; "),o.setAttribute("style",n+"margin-left: "+Math.round(u+t)+"px;"),(d+=0!=h?"rotate("+h+" "+u+" "+p+")":"")?c.setAttribute("transform",d):c.removeAttribute("transform"),1!=this.state.alpha?c.setAttribute("opacity",this.state.alpha):c.removeAttribute("opacity")}))},mxSvgCanvas2D.createCss=function(t,e,n,i,l,s,o,r,a,h,d,u,p){var m="box-sizing: border-box; font-size: 0; text-align: "+(n==mxConstants.ALIGN_LEFT?"left":n==mxConstants.ALIGN_RIGHT?"right":"center")+"; ",c=mxUtils.getAlignmentAsPoint(n,i),g="overflow: hidden; ",x="width: 1px; ",n="height: 1px; ",i=c.x*t,c=c.y*e;o?(x="width: "+Math.round(t)+"px; ",m+="max-height: "+Math.round(e)+"px; ",c=0):"fill"==s?(d+="width: 100%; height: 100%; ",m+=(x="width: "+Math.round(t)+"px; ")+(n="height: "+Math.round(e)+"px; ")):"width"==s?(d+="width: 100%; ",m+=x="width: "+Math.round(t)+"px; ",(c=0)"),document.body.appendChild(a),l=a.offsetWidth,s=a.offsetHeight,a.parentNode.removeChild(a),o==mxConstants.ALIGN_CENTER?n-=l/2:o==mxConstants.ALIGN_RIGHT&&(n-=l),r==mxConstants.ALIGN_MIDDLE?i-=s/2:r==mxConstants.ALIGN_BOTTOM&&(i-=s),d=new mxRectangle((n+1)*h.scale,(i+2)*h.scale,l*h.scale,(s+1)*h.scale)),null!=d&&((s=this.createElement("rect")).setAttribute("fill",h.fontBackgroundColor||"none"),s.setAttribute("stroke",h.fontBorderColor||"none"),s.setAttribute("x",Math.floor(d.x-1)),s.setAttribute("y",Math.floor(d.y-1)),s.setAttribute("width",Math.ceil(d.width+2)),s.setAttribute("height",Math.ceil(d.height)),h=null!=h.fontBorderColor?Math.max(1,this.format(h.scale)):0,s.setAttribute("stroke-width",h),this.root.ownerDocument==document&&1==mxUtils.mod(h,2)&&s.setAttribute("transform","translate(0.5, 0.5)"),t.insertBefore(s,t.firstChild))}},mxSvgCanvas2D.prototype.stroke=function(){this.addNode(!1,!0)},mxSvgCanvas2D.prototype.fill=function(){this.addNode(!0,!1)},mxSvgCanvas2D.prototype.fillAndStroke=function(){this.addNode(!0,!0)};var mxVmlCanvas2D=function(t){mxAbstractCanvas2D.call(this),this.root=t};function mxGuide(t,e){this.graph=t,this.setStates(e)}function mxShape(t){this.stencil=t,this.initStyles()}function mxStencil(t){this.desc=t,this.parseDescription(),this.parseConstraints()}mxUtils.extend(mxVmlCanvas2D,mxAbstractCanvas2D),mxVmlCanvas2D.prototype.node=null,mxVmlCanvas2D.prototype.textEnabled=!0,mxVmlCanvas2D.prototype.moveOp="m",mxVmlCanvas2D.prototype.lineOp="l",mxVmlCanvas2D.prototype.curveOp="c",mxVmlCanvas2D.prototype.closeOp="x",mxVmlCanvas2D.prototype.rotatedHtmlBackground="",mxVmlCanvas2D.prototype.vmlScale=1,mxVmlCanvas2D.prototype.createElement=function(t){return document.createElement(t)},mxVmlCanvas2D.prototype.createVmlElement=function(t){return this.createElement(mxClient.VML_PREFIX+":"+t)},mxVmlCanvas2D.prototype.addNode=function(t,e){var n=this.node,i=this.state;if(null!=n){if("shape"==n.nodeName){if(!(null!=this.path&&0Math.PI/2&&(T=Math.PI-T),E=Math.cos(T),S=Math.sin(T),8!=document.documentMode||mxClient.IS_EM||(y.style.display="inline-block",b.style.display="inline-block",c.style.display="inline-block"),y.style.visibility="hidden",y.style.position="absolute",document.body.appendChild(y),null!=(T=y).firstChild&&"DIV"==T.firstChild.nodeName&&(T=T.firstChild),v=T.offsetWidth+3,T=T.offsetHeight,d?(n=Math.min(n,v),T=Math.min(T,i)):n=v,r&&(y.style.width=n+"px"),mxClient.IS_QUIRKS&&(d||"width"==h)&&i
")),l=!mxUtils.isNode(this.value)&&this.replaceLinefeeds&&"html"==i?l.replace(/\n/g,"
"):l,(e=this.textDirection)!=mxConstants.TEXT_DIRECTION_AUTO||n||(e=this.getAutoDirection()),e!=mxConstants.TEXT_DIRECTION_LTR&&e!=mxConstants.TEXT_DIRECTION_RTL&&(e=null),t.text(s,o,r,a,l,this.align,this.valign,this.wrap,i,this.overflow,this.clipped,this.getTextRotation(),e))},mxText.prototype.redraw=function(){var t;this.visible&&this.checkBounds()&&this.cacheEnabled&&this.lastValue==this.value&&(mxUtils.isNode(this.value)||this.dialect==mxConstants.DIALECT_STRICTHTML)?"DIV"!=this.node.nodeName||!this.isHtmlAllowed()&&mxClient.IS_VML?null!=(t=this.createCanvas())&&null!=t.updateText?(t.pointerEvents=this.pointerEvents,this.paint(t,!0),this.destroyCanvas(t),this.updateBoundingBox()):mxShape.prototype.redraw.apply(this,arguments):(mxClient.IS_SVG?this.redrawHtmlShapeWithCss3():(this.updateSize(this.node,null==this.state||null==this.state.view.textDiv),mxClient.IS_IE&&(null==document.documentMode||document.documentMode<=8)?this.updateHtmlFilter():this.updateHtmlTransform()),this.updateBoundingBox()):(mxShape.prototype.redraw.apply(this,arguments),mxUtils.isNode(this.value)||this.dialect==mxConstants.DIALECT_STRICTHTML?this.lastValue=this.value:this.lastValue=null)},mxText.prototype.resetStyles=function(){mxShape.prototype.resetStyles.apply(this,arguments),this.color="black",this.align=mxConstants.ALIGN_CENTER,this.valign=mxConstants.ALIGN_MIDDLE,this.family=mxConstants.DEFAULT_FONTFAMILY,this.size=mxConstants.DEFAULT_FONTSIZE,this.fontStyle=mxConstants.DEFAULT_FONTSTYLE,this.spacing=2,this.spacingTop=2,this.spacingRight=2,this.spacingBottom=2,this.spacingLeft=2,this.horizontal=!0,delete this.background,delete this.border,this.textDirection=mxConstants.DEFAULT_TEXT_DIRECTION,delete this.margin},mxText.prototype.apply=function(t){var e=this.spacing;mxShape.prototype.apply.apply(this,arguments),null!=this.style&&(this.fontStyle=mxUtils.getValue(this.style,mxConstants.STYLE_FONTSTYLE,this.fontStyle),this.family=mxUtils.getValue(this.style,mxConstants.STYLE_FONTFAMILY,this.family),this.size=mxUtils.getValue(this.style,mxConstants.STYLE_FONTSIZE,this.size),this.color=mxUtils.getValue(this.style,mxConstants.STYLE_FONTCOLOR,this.color),this.align=mxUtils.getValue(this.style,mxConstants.STYLE_ALIGN,this.align),this.valign=mxUtils.getValue(this.style,mxConstants.STYLE_VERTICAL_ALIGN,this.valign),this.spacing=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING,this.spacing)),this.spacingTop=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING_TOP,this.spacingTop-e))+this.spacing,this.spacingRight=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING_RIGHT,this.spacingRight-e))+this.spacing,this.spacingBottom=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING_BOTTOM,this.spacingBottom-e))+this.spacing,this.spacingLeft=parseInt(mxUtils.getValue(this.style,mxConstants.STYLE_SPACING_LEFT,this.spacingLeft-e))+this.spacing,this.horizontal=mxUtils.getValue(this.style,mxConstants.STYLE_HORIZONTAL,this.horizontal),this.background=mxUtils.getValue(this.style,mxConstants.STYLE_LABEL_BACKGROUNDCOLOR,this.background),this.border=mxUtils.getValue(this.style,mxConstants.STYLE_LABEL_BORDERCOLOR,this.border),this.textDirection=mxUtils.getValue(this.style,mxConstants.STYLE_TEXT_DIRECTION,mxConstants.DEFAULT_TEXT_DIRECTION),this.opacity=mxUtils.getValue(this.style,mxConstants.STYLE_TEXT_OPACITY,100),this.updateMargin()),this.flipV=null,this.flipH=null},mxText.prototype.getAutoDirection=function(){var t=/[A-Za-z\u05d0-\u065f\u066a-\u06ef\u06fa-\u07ff\ufb1d-\ufdff\ufe70-\ufefc]/.exec(this.value);return null!=t&&0
"),t=this.replaceLinefeeds?t.replace(/\n/g,"
"):t},mxText.prototype.getTextCss=function(){var t=mxConstants.ABSOLUTE_LINE_HEIGHT?this.size*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT,e="display: inline-block; font-size: "+this.size+"px; font-family: "+this.family+"; color: "+this.color+"; line-height: "+t+"; pointer-events: "+(this.pointerEvents?"all":"none")+"; ";(this.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&(e+="font-weight: bold; "),(this.fontStyle&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC&&(e+="font-style: italic; ");t=[];return(this.fontStyle&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&t.push("underline"),(this.fontStyle&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&t.push("line-through"),0
"+n+"
"),this.node.firstChild.firstChild.setAttribute("style",l),this.node.firstChild.setAttribute("style",i)}))},mxText.prototype.updateHtmlTransform=function(){var t=this.getTextRotation(),e=this.node.style,n=this.margin.x,i=this.margin.y;0!=t?(mxUtils.setPrefixedStyle(e,"transformOrigin",100*-n+"% "+100*-i+"%"),mxUtils.setPrefixedStyle(e,"transform","translate("+100*n+"%,"+100*i+"%) scale("+this.scale+") rotate("+t+"deg)")):(mxUtils.setPrefixedStyle(e,"transformOrigin","0% 0%"),mxUtils.setPrefixedStyle(e,"transform","scale("+this.scale+") translate("+100*n+"%,"+100*i+"%)")),e.left=Math.round(this.bounds.x-Math.ceil(n*("fill"!=this.overflow&&"width"!=this.overflow?3:1)))+"px",e.top=Math.round(this.bounds.y-i*("fill"!=this.overflow?3:1))+"px",this.opacity<100?e.opacity=this.opacity/100:e.opacity=""},mxText.prototype.updateInnerHtml=function(t){var e;mxUtils.isNode(this.value)?t.innerHTML=this.value.outerHTML:(e=this.value,this.dialect!=mxConstants.DIALECT_STRICTHTML&&(e=mxUtils.htmlEntities(e,!1)),e=mxUtils.replaceTrailingNewlines(e,"
 
"),e='
'+(e=this.replaceLinefeeds?e.replace(/\n/g,"
"):e)+"
",t.innerHTML=e)},mxText.prototype.updateHtmlFilter=function(){var t=this.node.style,e=this.margin.x,n=this.margin.y,i=this.scale;mxUtils.setOpacity(this.node,this.opacity);var l=0,s=0,o=null!=this.state?this.state.view.textDiv:null,r=this.node;null!=o?(o.style.overflow="",o.style.height="",o.style.width="",this.updateFont(o),this.updateSize(o,!1),this.updateInnerHtml(o),a=Math.round(this.bounds.width/this.scale),this.wrap&&0Math.PI/2&&(d=Math.PI-d);o=Math.cos(d),r=Math.sin(-d),s=a*-(e+.5),l=h*-(n+.5),e=(h-h*o+a*r)/2+p*s-u*l,l=(a-a*o+h*r)/2-u*s-p*l;0!=d&&(u="progid:DXImageTransform.Microsoft.Matrix(M11="+u+", M12="+p+", M21="+-p+", M22="+u+", sizingMethod='auto expand')",null!=t.filter&&0
"),i=this.replaceLinefeeds?i.replace(/\n/g,"
"):i,t=null!=this.background&&this.background!=mxConstants.NONE?this.background:null,e=null!=this.border&&this.border!=mxConstants.NONE?this.border:null,"fill"==this.overflow||"width"==this.overflow?(null!=t&&(this.node.style.backgroundColor=t),null!=e&&(this.node.style.border="1px solid "+e)):(n="",null!=t&&(n+="background-color:"+mxUtils.htmlEntities(t)+";"),null!=e&&(n+="border:1px solid "+mxUtils.htmlEntities(e)+";"),i='
'+i+"
"),this.node.innerHTML=i,0<(n=this.node.getElementsByTagName("div")).length&&((i=this.textDirection)==mxConstants.TEXT_DIRECTION_AUTO&&this.dialect!=mxConstants.DIALECT_STRICTHTML&&(i=this.getAutoDirection()),i==mxConstants.TEXT_DIRECTION_LTR||i==mxConstants.TEXT_DIRECTION_RTL?n[n.length-1].setAttribute("dir",i):n[n.length-1].removeAttribute("dir")))},mxText.prototype.updateFont=function(t){var e=t.style;e.lineHeight=mxConstants.ABSOLUTE_LINE_HEIGHT?this.size*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT,e.fontSize=this.size+"px",e.fontFamily=this.family,e.verticalAlign="top",e.color=this.color,(this.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD?e.fontWeight="bold":e.fontWeight="",(this.fontStyle&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC?e.fontStyle="italic":e.fontStyle="";t=[];(this.fontStyle&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&t.push("underline"),(this.fontStyle&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&t.push("line-through"),e.textDecoration=t.join(" "),this.align==mxConstants.ALIGN_CENTER?e.textAlign="center":this.align==mxConstants.ALIGN_RIGHT?e.textAlign="right":e.textAlign="left"},mxText.prototype.updateSize=function(t,e){var n,i=Math.max(0,Math.round(this.bounds.width/this.scale)),l=Math.max(0,Math.round(this.bounds.height/this.scale)),s=t.style;this.clipped?(s.overflow="hidden",mxClient.IS_QUIRKS?s.width=i+"px":(s.maxHeight=l+"px",s.maxWidth=i+"px")):"fill"==this.overflow?(s.width=i+1+"px",s.height=l+1+"px",s.overflow="hidden"):"width"==this.overflow&&(s.width=i+1+"px",s.maxHeight=l+1+"px",s.overflow="hidden"),this.wrap&&0t.weightedValue||!(e.weightedValuee.x)?1:-1:t.y==e.y?0:0<(t.y>e.y)?1:-1})),i},mxStackLayout.prototype.snap=function(t){var e;return null!=this.gridSize&&0this.gridSize/2?this.gridSize-e:-e),t},mxStackLayout.prototype.execute=function(t){if(null!=t){var e=this.getParentSize(t),n=this.isHorizontal(),i=this.graph.getModel(),l=null;null!=e&&(l=n?e.height-this.marginTop-this.marginBottom:e.width-this.marginLeft-this.marginRight),l-=2*this.border;var s,o,r=this.x0+this.border+this.marginLeft,a=this.y0+this.border+this.marginTop;this.graph.isSwimlane(t)&&(o=this.graph.getCellStyle(t),s=mxUtils.getNumber(o,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE),o=1==mxUtils.getValue(o,mxConstants.STYLE_HORIZONTAL,!0),null!=e&&(s=o?Math.min(s,e.height):Math.min(s,e.width)),n==o&&(l-=s),o?a+=s:r+=s),i.beginUpdate();try{for(var h=0,d=null,u=0,p=null,m=this.getLayoutCells(t),c=0;cthis.wrap||!n&&d.y+d.height+f.height+2*this.spacing>this.wrap)&&(d=null,n?a+=h+this.spacing:r+=h+this.spacing,h=0),h=Math.max(h,n?f.height:f.width),g=0,this.borderCollapse||(x=this.graph.getCellStyle(y),g=mxUtils.getNumber(x,mxConstants.STYLE_STROKEWIDTH,1)),null!=d?(x=u+this.spacing+Math.floor(g/2),n?f.x=this.snap((this.allowGaps?Math.max(x,f.x):x)-this.marginLeft)+this.marginLeft:f.y=this.snap((this.allowGaps?Math.max(x,f.y):x)-this.marginTop)+this.marginTop):this.keepFirstLocation||(n?f.x=this.allowGaps&&f.x>r?Math.max(this.snap(f.x-this.marginLeft)+this.marginLeft,r):r:f.y=this.allowGaps&&f.y>a?Math.max(this.snap(f.y-this.marginTop)+this.marginTop,a):a),n?f.y=a:f.x=r,this.fill&&null!=l&&(n?f.height=l:f.width=l),n?f.width=this.snap(f.width):f.height=this.snap(f.height),this.setChildGeometry(y,f),p=y,d=f,u=n?d.x+d.width+Math.floor(g/2):d.y+d.height+Math.floor(g/2))}this.resizeParent&&null!=e&&null!=d&&!this.graph.isCellCollapsed(t)?this.updateParentGeometry(t,e,d):this.resizeLast&&null!=e&&null!=d&&null!=p&&(n?d.width=e.width-d.x-this.spacing-this.marginRight-this.marginLeft:d.height=e.height-d.y-this.spacing-this.marginBottom,this.setChildGeometry(p,d))}finally{i.endUpdate()}}},mxStackLayout.prototype.setChildGeometry=function(t,e){var n=this.graph.getCellGeometry(t);null!=n&&e.x==n.x&&e.y==n.y&&e.width==n.width&&e.height==n.height||this.graph.getModel().setGeometry(t,e)},mxStackLayout.prototype.updateParentGeometry=function(t,e,n){var i,l=this.isHorizontal(),s=this.graph.getModel(),o=e.clone();l?(i=n.x+n.width+this.marginRight+this.border,this.resizeParentMax?o.width=Math.max(o.width,i):o.width=i):(i=n.y+n.height+this.marginBottom+this.border,this.resizeParentMax?o.height=Math.max(o.height,i):o.height=i),e.x==o.x&&e.y==o.y&&e.width==o.width&&e.height==o.height||s.setGeometry(t,o)},mxPartitionLayout.prototype=new mxGraphLayout,mxPartitionLayout.prototype.constructor=mxPartitionLayout,mxPartitionLayout.prototype.horizontal=null,mxPartitionLayout.prototype.spacing=null,mxPartitionLayout.prototype.border=null,mxPartitionLayout.prototype.resizeVertices=!0,mxPartitionLayout.prototype.isHorizontal=function(){return this.horizontal},mxPartitionLayout.prototype.moveCell=function(t,e,n){var i=this.graph.getModel(),l=i.getParent(t);if(null!=t&&null!=l){for(var s=0,o=0,r=i.getChildCount(l),s=0;st.height&&(t.height=this.maxRankHeight[e]);for(var n=t.child;null!=n;)this.setCellHeights(n,e+1),n=n.next},mxCompactTreeLayout.prototype.dfs=function(t,e){var n=mxCellPath.create(t),i=null;if(null!=t&&null==this.visited[n]&&!this.isVertexIgnored(t)){this.visited[n]=t,i=this.createNode(t);var l=this.graph.getModel(),s=null,o=this.graph.getEdges(t,e,this.invert,!this.invert,!1,!0),r=this.graph.getView();this.sortEdges&&this.sortOutgoingEdges(t,o);for(var a=0;ar+2*this.prefHozEdgeSep&&(o-=2*this.prefHozEdgeSep);var a=o/i,h=a/2;o>r+2*this.prefHozEdgeSep&&(h+=this.prefHozEdgeSep);for(var d=this.minEdgeJetty-this.prefVertEdgeOff,u=0,p=this.getVertexBounds(n),e=t.child,m=0;mc.theta&&mthis.maxDistanceLimit||(l=a.length){for(var h=new mxGraphHierarchyEdge(a),d=0;d=d.length){for(var u=new mxGraphHierarchyEdge(d),p=0;ps[i.swimlaneIndex]&&(d=s[i.swimlaneIndex]),i.temp[0]=d,null!=a)for(var p,n=0;n>1]}return n},mxMedianHybridCrossingReduction.prototype.transpose=function(t,e){for(var n=!0,i=0;n&&i++<10;)for(var l=t%2==1&&i%2==1,n=!1,s=0;sy[b]&&S++,g[E]f[b]&&S++,x[E]t.medianValue?-1:e.medianValueu.getGeneralPurposeVariable(p)+1&&(u.setGeneralPurposeVariable(p,b),y=!0)),y){for(l=0;lthis.widestRankValue&&(this.widestRankValue=r,this.widestRank=l),this.rankWidths[l]=r}1==a&&mxLog.warn("At least one cell has no bounds"),this.rankY[l]=n;var p=s/2+i/2+this.interRankCellSpacing,i=s;this.orientation==mxConstants.DIRECTION_NORTH||this.orientation==mxConstants.DIRECTION_WEST?n+=p:n-=p;for(h=0;hl.minRank+1;a--)c==(g=l.getX(a-1))||this.repositionValid(e,l,a-1,c)?(m[a-l.minRank-2]=c,u++):(m[a-l.minRank-2]=l.getX(a-1),c=g);if(rl.minRank;a--)l.setX(a,m[a-l.minRank-1]);else if(uf+2*this.prefHozEdgeSep&&(u+=this.prefHozEdgeSep,p-=this.prefHozEdgeSep);for(var C=(p-u)/m,v=u+C/2,E=this.minEdgeJetty-this.prefVertEdgeOff,S=0,h=0;h=this.swimlanes.length||(re[o]?1:-1:(n=parseInt(t[o]))==(i=parseInt(e[o]))?0:i=t.x&&n.x<=t.x+t.width?h.x=n.x:n.y>=t.y&&n.y<=t.y+t.height&&(h.y=n.y),n.xt.x+t.width&&(h.x=t.x+t.width),n.yt.y+t.height&&(h.y=t.y+t.height)),h},EllipsePerimeter:function(t,e,n,i){var l=t.x,s=t.y,o=t.width/2,r=t.height/2,a=l+o,h=s+r,d=n.x,u=n.y,p=parseInt(d-a),n=parseInt(u-h);if(0==p&&0!=n)return new mxPoint(a,h+r*n/Math.abs(n));if(0==p&&0==n)return new mxPoint(d,u);if(i){if(s<=u&&u<=s+t.height){var m=u-h,c=Math.sqrt(o*o*(1-m*m/(r*r)))||0;return d<=l&&(c=-c),new mxPoint(a+c,u)}if(l<=d&&d<=l+t.width){c=d-a,m=Math.sqrt(r*r*(1-c*c/(o*o)))||0;return u<=s&&(m=-m),new mxPoint(d,h+m)}}m=n/p,n=h-m*a,p=o*o*m*m+r*r,h=-2*a*p,o=o*o*m*m*a*a+r*r*a*a-o*o*r*r,r=Math.sqrt(h*h-4*p*o),o=(-h+r)/(2*p),h=(-h-r)/(2*p),r=m*o+n,p=m*h+n,m=0,n=0,n=Math.sqrt(Math.pow(o-d,2)+Math.pow(r-u,2))Math.PI-e)?i&&(s&&n.x>=p.x&&n.x<=c.x||!s&&n.y>=p.y&&n.y<=c.y)?s?new mxPoint(n.x,p.y):new mxPoint(p.x,n.y):l==mxConstants.DIRECTION_NORTH?new mxPoint(o+a/2+h*Math.tan(y)/2,r+h):l==mxConstants.DIRECTION_SOUTH?new mxPoint(o+a/2-h*Math.tan(y)/2,r):l==mxConstants.DIRECTION_WEST?new mxPoint(o+a,r+h/2+a*Math.tan(y)/2):new mxPoint(o,r+h/2-a*Math.tan(y)/2):(i&&(i=new mxPoint(d,u),n.y>=r&&n.y<=r+h?(i.x=s?d:l==mxConstants.DIRECTION_WEST?o+a:o,i.y=n.y):n.x>=o&&n.x<=o+a&&(i.x=n.x,i.y=s?l==mxConstants.DIRECTION_NORTH?r+h:r:u),g=n.x-i.x,x=n.y-i.y,d=i.x,u=i.y),s&&n.x<=o+a/2||!s&&n.y<=r+h/2?mxUtils.intersection(n.x,n.y,d,u,p.x,p.y,m.x,m.y):mxUtils.intersection(n.x,n.y,d,u,m.x,m.y,c.x,c.y)))&&(t=new mxPoint(d,u)),t},HexagonPerimeter:function(t,e,n,i){var l,s=t.x,o=t.y,r=t.width,a=t.height,h=t.getCenterX(),d=t.getCenterY(),u=n.x,p=n.y,m=u-h,c=p-d,g=-Math.atan2(c,m),x=Math.PI,y=Math.PI/2,f=new mxPoint(h,d),t=null!=e?mxUtils.getValue(e.style,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST):mxConstants.DIRECTION_EAST,c=t==mxConstants.DIRECTION_NORTH||t==mxConstants.DIRECTION_SOUTH,m=new mxPoint,e=new mxPoint;if((u':8==document.documentMode?t='':8'):("CSS1Compat"===document.compatMode&&r.writeln(""),r.writeln("")),r.writeln(""),this.writeHead(r,t),r.writeln(""),r.writeln(''));var a=this.graph.getGraphBounds().clone(),h=this.graph.getView().getScale(),d=h/this.scale,u=this.graph.getView().getTranslate();this.autoOrigin||(this.x0-=u.x*this.scale,this.y0-=u.y*this.scale,a.width+=a.x,a.height+=a.y,a.x=0,a.y=0,this.border=0);var p=this.pageFormat.width-2*this.border,m=this.pageFormat.height-2*this.border;this.pageFormat.height+=this.marginTop+this.marginBottom,a.width/=d,a.height/=d;var c=Math.max(1,Math.ceil((a.width+this.x0)/p)),g=Math.max(1,Math.ceil((a.height+this.y0)/m));this.pageCount=c*g;var d=mxUtils.bind(this,function(){var t,e;this.pageSelector&&(1"),t.writeln(""),t.close(),mxEvent.release(t.body))}catch(t){}},mxPrintPreview.prototype.writeHead=function(t,e){null!=this.title&&t.writeln(""+this.title+""),mxClient.IS_VML&&t.writeln(''),t.writeln('")},mxPrintPreview.prototype.writePostfix=function(t){},mxPrintPreview.prototype.createPageSelector=function(t,e){var n=this.wnd.document,i=n.createElement("table");i.className="mxPageSelector",i.setAttribute("border","0");for(var l=n.createElement("tbody"),s=0;s":"",mxCellEditor.prototype.escapeCancelsEditing=!0,mxCellEditor.prototype.textNode="",mxCellEditor.prototype.zIndex=5,mxCellEditor.prototype.minResize=new mxRectangle(0,20),mxCellEditor.prototype.wordWrapPadding=mxClient.IS_QUIRKS?2:mxClient.IS_IE11?0:1,mxCellEditor.prototype.blurEnabled=!1,mxCellEditor.prototype.initialValue=null,mxCellEditor.prototype.align=null,mxCellEditor.prototype.init=function(){this.textarea=document.createElement("div"),this.textarea.className="mxCellEditor mxPlainTextEditor",this.textarea.contentEditable=!0,mxClient.IS_GC&&(this.textarea.style.minHeight="1em"),this.textarea.style.position=this.isLegacyEditor()?"absolute":"relative",this.installListeners(this.textarea)},mxCellEditor.prototype.applyValue=function(t,e){this.graph.labelChanged(t.cell,e,this.trigger)},mxCellEditor.prototype.setAlign=function(t){null!=this.textarea&&(this.textarea.style.textAlign=t),this.align=t,this.resize()},mxCellEditor.prototype.getInitialValue=function(t,e){e=mxUtils.htmlEntities(this.graph.getEditingValue(t.cell,e),!1);return mxClient.IS_QUIRKS||8==document.documentMode||9==document.documentMode||10==document.documentMode||(e=mxUtils.replaceTrailingNewlines(e,"

")),e.replace(/\n/g,"
")},mxCellEditor.prototype.getCurrentValue=function(t){return mxUtils.extractTextWithWhitespace(this.textarea.childNodes)},mxCellEditor.prototype.isCancelEditingKeyEvent=function(t){return this.escapeCancelsEditing||mxEvent.isShiftDown(t)||mxEvent.isControlDown(t)||mxEvent.isMetaDown(t)},mxCellEditor.prototype.installListeners=function(e){mxEvent.addListener(e,"dragstart",mxUtils.bind(this,function(t){this.graph.stopEditing(!1),mxEvent.consume(t)})),mxEvent.addListener(e,"blur",mxUtils.bind(this,function(t){this.blurEnabled&&this.focusLost(t)})),mxEvent.addListener(e,"keydown",mxUtils.bind(this,function(t){mxEvent.isConsumed(t)||(this.isStopEditingEvent(t)?(this.graph.stopEditing(!1),mxEvent.consume(t)):27==t.keyCode&&(this.graph.stopEditing(this.isCancelEditingKeyEvent(t)),mxEvent.consume(t)))}));var t=mxUtils.bind(this,function(t){null!=this.editingCell&&this.clearOnChange&&e.innerHTML==this.getEmptyLabelText()&&(!mxClient.IS_FF||8!=t.keyCode&&46!=t.keyCode)&&(this.clearOnChange=!1,e.innerHTML="")});mxEvent.addListener(e,"keypress",t),mxEvent.addListener(e,"paste",t);var n=mxUtils.bind(this,function(t){null!=this.editingCell&&(0==this.textarea.innerHTML.length||"
"==this.textarea.innerHTML?(this.textarea.innerHTML=this.getEmptyLabelText(),this.clearOnChange=0d&&(this.textarea.style.width=this.textarea.scrollWidth+"px")):this.textarea.style.maxWidth=d+"px"):(this.textarea.style.whiteSpace="nowrap",this.textarea.style.width=""),8==document.documentMode&&(this.textarea.style.zoom="1",this.textarea.style.height="auto"),h=this.textarea.scrollWidth,d=this.textarea.scrollHeight,8==document.documentMode?(this.textarea.style.left=Math.max(0,Math.ceil((this.bounds.x-a.x*(this.bounds.width-(h+1)*t)+h*(t-1)*0+2*(a.x+.5))/t))+"px",this.textarea.style.top=Math.max(0,Math.ceil((this.bounds.y-a.y*(this.bounds.height-(d+.5)*t)+d*(t-1)*0+ +Math.abs(a.y+.5))/t))+"px",this.textarea.style.width=Math.round(h*t)+"px",this.textarea.style.height=Math.round(d*t)+"px"):mxClient.IS_QUIRKS?(this.textarea.style.left=Math.max(0,Math.ceil(this.bounds.x-a.x*(this.bounds.width-(h+1)*t)+h*(t-1)*0+2*(a.x+.5)))+"px",this.textarea.style.top=Math.max(0,Math.ceil(this.bounds.y-a.y*(this.bounds.height-(d+.5)*t)+d*(t-1)*0+ +Math.abs(a.y+.5)))+"px"):(this.textarea.style.left=Math.max(0,Math.round(this.bounds.x-a.x*(this.bounds.width-2))+1)+"px",this.textarea.style.top=Math.max(0,Math.round(this.bounds.y-a.y*(this.bounds.height-4)+(-1==a.y?3:0))+1)+"px")):(this.bounds=this.getEditorBounds(u),this.textarea.style.width=Math.round(this.bounds.width/t)+"px",this.textarea.style.height=Math.round(this.bounds.height/t)+"px",8==document.documentMode||mxClient.IS_QUIRKS?(this.textarea.style.left=Math.round(this.bounds.x)+"px",this.textarea.style.top=Math.round(this.bounds.y)+"px"):(this.textarea.style.left=Math.max(0,Math.round(this.bounds.x+1))+"px",this.textarea.style.top=Math.max(0,Math.round(this.bounds.y+1))+"px"),this.graph.isWrapping(u.cell)&&(2<=this.bounds.width||2<=this.bounds.height)&&this.textarea.innerHTML!=this.getEmptyLabelText()?(this.textarea.style.wordWrap=mxConstants.WORD_WRAP,this.textarea.style.whiteSpace="normal","fill"!=u.style[mxConstants.STYLE_OVERFLOW]&&(this.textarea.style.width=Math.round(this.bounds.width/t)+this.wordWrapPadding+"px")):(this.textarea.style.whiteSpace="nowrap","fill"!=u.style[mxConstants.STYLE_OVERFLOW]&&(this.textarea.style.width=""))),mxClient.IS_VML?this.textarea.style.zoom=t:(mxUtils.setPrefixedStyle(this.textarea.style,"transformOrigin","0px 0px"),mxUtils.setPrefixedStyle(this.textarea.style,"transform","scale("+t+","+t+")"+(null==a?"":" translate("+100*a.x+"%,"+100*a.y+"%)"))))},mxCellEditor.prototype.focusLost=function(){this.stopEditing(!this.graph.isInvokesStopCellEditing())},mxCellEditor.prototype.getBackgroundColor=function(t){return null},mxCellEditor.prototype.isLegacyEditor=function(){if(mxClient.IS_VML)return!0;var t,e=!1;return mxClient.IS_SVG&&(null==(t=this.graph.view.getDrawPane().ownerSVGElement)||null!=(t=mxUtils.getCurrentStyle(t))&&(e="absolute"==t.position)),!e},mxCellEditor.prototype.startEditing=function(t,e){this.stopEditing(!0),(this.align=null)==this.textarea&&this.init(),null!=this.graph.tooltipHandler&&this.graph.tooltipHandler.hideTooltip();var n=this.graph.getView().getState(t);if(null!=n){this.graph.getView().scale;var i=mxUtils.getValue(n.style,mxConstants.STYLE_FONTSIZE,mxConstants.DEFAULT_FONTSIZE),l=mxUtils.getValue(n.style,mxConstants.STYLE_FONTFAMILY,mxConstants.DEFAULT_FONTFAMILY),s=mxUtils.getValue(n.style,mxConstants.STYLE_FONTCOLOR,"black"),o=mxUtils.getValue(n.style,mxConstants.STYLE_ALIGN,mxConstants.ALIGN_LEFT),r=(mxUtils.getValue(n.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD,a=(mxUtils.getValue(n.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC,h=[];(mxUtils.getValue(n.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&h.push("underline"),(mxUtils.getValue(n.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&h.push("line-through"),this.textarea.style.lineHeight=mxConstants.ABSOLUTE_LINE_HEIGHT?Math.round(i*mxConstants.LINE_HEIGHT)+"px":mxConstants.LINE_HEIGHT,this.textarea.style.backgroundColor=this.getBackgroundColor(n),this.textarea.style.textDecoration=h.join(" "),this.textarea.style.fontWeight=r?"bold":"normal",this.textarea.style.fontStyle=a?"italic":"",this.textarea.style.fontSize=Math.round(i)+"px",this.textarea.style.zIndex=this.zIndex,this.textarea.style.fontFamily=l,this.textarea.style.textAlign=o,this.textarea.style.outline="none",this.textarea.style.color=s;s=this.textDirection=mxUtils.getValue(n.style,mxConstants.STYLE_TEXT_DIRECTION,mxConstants.DEFAULT_TEXT_DIRECTION);s==mxConstants.TEXT_DIRECTION_AUTO&&(null==n||null==n.text||n.text.dialect==mxConstants.DIALECT_STRICTHTML||mxUtils.isNode(n.text.value)||(s=n.text.getAutoDirection())),s==mxConstants.TEXT_DIRECTION_LTR||s==mxConstants.TEXT_DIRECTION_RTL?this.textarea.setAttribute("dir",s):this.textarea.removeAttribute("dir"),this.textarea.innerHTML=this.getInitialValue(n,e)||"",this.initialValue=this.textarea.innerHTML,0==this.textarea.innerHTML.length||"
"==this.textarea.innerHTML?(this.textarea.innerHTML=this.getEmptyLabelText(),this.clearOnChange=!0):this.clearOnChange=this.textarea.innerHTML==this.getEmptyLabelText(),this.graph.container.appendChild(this.textarea),this.editingCell=t,this.trigger=e,(this.textNode=null)!=n.text&&this.isHideLabel(n)&&(this.textNode=n.text.node,this.textNode.style.visibility="hidden"),this.autoSize&&(this.graph.model.isEdge(n.cell)||"fill"!=n.style[mxConstants.STYLE_OVERFLOW])&&window.setTimeout(mxUtils.bind(this,function(){this.resize()}),0),this.resize();try{this.textarea.focus(),this.isSelectText()&&0e.x+e.width?null!=m?(o=m.x,d=Math.max(Math.abs(h-m.y),d)):a==mxConstants.DIRECTION_NORTH?h=e.y-2*r:a==mxConstants.DIRECTION_SOUTH?h=e.y+e.height+2*r:o=a==mxConstants.DIRECTION_EAST?e.x-2*d:e.x+e.width+2*d:null!=m&&(o=s.getRoutingCenterX(e),r=Math.max(Math.abs(o-m.x),d),h=m.y,d=0),l.push(new mxPoint(o-r,h-d)),l.push(new mxPoint(o+r,h+d)));else if(null!=i&&0a,u=h.xo):(d=(s=Math.max(e.x,n.x))==(o=Math.min(e.x+e.width,n.x+n.width)))||(u=(r=Math.max(e.y,n.y))==(a=Math.min(e.y+e.height,n.y+n.height)))),u||!d&&t.style[mxConstants.STYLE_ELBOW]!=mxConstants.ELBOW_VERTICAL?mxEdgeStyle.SideToSide(t,e,n,i,l):mxEdgeStyle.TopToBottom(t,e,n,i,l)},SideToSide:function(t,e,n,i,l){var s=t.view,o=null!=i&&0=e.y&&o.y<=e.y+e.height&&(r=o.y),o.y>=n.y&&o.y<=n.y+n.height&&(s=o.y)),mxUtils.contains(n,i,r)||mxUtils.contains(e,i,r)||l.push(new mxPoint(i,r)),mxUtils.contains(n,i,s)||mxUtils.contains(e,i,s)||l.push(new mxPoint(i,s)),1==l.length&&(null!=o?mxUtils.contains(n,i,o.y)||mxUtils.contains(e,i,o.y)||l.push(new mxPoint(i,o.y)):(o=Math.max(e.y,n.y),n=Math.min(e.y+e.height,n.y+n.height),l.push(new mxPoint(i,o+(n-o)/2)))))},TopToBottom:function(t,e,n,i,l){var s=t.view,o=null!=i&&0=e.x&&o.x<=e.x+e.width&&(r=o.x),i=null!=o?o.y:Math.round(i+(t-i)/2),mxUtils.contains(n,r,i)||mxUtils.contains(e,r,i)||l.push(new mxPoint(r,i)),r=null!=o&&o.x>=n.x&&o.x<=n.x+n.width?o.x:s.getRoutingCenterX(n),mxUtils.contains(n,r,i)||mxUtils.contains(e,r,i)||l.push(new mxPoint(r,i)),1==l.length&&(null!=o&&1==l.length?mxUtils.contains(n,o.x,i)||mxUtils.contains(e,o.x,i)||l.push(new mxPoint(o.x,i)):(o=Math.max(e.x,n.x),n=Math.min(e.x+e.width,n.x+n.width),l.push(new mxPoint(o+(n-o)/2,i)))))},SegmentConnector:function(e,t,n,i,l){var s=mxEdgeStyle.scalePointArray(e.absolutePoints,e.view.scale),o=mxEdgeStyle.scaleCellState(t,e.view.scale),r=mxEdgeStyle.scaleCellState(n,e.view.scale),a=0=Math.max(1,e.view.scale))&&(l.push(t),a=t),a}var p=s[0];null==p&&null!=o?p=new mxPoint(e.view.getRoutingCenterX(o),e.view.getRoutingCenterY(o)):null!=p&&(p=p.clone());var m=s.length-1;if(null!=i&&0=f.y&&v.y<=f.y+f.height,b=null!=f&&v.x>=f.x&&v.x<=f.x+f.width,T=S||null==C&&w,A=E||null==C&&b;if(0!=g||!(T&&A||E&&S)){if(null!=C&&!S&&!E&&(w||b)){h=!w;break}if(A||T){h=T,1==g&&(h=c.length%2==0?T:A);break}}f=r,null!=(C=s[m])&&(f=null),v=c[c.length-1],E&&S&&(c=c.slice(1))}h&&(null!=s[0]&&s[0].y!=d.y||null==s[0]&&null!=o&&(d.yo.y+o.height))?u(new mxPoint(p.x,d.y)):!h&&(null!=s[0]&&s[0].x!=d.x||null==s[0]&&null!=o&&(d.xo.x+o.width))&&u(new mxPoint(d.x,p.y)),h?p.y=d.y:p.x=d.x;for(g=0;gr.y+r.height))?u(new mxPoint(p.x,d.y)):!h&&(null!=s[m]&&s[m].x!=d.x||null==s[m]&&null!=r&&(d.xr.x+r.width))&&u(new mxPoint(d.x,p.y))),null==s[0]&&null!=o)for(;1>8),0==(983040&N[I])&&(N[I]=65535&N[I]|(251658240&N[I])>>8),T[I]=15&N[I],b[I]!=mxConstants.DIRECTION_MASK_WEST&&b[I]!=mxConstants.DIRECTION_MASK_NORTH&&b[I]!=mxConstants.DIRECTION_MASK_EAST&&b[I]!=mxConstants.DIRECTION_MASK_SOUTH||(T[I]=b[I]));u=T[0]==mxConstants.DIRECTION_MASK_EAST?3:T[0],h=T[1]==mxConstants.DIRECTION_MASK_EAST?3:T[1];(u-=R)<1&&(u+=4),(h-=R)<1&&(h+=4);var G=mxEdgeStyle.routePatterns[u-1][h-1];switch(mxEdgeStyle.wayPoints1[0][0]=A[0][0],mxEdgeStyle.wayPoints1[0][1]=A[0][1],T[0]){case mxConstants.DIRECTION_MASK_WEST:mxEdgeStyle.wayPoints1[0][0]-=E,mxEdgeStyle.wayPoints1[0][1]+=U[0][1]*A[0][3];break;case mxConstants.DIRECTION_MASK_SOUTH:mxEdgeStyle.wayPoints1[0][0]+=U[0][0]*A[0][2],mxEdgeStyle.wayPoints1[0][1]+=A[0][3]+E;break;case mxConstants.DIRECTION_MASK_EAST:mxEdgeStyle.wayPoints1[0][0]+=A[0][2]+E,mxEdgeStyle.wayPoints1[0][1]+=U[0][1]*A[0][3];break;case mxConstants.DIRECTION_MASK_NORTH:mxEdgeStyle.wayPoints1[0][0]+=U[0][0]*A[0][2],mxEdgeStyle.wayPoints1[0][1]-=E}for(var k=0,V=0<(T[0]&(mxConstants.DIRECTION_MASK_EAST|mxConstants.DIRECTION_MASK_WEST))?0:1,F=V,B=0,I=0;I>5;15<(Z<<=R)&&(Z>>=4);z=0<(G[I]&mxEdgeStyle.CENTER_MASK);(X||j)&&Z<9?(j=0,X=X?0:1,j=z&&0==B?A[X][0]+U[X][0]*A[X][2]:z?A[X][1]+U[X][1]*A[X][3]:mxEdgeStyle.limits[X][Z],0==B?0<(Z=(j-mxEdgeStyle.wayPoints1[k][0])*W[0])&&(mxEdgeStyle.wayPoints1[k][0]+=W[0]*Z):0<(j=(j-mxEdgeStyle.wayPoints1[k][1])*W[1])&&(mxEdgeStyle.wayPoints1[k][1]+=W[1]*j)):z&&(mxEdgeStyle.wayPoints1[k][0]+=W[0]*Math.abs(mxEdgeStyle.vertexSeperations[Y]/2),mxEdgeStyle.wayPoints1[k][1]+=W[1]*Math.abs(mxEdgeStyle.vertexSeperations[Y]/2)),0=Math.round(a+r)&&he+2&&n.x<=t)return!0;e=this.graph.container.offsetHeight,t=this.graph.container.clientHeight;return tt+2&&n.y<=e},mxGraphView.prototype.init=function(){this.installListeners();var t=this.graph;t.dialect==mxConstants.DIALECT_SVG?this.createSvg():t.dialect==mxConstants.DIALECT_VML?this.createVml():this.createHtml()},mxGraphView.prototype.installListeners=function(){var e,i=this.graph,l=i.container;null!=l&&(mxClient.IS_TOUCH&&(mxEvent.addListener(l,"gesturestart",mxUtils.bind(this,function(t){i.fireGestureEvent(t),mxEvent.consume(t)})),mxEvent.addListener(l,"gesturechange",mxUtils.bind(this,function(t){i.fireGestureEvent(t),mxEvent.consume(t)})),mxEvent.addListener(l,"gestureend",mxUtils.bind(this,function(t){i.fireGestureEvent(t),mxEvent.consume(t)}))),e=null,mxEvent.addGestureListeners(l,mxUtils.bind(this,function(t){!this.isContainerEvent(t)||(mxClient.IS_IE||mxClient.IS_IE11||mxClient.IS_GC||mxClient.IS_OP||mxClient.IS_SF)&&this.isScrollEvent(t)||(i.fireMouseEvent(mxEvent.MOUSE_DOWN,new mxMouseEvent(t)),e=t.pointerId)}),mxUtils.bind(this,function(t){!this.isContainerEvent(t)||null!=e&&t.pointerId!=e||i.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(t))}),mxUtils.bind(this,function(t){this.isContainerEvent(t)&&i.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(t)),e=null})),mxEvent.addListener(l,"dblclick",mxUtils.bind(this,function(t){this.isContainerEvent(t)&&i.dblClick(t)})),i.addMouseListener({mouseDown:function(t,e){i.popupMenuHandler.hideMenu()},mouseMove:function(){},mouseUp:function(){}}),this.moveHandler=mxUtils.bind(this,function(t){var e,n;null!=i.tooltipHandler&&i.tooltipHandler.isHideOnHover()&&i.tooltipHandler.hide(),this.captureDocumentGesture&&i.isMouseDown&&null!=i.container&&!this.isContainerEvent(t)&&"none"!=i.container.style.display&&"hidden"!=i.container.style.visibility&&!mxEvent.isConsumed(t)&&i.fireMouseEvent(mxEvent.MOUSE_MOVE,new mxMouseEvent(t,(e=t,n=null,mxClient.IS_TOUCH&&(t=mxEvent.getClientX(e),e=mxEvent.getClientY(e),e=mxUtils.convertPoint(l,t,e),n=i.view.getState(i.getCellAt(e.x,e.y))),n)))}),this.endHandler=mxUtils.bind(this,function(t){this.captureDocumentGesture&&i.isMouseDown&&null!=i.container&&!this.isContainerEvent(t)&&"none"!=i.container.style.display&&"hidden"!=i.container.style.visibility&&i.fireMouseEvent(mxEvent.MOUSE_UP,new mxMouseEvent(t))}),mxEvent.addGestureListeners(document,null,this.moveHandler,this.endHandler))},mxGraphView.prototype.createHtml=function(){var t=this.graph.container;null!=t&&(this.canvas=this.createHtmlPane("100%","100%"),this.canvas.style.overflow="hidden",this.backgroundPane=this.createHtmlPane("1px","1px"),this.drawPane=this.createHtmlPane("1px","1px"),this.overlayPane=this.createHtmlPane("1px","1px"),this.decoratorPane=this.createHtmlPane("1px","1px"),this.canvas.appendChild(this.backgroundPane),this.canvas.appendChild(this.drawPane),this.canvas.appendChild(this.overlayPane),this.canvas.appendChild(this.decoratorPane),t.appendChild(this.canvas),this.updateContainerStyle(t),mxClient.IS_QUIRKS&&(t=mxUtils.bind(this,function(t){var e=this.getGraphBounds(),n=e.x+e.width+this.graph.border,e=e.y+e.height+this.graph.border;this.updateHtmlCanvasSize(n,e)}),mxEvent.addListener(window,"resize",t)))},mxGraphView.prototype.updateHtmlCanvasSize=function(t,e){var n,i;null!=this.graph.container&&(n=this.graph.container.offsetWidth,i=this.graph.container.offsetHeight,this.canvas.style.width=n")},mxGraph.prototype.createHandlers=function(){this.tooltipHandler=this.createTooltipHandler(),this.tooltipHandler.setEnabled(!1),this.selectionCellsHandler=this.createSelectionCellsHandler(),this.connectionHandler=this.createConnectionHandler(),this.connectionHandler.setEnabled(!1),this.graphHandler=this.createGraphHandler(),this.panningHandler=this.createPanningHandler(),this.panningHandler.panningEnabled=!1,this.popupMenuHandler=this.createPopupMenuHandler()},mxGraph.prototype.createTooltipHandler=function(){return new mxTooltipHandler(this)},mxGraph.prototype.createSelectionCellsHandler=function(){return new mxSelectionCellsHandler(this)},mxGraph.prototype.createConnectionHandler=function(){return new mxConnectionHandler(this)},mxGraph.prototype.createGraphHandler=function(){return new mxGraphHandler(this)},mxGraph.prototype.createPanningHandler=function(){return new mxPanningHandler(this)},mxGraph.prototype.createPopupMenuHandler=function(){return new mxPopupMenuHandler(this)},mxGraph.prototype.createSelectionModel=function(){return new mxGraphSelectionModel(this)},mxGraph.prototype.createStylesheet=function(){return new mxStylesheet},mxGraph.prototype.createGraphView=function(){return new mxGraphView(this)},mxGraph.prototype.createCellRenderer=function(){return new mxCellRenderer},mxGraph.prototype.createCellEditor=function(){return new mxCellEditor(this)},mxGraph.prototype.getModel=function(){return this.model},mxGraph.prototype.getView=function(){return this.view},mxGraph.prototype.getStylesheet=function(){return this.stylesheet},mxGraph.prototype.setStylesheet=function(t){this.stylesheet=t},mxGraph.prototype.getSelectionModel=function(){return this.selectionModel},mxGraph.prototype.setSelectionModel=function(t){this.selectionModel=t},mxGraph.prototype.getSelectionCellsForChanges=function(t,e){for(var i=new mxDictionary,l=[],s=mxUtils.bind(this,function(t){if(!i.get(t)&&this.model.contains(t))if(this.model.isEdge(t)||this.model.isVertex(t))i.put(t,!0),l.push(t);else for(var e=this.model.getChildCount(t),n=0;n"+t+"");return i&&t.addListener(mxEvent.CLICK,mxUtils.bind(this,function(t,e){this.isEnabled()&&this.setSelectionCell(n)})),this.addCellOverlay(n,t)}return this.removeCellOverlays(n),null},mxGraph.prototype.startEditing=function(t){this.startEditingAtCell(null,t)},mxGraph.prototype.startEditingAtCell=function(t,e){null!=e&&mxEvent.isMultiTouchEvent(e)||(null==t&&(null==(t=this.getSelectionCell())||this.isCellEditable(t)||(t=null)),null!=t&&(this.fireEvent(new mxEventObject(mxEvent.START_EDITING,"cell",t,"event",e)),this.cellEditor.startEditing(t,e),this.fireEvent(new mxEventObject(mxEvent.EDITING_STARTED,"cell",t,"event",e))))},mxGraph.prototype.getEditingValue=function(t,e){return this.convertValueToString(t)},mxGraph.prototype.stopEditing=function(t){this.cellEditor.stopEditing(t),this.fireEvent(new mxEventObject(mxEvent.EDITING_STOPPED,"cancel",t))},mxGraph.prototype.labelChanged=function(t,e,n){this.model.beginUpdate();try{var i=t.value;this.cellLabelChanged(t,e,this.isAutoSizeCell(t)),this.fireEvent(new mxEventObject(mxEvent.LABEL_CHANGED,"cell",t,"value",e,"old",i,"event",n))}finally{this.model.endUpdate()}return t},mxGraph.prototype.cellLabelChanged=function(t,e,n){this.model.beginUpdate();try{this.model.setValue(t,e),n&&this.cellSizeUpdated(t,!1)}finally{this.model.endUpdate()}},mxGraph.prototype.escape=function(t){this.fireEvent(new mxEventObject(mxEvent.ESCAPE,"event",t))},mxGraph.prototype.click=function(t){var n,e=t.getEvent(),i=t.getCell(),l=new mxEventObject(mxEvent.CLICK,"event",e,"cell",i);if(t.isConsumed()&&l.consume(),this.fireEvent(l),this.isEnabled()&&!mxEvent.isConsumed(e)&&!l.isConsumed()){if(null!=i)this.isTransparentClickEvent(e)&&(n=!1,null!=(l=this.getCellAt(t.graphX,t.graphY,null,null,null,mxUtils.bind(this,function(t){var e=this.isCellSelected(t.cell);return!(n=n||e)||e||t.cell!=i&&this.model.isAncestor(t.cell,i)})))&&(i=l));else if(this.isSwimlaneSelectionEnabled()&&!(null==(i=this.getSwimlaneAt(t.getGraphX(),t.getGraphY()))||this.isToggleEvent(e)&&mxEvent.isAltDown(e))){for(var s=i,o=[];null!=s;){s=this.model.getParent(s);var r=this.view.getState(s);this.isSwimlane(s)&&null!=r&&o.push(s)}if(0=(l=this.container).scrollLeft&&e>=l.scrollTop&&t<=l.scrollLeft+l.clientWidth&&e<=l.scrollTop+l.clientHeight&&((o=l.scrollLeft+l.clientWidth-t)this.minPageBreakDist)?Math.ceil(o.height/r.height)+1:0,h=t?Math.ceil(o.width/r.width)+1:0,d=(h-1)*r.width,u=(a-1)*r.height;null==this.horizontalPageBreaks&&0this.model.getChildCount(e)&&n--,this.model.add(e,t[g],n+g),this.autoSizeCellsOnAdd&&this.autoSizeCell(t[g],!0),(null==r||r)&&this.isExtendParentsOnAdd(t[g])&&this.isExtendParent(t[g])&&this.extendParent(t[g]),null!=o&&!o||this.constrainChild(t[g]),null!=i&&this.cellConnected(t[g],i,!0),null!=l&&this.cellConnected(t[g],l,!1));this.fireEvent(new mxEventObject(mxEvent.CELLS_ADDED,"cells",t,"parent",e,"index",n,"source",i,"target",l,"absolute",s))}finally{this.model.endUpdate()}}},mxGraph.prototype.autoSizeCell=function(t,e){if(e=null==e||e)for(var n=this.model.getChildCount(t),i=0;i"),o=(r=mxUtils.getSizeForString(t,i,s[mxConstants.STYLE_FONTFAMILY],e,s[mxConstants.STYLE_FONTSTYLE])).width+o,r=r.height+l,mxUtils.getValue(s,mxConstants.STYLE_HORIZONTAL,!0)||(s=r,r=o,o=s),this.gridEnabled&&(o=this.snap(o+this.gridSize/2),r=this.snap(r+this.gridSize/2)),new mxRectangle(0,0,o,r)):new mxRectangle(0,0,r=4*this.gridSize,r))),a},mxGraph.prototype.resizeCell=function(t,e,n){return this.resizeCells([t],[e],n)[0]},mxGraph.prototype.resizeCells=function(t,e,n){n=null!=n?n:this.isRecursiveResize(),this.model.beginUpdate();try{var i=this.cellsResized(t,e,n);this.fireEvent(new mxEventObject(mxEvent.RESIZE_CELLS,"cells",t,"bounds",e,"previous",i))}finally{this.model.endUpdate()}return t},mxGraph.prototype.cellsResized=function(t,e,n){n=null!=n&&n;var i=[];if(null!=t&&null!=e&&t.length==e.length){this.model.beginUpdate();try{for(var l=0;le.width&&(r=n.width-e.width,n.width-=r),h.x+h.width>e.x+e.width&&(r-=h.x+h.width-e.x-e.width-r),a=0,n.height>e.height&&(a=n.height-e.height,n.height-=a),h.y+h.height>e.y+e.height&&(a-=h.y+h.height-e.y-e.height-a),h.xo+e&&(this.view.translate.x-=(t.x+i-e-o)/a,h=!0),t.y+l>r+n&&(this.view.translate.y-=(t.y+l-n-r)/a,h=!0),t.x")):this.setCellWarning(s,null),n=n&&null==o}var r="";this.isCellCollapsed(t)&&!n&&(r+=(mxResources.get(this.containsValidationErrorsResource)||this.containsValidationErrorsResource)+"\n"),this.model.isEdge(t)?r+=this.getEdgeValidationError(t,this.model.getTerminal(t,!0),this.model.getTerminal(t,!1))||"":r+=this.getCellValidationError(t)||"";var a=this.validateCell(t,e);return null!=a&&(r+=a),null==this.model.getParent(t)&&this.view.validate(),0o.max||eo.max||n")),null==s&&null!=t.overlays&&t.overlays.visit(function(t,e){null!=s||n!=e.node&&n.parentNode!=e.node||(s=e.overlay.toString())}),null!=s||null!=(l=this.selectionCellsHandler.getHandler(t.cell))&&"function"==typeof l.getTooltipForNode&&(s=l.getTooltipForNode(n)),null==s&&(s=this.getTooltipForCell(t.cell))),s},mxGraph.prototype.getTooltipForCell=function(t){return null!=t&&null!=t.getTooltip?t.getTooltip():this.convertValueToString(t)},mxGraph.prototype.getLinkForCell=function(t){return null},mxGraph.prototype.getCursorForMouseEvent=function(t){return this.getCursorForCell(t.getCell())},mxGraph.prototype.getCursorForCell=function(t){return null},mxGraph.prototype.getStartSize=function(t,e){var n=new mxRectangle,t=this.getCurrentCellStyle(t,e),e=parseInt(mxUtils.getValue(t,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE));return mxUtils.getValue(t,mxConstants.STYLE_HORIZONTAL,!0)?n.height=e:n.width=e,n},mxGraph.prototype.getSwimlaneDirection=function(t){var e=mxUtils.getValue(t,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST),n=1==mxUtils.getValue(t,mxConstants.STYLE_FLIPH,0),i=1==mxUtils.getValue(t,mxConstants.STYLE_FLIPV,0),t=mxUtils.getValue(t,mxConstants.STYLE_HORIZONTAL,!0)?0:3;e==mxConstants.DIRECTION_NORTH?t--:e==mxConstants.DIRECTION_WEST?t+=2:e==mxConstants.DIRECTION_SOUTH&&(t+=1);e=mxUtils.mod(t,2);return n&&1==e&&(t+=2),i&&0==e&&(t+=2),[mxConstants.DIRECTION_NORTH,mxConstants.DIRECTION_EAST,mxConstants.DIRECTION_SOUTH,mxConstants.DIRECTION_WEST][mxUtils.mod(t,4)]},mxGraph.prototype.getActualStartSize=function(t,e){var n=new mxRectangle;return this.isSwimlane(t,e)&&(t=this.getCurrentCellStyle(t,e),e=parseInt(mxUtils.getValue(t,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE)),(t=this.getSwimlaneDirection(t))==mxConstants.DIRECTION_NORTH?n.y=e:t==mxConstants.DIRECTION_WEST?n.x=e:t==mxConstants.DIRECTION_SOUTH?n.height=e:n.width=e),n},mxGraph.prototype.getImage=function(t){return null!=t&&null!=t.style?t.style[mxConstants.STYLE_IMAGE]:null},mxGraph.prototype.isTransparentState=function(t){var e,n,i=!1;return null!=t&&(e=mxUtils.getValue(t.style,mxConstants.STYLE_STROKECOLOR,mxConstants.NONE),n=mxUtils.getValue(t.style,mxConstants.STYLE_FILLCOLOR,mxConstants.NONE),i=e==mxConstants.NONE&&n==mxConstants.NONE&&null==this.getImage(t)),i},mxGraph.prototype.getVerticalAlign=function(t){return null!=t&&null!=t.style?t.style[mxConstants.STYLE_VERTICAL_ALIGN]||mxConstants.ALIGN_MIDDLE:null},mxGraph.prototype.getIndicatorColor=function(t){return null!=t&&null!=t.style?t.style[mxConstants.STYLE_INDICATOR_COLOR]:null},mxGraph.prototype.getIndicatorGradientColor=function(t){return null!=t&&null!=t.style?t.style[mxConstants.STYLE_INDICATOR_GRADIENTCOLOR]:null},mxGraph.prototype.getIndicatorShape=function(t){return null!=t&&null!=t.style?t.style[mxConstants.STYLE_INDICATOR_SHAPE]:null},mxGraph.prototype.getIndicatorImage=function(t){return null!=t&&null!=t.style?t.style[mxConstants.STYLE_INDICATOR_IMAGE]:null},mxGraph.prototype.getBorder=function(){return this.border},mxGraph.prototype.setBorder=function(t){this.border=t},mxGraph.prototype.isSwimlane=function(t,e){return null!=t&&this.model.getParent(t)!=this.model.getRoot()&&!this.model.isEdge(t)&&this.getCurrentCellStyle(t,e)[mxConstants.STYLE_SHAPE]==mxConstants.SHAPE_SWIMLANE},mxGraph.prototype.isResizeContainer=function(){return this.resizeContainer},mxGraph.prototype.setResizeContainer=function(t){this.resizeContainer=t},mxGraph.prototype.isEnabled=function(){return this.enabled},mxGraph.prototype.setEnabled=function(t){this.enabled=t},mxGraph.prototype.isEscapeEnabled=function(){return this.escapeEnabled},mxGraph.prototype.setEscapeEnabled=function(t){this.escapeEnabled=t},mxGraph.prototype.isInvokesStopCellEditing=function(){return this.invokesStopCellEditing},mxGraph.prototype.setInvokesStopCellEditing=function(t){this.invokesStopCellEditing=t},mxGraph.prototype.isEnterStopsCellEditing=function(){return this.enterStopsCellEditing},mxGraph.prototype.setEnterStopsCellEditing=function(t){this.enterStopsCellEditing=t},mxGraph.prototype.isCellLocked=function(t){var e=this.model.getGeometry(t);return this.isCellsLocked()||null!=e&&this.model.isVertex(t)&&e.relative},mxGraph.prototype.isCellsLocked=function(){return this.cellsLocked},mxGraph.prototype.setCellsLocked=function(t){this.cellsLocked=t},mxGraph.prototype.getCloneableCells=function(t){return this.model.filterCells(t,mxUtils.bind(this,function(t){return this.isCellCloneable(t)}))},mxGraph.prototype.isCellCloneable=function(t){t=this.getCurrentCellStyle(t);return this.isCellsCloneable()&&0!=t[mxConstants.STYLE_CLONEABLE]},mxGraph.prototype.isCellsCloneable=function(){return this.cellsCloneable},mxGraph.prototype.setCellsCloneable=function(t){this.cellsCloneable=t},mxGraph.prototype.getExportableCells=function(t){return this.model.filterCells(t,mxUtils.bind(this,function(t){return this.canExportCell(t)}))},mxGraph.prototype.canExportCell=function(t){return this.exportEnabled},mxGraph.prototype.getImportableCells=function(t){return this.model.filterCells(t,mxUtils.bind(this,function(t){return this.canImportCell(t)}))},mxGraph.prototype.canImportCell=function(t){return this.importEnabled},mxGraph.prototype.isCellSelectable=function(t){return this.isCellsSelectable()},mxGraph.prototype.isCellsSelectable=function(){return this.cellsSelectable},mxGraph.prototype.setCellsSelectable=function(t){this.cellsSelectable=t},mxGraph.prototype.getDeletableCells=function(t){return this.model.filterCells(t,mxUtils.bind(this,function(t){return this.isCellDeletable(t)}))},mxGraph.prototype.isCellDeletable=function(t){t=this.getCurrentCellStyle(t);return this.isCellsDeletable()&&0!=t[mxConstants.STYLE_DELETABLE]},mxGraph.prototype.isCellsDeletable=function(){return this.cellsDeletable},mxGraph.prototype.setCellsDeletable=function(t){this.cellsDeletable=t},mxGraph.prototype.isLabelMovable=function(t){return!this.isCellLocked(t)&&(this.model.isEdge(t)&&this.edgeLabelsMovable||this.model.isVertex(t)&&this.vertexLabelsMovable)},mxGraph.prototype.isCellRotatable=function(t){return 0!=this.getCurrentCellStyle(t)[mxConstants.STYLE_ROTATABLE]},mxGraph.prototype.getMovableCells=function(t){return this.model.filterCells(t,mxUtils.bind(this,function(t){return this.isCellMovable(t)}))},mxGraph.prototype.isCellMovable=function(t){var e=this.getCurrentCellStyle(t);return this.isCellsMovable()&&!this.isCellLocked(t)&&0!=e[mxConstants.STYLE_MOVABLE]},mxGraph.prototype.isCellsMovable=function(){return this.cellsMovable},mxGraph.prototype.setCellsMovable=function(t){this.cellsMovable=t},mxGraph.prototype.isGridEnabled=function(){return this.gridEnabled},mxGraph.prototype.setGridEnabled=function(t){this.gridEnabled=t},mxGraph.prototype.isPortsEnabled=function(){return this.portsEnabled},mxGraph.prototype.setPortsEnabled=function(t){this.portsEnabled=t},mxGraph.prototype.getGridSize=function(){return this.gridSize},mxGraph.prototype.setGridSize=function(t){this.gridSize=t},mxGraph.prototype.getTolerance=function(){return this.tolerance},mxGraph.prototype.setTolerance=function(t){this.tolerance=t},mxGraph.prototype.isVertexLabelsMovable=function(){return this.vertexLabelsMovable},mxGraph.prototype.setVertexLabelsMovable=function(t){this.vertexLabelsMovable=t},mxGraph.prototype.isEdgeLabelsMovable=function(){return this.edgeLabelsMovable},mxGraph.prototype.setEdgeLabelsMovable=function(t){this.edgeLabelsMovable=t},mxGraph.prototype.isSwimlaneNesting=function(){return this.swimlaneNesting},mxGraph.prototype.setSwimlaneNesting=function(t){this.swimlaneNesting=t},mxGraph.prototype.isSwimlaneSelectionEnabled=function(){return this.swimlaneSelectionEnabled},mxGraph.prototype.setSwimlaneSelectionEnabled=function(t){this.swimlaneSelectionEnabled=t},mxGraph.prototype.isMultigraph=function(){return this.multigraph},mxGraph.prototype.setMultigraph=function(t){this.multigraph=t},mxGraph.prototype.isAllowLoops=function(){return this.allowLoops},mxGraph.prototype.setAllowDanglingEdges=function(t){this.allowDanglingEdges=t},mxGraph.prototype.isAllowDanglingEdges=function(){return this.allowDanglingEdges},mxGraph.prototype.setConnectableEdges=function(t){this.connectableEdges=t},mxGraph.prototype.isConnectableEdges=function(){return this.connectableEdges},mxGraph.prototype.setCloneInvalidEdges=function(t){this.cloneInvalidEdges=t},mxGraph.prototype.isCloneInvalidEdges=function(){return this.cloneInvalidEdges},mxGraph.prototype.setAllowLoops=function(t){this.allowLoops=t},mxGraph.prototype.isDisconnectOnMove=function(){return this.disconnectOnMove},mxGraph.prototype.setDisconnectOnMove=function(t){this.disconnectOnMove=t},mxGraph.prototype.isDropEnabled=function(){return this.dropEnabled},mxGraph.prototype.setDropEnabled=function(t){this.dropEnabled=t},mxGraph.prototype.isSplitEnabled=function(){return this.splitEnabled},mxGraph.prototype.setSplitEnabled=function(t){this.splitEnabled=t},mxGraph.prototype.isCellResizable=function(t){var e=this.getCurrentCellStyle(t);return this.isCellsResizable()&&!this.isCellLocked(t)&&"0"!=mxUtils.getValue(e,mxConstants.STYLE_RESIZABLE,"1")},mxGraph.prototype.isCellsResizable=function(){return this.cellsResizable},mxGraph.prototype.setCellsResizable=function(t){this.cellsResizable=t},mxGraph.prototype.isTerminalPointMovable=function(t,e){return!0},mxGraph.prototype.isCellBendable=function(t){var e=this.getCurrentCellStyle(t);return this.isCellsBendable()&&!this.isCellLocked(t)&&0!=e[mxConstants.STYLE_BENDABLE]},mxGraph.prototype.isCellsBendable=function(){return this.cellsBendable},mxGraph.prototype.setCellsBendable=function(t){this.cellsBendable=t},mxGraph.prototype.isCellEditable=function(t){var e=this.getCurrentCellStyle(t);return this.isCellsEditable()&&!this.isCellLocked(t)&&0!=e[mxConstants.STYLE_EDITABLE]},mxGraph.prototype.isCellsEditable=function(){return this.cellsEditable},mxGraph.prototype.setCellsEditable=function(t){this.cellsEditable=t},mxGraph.prototype.isCellDisconnectable=function(t,e,n){return this.isCellsDisconnectable()&&!this.isCellLocked(t)},mxGraph.prototype.isCellsDisconnectable=function(){return this.cellsDisconnectable},mxGraph.prototype.setCellsDisconnectable=function(t){this.cellsDisconnectable=t},mxGraph.prototype.isValidSource=function(t){return null==t&&this.allowDanglingEdges||null!=t&&(!this.model.isEdge(t)||this.connectableEdges)&&this.isCellConnectable(t)},mxGraph.prototype.isValidTarget=function(t){return this.isValidSource(t)},mxGraph.prototype.isValidConnection=function(t,e){return this.isValidSource(t)&&this.isValidTarget(e)},mxGraph.prototype.setConnectable=function(t){this.connectionHandler.setEnabled(t)},mxGraph.prototype.isConnectable=function(){return this.connectionHandler.isEnabled()},mxGraph.prototype.setTooltips=function(t){this.tooltipHandler.setEnabled(t)},mxGraph.prototype.setPanning=function(t){this.panningHandler.panningEnabled=t},mxGraph.prototype.isEditing=function(t){if(null==this.cellEditor)return!1;var e=this.cellEditor.getEditingCell();return null==t?null!=e:t==e},mxGraph.prototype.isAutoSizeCell=function(t){t=this.getCurrentCellStyle(t);return this.isAutoSizeCells()||1==t[mxConstants.STYLE_AUTOSIZE]},mxGraph.prototype.isAutoSizeCells=function(){return this.autoSizeCells},mxGraph.prototype.setAutoSizeCells=function(t){this.autoSizeCells=t},mxGraph.prototype.isExtendParent=function(t){return!this.getModel().isEdge(t)&&this.isExtendParents()},mxGraph.prototype.isExtendParents=function(){return this.extendParents},mxGraph.prototype.setExtendParents=function(t){this.extendParents=t},mxGraph.prototype.isExtendParentsOnAdd=function(t){return this.extendParentsOnAdd},mxGraph.prototype.setExtendParentsOnAdd=function(t){this.extendParentsOnAdd=t},mxGraph.prototype.isExtendParentsOnMove=function(){return this.extendParentsOnMove},mxGraph.prototype.setExtendParentsOnMove=function(t){this.extendParentsOnMove=t},mxGraph.prototype.isRecursiveResize=function(t){return this.recursiveResize},mxGraph.prototype.setRecursiveResize=function(t){this.recursiveResize=t},mxGraph.prototype.isConstrainChild=function(t){return this.isConstrainChildren()&&!this.getModel().isEdge(this.getModel().getParent(t))},mxGraph.prototype.isConstrainChildren=function(){return this.constrainChildren},mxGraph.prototype.setConstrainChildren=function(t){this.constrainChildren=t},mxGraph.prototype.isConstrainRelativeChildren=function(){return this.constrainRelativeChildren},mxGraph.prototype.setConstrainRelativeChildren=function(t){this.constrainRelativeChildren=t},mxGraph.prototype.isAllowNegativeCoordinates=function(){return this.allowNegativeCoordinates},mxGraph.prototype.setAllowNegativeCoordinates=function(t){this.allowNegativeCoordinates=t},mxGraph.prototype.getOverlap=function(t){return this.isAllowOverlapParent(t)?this.defaultOverlap:0},mxGraph.prototype.isAllowOverlapParent=function(t){return!1},mxGraph.prototype.getFoldableCells=function(t,e){return this.model.filterCells(t,mxUtils.bind(this,function(t){return this.isCellFoldable(t,e)}))},mxGraph.prototype.isCellFoldable=function(t,e){var n=this.getCurrentCellStyle(t);return 0l.width*t)return!0;if(0l.height*t)return!0}return!1},mxGraph.prototype.getChildVertices=function(t){return this.getChildCells(t,!0,!1)},mxGraph.prototype.getChildEdges=function(t){return this.getChildCells(t,!1,!0)},mxGraph.prototype.getChildCells=function(t,e,n){t=null!=t?t:this.getDefaultParent(),e=null!=e&&e,n=null!=n&&n;for(var i=this.model.getChildCells(t,e,n),l=[],s=0;s=t&&c.y+c.height<=u&&c.y>=e&&c.x+c.width<=d)&&s.push(g),c&&!a||this.getCells(t,e,n,i,g,s,o,r,a))}}return s},mxGraph.prototype.getCellsBeyond=function(t,e,n,i,l){var s=[];if((i||l)&&(null==n&&(n=this.getDefaultParent()),null!=n))for(var o=this.model.getChildCount(n),r=0;r=t)&&(!l||h.y>=e)&&s.push(a)}return s},mxGraph.prototype.findTreeRoots=function(t,e,n){e=null!=e&&e,n=null!=n&&n;var i=[];if(null!=t){for(var l=this.getModel(),s=l.getChildCount(t),o=null,r=0,a=0;a=this.max)||!this.source&&(0==this.max||s>=this.max))&&(o+=this.countError+"\n"),null!=this.validNeighbors&&null!=this.typeError&&0=this.cellCount&&!this.livePreviewActive&&this.allowLivePreview?this.cloning&&this.livePreviewActive||(this.livePreviewActive=!0,this.livePreviewUsed=!0):this.livePreviewUsed||null!=this.shape||(this.shape=this.createPreviewShape(this.bounds))},mxGraphHandler.prototype.mouseMove=function(t,e){var n,i,l,s,o,r,a,h,d=this.graph;e.isConsumed()||!d.isMouseDown||null==this.cell||null==this.first||null==this.bounds||this.suspended?!this.isMoveEnabled()&&!this.isCloneEnabled()||!this.updateCursor||e.isConsumed()||null==e.getState()&&null==e.sourceState||d.isMouseDown||(null==(r=d.getCursorForMouseEvent(e))&&d.isEnabled()&&d.isCellMovable(e.getCell())&&(r=d.getModel().isEdge(e.getCell())?mxConstants.CURSOR_MOVABLE_EDGE:mxConstants.CURSOR_MOVABLE_VERTEX),null!=r&&null!=e.sourceState&&e.sourceState.setCursor(r)):mxEvent.isMultiTouchEvent(e.getEvent())?this.reset():(n=this.getDelta(e),h=d.tolerance,(null!=this.shape||this.livePreviewActive||Math.abs(n.x)>h||Math.abs(n.y)>h)&&(null==this.highlight&&(this.highlight=new mxCellHighlight(this.graph,mxConstants.DROP_TARGET_COLOR,3)),i=d.isCloneEvent(e.getEvent())&&d.isCellsCloneable()&&this.isCloneEnabled(),l=d.isGridEnabledEvent(e.getEvent()),a=e.getCell(),s=!0,o=null,this.cloning=i,d.isDropEnabled()&&this.highlightEnabled&&(o=d.getDropTarget(this.cells,e.getEvent(),a,i)),r=!1,null!=(h=d.getView().getState(o))&&(i||this.isValidDropTarget(o,e))?(this.target!=o&&(this.target=o,this.setHighlightColor(mxConstants.DROP_TARGET_COLOR)),r=!0):(this.target=null,this.connectOnDrop&&null!=a&&1==this.cells.length&&d.getModel().isVertex(a)&&d.isCellConnectable(a)&&null!=(h=d.getView().getState(a))&&(a=null==d.getEdgeValidationError(null,this.cell,a)?mxConstants.VALID_COLOR:mxConstants.INVALID_CONNECT_TARGET_COLOR,this.setHighlightColor(a),r=!0)),null!=h&&r?this.highlight.highlight(h):this.highlight.hide(),null!=this.guide&&this.useGuidesForEvent(e)?(n=this.guide.move(this.bounds,n,l,i),s=!1):n=this.graph.snapDelta(n,this.bounds,!l,!1,!1),null!=this.guide&&s&&this.guide.hide(),d.isConstrainedEvent(e.getEvent())&&(Math.abs(n.x)>Math.abs(n.y)?n.y=0:n.x=0),this.checkPreview(),this.currentDx==n.x&&this.currentDy==n.y||(this.currentDx=n.x,this.currentDy=n.y,this.updatePreview())),this.updateHint(e),this.consumeMouseEvent(mxEvent.MOUSE_MOVE,e),mxEvent.consume(e.getEvent()))},mxGraphHandler.prototype.updatePreview=function(t){this.livePreviewUsed&&!t?null!=this.cells&&(this.setHandlesVisibleForCells(this.graph.selectionCellsHandler.getHandledSelectionCells(),!1),this.updateLivePreview(this.currentDx,this.currentDy)):this.updatePreviewShape()},mxGraphHandler.prototype.updatePreviewShape=function(){null!=this.shape&&null!=this.pBounds&&(this.shape.bounds=new mxRectangle(Math.round(this.pBounds.x+this.currentDx),Math.round(this.pBounds.y+this.currentDy),this.pBounds.width,this.pBounds.height),this.shape.redraw())},mxGraphHandler.prototype.updateLivePreview=function(i,l){if(!this.suspended){var s=[];if(null!=this.allCells&&this.allCells.visit(mxUtils.bind(this,function(t,e){var n=this.graph.view.getState(e.cell);n!=e&&(e.destroy(),null!=n?this.allCells.put(e.cell,n):this.allCells.remove(e.cell),e=n),null!=e&&(n=e.clone(),s.push([e,n]),null!=e.shape&&(null==e.shape.originalPointerEvents&&(e.shape.originalPointerEvents=e.shape.pointerEvents),e.shape.pointerEvents=!1,null!=e.text&&(null==e.text.originalPointerEvents&&(e.text.originalPointerEvents=e.text.pointerEvents),e.text.pointerEvents=!1)),this.graph.model.isVertex(e.cell)&&(e.x+=i,e.y+=l,this.cloning?null!=e.text&&(e.text.updateBoundingBox(),null!=e.text.boundingBox&&(e.text.boundingBox.x+=i,e.text.boundingBox.y+=l),null!=e.text.unrotatedBoundingBox&&(e.text.unrotatedBoundingBox.x+=i,e.text.unrotatedBoundingBox.y+=l)):(e.view.graph.cellRenderer.redraw(e,!0),e.view.invalidate(e.cell),e.invalid=!1,null!=e.control&&null!=e.control.node&&(e.control.node.style.visibility="hidden"))))})),0==s.length)this.reset();else{for(var t=this.graph.view.scale,e=0;ethis.graph.tolerance||Math.abs(this.dy)>this.graph.tolerance,!n&&this.active&&this.fireEvent(new mxEventObject(mxEvent.PAN_START,"event",e))),(this.active||this.panningTrigger)&&e.consume()},mxPanningHandler.prototype.mouseUp=function(t,e){var n,i;this.active&&(null!=this.dx&&null!=this.dy&&(this.graph.useScrollbarsForPanning&&mxUtils.hasScrollbars(this.graph.container)||(n=this.graph.getView().scale,i=this.graph.getView().translate,this.graph.panGraph(0,0),this.panGraph(i.x+this.dx/n,i.y+this.dy/n)),e.consume()),this.fireEvent(new mxEventObject(mxEvent.PAN_END,"event",e))),this.reset()},mxPanningHandler.prototype.zoomGraph=function(t){var e=Math.round(this.initialScale*t.scale*100)/100;null!=this.minScale&&(e=Math.max(this.minScale,e)),null!=this.maxScale&&(e=Math.min(this.maxScale,e)),this.graph.view.scale!=e&&(this.graph.zoomTo(e),mxEvent.consume(t))},mxPanningHandler.prototype.reset=function(){this.panningTrigger=!1,this.mouseDownEvent=null,this.active=!1,this.dx=null,this.dy=null},mxPanningHandler.prototype.panGraph=function(t,e){this.graph.getView().setTranslate(t,e)},mxPanningHandler.prototype.destroy=function(){this.graph.removeMouseListener(this),this.graph.removeListener(this.forcePanningHandler),this.graph.removeListener(this.gestureHandler),mxEvent.removeListener(document,"mouseup",this.mouseUpListener)},mxPopupMenuHandler.prototype=new mxPopupMenu,mxPopupMenuHandler.prototype.constructor=mxPopupMenuHandler,mxPopupMenuHandler.prototype.graph=null,mxPopupMenuHandler.prototype.selectOnPopup=!0,mxPopupMenuHandler.prototype.clearSelectionOnBackground=!0,mxPopupMenuHandler.prototype.triggerX=null,mxPopupMenuHandler.prototype.triggerY=null,mxPopupMenuHandler.prototype.screenX=null,mxPopupMenuHandler.prototype.screenY=null,mxPopupMenuHandler.prototype.init=function(){mxPopupMenu.prototype.init.apply(this),mxEvent.addGestureListeners(this.div,mxUtils.bind(this,function(t){this.graph.tooltipHandler.hide()}))},mxPopupMenuHandler.prototype.isSelectOnPopup=function(t){return this.selectOnPopup},mxPopupMenuHandler.prototype.mouseDown=function(t,e){this.isEnabled()&&!mxEvent.isMultiTouchEvent(e.getEvent())&&(this.hideMenu(),this.triggerX=e.getGraphX(),this.triggerY=e.getGraphY(),this.screenX=mxEvent.getMainEvent(e.getEvent()).screenX,this.screenY=mxEvent.getMainEvent(e.getEvent()).screenY,this.popupTrigger=this.isPopupTrigger(e),this.inTolerance=!0)},mxPopupMenuHandler.prototype.mouseMove=function(t,e){this.inTolerance&&null!=this.screenX&&null!=this.screenY&&(Math.abs(mxEvent.getMainEvent(e.getEvent()).screenX-this.screenX)>this.graph.tolerance||Math.abs(mxEvent.getMainEvent(e.getEvent()).screenY-this.screenY)>this.graph.tolerance)&&(this.inTolerance=!1)},mxPopupMenuHandler.prototype.mouseUp=function(t,e){var n,i;this.popupTrigger&&this.inTolerance&&null!=this.triggerX&&null!=this.triggerY&&(n=this.getCellForPopupEvent(e),this.graph.isEnabled()&&this.isSelectOnPopup(e)&&null!=n&&!this.graph.isCellSelected(n)?this.graph.setSelectionCell(n):this.clearSelectionOnBackground&&null==n&&this.graph.clearSelection(),this.graph.tooltipHandler.hide(),i=mxUtils.getScrollOrigin(),this.popup(e.getX()+i.x+1,e.getY()+i.y+1,n,e.getEvent()),e.consume()),this.popupTrigger=!1,this.inTolerance=!1},mxPopupMenuHandler.prototype.getCellForPopupEvent=function(t){return t.getCell()},mxPopupMenuHandler.prototype.destroy=function(){this.graph.removeMouseListener(this),this.graph.removeListener(this.gestureHandler),mxPopupMenu.prototype.destroy.apply(this)},mxUtils.extend(mxCellMarker,mxEventSource),mxCellMarker.prototype.graph=null,mxCellMarker.prototype.enabled=!0,mxCellMarker.prototype.hotspot=mxConstants.DEFAULT_HOTSPOT,mxCellMarker.prototype.hotspotEnabled=!1,mxCellMarker.prototype.validColor=null,mxCellMarker.prototype.invalidColor=null,mxCellMarker.prototype.currentColor=null,mxCellMarker.prototype.validState=null,mxCellMarker.prototype.markedState=null,mxCellMarker.prototype.setEnabled=function(t){this.enabled=t},mxCellMarker.prototype.isEnabled=function(){return this.enabled},mxCellMarker.prototype.setHotspot=function(t){this.hotspot=t},mxCellMarker.prototype.getHotspot=function(){return this.hotspot},mxCellMarker.prototype.setHotspotEnabled=function(t){this.hotspotEnabled=t},mxCellMarker.prototype.isHotspotEnabled=function(){return this.hotspotEnabled},mxCellMarker.prototype.hasValidState=function(){return null!=this.validState},mxCellMarker.prototype.getValidState=function(){return this.validState},mxCellMarker.prototype.getMarkedState=function(){return this.markedState},mxCellMarker.prototype.reset=function(){(this.validState=null)!=this.markedState&&(this.markedState=null,this.unmark())},mxCellMarker.prototype.process=function(t){var e=null;return this.isEnabled()&&(e=this.getState(t),this.setCurrentState(e,t)),e},mxCellMarker.prototype.setCurrentState=function(t,e,n){var i=null!=t&&this.isValidState(t);n=null!=n?n:this.getMarkerColor(e.getEvent(),t,i),this.validState=i?t:null,t==this.markedState&&n==this.currentColor||(this.currentColor=n,null!=t&&null!=this.currentColor?(this.markedState=t,this.mark()):null!=this.markedState&&(this.markedState=null,this.unmark()))},mxCellMarker.prototype.markCell=function(t,e){t=this.graph.getView().getState(t);null!=t&&(this.currentColor=null!=e?e:this.validColor,this.markedState=t,this.mark())},mxCellMarker.prototype.mark=function(){this.highlight.setHighlightColor(this.currentColor),this.highlight.highlight(this.markedState),this.fireEvent(new mxEventObject(mxEvent.MARK,"state",this.markedState))},mxCellMarker.prototype.unmark=function(){this.mark()},mxCellMarker.prototype.isValidState=function(t){return!0},mxCellMarker.prototype.getMarkerColor=function(t,e,n){return n?this.validColor:this.invalidColor},mxCellMarker.prototype.getState=function(t){var e=this.graph.getView(),n=this.getCell(t),n=this.getStateToMark(e.getState(n));return null!=n&&this.intersects(n,t)?n:null},mxCellMarker.prototype.getCell=function(t){return t.getCell()},mxCellMarker.prototype.getStateToMark=function(t){return t},mxCellMarker.prototype.intersects=function(t,e){return!this.hotspotEnabled||mxUtils.intersectsHotspot(t,e.getGraphX(),e.getGraphY(),this.hotspot,mxConstants.MIN_HOTSPOT_SIZE,mxConstants.MAX_HOTSPOT_SIZE)},mxCellMarker.prototype.destroy=function(){this.graph.getView().removeListener(this.resetHandler),this.graph.getModel().removeListener(this.resetHandler),this.highlight.destroy()},mxUtils.extend(mxSelectionCellsHandler,mxEventSource),mxSelectionCellsHandler.prototype.graph=null,mxSelectionCellsHandler.prototype.enabled=!0,mxSelectionCellsHandler.prototype.refreshHandler=null,mxSelectionCellsHandler.prototype.maxHandlers=100,mxSelectionCellsHandler.prototype.handlers=null,mxSelectionCellsHandler.prototype.isEnabled=function(){return this.enabled},mxSelectionCellsHandler.prototype.setEnabled=function(t){this.enabled=t},mxSelectionCellsHandler.prototype.getHandler=function(t){return this.handlers.get(t)},mxSelectionCellsHandler.prototype.isHandled=function(t){return null!=this.getHandler(t)},mxSelectionCellsHandler.prototype.reset=function(){this.handlers.visit(function(t,e){e.reset.apply(e)})},mxSelectionCellsHandler.prototype.getHandledSelectionCells=function(){return this.graph.getSelectionCells()},mxSelectionCellsHandler.prototype.refresh=function(){var t=this.handlers;this.handlers=new mxDictionary;for(var e=mxUtils.sortCells(this.getHandledSelectionCells(),!1),n=0;nthis.graph.tolerance||Math.abs(e.getGraphY()-this.first.y)>this.graph.tolerance)&&this.updateCurrentState(e,s),null!=this.first){var o=null,r=s;null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus&&null!=this.constraintHandler.currentPoint?(o=this.constraintHandler.currentConstraint,r=this.constraintHandler.currentPoint.clone()):null!=this.previous&&!this.graph.isIgnoreTerminalEvent(e.getEvent())&&mxEvent.isShiftDown(e.getEvent())&&(Math.abs(this.previous.getCenterX()-s.x)this.graph.tolerance||u>this.graph.tolerance)&&(this.shape=this.createShape(),null!=this.edgeState&&this.shape.apply(this.edgeState),this.updateCurrentState(e,s))),null!=this.shape&&(null!=this.edgeState?this.shape.points=this.edgeState.absolutePoints:(a=[a],null!=this.waypoints&&(a=a.concat(this.waypoints)),a.push(r),this.shape.points=a),this.drawPreview()),null!=this.cursor&&(this.graph.container.style.cursor=this.cursor),mxEvent.consume(e.getEvent()),e.consume()}else this.isEnabled()&&this.graph.isEnabled()?this.previous!=this.currentState&&null==this.edgeState?(this.destroyIcons(),null!=this.currentState&&null==this.error&&null==this.constraintHandler.currentConstraint&&(this.icons=this.createIcons(this.currentState),null==this.icons&&(this.currentState.setCursor(mxConstants.CURSOR_CONNECT),e.consume())),this.previous=this.currentState):this.previous!=this.currentState||null==this.currentState||null!=this.icons||this.graph.isMouseDown||e.consume():this.constraintHandler.reset();if(!this.graph.isMouseDown&&null!=this.currentState&&null!=this.icons){for(var p=!1,m=e.getSource(),c=0;cthis.graph.tolerance||i>this.graph.tolerance))&&(null==this.waypoints&&(this.waypoints=[]),i=this.graph.view.scale,e=new mxPoint(this.graph.snap(t.getGraphX()/i)*i,this.graph.snap(t.getGraphY()/i)*i),this.waypoints.push(e))},mxConnectionHandler.prototype.checkConstraints=function(t,e){return null==t||null==e||null==t.point||null==e.point||!t.point.equals(e.point)||t.dx!=e.dx||t.dy!=e.dy||t.perimeter!=e.perimeter},mxConnectionHandler.prototype.mouseUp=function(t,e){if(!e.isConsumed()&&this.isConnecting()){if(this.waypointsEnabled&&!this.isStopEvent(e))return this.addWaypointForEvent(e),void e.consume();var n=this.sourceConstraint,i=this.constraintHandler.currentConstraint,l=null!=this.previous?this.previous.cell:null,s=null;null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus&&(s=this.constraintHandler.currentFocus.cell),null==s&&null!=this.currentState&&(s=this.currentState.cell),null!=this.error||null!=l&&null!=s&&l==s&&!this.checkConstraints(n,i)?(null!=this.previous&&null!=this.marker.validState&&this.previous.cell==this.marker.validState.cell&&this.graph.selectCellForEvent(this.marker.source,e.getEvent()),null!=this.error&&0o||Math.abs(s)>o)&&(null==this.div&&(this.div=this.createShape()),mxUtils.clearSelection(),this.update(n,i),e.consume()))},mxRubberband.prototype.createShape=function(){null==this.sharedDiv&&(this.sharedDiv=document.createElement("div"),this.sharedDiv.className="mxRubberband",mxUtils.setOpacity(this.sharedDiv,this.defaultOpacity)),this.graph.container.appendChild(this.sharedDiv);var t=this.sharedDiv;return mxClient.IS_SVG&&(!mxClient.IS_IE||10<=document.documentMode)&&this.fadeOut&&(this.sharedDiv=null),t},mxRubberband.prototype.isActive=function(t,e){return null!=this.div&&"none"!=this.div.style.display},mxRubberband.prototype.mouseUp=function(t,e){var n=this.isActive();this.reset(),n&&(this.execute(e.getEvent()),e.consume())},mxRubberband.prototype.execute=function(t){var e=new mxRectangle(this.x,this.y,this.width,this.height);this.graph.selectRegion(e,t)},mxRubberband.prototype.reset=function(){var t;null!=this.div&&(mxClient.IS_SVG&&(!mxClient.IS_IE||10<=document.documentMode)&&this.fadeOut?(t=this.div,mxUtils.setPrefixedStyle(t.style,"transition","all 0.2s linear"),t.style.pointerEvents="none",t.style.opacity=0,window.setTimeout(function(){t.parentNode.removeChild(t)},200)):this.div.parentNode.removeChild(this.div)),mxEvent.removeGestureListeners(document,null,this.dragHandler,this.dropHandler),this.dragHandler=null,this.dropHandler=null,this.currentX=0,this.currentY=0,this.first=null,this.div=null},mxRubberband.prototype.update=function(t,e){this.currentX=t,this.currentY=e,this.repaint()},mxRubberband.prototype.repaint=function(){var t,e;null!=this.div&&(t=this.currentX-this.graph.panDx,e=this.currentY-this.graph.panDy,this.x=Math.min(this.first.x,t),this.y=Math.min(this.first.y,e),this.width=Math.max(this.first.x,t)-this.x,this.height=Math.max(this.first.y,e)-this.y,t=mxClient.IS_VML?this.graph.panDx:0,e=mxClient.IS_VML?this.graph.panDy:0,this.div.style.left=this.x+t+"px",this.div.style.top=this.y+e+"px",this.div.style.width=Math.max(1,this.width)+"px",this.div.style.height=Math.max(1,this.height)+"px")},mxRubberband.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.graph.removeMouseListener(this),this.graph.removeListener(this.forceRubberbandHandler),this.graph.removeListener(this.panHandler),this.reset(),null!=this.sharedDiv&&(this.sharedDiv=null))},mxHandle.prototype.cursor="default",mxHandle.prototype.image=null,mxHandle.prototype.ignoreGrid=!1,mxHandle.prototype.getPosition=function(t){},mxHandle.prototype.setPosition=function(t,e,n){},mxHandle.prototype.execute=function(t){},mxHandle.prototype.copyStyle=function(t){this.graph.setCellStyles(t,this.state.style[t],[this.state.cell])},mxHandle.prototype.processEvent=function(t){var e=this.graph.view.scale,n=this.graph.view.translate,i=new mxPoint(t.getGraphX()/e-n.x,t.getGraphY()/e-n.y);null!=this.shape&&null!=this.shape.bounds&&(i.x-=this.shape.bounds.width/e/4,i.y-=this.shape.bounds.height/e/4);n=-mxUtils.toRadians(this.getRotation()),e=-mxUtils.toRadians(this.getTotalRotation())-n,i=this.flipPoint(this.rotatePoint(this.snapPoint(this.rotatePoint(i,n),this.ignoreGrid||!this.graph.isGridEnabledEvent(t.getEvent())),e));this.setPosition(this.state.getPaintBounds(),i,t),this.redraw()},mxHandle.prototype.positionChanged=function(){null!=this.state.text&&this.state.text.apply(this.state),null!=this.state.shape&&this.state.shape.apply(this.state),this.graph.cellRenderer.redraw(this.state,!0)},mxHandle.prototype.getRotation=function(){return null!=this.state.shape?this.state.shape.getRotation():0},mxHandle.prototype.getTotalRotation=function(){return null!=this.state.shape?this.state.shape.getShapeRotation():0},mxHandle.prototype.init=function(){var t=this.isHtmlRequired();null!=this.image?(this.shape=new mxImageShape(new mxRectangle(0,0,this.image.width,this.image.height),this.image.src),this.shape.preserveImageAspect=!1):null==this.shape&&(this.shape=this.createShape(t)),this.initShape(t)},mxHandle.prototype.createShape=function(t){return new mxRectangleShape(new mxRectangle(0,0,mxConstants.HANDLE_SIZE,mxConstants.HANDLE_SIZE),mxConstants.HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR)},mxHandle.prototype.initShape=function(t){t&&this.shape.isHtmlAllowed()?(this.shape.dialect=mxConstants.DIALECT_STRICTHTML,this.shape.init(this.graph.container)):(this.shape.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_MIXEDHTML:mxConstants.DIALECT_SVG,null!=this.cursor&&this.shape.init(this.graph.getView().getOverlayPane())),mxEvent.redirectMouseEvents(this.shape.node,this.graph,this.state),this.shape.node.style.cursor=this.cursor},mxHandle.prototype.redraw=function(){var t,e,n;null==this.shape||null==this.state.shape||null!=(t=this.getPosition(this.state.getPaintBounds()))&&(n=mxUtils.toRadians(this.getTotalRotation()),t=this.rotatePoint(this.flipPoint(t),n),e=this.graph.view.scale,n=this.graph.view.translate,this.shape.bounds.x=Math.floor((t.x+n.x)*e-this.shape.bounds.width/2),this.shape.bounds.y=Math.floor((t.y+n.y)*e-this.shape.bounds.height/2),this.shape.redraw())},mxHandle.prototype.isHtmlRequired=function(){return null!=this.state.text&&this.state.text.node.parentNode==this.graph.container},mxHandle.prototype.rotatePoint=function(t,e){var n=this.state.getCellBounds(),i=new mxPoint(n.getCenterX(),n.getCenterY()),n=Math.cos(e),e=Math.sin(e);return mxUtils.getRotatedPoint(t,n,e,i)},mxHandle.prototype.flipPoint=function(t){var e;return null!=this.state.shape&&(e=this.state.getCellBounds(),this.state.shape.flipH&&(t.x=2*e.x+e.width-t.x),this.state.shape.flipV&&(t.y=2*e.y+e.height-t.y)),t},mxHandle.prototype.snapPoint=function(t,e){return e||(t.x=this.graph.snap(t.x),t.y=this.graph.snap(t.y)),t},mxHandle.prototype.setVisible=function(t){null!=this.shape&&null!=this.shape.node&&(this.shape.node.style.display=t?"":"none")},mxHandle.prototype.reset=function(){this.setVisible(!0),this.state.style=this.graph.getCellStyle(this.state.cell),this.positionChanged()},mxHandle.prototype.destroy=function(){null!=this.shape&&(this.shape.destroy(),this.shape=null)},mxVertexHandler.prototype.graph=null,mxVertexHandler.prototype.state=null,mxVertexHandler.prototype.singleSizer=!1,mxVertexHandler.prototype.index=null,mxVertexHandler.prototype.allowHandleBoundsCheck=!0,mxVertexHandler.prototype.handleImage=null,mxVertexHandler.prototype.handlesVisible=!0,mxVertexHandler.prototype.tolerance=0,mxVertexHandler.prototype.rotationEnabled=!1,mxVertexHandler.prototype.parentHighlightEnabled=!1,mxVertexHandler.prototype.rotationRaster=!0,mxVertexHandler.prototype.rotationCursor="crosshair",mxVertexHandler.prototype.livePreview=!1,mxVertexHandler.prototype.movePreviewToFront=!1,mxVertexHandler.prototype.manageSizers=!1,mxVertexHandler.prototype.constrainGroupByChildren=!1,mxVertexHandler.prototype.rotationHandleVSpacing=-16,mxVertexHandler.prototype.horizontalOffset=0,mxVertexHandler.prototype.verticalOffset=0,mxVertexHandler.prototype.init=function(){var t,e;this.graph=this.state.view.graph,this.selectionBounds=this.getSelectionBounds(this.state),this.bounds=new mxRectangle(this.selectionBounds.x,this.selectionBounds.y,this.selectionBounds.width,this.selectionBounds.height),this.selectionBorder=this.createSelectionShape(this.bounds),this.selectionBorder.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG,this.selectionBorder.pointerEvents=!1,this.selectionBorder.rotation=Number(this.state.style[mxConstants.STYLE_ROTATION]||"0"),this.selectionBorder.init(this.graph.getView().getOverlayPane()),mxEvent.redirectMouseEvents(this.selectionBorder.node,this.graph,this.state),this.graph.isCellMovable(this.state.cell)&&this.selectionBorder.setCursor(mxConstants.CURSOR_MOVABLE_VERTEX),(mxGraphHandler.prototype.maxCells<=0||this.graph.getSelectionCount()this.graph.tolerance||Math.abs(t.getGraphY()-this.startY)>this.graph.tolerance)&&(this.inTolerance=!1)},mxVertexHandler.prototype.updateHint=function(t){},mxVertexHandler.prototype.removeHint=function(){},mxVertexHandler.prototype.roundAngle=function(t){return Math.round(10*t)/10},mxVertexHandler.prototype.roundLength=function(t){return Math.round(100*t)/100},mxVertexHandler.prototype.mouseMove=function(t,e){e.isConsumed()||null==this.index?this.graph.isMouseDown||null==this.getHandleForEvent(e)||e.consume(!1):(this.checkTolerance(e),this.inTolerance||(this.index<=mxEvent.CUSTOM_HANDLE?null!=this.customHandles&&(this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].processEvent(e),this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].active=!0,null!=this.ghostPreview?(this.ghostPreview.apply(this.state),this.ghostPreview.strokewidth=this.getSelectionStrokeWidth()/this.ghostPreview.scale/this.ghostPreview.scale,this.ghostPreview.isDashed=this.isSelectionDashed(),this.ghostPreview.stroke=this.getSelectionColor(),this.ghostPreview.redraw(),null!=this.selectionBounds&&(this.selectionBorder.node.style.display="none")):(this.movePreviewToFront&&this.moveToFront(),this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].positionChanged())):this.index==mxEvent.LABEL_HANDLE?this.moveLabel(e):(this.index==mxEvent.ROTATION_HANDLE?this.rotateVertex(e):this.resizeVertex(e),this.updateHint(e))),e.consume())},mxVertexHandler.prototype.isGhostPreview=function(){return 0p.x+p.width&&(this.unscaledBounds.width-=this.unscaledBounds.x+this.unscaledBounds.width-p.x-p.width),this.unscaledBounds.y+this.unscaledBounds.height>p.y+p.height&&(this.unscaledBounds.height-=this.unscaledBounds.y+this.unscaledBounds.height-p.y-p.height)));var p=this.bounds;this.bounds=new mxRectangle((null!=this.parentState?this.parentState.x:l.x*s)+this.unscaledBounds.x*s,(null!=this.parentState?this.parentState.y:l.y*s)+this.unscaledBounds.y*s,this.unscaledBounds.width*s,this.unscaledBounds.height*s),u.relative&&null!=this.parentState&&(this.bounds.x+=this.state.x-this.parentState.x,this.bounds.y+=this.state.y-this.parentState.y),o=Math.cos(n),r=Math.sin(n);u=new mxPoint(this.bounds.getCenterX(),this.bounds.getCenterY()),n=o*(a=u.x-e.x)-r*(h=u.y-e.y)-a,u=r*a+o*h-h,e=this.bounds.x-this.state.x,a=this.bounds.y-this.state.y,h=o*e-r*a,a=r*e+o*a;this.bounds.x+=n,this.bounds.y+=u,this.unscaledBounds.x=this.roundLength(this.unscaledBounds.x+n/s),this.unscaledBounds.y=this.roundLength(this.unscaledBounds.y+u/s),this.unscaledBounds.width=this.roundLength(this.unscaledBounds.width),this.unscaledBounds.height=this.roundLength(this.unscaledBounds.height),this.graph.isCellCollapsed(this.state.cell)||0==n&&0==u?(this.childOffsetX=0,this.childOffsetY=0):(this.childOffsetX=this.state.x-this.bounds.x+h,this.childOffsetY=this.state.y-this.bounds.y+a),p.equals(this.bounds)||(this.livePreviewActive&&this.updateLivePreview(t),null!=this.preview?this.drawPreview():this.updateParentHighlight())},mxVertexHandler.prototype.updateLivePreview=function(t){var e=this.graph.view.scale,n=this.graph.view.translate,i=this.state.clone();this.state.x=this.bounds.x,this.state.y=this.bounds.y,this.state.origin=new mxPoint(this.state.x/e-n.x,this.state.y/e-n.y),this.state.width=this.bounds.width,this.state.height=this.bounds.height;e=new mxPoint((e=this.state.absoluteOffset).x,e.y);this.state.absoluteOffset.x=0,this.state.absoluteOffset.y=0;n=this.graph.getCellGeometry(this.state.cell);null!=n&&(null==(e=n.offset||this.EMPTY_POINT)||n.relative||(this.state.absoluteOffset.x=this.state.view.scale*e.x,this.state.absoluteOffset.y=this.state.view.scale*e.y),this.state.view.updateVertexLabelOffset(this.state)),this.state.view.graph.cellRenderer.redraw(this.state,!0),this.state.view.invalidate(this.state.cell),this.state.invalid=!1,this.state.view.validate(),this.redrawHandles(),this.movePreviewToFront&&this.moveToFront(),null!=this.state.control&&null!=this.state.control.node&&(this.state.control.node.style.visibility="hidden"),this.state.setState(i)},mxVertexHandler.prototype.moveToFront=function(){(null!=this.state.text&&null!=this.state.text.node&&null!=this.state.text.node.nextSibling||null!=this.state.shape&&null!=this.state.shape.node&&null!=this.state.shape.node.nextSibling&&(null==this.state.text||this.state.shape.node.nextSibling!=this.state.text.node))&&(null!=this.state.shape&&null!=this.state.shape.node&&this.state.shape.node.parentNode.appendChild(this.state.shape.node),null!=this.state.text&&null!=this.state.text.node&&this.state.text.node.parentNode.appendChild(this.state.text.node))},mxVertexHandler.prototype.mouseUp=function(t,e){if(null!=this.index&&null!=this.state){var n,i,l,s,o,r,a=new mxPoint(e.getGraphX(),e.getGraphY()),h=this.index;(this.index=null)==this.ghostPreview&&(this.state.view.invalidate(this.state.cell,!1,!1),this.state.view.validate()),this.graph.getModel().beginUpdate();try{h<=mxEvent.CUSTOM_HANDLE?null!=this.customHandles&&(l=this.state.view.graph.getCellStyle(this.state.cell),this.customHandles[mxEvent.CUSTOM_HANDLE-h].active=!1,this.customHandles[mxEvent.CUSTOM_HANDLE-h].execute(e),null!=this.customHandles&&null!=this.customHandles[mxEvent.CUSTOM_HANDLE-h]&&(this.state.style=l,this.customHandles[mxEvent.CUSTOM_HANDLE-h].positionChanged())):h==mxEvent.ROTATION_HANDLE?null!=this.currentAlpha?0!=(s=this.currentAlpha-(this.state.style[mxConstants.STYLE_ROTATION]||0))&&this.rotateCell(this.state.cell,s):this.rotateClick():(n=this.graph.isGridEnabledEvent(e.getEvent()),r=mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION]||"0"),i=Math.cos(-r),r=(o=Math.sin(-r))*(l=a.x-this.startX)+i*(s=a.y-this.startY),l=i*l-o*s,s=r,o=this.graph.view.scale,r=this.isRecursiveResize(this.state,e),this.resizeCell(this.state.cell,this.roundLength(l/o),this.roundLength(s/o),h,n,this.isConstrainedEvent(e),r))}finally{this.graph.getModel().endUpdate()}e.consume(),this.reset(),this.redrawHandles()}},mxVertexHandler.prototype.isRecursiveResize=function(t,e){return this.graph.isRecursiveResize(this.state)},mxVertexHandler.prototype.rotateClick=function(){},mxVertexHandler.prototype.rotateCell=function(t,e,n){if(0!=e){var i=this.graph.getModel();if(i.isVertex(t)||i.isEdge(t)){i.isEdge(t)||(s=(this.graph.getCurrentCellStyle(t)[mxConstants.STYLE_ROTATION]||0)+e,this.graph.setCellStyles(mxConstants.STYLE_ROTATION,s,[t]));var l=this.graph.getCellGeometry(t);if(null!=l){var s=this.graph.getCellGeometry(n);if(null==s||i.isEdge(n)||((l=l.clone()).rotate(e,new mxPoint(s.width/2,s.height/2)),i.setGeometry(t,l)),i.isVertex(t)&&!l.relative||i.isEdge(t))for(var o=i.getChildCount(t),r=0;rmxEvent.VIRTUAL_HANDLE&&null!=this.customHandles)for(var i=0;imxEvent.VIRTUAL_HANDLE&&(s[this.index-1]=l)}return null!=o?o:s},mxEdgeHandler.prototype.isOutlineConnectEvent=function(t){var e=mxUtils.getOffset(this.graph.container),n=t.getEvent(),i=mxEvent.getClientX(n),l=mxEvent.getClientY(n),s=document.documentElement,n=(window.pageXOffset||s.scrollLeft)-(s.clientLeft||0),s=(window.pageYOffset||s.scrollTop)-(s.clientTop||0),n=this.currentPoint.x-this.graph.container.scrollLeft+e.x-n,s=this.currentPoint.y-this.graph.container.scrollTop+e.y-s;return this.outlineConnect&&!mxEvent.isShiftDown(t.getEvent())&&(t.isSource(this.marker.highlight.shape)||mxEvent.isAltDown(t.getEvent())&&null!=t.getState()||this.marker.highlight.isHighlightAt(i,l)||(n!=i||s!=l)&&null==t.getState()&&this.marker.highlight.isHighlightAt(n,s))},mxEdgeHandler.prototype.updatePreviewState=function(t,e,n,i,l){var s,o=this.isSource?n:this.state.getVisibleTerminalState(!0),r=this.isTarget?n:this.state.getVisibleTerminalState(!1),a=this.graph.getConnectionConstraint(t,o,!0),h=this.graph.getConnectionConstraint(t,r,!1),d=this.constraintHandler.currentConstraint;null==d&&l&&(null!=n?(i.isSource(this.marker.highlight.shape)&&(e=new mxPoint(i.getGraphX(),i.getGraphY())),d=this.graph.getOutlineConstraint(e,n,i),this.constraintHandler.setFocus(i,n,this.isSource),this.constraintHandler.currentConstraint=d,this.constraintHandler.currentPoint=e):d=new mxConnectionConstraint),this.outlineConnect&&null!=this.marker.highlight&&null!=this.marker.highlight.shape&&(s=this.graph.view.scale,null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus?(this.marker.highlight.shape.stroke=l?mxConstants.OUTLINE_HIGHLIGHT_COLOR:"transparent",this.marker.highlight.shape.strokewidth=mxConstants.OUTLINE_HIGHLIGHT_STROKEWIDTH/s/s,this.marker.highlight.repaint()):this.marker.hasValidState()&&(this.marker.highlight.shape.stroke=this.graph.isCellConnectable(i.getCell())&&this.marker.getValidState()!=i.getState()?"transparent":mxConstants.DEFAULT_VALID_COLOR,this.marker.highlight.shape.strokewidth=mxConstants.HIGHLIGHT_STROKEWIDTH/s/s,this.marker.highlight.repaint())),this.isSource?a=d:this.isTarget&&(h=d),(this.isSource||this.isTarget)&&(null!=d&&null!=d.point?(t.style[this.isSource?mxConstants.STYLE_EXIT_X:mxConstants.STYLE_ENTRY_X]=d.point.x,t.style[this.isSource?mxConstants.STYLE_EXIT_Y:mxConstants.STYLE_ENTRY_Y]=d.point.y):(delete t.style[this.isSource?mxConstants.STYLE_EXIT_X:mxConstants.STYLE_ENTRY_X],delete t.style[this.isSource?mxConstants.STYLE_EXIT_Y:mxConstants.STYLE_ENTRY_Y])),t.setVisibleTerminalState(o,!0),t.setVisibleTerminalState(r,!1),this.isSource&&null==o||t.view.updateFixedTerminalPoint(t,o,!0,a),this.isTarget&&null==r||t.view.updateFixedTerminalPoint(t,r,!1,h),(this.isSource||this.isTarget)&&null==n&&(t.setAbsoluteTerminalPoint(e,this.isSource),null==this.marker.getMarkedState()&&(this.error=this.graph.allowDanglingEdges?null:"")),t.view.updatePoints(t,this.points,o,r),t.view.updateFloatingTerminalPoints(t,o,r)},mxEdgeHandler.prototype.mouseMove=function(t,e){var n,i,l;null!=this.index&&null!=this.marker?(this.currentPoint=this.getPointForEvent(e),this.error=null,!this.graph.isIgnoreTerminalEvent(e.getEvent())&&mxEvent.isShiftDown(e.getEvent())&&null!=this.snapPoint&&(Math.abs(this.snapPoint.x-this.currentPoint.x)mxEvent.VIRTUAL_HANDLE?null!=this.customHandles&&(this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].processEvent(e),this.customHandles[mxEvent.CUSTOM_HANDLE-this.index].positionChanged(),null!=this.shape&&null!=this.shape.node&&(this.shape.node.style.display="none")):this.isLabel?(this.label.x=this.currentPoint.x,this.label.y=this.currentPoint.y):(this.points=this.getPreviewPoints(this.currentPoint,e),n=this.isSource||this.isTarget?this.getPreviewTerminalState(e):null,null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus&&null!=this.constraintHandler.currentPoint?this.currentPoint=this.constraintHandler.currentPoint.clone():this.outlineConnect&&((l=!(!this.isSource&&!this.isTarget)&&this.isOutlineConnectEvent(e))?n=this.marker.highlight.state:null!=n&&n!=e.getState()&&this.graph.isCellConnectable(e.getCell())&&null!=this.marker.highlight.shape&&(this.marker.highlight.shape.stroke="transparent",this.marker.highlight.repaint(),n=null)),null==n||this.isCellEnabled(n.cell)||(n=null,this.marker.reset()),i=this.clonePreviewState(this.currentPoint,null!=n?n.cell:null),this.updatePreviewState(i,this.currentPoint,n,e,l),l=null==this.error?this.marker.validColor:this.marker.invalidColor,this.setPreviewColor(l),this.abspoints=i.absolutePoints,this.active=!0,this.updateHint(e,this.currentPoint)),this.drawPreview(),mxEvent.consume(e.getEvent()),e.consume()):mxClient.IS_IE&&null!=this.getHandleForEvent(e)&&e.consume(!1)},mxEdgeHandler.prototype.mouseUp=function(t,e){if(null!=this.index&&null!=this.marker){null!=this.shape&&null!=this.shape.node&&(this.shape.node.style.display="");var n=this.state.cell,i=this.index;if(this.index=null,e.getX()!=this.startX||e.getY()!=this.startY){var l=!this.graph.isIgnoreTerminalEvent(e.getEvent())&&this.graph.isCloneEvent(e.getEvent())&&this.cloneEnabled&&this.graph.isCellsCloneable();if(null!=this.error)0mxEvent.VIRTUAL_HANDLE){if(null!=this.customHandles){(a=this.graph.getModel()).beginUpdate();try{this.customHandles[mxEvent.CUSTOM_HANDLE-i].execute(e),null!=this.shape&&null!=this.shape.node&&(this.shape.apply(this.state),this.shape.redraw())}finally{a.endUpdate()}}}else if(this.isLabel)this.moveLabel(this.state,this.label.x,this.label.y);else if(this.isSource||this.isTarget){var s,o,r=null;if(null!=this.constraintHandler.currentConstraint&&null!=this.constraintHandler.currentFocus&&(r=this.constraintHandler.currentFocus.cell),null==r&&this.marker.hasValidState()&&null!=this.marker.highlight&&null!=this.marker.highlight.shape&&"transparent"!=this.marker.highlight.shape.stroke&&"white"!=this.marker.highlight.shape.stroke&&(r=this.marker.validState.cell),null!=r){var a,h,d=(a=this.graph.getModel()).getParent(n);a.beginUpdate();try{l&&(h=a.getGeometry(n),l=this.graph.cloneCell(n),a.add(d,l,a.getChildCount(d)),null!=h&&(h=h.clone(),a.setGeometry(l,h)),h=a.getTerminal(n,!this.isSource),this.graph.connectCell(l,h,!this.isSource),n=l),n=this.connect(n,r,this.isSource,l,e)}finally{a.endUpdate()}}else this.graph.isAllowDanglingEdges()&&((s=this.abspoints[this.isSource?0:this.abspoints.length-1]).x=this.roundLength(s.x/this.graph.view.scale-this.graph.view.translate.x),s.y=this.roundLength(s.y/this.graph.view.scale-this.graph.view.translate.y),null!=(o=this.graph.getView().getState(this.graph.getModel().getParent(n)))&&(s.x-=o.origin.x,s.y-=o.origin.y),s.x-=this.graph.panDx/this.graph.view.scale,s.y-=this.graph.panDy/this.graph.view.scale,n=this.changeTerminalPoint(n,s,this.isSource,l))}else this.active?n=this.changePoints(n,this.points,l):(this.graph.getView().invalidate(this.state.cell),this.graph.getView().validate(this.state.cell))}else this.graph.isToggleEvent(e.getEvent())&&this.graph.selectCellForEvent(this.state.cell,e.getEvent());null!=this.marker&&(this.reset(),n!=this.state.cell&&this.graph.setSelectionCell(n)),e.consume()}},mxEdgeHandler.prototype.reset=function(){if(this.active&&this.refresh(),this.error=null,this.index=null,this.label=null,this.points=null,this.snapPoint=null,this.isLabel=!1,this.isSource=!1,this.isTarget=!1,this.active=!1,this.livePreview&&null!=this.sizers)for(var t=0;t"),this.div.style.visibility="",mxUtils.fit(this.div))},mxTooltipHandler.prototype.destroy=function(){this.destroyed||(this.graph.removeMouseListener(this),mxEvent.release(this.div),null!=this.div&&null!=this.div.parentNode&&this.div.parentNode.removeChild(this.div),this.destroyed=!0,this.div=null)},mxUtils.extend(mxCellTracker,mxCellMarker),mxCellTracker.prototype.mouseDown=function(t,e){},mxCellTracker.prototype.mouseMove=function(t,e){this.isEnabled()&&this.process(e)},mxCellTracker.prototype.mouseUp=function(t,e){},mxCellTracker.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.graph.removeMouseListener(this),mxCellMarker.prototype.destroy.apply(this))},mxCellHighlight.prototype.keepOnTop=!1,mxCellHighlight.prototype.graph=null,mxCellHighlight.prototype.state=null,mxCellHighlight.prototype.spacing=2,mxCellHighlight.prototype.resetHandler=null,mxCellHighlight.prototype.setHighlightColor=function(t){this.highlightColor=t,null!=this.shape&&(this.shape.stroke=t)},mxCellHighlight.prototype.drawHighlight=function(){this.shape=this.createShape(),this.repaint(),this.keepOnTop||this.shape.node.parentNode.firstChild==this.shape.node||this.shape.node.parentNode.insertBefore(this.shape.node,this.shape.node.parentNode.firstChild)},mxCellHighlight.prototype.createShape=function(){var t=this.graph.cellRenderer.createShape(this.state);return t.svgStrokeTolerance=this.graph.tolerance,t.points=this.state.absolutePoints,t.apply(this.state),t.stroke=this.highlightColor,t.opacity=this.opacity,t.isDashed=this.dashed,t.isShadow=!1,t.dialect=this.graph.dialect!=mxConstants.DIALECT_SVG?mxConstants.DIALECT_VML:mxConstants.DIALECT_SVG,t.init(this.graph.getView().getOverlayPane()),mxEvent.redirectMouseEvents(t.node,this.graph,this.state),this.graph.dialect!=mxConstants.DIALECT_SVG?t.pointerEvents=!1:t.svgPointerEvents="stroke",t},mxCellHighlight.prototype.getStrokeWidth=function(t){return this.strokeWidth},mxCellHighlight.prototype.repaint=function(){null!=this.state&&null!=this.shape&&(this.shape.scale=this.state.view.scale,this.graph.model.isEdge(this.state.cell)?(this.shape.strokewidth=this.getStrokeWidth(),this.shape.points=this.state.absolutePoints,this.shape.outline=!1):(this.shape.bounds=new mxRectangle(this.state.x-this.spacing,this.state.y-this.spacing,this.state.width+2*this.spacing,this.state.height+2*this.spacing),this.shape.rotation=Number(this.state.style[mxConstants.STYLE_ROTATION]||"0"),this.shape.strokewidth=this.getStrokeWidth()/this.state.view.scale,this.shape.outline=!0),null!=this.state.shape&&this.shape.setCursor(this.state.shape.getCursor()),!mxClient.IS_QUIRKS&&8!=document.documentMode||("transparent"==this.shape.stroke?(this.shape.stroke="white",this.shape.opacity=1):this.shape.opacity=this.opacity),this.shape.redraw())},mxCellHighlight.prototype.hide=function(){this.highlight(null)},mxCellHighlight.prototype.highlight=function(t){this.state!=t&&(null!=this.shape&&(this.shape.destroy(),this.shape=null),this.state=t,null!=this.state&&this.drawHighlight())},mxCellHighlight.prototype.isHighlightAt=function(t,e){var n=!1;if(null!=this.shape&&null!=document.elementFromPoint&&!mxClient.IS_QUIRKS)for(var i=document.elementFromPoint(t,e);null!=i;){if(i==this.shape.node){n=!0;break}i=i.parentNode}return n},mxCellHighlight.prototype.destroy=function(){this.graph.getView().removeListener(this.resetHandler),this.graph.getView().removeListener(this.repaintHandler),this.graph.getModel().removeListener(this.repaintHandler),null!=this.shape&&(this.shape.destroy(),this.shape=null)},mxDefaultKeyHandler.prototype.editor=null,mxDefaultKeyHandler.prototype.handler=null,mxDefaultKeyHandler.prototype.bindAction=function(t,e,n){var i=mxUtils.bind(this,function(){this.editor.execute(e)});n?this.handler.bindControlKey(t,i):this.handler.bindKey(t,i)},mxDefaultKeyHandler.prototype.destroy=function(){this.handler.destroy(),this.handler=null},mxDefaultPopupMenu.prototype.imageBasePath=null,mxDefaultPopupMenu.prototype.config=null,mxDefaultPopupMenu.prototype.createMenu=function(t,e,n,i){var l,s;null!=this.config&&(l=this.createConditions(t,n,i),s=this.config.firstChild,this.addItems(t,e,n,i,l,s,null))},mxDefaultPopupMenu.prototype.addItems=function(t,e,n,i,l,s,o){for(var r,a,h,d,u,p,m=!1;null!=s;)"add"==s.nodeName?null!=(p=s.getAttribute("if"))&&!l[p]||(r=s.getAttribute("as"),r=mxResources.get(r)||r,a=mxUtils.eval(mxUtils.getTextContent(s)),h=s.getAttribute("action"),d=s.getAttribute("icon"),u=s.getAttribute("iconCls"),p=null==(p=s.getAttribute("enabled-if"))||l[p],m&&(e.addSeparator(o),m=!1),null!=d&&this.imageBasePath&&(d=this.imageBasePath+d),p=this.addAction(e,t,r,d,a,h,n,o,u,p),this.addItems(t,e,n,i,l,s.firstChild,p)):"separator"==s.nodeName&&(m=!0),s=s.nextSibling},mxDefaultPopupMenu.prototype.addAction=function(t,e,n,i,l,s,o,r,a,h){return t.addItem(n,i,function(t){"function"==typeof l&&l.call(e,e,o,t),null!=s&&e.execute(s,o,t)},r,a,h)},mxDefaultPopupMenu.prototype.createConditions=function(t,e,n){var i=t.graph.getModel(),l=i.getChildCount(e),s=[];s.nocell=null==e,s.ncells=1 "+e.convertValueToString(n)+t),n=e.getModel().getParent(n);return this.getRootTitle()+t},mxEditor.prototype.getRootTitle=function(){var t=this.graph.getModel().getRoot();return this.graph.convertValueToString(t)},mxEditor.prototype.undo=function(){this.undoManager.undo()},mxEditor.prototype.redo=function(){this.undoManager.redo()},mxEditor.prototype.groupCells=function(){var t=null!=this.groupBorderSize?this.groupBorderSize:this.graph.gridSize;return this.graph.groupCells(this.createGroup(),t)},mxEditor.prototype.createGroup=function(){return this.graph.getModel().cloneCell(this.defaultGroup)},mxEditor.prototype.open=function(t){var e;null!=t&&(e=mxUtils.load(t).getXml(),this.readGraphModel(e.documentElement),this.filename=t,this.fireEvent(new mxEventObject(mxEvent.OPEN,"filename",t)))},mxEditor.prototype.readGraphModel=function(t){new mxCodec(t.ownerDocument).decode(t,this.graph.getModel()),this.resetHistory()},mxEditor.prototype.save=function(t,e){null!=(t=t||this.getUrlPost())&&0C.clientHeight-64&&(n.style.overflowY="auto"),s&&((s=document.createElement("img")).setAttribute("src",Dialog.prototype.closeImage),s.setAttribute("title",mxResources.get("close")),s.className="geDialogClose",s.style.top=y+14+"px",s.style.left=x+i+38-u+"px",s.style.zIndex=this.zIndex,mxEvent.addListener(s,"click",mxUtils.bind(this,function(){e.hideDialog(!0)})),document.body.appendChild(s),this.dialogImg=s,d||(f=!1,mxEvent.addGestureListeners(this.bg,mxUtils.bind(this,function(t){f=!0}),null,mxUtils.bind(this,function(t){f&&(e.hideDialog(!0),f=!1)})))),this.resizeListener=mxUtils.bind(this,function(){null==h||null!=(t=h())&&(p=i=t.w,m=l=t.h);var t=mxUtils.getDocumentSize();g=t.height,this.bg.style.height=g+"px",x=Math.max(1,Math.round((t.width-i-64)/2)),y=Math.max(1,Math.round((g-l-e.footerHeight)/3)),i=null!=document.body?Math.min(p,document.body.scrollWidth-64):p,l=Math.min(m,g-64);t=this.getPosition(x,y,i,l);x=t.x,y=t.y,C.style.left=x+"px",C.style.top=y+"px",C.style.width=i+"px",C.style.height=l+"px",!r&&n.clientHeight>C.clientHeight-64&&(n.style.overflowY="auto"),null!=this.dialogImg&&(this.dialogImg.style.top=y+14+"px",this.dialogImg.style.left=x+i+38-u+"px")}),mxEvent.addListener(window,"resize",this.resizeListener),this.onDialogClose=o,this.container=C,e.editor.fireEvent(new mxEventObject("showDialog"))}mxDefaultToolbarCodec.allowEval=!0,mxCodecRegistry.register(function(){var t=new mxObjectCodec(new mxDefaultPopupMenu);return t.encode=function(t,e){return null},t.decode=function(t,e,n){var i=e.getElementsByTagName("include")[0];return null!=i?this.processInclude(t,i,n):null!=n&&(n.config=e),n},t}()),mxCodecRegistry.register(function(){var t=new mxObjectCodec(new mxEditor,["modified","lastSnapshot","ignoredChanges","undoManager","graphContainer","toolbarContainer"]);return t.afterDecode=function(t,e,n){var i=e.getAttribute("defaultEdge");null!=i&&(e.removeAttribute("defaultEdge"),n.defaultEdge=n.templates[i]);i=e.getAttribute("defaultGroup");return null!=i&&(e.removeAttribute("defaultGroup"),n.defaultGroup=n.templates[i]),n},t.decodeChild=function(t,e,n){if("Array"==e.nodeName){if("templates"==e.getAttribute("as"))return void this.decodeTemplates(t,e,n)}else if("ui"==e.nodeName)return void this.decodeUi(t,e,n);mxObjectCodec.prototype.decodeChild.apply(this,arguments)},t.decodeUi=function(t,e,n){for(var i,l,s,o,r,a,h,d=e.firstChild;null!=d;)"add"==d.nodeName?(i=d.getAttribute("as"),a=d.getAttribute("element"),l=d.getAttribute("style"),(h=null)!=a?null!=(h=document.getElementById(a))&&null!=l&&(h.style.cssText+=";"+l):(s=parseInt(d.getAttribute("x")),o=parseInt(d.getAttribute("y")),r=d.getAttribute("width"),a=d.getAttribute("height"),(h=document.createElement("div")).style.cssText=l,new mxWindow(mxResources.get(i)||i,h,s,o,r,a,!1,!0).setVisible(!0)),"graph"==i?n.setGraphContainer(h):"toolbar"==i?n.setToolbarContainer(h):"title"==i?n.setTitleContainer(h):"status"==i?n.setStatusContainer(h):"map"==i&&n.setMapContainer(h)):"resource"==d.nodeName?mxResources.add(d.getAttribute("basename")):"stylesheet"==d.nodeName&&mxClient.link("stylesheet",d.getAttribute("name")),d=d.nextSibling},t.decodeTemplates=function(t,e,n){null==n.templates&&(n.templates=[]);for(var i=mxUtils.getChildNodes(e),l=0;li.container.scrollLeft+.9*i.container.clientWidth&&(i.container.scrollLeft=Math.min(e.x+e.width-i.container.clientWidth,e.x-10)),e.y>i.container.scrollTop+.9*i.container.clientHeight&&(i.container.scrollTop=Math.min(e.y+e.height-i.container.clientHeight,e.y-10)))):(e=i.getGraphBounds(),n=Math.max(e.width,i.scrollTileSize.width*i.view.scale),t=Math.max(e.height,i.scrollTileSize.height*i.view.scale),i.container.scrollTop=Math.floor(Math.max(0,e.y-Math.max(20,(i.container.clientHeight-t)/4))),i.container.scrollLeft=Math.floor(Math.max(0,e.x-Math.max(0,(i.container.clientWidth-n)/2)))):(t=mxRectangle.fromRectangle(i.pageVisible?i.view.getBackgroundPageBounds():i.getGraphBounds()),e=i.view.translate,n=i.view.scale,t.x=t.x/n-e.x,t.y=t.y/n-e.y,t.width/=n,t.height/=n,n=i.pageVisible?0:Math.max(0,(i.container.clientHeight-t.height)/4),i.view.setTranslate(Math.floor(Math.max(0,(i.container.clientWidth-t.width)/2)-t.x+2),Math.floor(n-t.y+1)))):(i.container.scrollTop=0,i.container.scrollLeft=0,mxUtils.hasScrollbars(i.container)||i.view.setTranslate(0,0))},EditorUi.prototype.setPageVisible=function(t){var e=this.editor.graph,n=mxUtils.hasScrollbars(e.container),i=0,l=0;n&&(i=e.view.translate.x*e.view.scale-e.container.scrollLeft,l=e.view.translate.y*e.view.scale-e.container.scrollTop),e.pageVisible=t,e.pageBreaksVisible=t,e.preferPageSize=t,e.view.validateBackground(),n&&(t=e.getSelectionCells(),e.clearSelection(),e.setSelectionCells(t)),e.sizeDidChange(),n&&(e.container.scrollLeft=e.view.translate.x*e.view.scale-i,e.container.scrollTop=e.view.translate.y*e.view.scale-l),this.fireEvent(new mxEventObject("pageViewChanged"))},ChangeGridColor.prototype.execute=function(){var t=this.ui.editor.graph.view.gridColor;this.ui.setGridColor(this.color),this.color=t},function(){var t=new mxObjectCodec(new ChangeGridColor,["ui"]);mxCodecRegistry.register(t)}(),ChangePageSetup.prototype.execute=function(){var t,e=this.ui.editor.graph;this.ignoreColor||(this.color=this.previousColor,t=e.background,this.ui.setBackgroundColor(this.previousColor),this.previousColor=t),this.ignoreImage||(this.image=this.previousImage,t=e.backgroundImage,this.ui.setBackgroundImage(this.previousImage),this.previousImage=t),null!=this.previousFormat&&(this.format=this.previousFormat,t=e.pageFormat,this.previousFormat.width==t.width&&this.previousFormat.height==t.height||(this.ui.setPageFormat(this.previousFormat),this.previousFormat=t)),null!=this.foldingEnabled&&this.foldingEnabled!=this.ui.editor.graph.foldingEnabled&&(this.ui.setFoldingEnabled(this.foldingEnabled),this.foldingEnabled=!this.foldingEnabled),null!=this.previousPageScale&&(t=this.ui.editor.graph.pageScale,this.previousPageScale!=t&&(this.ui.setPageScale(this.previousPageScale),this.previousPageScale=t))},function(){var t=new mxObjectCodec(new ChangePageSetup,["ui","previousColor","previousImage","previousFormat","previousPageScale"]);t.afterDecode=function(t,e,n){return n.previousColor=n.color,n.previousImage=n.image,n.previousFormat=n.format,n.previousPageScale=n.pageScale,null!=n.foldingEnabled&&(n.foldingEnabled=!n.foldingEnabled),n},mxCodecRegistry.register(t)}(),EditorUi.prototype.setBackgroundColor=function(t){this.editor.graph.background=t,this.editor.graph.view.validateBackground(),this.fireEvent(new mxEventObject("backgroundColorChanged"))},EditorUi.prototype.setFoldingEnabled=function(t){this.editor.graph.foldingEnabled=t,this.editor.graph.view.revalidate(),this.fireEvent(new mxEventObject("foldingEnabledChanged"))},EditorUi.prototype.setPageFormat=function(t){this.editor.graph.pageFormat=t,this.editor.graph.pageVisible?(this.editor.graph.view.validateBackground(),this.editor.graph.sizeDidChange()):this.actions.get("pageView").funct(),this.fireEvent(new mxEventObject("pageFormatChanged"))},EditorUi.prototype.setPageScale=function(t){this.editor.graph.pageScale=t,this.editor.graph.pageVisible?(this.editor.graph.view.validateBackground(),this.editor.graph.sizeDidChange()):this.actions.get("pageView").funct(),this.fireEvent(new mxEventObject("pageScaleChanged"))},EditorUi.prototype.setGridColor=function(t){this.editor.graph.view.gridColor=t,this.editor.graph.view.validateBackground(),this.fireEvent(new mxEventObject("gridColorChanged"))},EditorUi.prototype.addUndoListener=function(){var t=this.actions.get("undo"),e=this.actions.get("redo"),n=this.editor.undoManager,i=mxUtils.bind(this,function(){t.setEnabled(this.canUndo()),e.setEnabled(this.canRedo())});n.addListener(mxEvent.ADD,i),n.addListener(mxEvent.UNDO,i),n.addListener(mxEvent.REDO,i),n.addListener(mxEvent.CLEAR,i);var l=this.editor.graph.cellEditor.startEditing;this.editor.graph.cellEditor.startEditing=function(){l.apply(this,arguments),i()};var s=this.editor.graph.cellEditor.stopEditing;this.editor.graph.cellEditor.stopEditing=function(t,e){s.apply(this,arguments),i()},i()},EditorUi.prototype.updateActionStates=function(){var t=this.editor.graph,e=!t.isSelectionEmpty(),n=!1,i=!1,l=!1,s=t.getSelectionCells();if(null!=s)for(var o=0;o").replace(/</g,"<").replace(/\\"/g,'"').replace(/\n/g,"")))}catch(t){}return e},EditorUi.prototype.extractGraphModelFromEvent=function(t){var e=null,n=null;return null==t||null!=(t=null!=t.dataTransfer?t.dataTransfer:t.clipboardData)&&(10==document.documentMode||11==document.documentMode?n=t.getData("Text"):(n=0<=mxUtils.indexOf(t.types,"text/html")?t.getData("text/html"):null,mxUtils.indexOf(t.types,null==n||0==n.length)&&(n=t.getData("text/plain"))),null!=n&&(n=Graph.zapGremlins(mxUtils.trim(n)),null!=(t=this.extractGraphModelFromHtml(n))&&(n=t))),null!=n&&this.isCompatibleString(n)&&(e=n),e},EditorUi.prototype.isCompatibleString=function(t){return!1},EditorUi.prototype.saveFile=function(t){t||null==this.editor.filename?(t=new FilenameDialog(this,this.editor.getOrCreateFilename(),mxResources.get("save"),mxUtils.bind(this,function(t){this.save(t)}),null,mxUtils.bind(this,function(t){return null!=t&&0'),t.writeln("@media screen {"),t.writeln(" body > div { padding:30px;box-sizing:content-box; }"),t.writeln("}"),t.writeln("")},s},PrintDialog.previewEnabled=!0;var PageSetupDialog=function(i){var l=i.editor.graph,t=document.createElement("table");t.style.width="100%",t.style.height="100%";var e,n=document.createElement("tbody"),s=document.createElement("tr");(e=document.createElement("td")).style.verticalAlign="top",e.style.fontSize="10pt",mxUtils.write(e,mxResources.get("paperSize")+":"),s.appendChild(e),(e=document.createElement("td")).style.verticalAlign="top",e.style.fontSize="10pt";var o=PageSetupDialog.addPageFormatPanel(e,"pagesetupdialog",l.pageFormat);s.appendChild(e),n.appendChild(s),s=document.createElement("tr"),e=document.createElement("td"),mxUtils.write(e,mxResources.get("background")+":"),s.appendChild(e),(e=document.createElement("td")).style.whiteSpace="nowrap",document.createElement("input").setAttribute("type","text");var r=document.createElement("button");r.style.width="18px",r.style.height="18px",r.style.marginRight="20px",r.style.backgroundPosition="center center",r.style.backgroundRepeat="no-repeat";var a=l.background;function h(){null==a||a==mxConstants.NONE?(r.style.backgroundColor="",r.style.backgroundImage="url('"+Dialog.prototype.noColorImage+"')"):(r.style.backgroundColor=a,r.style.backgroundImage="")}h(),mxEvent.addListener(r,"click",function(t){i.pickColor(a||"none",function(t){a=t,h()}),mxEvent.consume(t)}),e.appendChild(r),mxUtils.write(e,mxResources.get("gridSize")+":");var d=document.createElement("input");d.setAttribute("type","number"),d.setAttribute("min","0"),d.style.width="40px",d.style.marginLeft="6px",d.value=l.getGridSize(),e.appendChild(d),mxEvent.addListener(d,"change",function(){var t=parseInt(d.value);d.value=Math.max(1,isNaN(t)?l.getGridSize():t)}),s.appendChild(e),n.appendChild(s),s=document.createElement("tr"),e=document.createElement("td"),mxUtils.write(e,mxResources.get("image")+":"),s.appendChild(e),e=document.createElement("td");var u=document.createElement("a");u.style.textDecoration="underline",u.style.cursor="pointer",u.style.color="#a0a0a0";var p=l.backgroundImage;function m(){null==p?(u.removeAttribute("title"),u.style.fontSize="",u.innerHTML=mxUtils.htmlEntities(mxResources.get("change"))+"..."):(u.setAttribute("title",p.src),u.style.fontSize="11px",u.innerHTML=mxUtils.htmlEntities(p.src.substring(0,42))+"...")}mxEvent.addListener(u,"click",function(t){i.showBackgroundImageDialog(function(t,e){e||(p=t,m())},p),mxEvent.consume(t)}),m(),e.appendChild(u),s.appendChild(e),n.appendChild(s),s=document.createElement("tr"),(e=document.createElement("td")).colSpan=2,e.style.paddingTop="16px",e.setAttribute("align","right");var c=mxUtils.button(mxResources.get("cancel"),function(){i.hideDialog()});c.className="geBtn",i.editor.cancelFirst&&e.appendChild(c);var g=mxUtils.button(mxResources.get("apply"),function(){i.hideDialog();var t=parseInt(d.value);isNaN(t)||l.gridSize===t||l.setGridSize(t);var e=new ChangePageSetup(i,a,p,o.get());e.ignoreColor=l.background==a;var n=null!=l.backgroundImage?l.backgroundImage.src:null,t=null!=p?p.src:null;e.ignoreImage=n===t,l.pageFormat.width==e.previousFormat.width&&l.pageFormat.height==e.previousFormat.height&&e.ignoreColor&&e.ignoreImage||l.model.execute(e)});g.className="geBtn gePrimaryBtn",e.appendChild(g),i.editor.cancelFirst||e.appendChild(c),s.appendChild(e),n.appendChild(s),t.appendChild(n),this.container=t};PageSetupDialog.addPageFormatPanel=function(t,e,o,i){var n="format-"+e,r=document.createElement("input");r.setAttribute("name",n),r.setAttribute("type","radio"),r.setAttribute("value","portrait");var a=document.createElement("input");a.setAttribute("name",n),a.setAttribute("type","radio"),a.setAttribute("value","landscape");var h=document.createElement("select");h.style.marginBottom="8px",h.style.width="202px";var d=document.createElement("div");d.style.marginLeft="4px",d.style.width="210px",d.style.height="24px",r.style.marginRight="6px",d.appendChild(r);e=document.createElement("span");e.style.maxWidth="100px",mxUtils.write(e,mxResources.get("portrait")),d.appendChild(e),a.style.marginLeft="10px",a.style.marginRight="6px",d.appendChild(a);n=document.createElement("span");n.style.width="100px",mxUtils.write(n,mxResources.get("landscape")),d.appendChild(n);var u=document.createElement("div");u.style.marginLeft="4px",u.style.width="210px",u.style.height="24px";var p=document.createElement("input");p.setAttribute("size","7"),p.style.textAlign="right",u.appendChild(p),mxUtils.write(u," in x ");var m=document.createElement("input");m.setAttribute("size","7"),m.style.textAlign="right",u.appendChild(m),mxUtils.write(u," in"),d.style.display="none",u.style.display="none";for(var l=new Object,c=PageSetupDialog.getFormats(),s=0;s'};var l=mxGraph.prototype.panGraph;mxGraph.prototype.panGraph=function(t,e){var n,i;l.apply(this,arguments),null!=this.shiftPreview1&&(null!=(n=this.view.canvas).ownerSVGElement&&(n=n.ownerSVGElement),i=this.gridSize*this.view.scale*this.view.gridSteps,i=-Math.round(i-mxUtils.mod(this.view.translate.x*this.view.scale+t,i))+"px "+-Math.round(i-mxUtils.mod(this.view.translate.y*this.view.scale+e,i))+"px",n.style.backgroundPosition=i)},mxGraph.prototype.updatePageBreaks=function(t,e,n){var i=this.view.scale,l=this.view.translate,s=this.pageFormat,o=i*this.pageScale,r=this.view.getBackgroundPageBounds();e=r.width,n=r.height;var a=new mxRectangle(i*l.x,i*l.y,s.width*o,s.height*o),h=(t=t&&Math.min(a.width,a.height)>this.minPageBreakDist)?Math.ceil(n/a.height)-1:0,d=t?Math.ceil(e/a.width)-1:0,u=r.x+e,p=r.y+n;null==this.horizontalPageBreaks&&0this.maxTooltipWidth||h>this.maxTooltipHeight?this.graph2.view.scale=Math.round(100*Math.min(this.maxTooltipWidth/a,this.maxTooltipHeight/h))/100:this.graph2.view.scale=1,this.tooltip.style.display="block",this.graph2.labelsVisible=null==u||u;var t=mxClient.NO_FO;mxClient.NO_FO=Editor.prototype.originalNoForeignObject;var e=this.graph2.cloneCells(r);this.editorUi.insertHandler(e,null,this.graph2.model),this.graph2.addCells(e),mxClient.NO_FO=t;var n=this.graph2.getGraphBounds(),i=n.width+2*this.tooltipBorder+4,l=n.height+2*this.tooltipBorder;mxClient.IS_QUIRKS?(l+=4,this.tooltip.style.overflow="hidden"):this.tooltip.style.overflow="visible",this.tooltip.style.width=i+"px";e=i;this.tooltipTitles&&null!=d&&0Heading

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

","Textbox",null,null,"text textbox textarea"),this.createVertexTemplateEntry("ellipse;shape=ellipse;whiteSpace=wrap;html=1;aspect=fixed;",120,80,"","Ellipse",null,null,"oval ellipse state"),this.createVertexTemplateEntry("whiteSpace=wrap;html=1;aspect=fixed;",80,80,"","Square",null,null,"square"),this.createVertexTemplateEntry("ellipse;shape=ellipse;whiteSpace=wrap;html=1;aspect=fixed;",80,80,"","Circle",null,null,"circle"),this.createVertexTemplateEntry("shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;",120,60,"","Process",null,null,"process task"),this.createVertexTemplateEntry("html=1;whiteSpace=wrap;aspect=fixed;shape=isoRectangle;",80,80,"","Diamond",null,null,"diamond rhombus if condition decision conditional question test"),this.createVertexTemplateEntry("shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;",120,60,"","Parallelogram"),this.createVertexTemplateEntry("shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;",120,80,"","Hexagon",null,null,"hexagon preparation"),this.createVertexTemplateEntry("triangle;shape=triangle;whiteSpace=wrap;html=1;",60,80,"","Triangle",null,null,"triangle logic inverter buffer"),this.createVertexTemplateEntry("shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;",60,80,"","Cylinder",null,null,"cylinder data database"),this.createVertexTemplateEntry("ellipse;shape=cloud;whiteSpace=wrap;html=1;",120,80,"","Cloud",null,null,"cloud network"),this.createVertexTemplateEntry("shape=document;whiteSpace=wrap;html=1;boundedLbl=1;",120,80,"","Document"),this.createVertexTemplateEntry("shape=internalStorage;whiteSpace=wrap;html=1;backgroundOutline=1;",80,80,"","Internal Storage"),this.createVertexTemplateEntry("shape=cube;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;darkOpacity=0.05;darkOpacity2=0.1;",120,80,"","Cube"),this.createVertexTemplateEntry("shape=step;perimeter=stepPerimeter;whiteSpace=wrap;html=1;fixedSize=1;",120,80,"","Step"),this.createVertexTemplateEntry("shape=trapezoid;perimeter=trapezoidPerimeter;whiteSpace=wrap;html=1;fixedSize=1;",120,60,"","Trapezoid"),this.createVertexTemplateEntry("shape=tape;whiteSpace=wrap;html=1;",120,100,"","Tape"),this.createVertexTemplateEntry("shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;",80,100,"","Note"),this.createVertexTemplateEntry("shape=card;whiteSpace=wrap;html=1;",80,100,"","Card"),this.createVertexTemplateEntry("shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;",120,80,"","Callout",null,null,"bubble chat thought speech message"),this.createVertexTemplateEntry("shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;",30,60,"Actor","Actor",!1,null,"user person human stickman"),this.createVertexTemplateEntry("shape=xor;whiteSpace=wrap;html=1;",60,80,"","Or",null,null,"logic or"),this.createVertexTemplateEntry("shape=or;whiteSpace=wrap;html=1;",60,80,"","And",null,null,"logic and"),this.createVertexTemplateEntry("shape=dataStorage;whiteSpace=wrap;html=1;fixedSize=1;",100,80,"","Data Storage"),this.createVertexTemplateEntry("swimlane;startSize=0;",200,200,"","Container",null,null,"container swimlane lane pool group"),this.createVertexTemplateEntry("swimlane;",200,200,"Vertical Container","Container",null,null,"container swimlane lane pool group"),this.createVertexTemplateEntry("swimlane;horizontal=0;",200,200,"Horizontal Container","Horizontal Container",null,null,"container swimlane lane pool group"),this.addEntry("list group erd table",function(){var t=new mxCell("List",new mxGeometry(0,0,140,120),"swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;");return t.vertex=!0,t.insert(n.cloneCell(l,"Item 1")),t.insert(n.cloneCell(l,"Item 2")),t.insert(n.cloneCell(l,"Item 3")),n.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"List")}),this.addEntry("list item entry value group erd table",function(){return n.createVertexTemplateFromCells([n.cloneCell(l,"List Item")],l.geometry.width,l.geometry.height,"List Item")}),this.addEntry("curve",mxUtils.bind(this,function(){var t=new mxCell("",new mxGeometry(0,0,50,50),"curved=1;endArrow=classic;html=1;");return t.geometry.setTerminalPoint(new mxPoint(0,50),!0),t.geometry.setTerminalPoint(new mxPoint(50,0),!1),t.geometry.points=[new mxPoint(50,50),new mxPoint(0,0)],t.geometry.relative=!0,t.edge=!0,this.createEdgeTemplateFromCells([t],t.geometry.width,t.geometry.height,"Curve")})),this.createEdgeTemplateEntry("shape=flexArrow;endArrow=classic;startArrow=classic;html=1;",100,100,"","Bidirectional Arrow",null,e+"bidirectional"),this.createEdgeTemplateEntry("shape=flexArrow;endArrow=classic;html=1;",50,50,"","Arrow",null,e+"directional directed"),this.createEdgeTemplateEntry("endArrow=none;dashed=1;html=1;",50,50,"","Dashed Line",null,e+"dashed undirected no"),this.createEdgeTemplateEntry("endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;",50,50,"","Dotted Line",null,e+"dotted undirected no"),this.createEdgeTemplateEntry("endArrow=none;html=1;",50,50,"","Line",null,e+"simple undirected plain blank no"),this.createEdgeTemplateEntry("endArrow=classic;startArrow=classic;html=1;",50,50,"","Bidirectional Connector",null,e+"bidirectional"),this.createEdgeTemplateEntry("endArrow=classic;html=1;",50,50,"","Directional Connector",null,e+"directional directed"),this.createEdgeTemplateEntry("shape=link;html=1;",100,0,"","Link",null,e+"link"),this.addEntry(e+"edge title",mxUtils.bind(this,function(){var t=new mxCell("",new mxGeometry(0,0,0,0),"endArrow=classic;html=1;");t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(100,0),!1),t.geometry.relative=!0,t.edge=!0;var e=new mxCell("Label",new mxGeometry(0,0,0,0),"edgeLabel;resizable=0;html=1;align=center;verticalAlign=middle;");return e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e),this.createEdgeTemplateFromCells([t],100,0,"Connector with Label")})),this.addEntry(e+"edge title multiplicity",mxUtils.bind(this,function(){var t=new mxCell("",new mxGeometry(0,0,0,0),"endArrow=classic;html=1;");t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(160,0),!1),t.geometry.relative=!0,t.edge=!0;var e=new mxCell("Label",new mxGeometry(0,0,0,0),"edgeLabel;resizable=0;html=1;align=center;verticalAlign=middle;");e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e);e=new mxCell("Source",new mxGeometry(-1,0,0,0),"edgeLabel;resizable=0;html=1;align=left;verticalAlign=bottom;");return e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e),this.createEdgeTemplateFromCells([t],160,0,"Connector with 2 Labels")})),this.addEntry(e+"edge title multiplicity",mxUtils.bind(this,function(){var t=new mxCell("",new mxGeometry(0,0,0,0),"endArrow=classic;html=1;");t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(160,0),!1),t.geometry.relative=!0,t.edge=!0;var e=new mxCell("Label",new mxGeometry(0,0,0,0),"edgeLabel;resizable=0;html=1;align=center;verticalAlign=middle;");e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e);e=new mxCell("Source",new mxGeometry(-1,0,0,0),"edgeLabel;resizable=0;html=1;align=left;verticalAlign=bottom;");e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e);e=new mxCell("Target",new mxGeometry(1,0,0,0),"edgeLabel;resizable=0;html=1;align=right;verticalAlign=bottom;");return e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e),this.createEdgeTemplateFromCells([t],160,0,"Connector with 3 Labels")})),this.addEntry(e+"edge shape symbol message mail email",mxUtils.bind(this,function(){var t=new mxCell("",new mxGeometry(0,0,0,0),"endArrow=classic;html=1;");t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(100,0),!1),t.geometry.relative=!0,t.edge=!0;var e=new mxCell("",new mxGeometry(0,0,20,14),"shape=message;html=1;outlineConnect=0;");return e.geometry.relative=!0,e.vertex=!0,e.geometry.offset=new mxPoint(-10,-7),t.insert(e),this.createEdgeTemplateFromCells([t],100,0,"Connector with Symbol")}))];this.addPaletteFunctions("general",mxResources.get("general"),null==t||t,e),this.setCurrentSearchEntryLibrary()},Sidebar.prototype.addMiscPalette=function(t){var n=this,e="line lines connector connectors connection connections arrow arrows ";this.setCurrentSearchEntryLibrary("general","misc");e=[this.createVertexTemplateEntry("text;strokeColor=none;fillColor=none;html=1;fontSize=24;fontStyle=1;verticalAlign=middle;align=center;",100,40,"Title","Title",null,null,"text heading title"),this.createVertexTemplateEntry("text;strokeColor=none;fillColor=none;html=1;whiteSpace=wrap;verticalAlign=middle;overflow=hidden;",100,80,"
  • Value 1
  • Value 2
  • Value 3
","Unordered List"),this.createVertexTemplateEntry("text;strokeColor=none;fillColor=none;html=1;whiteSpace=wrap;verticalAlign=middle;overflow=hidden;",100,80,"
  1. Value 1
  2. Value 2
  3. Value 3
","Ordered List"),this.addDataEntry("table",180,120,"Table 1","7ZjBTuMwEIafJteVnVDoXpuycGAvsC9g6mltyfFE9kAann7txN2qqIgU0aCllRJpZjxO7G9i/3KyoqzWN07U6jdKMFlxnRWlQ6TeqtYlGJPlTMusmGd5zsKd5b/eaOVdK6uFA0tDOuR9h2dhnqCP9AFPrUkBr0QdTRKPMTRTVIVhznkwG6UJHmqxiO1NmESIeRKOHvRLDLHgL9CS0BZc6rNAY0TtdfewPkNpI+9Ei0+0ec3Gm6XhgSNYvznFLpTmdwNYAbk2pDRakkoZ0x4DU6BXatMtsWHC94HVv75bYsFI0PYDLA4EeI9NZIhOv0QwJjF4Tc03ujLCwi0I+So0Q9mmEGGdLANLSuYjEmGVHJemy/aSlw7rP8KtYJOy1MaUaDAWy6KN5a5RW+oATWbhCshK9mOSTcLMyuDzrR+umO6oROvJhaLHx4Lw1IAfXMz8Y8W8+IRaXgyvZRgxaWHuYUHCroasi7AObMze0t8D+7CCYkC5NPGDmistJdihjIt3GV8eCfHkxBGvd/GOQPzyTHxnsx8B+dVZE0bRhHa3ZGNIxPRUVtPVl0nEzxNHPL5EcHZGPrZGcH4WiTFFYjqiSPADTtX/93ri7x+9j7aADjh5f0/IXyAU3+GE3O1L4K6fod+e+CfV4YjqEdztL8GubeeP4V8="),this.addDataEntry("table",180,120,"Table 2","7ZhRb5swEMc/Da+TDSFJX0O27qF7aae9u8EJlowP2ZcR+ulng1maJlbTaaEPIBHpfL5z8O/v0wlHSVYe7jWrih+QcxklX6Mk0wDYWeUh41JGMRF5lKyjOCb2F8XfArO0nSUV01zhNQlxl/CbyT3vPJ3DYCO9wxSsciayZ+daFVja11xTa9aFQP5UsY2br+0mrM8g0/gkXpyL2PEGFDKhuPY5G5CSVUa0i3URhZD5A2tgj/3f9CMXvS/Vg803PlpD/Xro359r5Icgg9blAdxzKDnqxobUIsfCRyw7TqTgYlf0aR4eYaZz7P7mHpFaw1O9TDj5IOFHqB1k0OLFkZN+n2+xmlqUkin+nbP8jWsFeeNdCJW3JN+iN58BEcoep98uuShNrqH6yfSO9yFbIWUGEpyaCpQ7DxUIhS2gdGUfiywjX9IotTvL7Jgex/Zx4RozUAa1PRVuWc4M1tzgtWLG/ybm7D9oOTvT8ldrxoQGRbWvjoLJR75BpnbXVJCtGOWijzJcoP4xZcEy3Up3staFyHOu3KL2ePkDReNr4Sfvwp/fiH0aZB8uqFGwP5xyH0CKeVCKZJLidd8YQIvF1F4GaS/NqWRDdJtlsMxmIymzxad1m7sg+3Tc7IfvNpQEtZhPWgzcbiid+s2Q/WY5YL+h55cBfaEtRlJo9P2bgptV1vlFQU9/OXL6n9Bzwl/6d5MYN246dni8AG3nTu5H/wA="),this.addDataEntry("table title",180,150,"Table with Title 1","7ZjBbtswDEC/xtfBsuumu8bZusN2afoDasxYAmjJkNk57tePkpVlXdMlBRYXaAI4AEmRcvgogpCTvGw2t0626oetAJP8S5KXzloapWZTAmKSpbpK8kWSZSn/kuzrK6sirKatdGDomIBsDPgp8RFGy718QBitHQ0YrZ2SrRcprObzjqSjpX7ytjxlw8oaktqAY4MIOqJsOx3cF8FDaay+y8E+0najrTZfc/Qyvs1HS9S1YXnFafgt5/FvgiPYvJpqMMU8b8E2QG5gl15XpKLHzYgjVaBrtQ0rolF2o6H+Hbsjx0KEtx9k/gLkvxne2Z7TUtbpJ08OI6Q/uQa91w1KA99AVn+Z5rYaoolsGyWENUXxwRLZJiouppvuLU3lbHsvXQ1bl7VGLC1aX01jja94a7WhAKiY88PIyvRTkRScWcm62On8eHdHpTUdOT4VfluQHfXQ0bHFzPYXc4i4Y8kO1fbqP5T26vjScgKkJd7BiqSpQ6coajCe6l5pgmUrV961554f+8Z4710x9rB/W30tk12jP18LpasKzLHI84P9c30ixMWZI948xzsB8esL8RCQTYd8dhkRU46I2YQj4uZcumn2biPi85kjnn5EiPSCfOoZIcRlSEw5JISYcEqIl7ftD9pQ4vBV/GQd9Iab+MeE/A6T4myuyAeYn3BUsLr7LBjWnn01/AU="),this.addDataEntry("table title",180,150,"Table with Title 2","7VhLc5swEP41XDs8ghtfwWl6cC9xpnfFLKAZITHSJpj8+q6EqJPaJG5aPw6ZwTP7lNnv034HgiRvNreatfUPVYAIkpsgybVSOFjNJgchgjjkRZAsgjgO6RfE3yaykcuGLdMg8ZCGeGh4YuIRhsg9exAwRA32wkdNzVprossmmUGmccWfbSwJKbBWEhmXoCkQOV8I1hruyheuouaiWLJePeJ40OhlJd9Acac647u16pZ0mPGtJR2+8i9j0/6lQSNsJgd3IT/1LagGUPdU0vECa19xPYAT1sCremxLfZCZIVD97t3iSIaHcj+syQ6sbyNKo9NYtdL82eIo/NwvUXZ+xxvBJHwHVvwRylTR+xCq1lsCSvTmg0JUjXe0HzfcS1ShVXvPdAVjScmFyJVQlluppOW/VVyiAyjN6CHI8vBLGqQ0WU5+tPXpseUacyUNaroj9lhgBjsweCiZ8X4yew+3p+w9bpP/QO3VDrXRJLc0AXIm7mCNTFZucWpshL/FXc0RVi1b29KOJGBYI2mrt2zsAf/vCFYEbSnsBVvUvChAjvSBvnmCgcWDlyp5d6mujoR7uoP7T2fG4YXjzwSvCPPFUJsZ+kMuq+XQOZsg6F/I2Lwm4uVSHIuc2afenVLvZifUu6871E5zexH79uF1mp1N264nte3CsT6etk2QcQZtm39q2ym1bX5CbYvCHW6Ty164D+/T/GziFkWT6nbhYB9P3SbYOL66kbv9uOByr749/AI="),this.addDataEntry("crossfunctional cross-functional cross functional flowchart swimlane table",400,400,"Cross-Functional Flowchart","7ZjRatswFIafxpcDy87a7nJJlvZig9HuBVT7JBLIOkZSGrtPPymS2622Gwc6z6WGXBz9HBnxfxz+cKJ0VVTXipbsB+YgovRblMTul64Uonk+N2pRrUAIW/M8StdR4vQkSjYDOsmxMy6pAmnOvZz4yw9U7MEr9oFaf9rsZWY4SuqaNwIPGaPK+GZtahGaNaOlKw29d9IyY1zk32mNe9OozWmpjf3CHX90/YvYNaMQtNT8eHXtFAXZXmn+ALegfaNToSqpzMNhi9LchQcQew7vB2Wg6vXjKL0w49mSa8ACjKrt+cBzw/ydRexdjBnwHTMvRKq9sHu62224FYPnp1mkLRZfM4PKSuR142/xYJ1gqPijdcci81a1DNcHXggq4QZoY2cjLTGvg2SwDJWArQnlPRqDRYMpGOLqXGH5i6odNMKWC7FCYd+driVKGBV0MhR03fD03zjFnST/kPuixf0noxq6uQdeg2n+aaMfOikhC/PaB+w/jmo6lGDVS/AJ1mgEP/cSTGaCpwiSiykgvOhFmM4ITyFMrqaA8LI3PzumcM7Pt8jPrtkdP0CvWuAnMLLjTuzle4zNLzO3c7lNIyxJPJM7l9w0MpKQ3pDs+J8zh+RbhGQX+fFDkrRXPR9uZsngRdCUYpK0F0MzuXcSlO3dzoxuUkl5FJudfOj4a3H/Gw=="),this.createVertexTemplateEntry("text;html=1;strokeColor=#c0c0c0;fillColor=#ffffff;overflow=fill;rounded=0;",280,160,'
Title 1Title 2Title 3
Value 1Value 2Value 3
Value 4Value 5Value 6
Value 7Value 8Value 9
Value 10Value 11Value 12
',"HTML Table 1"),this.createVertexTemplateEntry("text;html=1;strokeColor=#c0c0c0;fillColor=none;overflow=fill;",180,140,'
Value 1Value 2Value 3
Value 4Value 5Value 6
Value 7Value 8Value 9
',"HTML Table 2"),this.createVertexTemplateEntry("text;html=1;strokeColor=none;fillColor=none;overflow=fill;",180,140,'
Value 1Value 2Value 3
Value 4Value 5Value 6
Value 7Value 8Value 9
',"HTML Table 3"),this.createVertexTemplateEntry("text;html=1;strokeColor=none;fillColor=none;overflow=fill;",160,140,'
Title
Section 1.1\nSection 1.2\nSection 1.3
Section 2.1\nSection 2.2\nSection 2.3
',"HTML Table 4"),this.addEntry("link hyperlink",mxUtils.bind(this,function(){var t=new mxCell("Link",new mxGeometry(0,0,60,40),"text;html=1;strokeColor=none;fillColor=none;whiteSpace=wrap;align=center;verticalAlign=middle;fontColor=#0000EE;fontStyle=4;");return t.vertex=!0,this.graph.setLinkForCell(t,"https://www.draw.io"),this.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Link")})),this.addEntry("timestamp date time text label",mxUtils.bind(this,function(){var t=new mxCell("%date{ddd mmm dd yyyy HH:MM:ss}%",new mxGeometry(0,0,160,20),"text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;");return t.vertex=!0,this.graph.setAttributeForCell(t,"placeholders","1"),this.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Timestamp")})),this.addEntry("variable placeholder metadata hello world text label",mxUtils.bind(this,function(){var t=new mxCell("%name% Text",new mxGeometry(0,0,80,20),"text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;");return t.vertex=!0,this.graph.setAttributeForCell(t,"placeholders","1"),this.graph.setAttributeForCell(t,"name","Variable"),this.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Variable")})),this.createVertexTemplateEntry("shape=ext;double=1;rounded=0;whiteSpace=wrap;html=1;",120,80,"","Double Rectangle",null,null,"rect rectangle box double"),this.createVertexTemplateEntry("shape=ext;double=1;rounded=1;whiteSpace=wrap;html=1;",120,80,"","Double Rounded Rectangle",null,null,"rounded rect rectangle box double"),this.createVertexTemplateEntry("ellipse;shape=doubleEllipse;whiteSpace=wrap;html=1;",100,60,"","Double Ellipse",null,null,"oval ellipse start end state double"),this.createVertexTemplateEntry("shape=ext;double=1;whiteSpace=wrap;html=1;aspect=fixed;",80,80,"","Double Square",null,null,"double square"),this.createVertexTemplateEntry("ellipse;shape=doubleEllipse;whiteSpace=wrap;html=1;aspect=fixed;",80,80,"","Double Circle",null,null,"double circle"),this.createVertexTemplateEntry("rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillWeight=4;hachureGap=8;hachureAngle=45;fillColor=#1ba1e2;sketch=1;",120,60,"","Rectangle Sketch",!0,null,"rectangle rect box text sketch comic retro"),this.createVertexTemplateEntry("ellipse;whiteSpace=wrap;html=1;strokeWidth=2;fillWeight=2;hachureGap=8;fillColor=#990000;fillStyle=dots;sketch=1;",120,60,"","Ellipse Sketch",!0,null,"ellipse oval sketch comic retro"),this.createVertexTemplateEntry("rhombus;whiteSpace=wrap;html=1;strokeWidth=2;fillWeight=-1;hachureGap=8;fillStyle=cross-hatch;fillColor=#006600;sketch=1;",120,60,"","Diamond Sketch",!0,null,"diamond sketch comic retro"),this.createVertexTemplateEntry("html=1;whiteSpace=wrap;shape=isoCube2;backgroundOutline=1;isoAngle=15;",90,100,"","Isometric Cube",!0,null,"cube box iso isometric"),this.createVertexTemplateEntry("html=1;whiteSpace=wrap;aspect=fixed;shape=isoRectangle;",150,90,"","Isometric Square",!0,null,"rectangle rect box iso isometric"),this.createEdgeTemplateEntry("edgeStyle=isometricEdgeStyle;endArrow=none;html=1;",50,100,"","Isometric Edge 1"),this.createEdgeTemplateEntry("edgeStyle=isometricEdgeStyle;endArrow=none;html=1;elbow=vertical;",50,100,"","Isometric Edge 2"),this.createVertexTemplateEntry("shape=curlyBracket;whiteSpace=wrap;html=1;rounded=1;",20,120,"","Left Curly Bracket"),this.createVertexTemplateEntry("shape=curlyBracket;whiteSpace=wrap;html=1;rounded=1;flipH=1;",20,120,"","Right Curly Bracket"),this.createVertexTemplateEntry("line;strokeWidth=2;html=1;",160,10,"","Horizontal Line"),this.createVertexTemplateEntry("line;strokeWidth=2;direction=south;html=1;",10,160,"","Vertical Line"),this.createVertexTemplateEntry("line;strokeWidth=4;html=1;perimeter=backbonePerimeter;points=[];outlineConnect=0;",160,10,"","Horizontal Backbone",!1,null,"backbone bus network"),this.createVertexTemplateEntry("line;strokeWidth=4;direction=south;html=1;perimeter=backbonePerimeter;points=[];outlineConnect=0;",10,160,"","Vertical Backbone",!1,null,"backbone bus network"),this.createVertexTemplateEntry("shape=crossbar;whiteSpace=wrap;html=1;rounded=1;",120,20,"","Horizontal Crossbar",!1,null,"crossbar distance measure dimension unit"),this.createVertexTemplateEntry("shape=crossbar;whiteSpace=wrap;html=1;rounded=1;direction=south;",20,120,"","Vertical Crossbar",!1,null,"crossbar distance measure dimension unit"),this.createVertexTemplateEntry("shape=image;html=1;verticalLabelPosition=bottom;verticalAlign=top;imageAspect=1;aspect=fixed;image="+this.gearImage,52,61,"","Image (Fixed Aspect)",!1,null,"fixed image icon symbol"),this.createVertexTemplateEntry("shape=image;html=1;verticalLabelPosition=bottom;verticalAlign=top;imageAspect=0;image="+this.gearImage,50,60,"","Image (Variable Aspect)",!1,null,"strechted image icon symbol"),this.createVertexTemplateEntry("icon;html=1;image="+this.gearImage,60,60,"Icon","Icon",!1,null,"icon image symbol"),this.createVertexTemplateEntry("label;whiteSpace=wrap;html=1;image="+this.gearImage,140,60,"Label","Label 1",null,null,"label image icon symbol"),this.createVertexTemplateEntry("label;whiteSpace=wrap;html=1;align=center;verticalAlign=bottom;spacingLeft=0;spacingBottom=4;imageAlign=center;imageVerticalAlign=top;image="+this.gearImage,120,80,"Label","Label 2",null,null,"label image icon symbol"),this.addEntry("shape group container",function(){var t=new mxCell("Label",new mxGeometry(0,0,160,70),"html=1;whiteSpace=wrap;container=1;recursiveResize=0;collapsible=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(20,20,20,30),"triangle;html=1;whiteSpace=wrap;");return e.vertex=!0,t.insert(e),n.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Shape Group")}),this.createVertexTemplateEntry("shape=partialRectangle;whiteSpace=wrap;html=1;left=0;right=0;fillColor=none;",120,60,"","Partial Rectangle"),this.createVertexTemplateEntry("shape=partialRectangle;whiteSpace=wrap;html=1;bottom=0;top=0;fillColor=none;",120,60,"","Partial Rectangle"),this.createVertexTemplateEntry("shape=partialRectangle;whiteSpace=wrap;html=1;bottom=0;right=0;fillColor=none;",120,60,"","Partial Rectangle"),this.createVertexTemplateEntry("shape=partialRectangle;whiteSpace=wrap;html=1;bottom=1;right=1;left=1;top=0;fillColor=none;routingCenterX=-0.5;",120,60,"","Partial Rectangle"),this.createVertexTemplateEntry("shape=waypoint;sketch=0;fillStyle=solid;size=6;pointerEvents=1;points=[];fillColor=none;resizable=0;rotatable=0;perimeter=centerPerimeter;snapToPoint=1;",40,40,"","Waypoint"),this.createEdgeTemplateEntry("edgeStyle=segmentEdgeStyle;endArrow=classic;html=1;",50,50,"","Manual Line",null,e+"manual"),this.createEdgeTemplateEntry("shape=filledEdge;rounded=0;fixDash=1;endArrow=none;strokeWidth=10;fillColor=#ffffff;edgeStyle=orthogonalEdgeStyle;",60,40,"","Filled Edge"),this.createEdgeTemplateEntry("edgeStyle=elbowEdgeStyle;elbow=horizontal;endArrow=classic;html=1;",50,50,"","Horizontal Elbow",null,e+"elbow horizontal"),this.createEdgeTemplateEntry("edgeStyle=elbowEdgeStyle;elbow=vertical;endArrow=classic;html=1;",50,50,"","Vertical Elbow",null,e+"elbow vertical")];this.addPaletteFunctions("misc",mxResources.get("misc"),null==t||t,e),this.setCurrentSearchEntryLibrary()},Sidebar.prototype.addAdvancedPalette=function(t){this.setCurrentSearchEntryLibrary("general","advanced"),this.addPaletteFunctions("advanced",mxResources.get("advanced"),null!=t&&t,this.createAdvancedShapes()),this.setCurrentSearchEntryLibrary()},Sidebar.prototype.addBasicPalette=function(t){this.setCurrentSearchEntryLibrary("basic"),this.addStencilPalette("basic",mxResources.get("basic"),t+"/basic.xml",";whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#000000;strokeWidth=2",null,null,null,null,[this.createVertexTemplateEntry("shape=partialRectangle;whiteSpace=wrap;html=1;top=0;bottom=0;fillColor=none;",120,60,"","Partial Rectangle"),this.createVertexTemplateEntry("shape=partialRectangle;whiteSpace=wrap;html=1;right=0;top=0;bottom=0;fillColor=none;routingCenterX=-0.5;",120,60,"","Partial Rectangle"),this.createVertexTemplateEntry("shape=partialRectangle;whiteSpace=wrap;html=1;bottom=0;right=0;fillColor=none;",120,60,"","Partial Rectangle"),this.createVertexTemplateEntry("shape=partialRectangle;whiteSpace=wrap;html=1;top=0;left=0;fillColor=none;",120,60,"","Partial Rectangle")]),this.setCurrentSearchEntryLibrary()},Sidebar.prototype.createAdvancedShapes=function(){var e=this,n=new mxCell("List Item",new mxGeometry(0,0,60,26),"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");return n.vertex=!0,[this.createVertexTemplateEntry("shape=tapeData;whiteSpace=wrap;html=1;perimeter=ellipsePerimeter;",80,80,"","Tape Data"),this.createVertexTemplateEntry("shape=manualInput;whiteSpace=wrap;html=1;",80,80,"","Manual Input"),this.createVertexTemplateEntry("shape=loopLimit;whiteSpace=wrap;html=1;",100,80,"","Loop Limit"),this.createVertexTemplateEntry("shape=offPageConnector;whiteSpace=wrap;html=1;",80,80,"","Off Page Connector"),this.createVertexTemplateEntry("shape=delay;whiteSpace=wrap;html=1;",80,40,"","Delay"),this.createVertexTemplateEntry("shape=display;whiteSpace=wrap;html=1;",80,40,"","Display"),this.createVertexTemplateEntry("shape=singleArrow;direction=west;whiteSpace=wrap;html=1;",100,60,"","Arrow Left"),this.createVertexTemplateEntry("shape=singleArrow;whiteSpace=wrap;html=1;",100,60,"","Arrow Right"),this.createVertexTemplateEntry("shape=singleArrow;direction=north;whiteSpace=wrap;html=1;",60,100,"","Arrow Up"),this.createVertexTemplateEntry("shape=singleArrow;direction=south;whiteSpace=wrap;html=1;",60,100,"","Arrow Down"),this.createVertexTemplateEntry("shape=doubleArrow;whiteSpace=wrap;html=1;",100,60,"","Double Arrow"),this.createVertexTemplateEntry("shape=doubleArrow;direction=south;whiteSpace=wrap;html=1;",60,100,"","Double Arrow Vertical",null,null,"double arrow"),this.createVertexTemplateEntry("shape=actor;whiteSpace=wrap;html=1;",40,60,"","User",null,null,"user person human"),this.createVertexTemplateEntry("shape=cross;whiteSpace=wrap;html=1;",80,80,"","Cross"),this.createVertexTemplateEntry("shape=corner;whiteSpace=wrap;html=1;",80,80,"","Corner"),this.createVertexTemplateEntry("shape=tee;whiteSpace=wrap;html=1;",80,80,"","Tee"),this.createVertexTemplateEntry("shape=datastore;whiteSpace=wrap;html=1;",60,60,"","Data Store",null,null,"data store cylinder database"),this.createVertexTemplateEntry("shape=orEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;",80,80,"","Or",null,null,"or circle oval ellipse"),this.createVertexTemplateEntry("shape=sumEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;",80,80,"","Sum",null,null,"sum circle oval ellipse"),this.createVertexTemplateEntry("shape=lineEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;",80,80,"","Ellipse with horizontal divider",null,null,"circle oval ellipse"),this.createVertexTemplateEntry("shape=lineEllipse;line=vertical;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;",80,80,"","Ellipse with vertical divider",null,null,"circle oval ellipse"),this.createVertexTemplateEntry("shape=sortShape;perimeter=rhombusPerimeter;whiteSpace=wrap;html=1;",80,80,"","Sort",null,null,"sort"),this.createVertexTemplateEntry("shape=collate;whiteSpace=wrap;html=1;",80,80,"","Collate",null,null,"collate"),this.createVertexTemplateEntry("shape=switch;whiteSpace=wrap;html=1;",60,60,"","Switch",null,null,"switch router"),this.addEntry("process bar",function(){return e.createVertexTemplateFromData("zZXRaoMwFIafJpcDjbNrb2233rRQ8AkyPdPQaCRJV+3T7yTG2rUVBoOtgpDzn/xJzncCIdGyateKNeVW5iBI9EqipZLS9KOqXYIQhAY8J9GKUBrgT+jbRDZ02aBhCmrzEwPtDZ9MHKBXdkpmoDWKCVN9VptO+Kw+8kqwGqMkK7nIN6yTB7uTNizbD1FSSsVPsjYMC1qFKHxwIZZSSIVxLZ1/nJNar5+oQPMT7IYCrqUta1ENzuqGaeOFTArBGs3f3Vmtoo2Se7ja1h00kSoHK4bBIKUNy3hdoPYU0mF91i9mT8EEL2ocZ3gKa00ayWujLZY4IfHKFonVDLsRGgXuQ90zBmWgneyTk3yT1iArMKrDKUeem9L3ajHrbSXwohxsQd/ggOleKM7ese048J2/fwuim1uQGmhQCW8vQMkacP3GCQgBFMftHEsr7cYYe95CnmKTPMFbYD8CQ++DGQy+/M5X4ku5wHYmdIktfvk9tecpavThqS3m/0YtnqIWPTy1cD77K2wYjo+Ay317I74A",296,100,"Process Bar")}),this.createVertexTemplateEntry("swimlane;",200,200,"Container","Container",null,null,"container swimlane lane pool group"),this.addEntry("list group erd table",function(){var t=new mxCell("List",new mxGeometry(0,0,140,110),"swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;");return t.vertex=!0,t.insert(e.cloneCell(n,"Item 1")),t.insert(e.cloneCell(n,"Item 2")),t.insert(e.cloneCell(n,"Item 3")),e.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"List")}),this.addEntry("list item entry value group erd table",function(){return e.createVertexTemplateFromCells([e.cloneCell(n,"List Item")],n.geometry.width,n.geometry.height,"List Item")})]},Sidebar.prototype.addUmlPalette=function(t){var s=this,e=new mxCell("+ field: type",new mxGeometry(0,0,100,26),"text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");e.vertex=!0;var i=new mxCell("",new mxGeometry(0,0,40,8),"line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;");i.vertex=!0;var n="uml static class ";this.setCurrentSearchEntryLibrary("uml");n=[this.createVertexTemplateEntry("html=1;",110,50,"Object","Object",null,null,n+"object instance"),this.createVertexTemplateEntry("html=1;",110,50,"«interface»
Name","Interface",null,null,n+"interface object instance annotated annotation"),this.addEntry(n+"object instance",function(){var t=new mxCell("Classname",new mxGeometry(0,0,160,90),"swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;");return t.vertex=!0,t.insert(e.clone()),t.insert(i.clone()),t.insert(s.cloneCell(e,"+ method(type): type")),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Class")}),this.addEntry(n+"section subsection",function(){var t=new mxCell("Classname",new mxGeometry(0,0,140,110),"swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;");return t.vertex=!0,t.insert(e.clone()),t.insert(e.clone()),t.insert(e.clone()),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Class 2")}),this.addEntry(n+"item member method function variable field attribute label",function(){return s.createVertexTemplateFromCells([s.cloneCell(e,"+ item: attribute")],e.geometry.width,e.geometry.height,"Item 1")}),this.addEntry(n+"item member method function variable field attribute label",function(){var t=new mxCell("item: attribute",new mxGeometry(0,0,120,e.geometry.height),"label;fontStyle=0;strokeColor=none;fillColor=none;align=left;verticalAlign=top;overflow=hidden;spacingLeft=28;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;imageWidth=16;imageHeight=16;image="+s.gearImage);return t.vertex=!0,s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Item 2")}),this.addEntry(n+"divider hline line separator",function(){return s.createVertexTemplateFromCells([i.clone()],i.geometry.width,i.geometry.height,"Divider")}),this.addEntry(n+"spacer space gap separator",function(){var t=new mxCell("",new mxGeometry(0,0,20,14),"text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=4;spacingRight=4;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;");return t.vertex=!0,s.createVertexTemplateFromCells([t.clone()],t.geometry.width,t.geometry.height,"Spacer")}),this.createVertexTemplateEntry("text;align=center;fontStyle=1;verticalAlign=middle;spacingLeft=3;spacingRight=3;strokeColor=none;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;",80,26,"Title","Title",null,null,n+"title label"),this.addEntry(n+"component",function(){var t=new mxCell("«Annotation»
Component",new mxGeometry(0,0,180,90),"html=1;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(1,0,20,20),"shape=module;jettyWidth=8;jettyHeight=4;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(-27,7),t.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Component")}),this.addEntry(n+"component",function(){var t=new mxCell('

Component


+ Attribute1: Type
+ Attribute2: Type

',new mxGeometry(0,0,180,90),"align=left;overflow=fill;html=1;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(1,0,20,20),"shape=component;jettyWidth=8;jettyHeight=4;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(-24,4),t.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Component with Attributes")}),this.createVertexTemplateEntry("verticalAlign=top;align=left;spacingTop=8;spacingLeft=2;spacingRight=12;shape=cube;size=10;direction=south;fontStyle=4;html=1;",180,120,"Block","Block",null,null,n+"block"),this.createVertexTemplateEntry("shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;",100,50,"Module","Module",null,null,n+"module component"),this.createVertexTemplateEntry("shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;",70,50,"package","Package",null,null,n+"package"),this.createVertexTemplateEntry("verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;",160,90,'

Object:Type


field1 = value1
field2 = value2
field3 = value3

',"Object",null,null,n+"object instance"),this.createVertexTemplateEntry("verticalAlign=top;align=left;overflow=fill;html=1;",180,90,'
Tablename
PKuniqueId
FK1foreignKey
fieldname
',"Entity",null,null,"er entity table"),this.addEntry(n+"object instance",function(){var t=new mxCell('

Class


',new mxGeometry(0,0,140,60),"verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;");return t.vertex=!0,s.createVertexTemplateFromCells([t.clone()],t.geometry.width,t.geometry.height,"Class 3")}),this.addEntry(n+"object instance",function(){var t=new mxCell('

Class



',new mxGeometry(0,0,140,60),"verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;");return t.vertex=!0,s.createVertexTemplateFromCells([t.clone()],t.geometry.width,t.geometry.height,"Class 4")}),this.addEntry(n+"object instance",function(){var t=new mxCell('

Class


+ field: Type


+ method(): Type

',new mxGeometry(0,0,160,90),"verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;");return t.vertex=!0,s.createVertexTemplateFromCells([t.clone()],t.geometry.width,t.geometry.height,"Class 5")}),this.addEntry(n+"object instance",function(){var t=new mxCell('

<<Interface>>
Interface


+ field1: Type
+ field2: Type


+ method1(Type): Type
+ method2(Type, Type): Type

',new mxGeometry(0,0,190,140),"verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;");return t.vertex=!0,s.createVertexTemplateFromCells([t.clone()],t.geometry.width,t.geometry.height,"Interface 2")}),this.createVertexTemplateEntry("shape=providedRequiredInterface;html=1;verticalLabelPosition=bottom;",20,20,"","Provided/Required Interface",null,null,"uml provided required interface lollipop notation"),this.createVertexTemplateEntry("shape=requiredInterface;html=1;verticalLabelPosition=bottom;",10,20,"","Required Interface",null,null,"uml required interface lollipop notation"),this.addEntry("uml lollipop notation provided required interface",function(){return s.createVertexTemplateFromData("zVTBrptADPyavVYEkt4b0uQd3pMq5dD2uAUD27dgZJwE8vX1spsQlETtpVWRIjFjex3PmFVJWvc70m31hjlYlXxWSUqI7N/qPgVrVRyZXCUbFceR/FS8fRJdjNGo1QQN/0lB7AuO2h7AM57oeLCBIDw0Obj8SCVrJK6wxEbbV8RWyIWQP4F52Juzq9AHRqEqrm2IQpN/IsKTwAYb8MzWWBuO9B0hL2E2BGsqIQyxvJ9rzApD7QBrYBokhcBqNsf5UbrzsLzmXUu/oJET42jwGat5QYcHyiDkTDLKy03TiRrFfSx08m+FrrQtUkOZvZdbFKThmwMfVhf4fQ43/W3uZriiPPT+KKhjwnf4anKuQv//wsg+NPJ7/9d9Xf7eVykwbeeMOFWGYd/qzEVO8tHP/Suw4a2ujXV/+gXsEdhkOgSC8os44BQt0tggicZHeG1N2QiXibhAV48epRayEDd8MT7Ct06TUaXVWq027tCuhcx5VZjebeeaoDNn/WMcb/p+j0AM/dNr6InLl4Lgzylsk6OCgRWYsuI592gNZh5OhgmcblPv7+1l+ws=",40,10,"Lollipop Notation")}),this.createVertexTemplateEntry("shape=umlBoundary;whiteSpace=wrap;html=1;",100,80,"Boundary Object","Boundary Object",null,null,"uml boundary object"),this.createVertexTemplateEntry("ellipse;shape=umlEntity;whiteSpace=wrap;html=1;",80,80,"Entity Object","Entity Object",null,null,"uml entity object"),this.createVertexTemplateEntry("ellipse;shape=umlControl;whiteSpace=wrap;html=1;",70,80,"Control Object","Control Object",null,null,"uml control object"),this.createVertexTemplateEntry("shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;",30,60,"Actor","Actor",!1,null,"uml actor"),this.createVertexTemplateEntry("ellipse;whiteSpace=wrap;html=1;",140,70,"Use Case","Use Case",null,null,"uml use case usecase"),this.addEntry("uml activity state start",function(){var t=new mxCell("",new mxGeometry(0,0,30,30),"ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;");t.vertex=!0;var e=new mxCell("",new mxGeometry(0,0,0,0),"edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;");return e.geometry.setTerminalPoint(new mxPoint(15,90),!1),e.geometry.relative=!0,e.edge=!0,t.insertEdge(e,!0),s.createVertexTemplateFromCells([t,e],30,90,"Start")}),this.addEntry("uml activity state",function(){var t=new mxCell("Activity",new mxGeometry(0,0,120,40),"rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;");t.vertex=!0;var e=new mxCell("",new mxGeometry(0,0,0,0),"edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;");return e.geometry.setTerminalPoint(new mxPoint(60,100),!1),e.geometry.relative=!0,e.edge=!0,t.insertEdge(e,!0),s.createVertexTemplateFromCells([t,e],120,100,"Activity")}),this.addEntry("uml activity composite state",function(){var t=new mxCell("Composite State",new mxGeometry(0,0,160,60),"swimlane;html=1;fontStyle=1;align=center;verticalAlign=middle;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=0;resizeLast=1;container=0;fontColor=#000000;collapsible=0;rounded=1;arcSize=30;strokeColor=#ff0000;fillColor=#ffffc0;swimlaneFillColor=#ffffc0;dropTarget=0;");t.vertex=!0;var e=new mxCell("Subtitle",new mxGeometry(0,0,200,26),"text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;whiteSpace=wrap;overflow=hidden;rotatable=0;fontColor=#000000;");e.vertex=!0,t.insert(e);e=new mxCell("",new mxGeometry(0,0,0,0),"edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;");return e.geometry.setTerminalPoint(new mxPoint(80,120),!1),e.geometry.relative=!0,e.edge=!0,t.insertEdge(e,!0),s.createVertexTemplateFromCells([t,e],160,120,"Composite State")}),this.addEntry("uml activity condition",function(){var t=new mxCell("Condition",new mxGeometry(0,0,80,40),"rhombus;whiteSpace=wrap;html=1;fillColor=#ffffc0;strokeColor=#ff0000;");t.vertex=!0;var e=new mxCell("no",new mxGeometry(0,0,0,0),"edgeStyle=orthogonalEdgeStyle;html=1;align=left;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;");e.geometry.setTerminalPoint(new mxPoint(180,20),!1),e.geometry.relative=!0,e.geometry.x=-1,e.edge=!0,t.insertEdge(e,!0);var n=new mxCell("yes",new mxGeometry(0,0,0,0),"edgeStyle=orthogonalEdgeStyle;html=1;align=left;verticalAlign=top;endArrow=open;endSize=8;strokeColor=#ff0000;");return n.geometry.setTerminalPoint(new mxPoint(40,100),!1),n.geometry.relative=!0,n.geometry.x=-1,n.edge=!0,t.insertEdge(n,!0),s.createVertexTemplateFromCells([t,e,n],180,100,"Condition")}),this.addEntry("uml activity fork join",function(){var t=new mxCell("",new mxGeometry(0,0,200,10),"shape=line;html=1;strokeWidth=6;strokeColor=#ff0000;");t.vertex=!0;var e=new mxCell("",new mxGeometry(0,0,0,0),"edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;");return e.geometry.setTerminalPoint(new mxPoint(100,80),!1),e.geometry.relative=!0,e.edge=!0,t.insertEdge(e,!0),s.createVertexTemplateFromCells([t,e],200,80,"Fork/Join")}),this.createVertexTemplateEntry("ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#ff0000;",30,30,"","End",null,null,"uml activity state end"),this.createVertexTemplateEntry("shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;outlineConnect=0;",100,300,":Object","Lifeline",null,null,"uml sequence participant lifeline"),this.createVertexTemplateEntry("shape=umlLifeline;participant=umlActor;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;outlineConnect=0;",20,300,"","Actor Lifeline",null,null,"uml sequence participant lifeline actor"),this.createVertexTemplateEntry("shape=umlLifeline;participant=umlBoundary;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;outlineConnect=0;",50,300,"","Boundary Lifeline",null,null,"uml sequence participant lifeline boundary"),this.createVertexTemplateEntry("shape=umlLifeline;participant=umlEntity;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;outlineConnect=0;",40,300,"","Entity Lifeline",null,null,"uml sequence participant lifeline entity"),this.createVertexTemplateEntry("shape=umlLifeline;participant=umlControl;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;verticalAlign=top;spacingTop=36;outlineConnect=0;",40,300,"","Control Lifeline",null,null,"uml sequence participant lifeline control"),this.createVertexTemplateEntry("shape=umlFrame;whiteSpace=wrap;html=1;",300,200,"frame","Frame",null,null,"uml sequence frame"),this.createVertexTemplateEntry("shape=umlDestroy;whiteSpace=wrap;html=1;strokeWidth=3;",30,30,"","Destruction",null,null,"uml sequence destruction destroy"),this.addEntry("uml sequence invoke invocation call activation",function(){var t=new mxCell("",new mxGeometry(0,0,10,80),"html=1;points=[];perimeter=orthogonalPerimeter;");t.vertex=!0;var e=new mxCell("dispatch",new mxGeometry(0,0,0,0),"html=1;verticalAlign=bottom;startArrow=oval;endArrow=block;startSize=8;");return e.geometry.setTerminalPoint(new mxPoint(-60,0),!0),e.geometry.relative=!0,e.edge=!0,t.insertEdge(e,!1),s.createVertexTemplateFromCells([t,e],10,80,"Found Message")}),this.addEntry("uml sequence invoke call delegation synchronous invocation activation",function(){var t=new mxCell("",new mxGeometry(0,0,10,80),"html=1;points=[];perimeter=orthogonalPerimeter;");t.vertex=!0;var e=new mxCell("dispatch",new mxGeometry(0,0,0,0),"html=1;verticalAlign=bottom;endArrow=block;entryX=0;entryY=0;");e.geometry.setTerminalPoint(new mxPoint(-70,0),!0),e.geometry.relative=!0,e.edge=!0,t.insertEdge(e,!1);var n=new mxCell("return",new mxGeometry(0,0,0,0),"html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;exitX=0;exitY=0.95;");return n.geometry.setTerminalPoint(new mxPoint(-70,76),!1),n.geometry.relative=!0,n.edge=!0,t.insertEdge(n,!0),s.createVertexTemplateFromCells([t,e,n],10,80,"Synchronous Invocation")}),this.addEntry("uml sequence self call recursion delegation activation",function(){var t=new mxCell("",new mxGeometry(0,20,10,40),"html=1;points=[];perimeter=orthogonalPerimeter;");t.vertex=!0;var e=new mxCell("self call",new mxGeometry(0,0,0,0),"edgeStyle=orthogonalEdgeStyle;html=1;align=left;spacingLeft=2;endArrow=block;rounded=0;entryX=1;entryY=0;");return e.geometry.setTerminalPoint(new mxPoint(5,0),!0),e.geometry.points=[new mxPoint(30,0)],e.geometry.relative=!0,e.edge=!0,t.insertEdge(e,!1),s.createVertexTemplateFromCells([t,e],10,60,"Self Call")}),this.addEntry("uml sequence invoke call delegation callback activation",function(){return s.createVertexTemplateFromData("xZRNT8MwDIZ/Ta6oaymD47rBTkiTuMAxW6wmIm0q19s6fj1OE3V0Y2iCA4dK8euP2I+riGxedUuUjX52CqzIHkU2R+conKpuDtaKNDFKZAuRpgl/In264J303qSRCDVdk5CGhJ20WwhKEFo62ChoqritxURkReNMTa2X80LkC68AmgoIkEWHpF3pamlXR7WIFwASdBeb7KXY4RIc5+KBQ/ZGkY4RYY5Egyl1zLqLmmyDXQ6Zx4n5EIf+HkB2BmAjrV3LzftPIPw4hgNn1pQ1a2tH5Cp2QK1miG7vNeu4iJe4pdeY2BtvbCQDGlAljMCQxBJotJ8rWCFYSWY3LvUdmZi68rvkkLiU6QnL1m1xAzHoBOdw61WEb88II9AW67/ydQ2wq1Cy1aAGvOrFfPh6997qDA3g+dxzv3nIL6MPU/8T+kMw8+m4QPgdfrEJNo8PSQj/+s58Ag==",10,60,"Callback")}),this.createVertexTemplateEntry("html=1;points=[];perimeter=orthogonalPerimeter;",10,80,"","Activation",null,null,"uml sequence activation"),this.createVertexTemplateEntry("shape=partialRectangle;html=1;top=1;align=left;dashed=1;",200,20,"Template1 signature","Template signature",null,null,"template signature"),this.createVertexTemplateEntry("shape=partialRectangle;html=1;top=1;align=left;dashed=1;",200,50,"Template parameter 1\nTemplate parameter 2","Template signature",null,null,"template signature"),this.createVertexTemplateEntry("shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;",120,60,"Comment1 body","Note",null,null,"uml note"),this.addEntry("uml sequence self call recursion delegation activation",function(){var t=new mxCell("Constraint1 specification",new mxGeometry(0,0,160,60),"shape=note2;boundedLbl=1;whiteSpace=wrap;html=1;size=25;verticalAlign=top;align=center;");t.vertex=!0;var e=new mxCell("<>",new mxGeometry(0,0,t.geometry.width,25),"resizeWidth=1;part=1;strokeColor=none;fillColor=none;align=left;spacingLeft=5;");return e.geometry.relative=!0,e.vertex=!0,t.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Note")}),this.addEntry(n+"classifier",function(){var t=new mxCell("<<keyword>>
Classifier1
{abstract}",new mxGeometry(0,0,140,183),"swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=55;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;");t.vertex=!0;var e=new mxCell("attributes",new mxGeometry(0,0,140,20),"text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");e.vertex=!0,t.insert(e);e=new mxCell("attribute1",new mxGeometry(0,0,140,20),"text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");e.vertex=!0,t.insert(e);e=new mxCell("inherited attribute2",new mxGeometry(0,0,140,20),"text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontColor=#808080;");e.vertex=!0,t.insert(e);e=new mxCell("...",new mxGeometry(0,0,140,20),"text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");e.vertex=!0,t.insert(e),t.insert(i.clone());e=new mxCell("operations",new mxGeometry(0,0,140,20),"text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");e.vertex=!0,t.insert(e);e=new mxCell("operation1",new mxGeometry(0,0,140,20),"text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");return e.vertex=!0,t.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Classifier")}),this.createVertexTemplateEntry("shape=process;fixedSize=1;size=5;fontStyle=1;",140,40,"Classifier1","Classifier",null,null,"classifier"),this.addEntry(n+"classifier",function(){var t=new mxCell("Classifier1",new mxGeometry(0,0,140,183),"swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;");t.vertex=!0;var e=new mxCell("internal structure",new mxGeometry(0,0,140,30),"html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];resizeWidth=1;");e.vertex=!0,t.insert(e);var n=new mxCell("",new mxGeometry(0,0,140,140),"strokeColor=none;fillColor=none;");n.vertex=!0,t.insert(n);var i=new mxCell("property1",new mxGeometry(0,0,100,30),"html=1;align=center;verticalAlign=middle;rotatable=0;");i.geometry.relative=!0,i.geometry.offset=new mxPoint(20,20),i.vertex=!0,n.insert(i);var l=new mxCell("property2",new mxGeometry(0,0,100,30),"html=1;align=center;verticalAlign=middle;rotatable=0;");l.geometry.relative=!0,l.geometry.offset=new mxPoint(20,90),l.vertex=!0,n.insert(l);e=new mxCell("connector1",new mxGeometry(0,0,0,0),"edgeStyle=none;endArrow=none;verticalAlign=middle;labelBackgroundColor=none;endSize=12;html=1;align=left;endFill=0;exitX=0.15;exitY=1;entryX=0.15;entryY=0;spacingLeft=4;");return e.geometry.relative=!0,e.edge=!0,i.insertEdge(e,!0),l.insertEdge(e,!1),n.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Classifier")}),this.createVertexTemplateEntry("fontStyle=1;",140,30,"Association1","Association",null,null,"association"),this.addEntry(n+"classifier",function(){var t=new mxCell("Instance1",new mxGeometry(0,0,140,138),"swimlane;fontStyle=4;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;");t.vertex=!0;var e=new mxCell("slot1",new mxGeometry(0,0,140,30),"html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];resizeWidth=1;");e.vertex=!0,t.insert(e),t.insert(i.clone());var n=new mxCell("internal structure",new mxGeometry(0,0,140,20),"html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];resizeWidth=1;");n.vertex=!0,t.insert(n);e=new mxCell("",new mxGeometry(0,0,140,50),"strokeColor=none;fillColor=none;");e.vertex=!0,t.insert(e);n=new mxCell("instance2",new mxGeometry(0,0,80,30),"html=1;align=center;verticalAlign=middle;rotatable=0;");return n.geometry.relative=!0,n.geometry.offset=new mxPoint(30,10),n.vertex=!0,e.insert(n),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Classifier")}),this.createVertexTemplateEntry("fontStyle=0;",120,40,"Instance1 value","Instance",null,null,"instance"),this.addEntry(n+"classifier",function(){var t=new mxCell("<<enumeration>>
Enum1",new mxGeometry(0,0,140,70),"swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;");t.vertex=!0;var e=new mxCell("literal1",new mxGeometry(0,0,140,30),"text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");return e.vertex=!0,t.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Classifier")}),this.addEntry(n+"classifier",function(){var t=new mxCell("0..1",new mxGeometry(0,0,120,50),"align=right;verticalAlign=top;spacingRight=2;");t.vertex=!0;var e=new mxCell("Property1",new mxGeometry(0,1,120,30),"text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;resizeWidth=1;");return e.geometry.relative=!0,e.geometry.offset=new mxPoint(0,-30),e.vertex=!0,t.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Classifier")}),this.createVertexTemplateEntry("fontStyle=0;dashed=1;",140,30,"Property1","Property",null,null,"property"),this.createVertexTemplateEntry("fontStyle=0;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=2;",30,30,"port1","Port",null,null,"port"),this.addEntry(n+"component",function(){var t=new mxCell("",new mxGeometry(0,0,140,200),"fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;marginBottom=0;");t.vertex=!0;var e=new mxCell("Component",new mxGeometry(0,0,140,40),"html=1;align=left;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;");e.vertex=!0,t.insert(e);var n=new mxCell("",new mxGeometry(1,0,16,20),"shape=module;jettyWidth=10;jettyHeight=4;");n.vertex=!0,n.geometry.relative=!0,n.geometry.offset=new mxPoint(-25,9),e.insert(n),t.insert(i.clone());n=new mxCell("provided interfaces",new mxGeometry(0,0,140,25),"html=1;align=center;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;");n.vertex=!0,t.insert(n);n=new mxCell("Interface1",new mxGeometry(0,0,140,25),"html=1;align=left;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;");n.vertex=!0,t.insert(n),t.insert(i.clone());n=new mxCell("required interfaces",new mxGeometry(0,0,140,25),"html=1;align=center;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;");n.vertex=!0,t.insert(n);n=new mxCell("Interface2",new mxGeometry(0,0,140,30),"html=1;align=left;spacingLeft=4;verticalAlign=top;strokeColor=none;fillColor=none;");return n.vertex=!0,t.insert(n),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Component")}),this.addEntry(n+"classifier",function(){var t=new mxCell("",new mxGeometry(0,0,270,230),"shape=ellipse;container=1;horizontal=1;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;html=1;dashed=1;collapsible=0;");t.vertex=!0;var e=new mxCell("Collaboration1",new mxGeometry(0,0,270,30),"html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;rotatable=0;points=[[0,0.5],[1,0.5]];resizeWidth=1;");e.vertex=!0,t.insert(e);var n=new mxCell("",new mxGeometry(.145,0,192,8),"line;strokeWidth=1;fillColor=none;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;dashed=1;resizeWidth=1;");n.geometry.relative=!0,n.geometry.offset=new mxPoint(0,30),n.vertex=!0,t.insert(n);var i=new mxCell("Classifier1",new mxGeometry(0,0,100,30),"html=1;align=center;verticalAlign=middle;rotatable=0;");i.geometry.relative=!0,i.geometry.offset=new mxPoint(85,50),i.vertex=!0,t.insert(i);e=new mxCell("Collaboration use 1",new mxGeometry(0,0,140,30),"shape=ellipse;html=1;align=center;verticalAlign=middle;rotatable=0;dashed=1;");e.geometry.relative=!0,e.geometry.offset=new mxPoint(65,110),e.vertex=!0,t.insert(e);n=new mxCell("property1",new mxGeometry(0,0,0,0),"edgeStyle=none;endArrow=none;verticalAlign=middle;labelBackgroundColor=none;endSize=12;html=1;align=left;endFill=0;spacingLeft=4;");n.geometry.relative=!0,n.edge=!0,i.insertEdge(n,!0),e.insertEdge(n,!1),t.insert(n);i=new mxCell("Classifier2",new mxGeometry(0,0,100,30),"html=1;align=center;verticalAlign=middle;rotatable=0;");i.geometry.relative=!0,i.geometry.offset=new mxPoint(85,170),i.vertex=!0,t.insert(i);n=new mxCell("property1",new mxGeometry(0,0,0,0),"edgeStyle=none;endArrow=none;verticalAlign=middle;labelBackgroundColor=none;endSize=12;html=1;align=left;endFill=0;spacingLeft=4;");return n.geometry.relative=!0,n.edge=!0,e.insertEdge(n,!0),i.insertEdge(n,!1),t.insert(n),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Classifier")}),this.createVertexTemplateEntry("shape=folder;fontStyle=1;tabWidth=80;tabHeight=30;tabPosition=left;html=1;boundedLbl=1;",150,80,"Package1","Package",null,null,n+"package"),this.addEntry(n+"package",function(){var t=new mxCell("Package1",new mxGeometry(0,0,150,100),"shape=folder;fontStyle=1;tabWidth=110;tabHeight=30;tabPosition=left;html=1;boundedLbl=1;labelInHeader=1;");t.vertex=!0;var e=new mxCell("Packaged element1",new mxGeometry(0,0,110,30),"html=1;");return e.geometry.relative=!0,e.geometry.offset=new mxPoint(20,50),e.vertex=!0,t.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Classifier")}),this.addEntry(n+"package",function(){var t=new mxCell("Model1",new mxGeometry(0,0,150,80),"shape=folder;fontStyle=1;tabWidth=110;tabHeight=30;tabPosition=left;html=1;boundedLbl=1;folderSymbol=triangle;");return t.vertex=!0,s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Package")}),this.addEntry(n+"stereotype",function(){var t=new mxCell("",new mxGeometry(0,0,160,75),"shape=note2;size=25;childLayout=stackLayout;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;container=1;");t.vertex=!0;var e=new mxCell("<<stereotype1>>",new mxGeometry(0,0,160,25),"text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");e.vertex=!0,t.insert(e);e=new mxCell("stereotype property 1",new mxGeometry(0,0,160,25),"text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");e.vertex=!0,t.insert(e);e=new mxCell("stereotype property 2",new mxGeometry(0,0,160,25),"text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");return e.vertex=!0,t.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Stereotype")}),this.addEntry(n+"class",function(){var t=new mxCell("Class1",new mxGeometry(0,0,140,79),"swimlane;fontStyle=1;align=center;verticalAlign=middle;childLayout=stackLayout;horizontal=1;startSize=29;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;");t.vertex=!0;var e=new mxCell("<<stereotype1>>",new mxGeometry(0,0,140,25),"text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");e.vertex=!0,t.insert(e);e=new mxCell("stereotype property 1",new mxGeometry(0,0,140,25),"text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;");return e.vertex=!0,t.insert(e),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Class")}),this.createVertexTemplateEntry("text;html=1;align=center;",200,25,"<<stereotype1, stereotype2...>>","Label",null,null,n+"label"),this.createVertexTemplateEntry("ellipse;",50,25,"icon","Icon",null,null,n+"icon"),this.addEntry(n+"region",function(){var t=new mxCell("",new mxGeometry(60,0,10,100),"line;strokeWidth=1;direction=south;html=1;dashed=1;dashPattern=20 20;");t.vertex=!0;var e=new mxCell("Region 1",new mxGeometry(0,40,60,20),"text;align=right;");e.vertex=!0;var n=new mxCell("Region 2",new mxGeometry(70,40,60,20),"text;align=left;");return n.vertex=!0,s.createVertexTemplateFromCells([t,e,n],130,t.geometry.height,"Region")}),this.addEntry(n+"State",function(){var t=new mxCell("State1
[invariant1]
<<extended/final>>",new mxGeometry(0,0,140,176),"swimlane;fontStyle=4;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=60;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;html=1;rounded=1;absoluteArcSize=1;arcSize=50;");t.vertex=!0;var e=new mxCell("",new mxGeometry(0,0,140,50),"fillColor=none;strokeColor=none;container=1;collapsible=0;");e.vertex=!0,t.insert(e);var n=new mxCell("State2",new mxGeometry(30,10,80,30),"html=1;align=center;verticalAlign=middle;rounded=1;absoluteArcSize=1;arcSize=10;");n.vertex=!0,e.insert(n),t.insert(i.clone());n=new mxCell("behavior1",new mxGeometry(0,0,140,25),"fillColor=none;strokeColor=none;align=left;verticalAlign=middle;spacingLeft=5;");n.vertex=!0,t.insert(n),t.insert(i.clone());n=new mxCell("transition1",new mxGeometry(0,0,140,25),"fillColor=none;strokeColor=none;align=left;verticalAlign=middle;spacingLeft=5;");return n.vertex=!0,t.insert(n),s.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"State")}),this.createVertexTemplateEntry("html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=1;",140,40,"State1","State",null,null,n+"state"),this.createVertexTemplateEntry("html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;",140,40,"State","State",null,null,n+"state"),this.createVertexTemplateEntry("shape=folder;align=center;verticalAlign=middle;fontStyle=0;tabWidth=100;tabHeight=30;tabPosition=left;html=1;boundedLbl=1;labelInHeader=1;rounded=1;absoluteArcSize=1;arcSize=10;",140,90,"State1","State",null,null,n+"state"),this.createVertexTemplateEntry("html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;",140,40,"State1, State2, ...","State",null,null,n+"state"),this.createVertexTemplateEntry("shape=umlState;rounded=1;verticalAlign=top;spacingTop=5;umlStateSymbol=collapseState;absoluteArcSize=1;arcSize=10;",140,60,"State1","State",null,null,n+"state"),this.addEntry(n+"State",function(){var t=new mxCell("State1",new mxGeometry(40,0,140,50),"shape=umlState;rounded=1;verticalAlign=middle;align=center;absoluteArcSize=1;arcSize=10;umlStateConnection=connPointRefEntry;boundedLbl=1;");t.vertex=!0;var e=new mxCell("Entry1",new mxGeometry(0,40,50,20),"text;verticalAlign=middle;align=center;");return e.vertex=!0,t.insert(e),s.createVertexTemplateFromCells([t,e],180,60,"State")}),this.addEntry(n+"State",function(){var t=new mxCell("State1",new mxGeometry(40,0,140,50),"shape=umlState;rounded=1;verticalAlign=middle;spacingTop=0;absoluteArcSize=1;arcSize=10;umlStateConnection=connPointRefExit;boundedLbl=1;");t.vertex=!0;var e=new mxCell("Exit1",new mxGeometry(0,40,50,20),"text;verticalAlign=middle;align=center;");return e.vertex=!0,t.insert(e),s.createVertexTemplateFromCells([t,e],180,60,"State")}),this.createVertexTemplateEntry("ellipse;fillColor=#000000;strokeColor=none;",30,30,"","Initial state",null,null,n+"initial state"),this.createVertexTemplateEntry("ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#000000;",30,30,"","Final state",null,null,n+"final state"),this.createVertexTemplateEntry("ellipse;fillColor=#ffffff;strokeColor=#000000;",30,30,"H","Shallow History",null,null,n+"shallow history"),this.createVertexTemplateEntry("ellipse;fillColor=#ffffff;strokeColor=#000000;",30,30,"H*","Deep History",null,null,n+"deep history"),this.createVertexTemplateEntry("ellipse;fillColor=#ffffff;strokeColor=#000000;",30,30,"","Entry Point",null,null,n+"entry point"),this.createVertexTemplateEntry("shape=sumEllipse;perimeter=ellipsePerimeter;whiteSpace=wrap;html=1;backgroundOutline=1;",30,30,"","Exit Point",null,null,n+"exit point"),this.createVertexTemplateEntry("ellipse;fillColor=#000000;strokeColor=none;",20,20,"","Junction",null,null,n+"junction"),this.createVertexTemplateEntry("rhombus;",30,30,"","Choice",null,null,n+"choice"),this.createVertexTemplateEntry("shape=umlDestroy;",30,30,"","Terminate",null,null,n+"terminate"),this.createVertexTemplateEntry("html=1;points=[];perimeter=orthogonalPerimeter;fillColor=#000000;strokeColor=none;",5,80,"","Join/Fork",null,null,n+"join fork"),this.createVertexTemplateEntry("text;align=center;verticalAlign=middle;dashed=0;fillColor=#ffffff;strokeColor=#000000;",140,40,"OpaqueAction1 spec.","Opaque Action",null,null,n+"opaque action"),this.createEdgeTemplateEntry("html=1;verticalAlign=bottom;startArrow=oval;startFill=1;endArrow=block;startSize=8;",60,0,"dispatch","Found Message 1",null,"uml sequence message call invoke dispatch"),this.createEdgeTemplateEntry("html=1;verticalAlign=bottom;startArrow=circle;startFill=1;endArrow=open;startSize=6;endSize=8;",80,0,"dispatch","Found Message 2",null,"uml sequence message call invoke dispatch"),this.createEdgeTemplateEntry("html=1;verticalAlign=bottom;endArrow=block;",80,0,"dispatch","Message",null,"uml sequence message call invoke dispatch"),this.addEntry("uml sequence return message",function(){var t=new mxCell("return",new mxGeometry(0,0,0,0),"html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;");return t.geometry.setTerminalPoint(new mxPoint(80,0),!0),t.geometry.setTerminalPoint(new mxPoint(0,0),!1),t.geometry.relative=!0,t.edge=!0,s.createEdgeTemplateFromCells([t],80,0,"Return")}),this.addEntry("uml relation",function(){var t=new mxCell("name",new mxGeometry(0,0,0,0),"endArrow=block;endFill=1;html=1;edgeStyle=orthogonalEdgeStyle;align=left;verticalAlign=top;");t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(160,0),!1),t.geometry.relative=!0,t.geometry.x=-1,t.edge=!0;var e=new mxCell("1",new mxGeometry(-1,0,0,0),"edgeLabel;resizable=0;html=1;align=left;verticalAlign=bottom;");return e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e),s.createEdgeTemplateFromCells([t],160,0,"Relation 1")}),this.addEntry("uml association",function(){var t=new mxCell("",new mxGeometry(0,0,0,0),"endArrow=none;html=1;edgeStyle=orthogonalEdgeStyle;");t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(160,0),!1),t.geometry.relative=!0,t.edge=!0;var e=new mxCell("parent",new mxGeometry(-1,0,0,0),"edgeLabel;resizable=0;html=1;align=left;verticalAlign=bottom;");e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e);e=new mxCell("child",new mxGeometry(1,0,0,0),"edgeLabel;resizable=0;html=1;align=right;verticalAlign=bottom;");return e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e),s.createEdgeTemplateFromCells([t],160,0,"Association 1")}),this.addEntry("uml aggregation",function(){var t=new mxCell("1",new mxGeometry(0,0,0,0),"endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;align=left;verticalAlign=bottom;");return t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(160,0),!1),t.geometry.relative=!0,t.geometry.x=-1,t.geometry.y=3,t.edge=!0,s.createEdgeTemplateFromCells([t],160,0,"Aggregation 1")}),this.addEntry("uml composition",function(){var t=new mxCell("1",new mxGeometry(0,0,0,0),"endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=1;edgeStyle=orthogonalEdgeStyle;align=left;verticalAlign=bottom;");return t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(160,0),!1),t.geometry.relative=!0,t.geometry.x=-1,t.geometry.y=3,t.edge=!0,s.createEdgeTemplateFromCells([t],160,0,"Composition 1")}),this.addEntry("uml relation",function(){var t=new mxCell("Relation",new mxGeometry(0,0,0,0),"endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;");t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(160,0),!1),t.geometry.relative=!0,t.edge=!0;var e=new mxCell("0..n",new mxGeometry(-1,0,0,0),"edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;");e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e);e=new mxCell("1",new mxGeometry(1,0,0,0),"edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;");return e.geometry.relative=!0,e.setConnectable(!1),e.vertex=!0,t.insert(e),s.createEdgeTemplateFromCells([t],160,0,"Relation 2")}),this.createEdgeTemplateEntry("endArrow=open;endSize=12;dashed=1;html=1;",160,0,"Use","Dependency",null,"uml dependency use"),this.createEdgeTemplateEntry("endArrow=block;endSize=16;endFill=0;html=1;",160,0,"Extends","Generalization",null,"uml generalization extend"),this.createEdgeTemplateEntry("endArrow=block;startArrow=block;endFill=1;startFill=1;html=1;",160,0,"","Association 2",null,"uml association"),this.createEdgeTemplateEntry("endArrow=open;startArrow=circlePlus;endFill=0;startFill=0;endSize=8;html=1;",160,0,"","Inner Class",null,"uml inner class"),this.createEdgeTemplateEntry("endArrow=open;startArrow=cross;endFill=0;startFill=0;endSize=8;startSize=10;html=1;",160,0,"","Terminate",null,"uml terminate"),this.createEdgeTemplateEntry("endArrow=block;dashed=1;endFill=0;endSize=12;html=1;",160,0,"","Implementation",null,"uml realization implementation"),this.createEdgeTemplateEntry("endArrow=diamondThin;endFill=0;endSize=24;html=1;",160,0,"","Aggregation 2",null,"uml aggregation"),this.createEdgeTemplateEntry("endArrow=diamondThin;endFill=1;endSize=24;html=1;",160,0,"","Composition 2",null,"uml composition"),this.createEdgeTemplateEntry("endArrow=open;endFill=1;endSize=12;html=1;",160,0,"","Association 3",null,"uml association")];this.addPaletteFunctions("uml",mxResources.get("uml"),t||!1,n),this.setCurrentSearchEntryLibrary()},Sidebar.prototype.addBpmnPalette=function(t,e){var n=this;this.setCurrentSearchEntryLibrary("bpmn");var i=[this.createVertexTemplateEntry("shape=ext;rounded=1;html=1;whiteSpace=wrap;",120,80,"Task","Process",null,null,"bpmn task process"),this.createVertexTemplateEntry("shape=ext;rounded=1;html=1;whiteSpace=wrap;double=1;",120,80,"Transaction","Transaction",null,null,"bpmn transaction"),this.createVertexTemplateEntry("shape=ext;rounded=1;html=1;whiteSpace=wrap;dashed=1;dashPattern=1 4;",120,80,"Event\nSub-Process","Event Sub-Process",null,null,"bpmn event subprocess sub process sub-process"),this.createVertexTemplateEntry("shape=ext;rounded=1;html=1;whiteSpace=wrap;strokeWidth=3;",120,80,"Call Activity","Call Activity",null,null,"bpmn call activity"),this.addEntry("bpmn subprocess sub process sub-process",function(){var t=new mxCell("Sub-Process",new mxGeometry(0,0,120,80),"html=1;whiteSpace=wrap;rounded=1;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(.5,1,14,14),"html=1;shape=plus;outlineConnect=0;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(-7,-14),t.insert(e),n.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Sub-Process")}),this.addEntry(this.getTagsForStencil("mxgraph.bpmn","loop","subprocess sub process sub-process looped").join(" "),function(){var t=new mxCell("Looped\nSub-Process",new mxGeometry(0,0,120,80),"html=1;whiteSpace=wrap;rounded=1;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(.5,1,14,14),"html=1;shape=mxgraph.bpmn.loop;outlineConnect=0;");e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(-15,-14),t.insert(e);e=new mxCell("",new mxGeometry(.5,1,14,14),"html=1;shape=plus;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(1,-14),t.insert(e),n.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Looped Sub-Process")}),this.addEntry("bpmn receive task",function(){var t=new mxCell("Receive",new mxGeometry(0,0,120,80),"html=1;whiteSpace=wrap;rounded=1;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(0,0,20,14),"html=1;shape=message;outlineConnect=0;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(7,7),t.insert(e),n.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Receive Task")}),this.addEntry(this.getTagsForStencil("mxgraph.bpmn","user_task").join(" "),function(){var t=new mxCell("User",new mxGeometry(0,0,120,80),"html=1;whiteSpace=wrap;rounded=1;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(0,0,14,14),"html=1;shape=mxgraph.bpmn.user_task;outlineConnect=0;");e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(7,7),t.insert(e);e=new mxCell("",new mxGeometry(.5,1,14,14),"html=1;shape=plus;outlineConnect=0;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(-7,-14),t.insert(e),n.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"User Task")}),this.addEntry(this.getTagsForStencil("mxgraph.bpmn","timer_start","attached").join(" "),function(){var t=new mxCell("Process",new mxGeometry(0,0,120,80),"html=1;whiteSpace=wrap;rounded=1;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(1,1,30,30),"shape=mxgraph.bpmn.timer_start;perimeter=ellipsePerimeter;html=1;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(-40,-15),t.insert(e),n.createVertexTemplateFromCells([t],120,95,"Attached Timer Event 1")}),this.addEntry(this.getTagsForStencil("mxgraph.bpmn","timer_start","attached").join(" "),function(){var t=new mxCell("Process",new mxGeometry(0,0,120,80),"html=1;whiteSpace=wrap;rounded=1;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(1,0,30,30),"shape=mxgraph.bpmn.timer_start;perimeter=ellipsePerimeter;html=1;labelPosition=right;align=left;outlineConnect=0;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(-15,10),t.insert(e),n.createVertexTemplateFromCells([t],135,80,"Attached Timer Event 2")}),this.createVertexTemplateEntry("swimlane;html=1;horizontal=0;startSize=20;",320,240,"Pool","Pool",null,null,"bpmn pool"),this.createVertexTemplateEntry("swimlane;html=1;horizontal=0;swimlaneLine=0;",300,120,"Lane","Lane",null,null,"bpmn lane"),this.createVertexTemplateEntry("shape=hexagon;html=1;whiteSpace=wrap;perimeter=hexagonPerimeter;rounded=0;",60,50,"","Conversation",null,null,"bpmn conversation"),this.createVertexTemplateEntry("shape=hexagon;html=1;whiteSpace=wrap;perimeter=hexagonPerimeter;strokeWidth=4;rounded=0;",60,50,"","Call Conversation",null,null,"bpmn call conversation"),this.addEntry("bpmn subconversation sub conversation sub-conversation",function(){var t=new mxCell("",new mxGeometry(0,0,60,50),"shape=hexagon;whiteSpace=wrap;html=1;perimeter=hexagonPerimeter;rounded=0;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(.5,1,14,14),"html=1;shape=plus;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(-7,-14),t.insert(e),n.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Sub-Conversation")}),this.addEntry("bpmn data object",function(){var t=new mxCell("",new mxGeometry(0,0,40,60),"shape=note;whiteSpace=wrap;size=16;html=1;dropTarget=0;");t.vertex=!0;var e=new mxCell("",new mxGeometry(0,0,14,14),"html=1;shape=singleArrow;arrowWidth=0.4;arrowSize=0.4;outlineConnect=0;");e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(2,2),t.insert(e);e=new mxCell("",new mxGeometry(.5,1,14,14),"html=1;whiteSpace=wrap;shape=parallelMarker;outlineConnect=0;");return e.vertex=!0,e.geometry.relative=!0,e.geometry.offset=new mxPoint(-7,-14),t.insert(e),n.createVertexTemplateFromCells([t],t.geometry.width,t.geometry.height,"Data Object")}),this.createVertexTemplateEntry("shape=datastore;whiteSpace=wrap;html=1;",60,60,"","Data Store",null,null,"bpmn data store"),this.createVertexTemplateEntry("shape=plus;html=1;outlineConnect=0;",14,14,"","Sub-Process Marker",null,null,"bpmn subprocess sub process sub-process marker"),this.createVertexTemplateEntry("shape=mxgraph.bpmn.loop;html=1;outlineConnect=0;",14,14,"","Loop Marker",null,null,"bpmn loop marker"),this.createVertexTemplateEntry("shape=parallelMarker;html=1;outlineConnect=0;",14,14,"","Parallel MI Marker",null,null,"bpmn parallel mi marker"),this.createVertexTemplateEntry("shape=parallelMarker;direction=south;html=1;outlineConnect=0;",14,14,"","Sequential MI Marker",null,null,"bpmn sequential mi marker"),this.createVertexTemplateEntry("shape=mxgraph.bpmn.ad_hoc;fillColor=#000000;html=1;outlineConnect=0;",14,14,"","Ad Hoc Marker",null,null,"bpmn ad hoc marker"),this.createVertexTemplateEntry("shape=mxgraph.bpmn.compensation;html=1;outlineConnect=0;",14,14,"","Compensation Marker",null,null,"bpmn compensation marker"),this.createVertexTemplateEntry("shape=message;whiteSpace=wrap;html=1;outlineConnect=0;fillColor=#000000;strokeColor=#ffffff;strokeWidth=2;",40,30,"","Send Task",null,null,"bpmn send task"),this.createVertexTemplateEntry("shape=message;whiteSpace=wrap;html=1;outlineConnect=0;",40,30,"","Receive Task",null,null,"bpmn receive task"),this.createVertexTemplateEntry("shape=mxgraph.bpmn.user_task;html=1;outlineConnect=0;",14,14,"","User Task",null,null,this.getTagsForStencil("mxgraph.bpmn","user_task").join(" ")),this.createVertexTemplateEntry("shape=mxgraph.bpmn.manual_task;html=1;outlineConnect=0;",14,14,"","Manual Task",null,null,this.getTagsForStencil("mxgraph.bpmn","user_task").join(" ")),this.createVertexTemplateEntry("shape=mxgraph.bpmn.business_rule_task;html=1;outlineConnect=0;",14,14,"","Business Rule Task",null,null,this.getTagsForStencil("mxgraph.bpmn","business_rule_task").join(" ")),this.createVertexTemplateEntry("shape=mxgraph.bpmn.service_task;html=1;outlineConnect=0;",14,14,"","Service Task",null,null,this.getTagsForStencil("mxgraph.bpmn","service_task").join(" ")),this.createVertexTemplateEntry("shape=mxgraph.bpmn.script_task;html=1;outlineConnect=0;",14,14,"","Script Task",null,null,this.getTagsForStencil("mxgraph.bpmn","script_task").join(" ")),this.createVertexTemplateEntry("html=1;shape=mxgraph.flowchart.annotation_2;align=left;labelPosition=right;",50,100,"","Annotation",null,null,this.getTagsForStencil("bpmn","annotation_1","bpmn business process model ").join(" ")),this.addDataEntry("crossfunctional cross-functional cross functional flowchart swimlane table",400,400,"Cross-Functional Flowchart","7ZhRb5swEMc/DY+bMCRt97jQpi+tVC2fwINbbMnYyD4C6aefjaHpBrTRlNCoTALJPp9t+P25O5kgTvL6XtOCPaoMRBDfBXGilULfyusEhAiikGdBfBtEUWjvIFqPjJJmNCyoBonHTIj8hB0VJXiL3dyYL+tSpsiVpM55LVSVMqrROxvci9bZMFq4JtKfzrRKGRfZA92rEjtr11tpVT1wCcYOhM5ViTKXry0G7RYb/uwWXDgDw9wCuSW2WTGOsClo6gYri8uvIGhheLN1s4KGtNSG7+AHGL+Os0JdUJm1nUJxiaDvdhZQt/EvJXHTvpTbjAq+lbadgnO1hhYSaIR6FHRjainfg8oB9d66VDxD5j0WoRcjZMC3DP8yUuMN25e5B91so5VuWMa4J+P3FJW2JtLXrOK5oNLJxZTmz/blqXhNp3mO5cpe9smS8OsyWNp5ie2TQ99ezl1joqRBTXmDAajBCgxejprHKBcNK7fvBPIz3hOSRCcQctET8olRA+8JmSopIW2j8GOD6Sji8TDxepT4C9yTE1+OEo/mQ5xcTYn8ahR5PB/k0c2UyK9HC8SbX/mnLBAnqAlD8XK+onDTE+/fw+TiQF9fTin4Nl/O0xYAEs6X9LR5n5Ae6S7xv1lr/yf+4cQ/pN75Ej/pH88/UZyQkRPzR6R+0j9Bz4f0xMm/f8adD+qzZn/bPfw5bMb++LH4Gw=="),this.addDataEntry("container swimlane pool horizontal",480,380,"Horizontal Pool 1","zZRLbsIwEIZP4709TlHXhJYNSEicwCIjbNWJkWNKwumZxA6IlrRUaisWlmb+eX8LM5mXzdyrnV66Ai2TL0zm3rkQrbLJ0VoG3BRMzhgAp8fgdSQq+ijfKY9VuKcAYsG7snuMyso5G8U6tDaJ9cGUVlXkTXUoacuZIHOjjS0WqnX7blYd1OZt8KYea3PE1bCI+CAtVUMq7/o5b46uCmroSn18WFMm+XCdse5GpLq0OPqAzejxvZQun6MrMfiWUg6mCDpmZM8RENdotjqVyUFUdRS259oLSzISztto5Se0i44gcHEn3i9A/IQB3GbQpmi69DskAn4BSTaGBB4Jicj+k8nTGBP5SExg8odMyL38eH3s6kM8AQ=="),this.addDataEntry("container swimlane pool horizontal",480,360,"Horizontal Pool 2","zZTBbsIwDIafJvfU6dDOlI0LSEg8QUQtEi1tUBJGy9PPbcJQWTsxaZs4VLJ//07sT1WYKKpm6eRBrW2JhokXJgpnbYhR1RRoDAOuSyYWDIDTx+B1opr1VX6QDutwTwPEhndpjhiVjbUmij60Jon+pCsja8rmKlQ05SKjcKe0KVeytcfuLh/k7u2SzR16fcbNZZDsRlrLhlTenWedPts6SJMEOseFLTkph6Fj212RbGlwdAGbyeV7KW2+RFthcC1ZTroMKjry5wiIK9R7ldrELInSR2H/2XtlSUHCOY5WfEG76ggCz+7E+w2InzCAcQapIf0fAySzESQZ/AKSfAoJPCKS9mbzf0H0NIVIPDAiyP8QEaXX97CvDZ7LDw=="),this.createVertexTemplateEntry("swimlane;startSize=20;horizontal=0;",320,120,"Lane","Horizontal Swimlane",null,null,"swimlane lane pool"),this.addDataEntry("container swimlane pool horizontal",360,480,"Vertical Pool 1","xZRBbsIwEEVP4709ThFrQssGJKSewCIjbNXGyDEl4fSdxKa0NJFQVTULSzP/e+T5b2EmS9esgjrqja/QMvnMZBm8j6lyTYnWMuCmYnLJADgdBi8jruhdflQBD/GRAUgD78qeMClb720S69jaLNZn46w6ULfQ0dGWS0HlThtbrVXrT91bdVS7t2u3CFibC26vi4g7aaMaUjmpNBbiKxnUQyfkjTBEbEZT9VKOtELvMIaWrpxNFXW6IWcpOddo9jqPFfMsqjoJ+8/ZGyQqMqdhZvIHs3WHBrh4kNvvIsNw5Da7OdgXAgKGCMz+gEAxRgCmINDcxZ2CyNMYETkhESj+jwi1t1+r9759ah8="),this.addDataEntry("container swimlane pool vertical",380,480,"Vertical Pool 2","xZTPbsIwDMafJvf86dDOlI0LSEg8QUQtEi1pUBJGy9PPbdJ1G1TqhXGoZH/219g/RSGitM3ay5PaugoMEW9ElN65mCLblGAM4VRXRKwI5xQ/wt8nqqyv0pP0UMc5Bp4Mn9KcISk750wSQ2xNFsNFWyNrzJYqWpxyxTA8KG2qjWzduTsrRHn4GLKlh6CvsBsGYX+krWxQpaiizcc9FjDnnaCc11dXR2lyxyjsuyPy3/Lg4CM0k8v3Ut58Dc5C9C22XHQVVeoQrwkQVaCPKtuKQZQhCcdv78gSg4zzPlpxg3bTEeSUzcR7Q2bWyvz+ytmQr8NPAow/ikAxRYA/kQAr/hPByxQC8cxLsHggAkzH56uv/XrdvgA="),this.createVertexTemplateEntry("swimlane;startSize=20;",120,320,"Lane","Vertical Swimlane",null,null,"swimlane lane pool"),this.createVertexTemplateEntry("rounded=1;arcSize=10;dashed=1;strokeColor=#000000;fillColor=none;gradientColor=none;dashPattern=8 3 1 3;strokeWidth=2;",200,200,"","Group",null,null,this.getTagsForStencil("bpmn","group","bpmn business process model ").join(" ")),this.createEdgeTemplateEntry("endArrow=block;endFill=1;endSize=6;html=1;",100,0,"","Sequence Flow",null,"bpmn sequence flow"),this.createEdgeTemplateEntry("startArrow=dash;startSize=8;endArrow=block;endFill=1;endSize=6;html=1;",100,0,"","Default Flow",null,"bpmn default flow"),this.createEdgeTemplateEntry("startArrow=diamondThin;startFill=0;startSize=14;endArrow=block;endFill=1;endSize=6;html=1;",100,0,"","Conditional Flow",null,"bpmn conditional flow"),this.createEdgeTemplateEntry("startArrow=oval;startFill=0;startSize=7;endArrow=block;endFill=0;endSize=10;dashed=1;html=1;",100,0,"","Message Flow 1",null,"bpmn message flow"),this.addEntry("bpmn message flow",function(){var t=new mxCell("",new mxGeometry(0,0,0,0),"startArrow=oval;startFill=0;startSize=7;endArrow=block;endFill=0;endSize=10;dashed=1;html=1;");t.geometry.setTerminalPoint(new mxPoint(0,0),!0),t.geometry.setTerminalPoint(new mxPoint(100,0),!1),t.geometry.relative=!0,t.edge=!0;var e=new mxCell("",new mxGeometry(0,0,20,14),"shape=message;html=1;outlineConnect=0;");return e.geometry.relative=!0,e.vertex=!0,e.geometry.offset=new mxPoint(-10,-7),t.insert(e),n.createEdgeTemplateFromCells([t],100,0,"Message Flow 2")}),this.createEdgeTemplateEntry("shape=link;html=1;",100,0,"","Link",null,"bpmn link")];this.addPaletteFunctions("bpmn","BPMN "+mxResources.get("general"),!1,i),this.setCurrentSearchEntryLibrary()},Sidebar.prototype.createTitle=function(t){var e=document.createElement("a");return e.setAttribute("title",mxResources.get("sidebarTooltip")),e.className="geTitle",mxUtils.write(e,t),e},Sidebar.prototype.createThumb=function(t,e,n,i,l,s,o,r,a){this.graph.labelsVisible=null==s||s;var h=mxClient.NO_FO;mxClient.NO_FO=Editor.prototype.originalNoForeignObject,this.graph.view.scaleAndTranslate(1,0,0),this.graph.addCells(t);s=this.graph.getGraphBounds(),t=Math.floor(100*Math.min((e-2*this.thumbBorder)/s.width,(n-2*this.thumbBorder)/s.height))/100;this.graph.view.scaleAndTranslate(t,Math.floor((e-s.width*t)/2/t-s.x),Math.floor((n-s.height*t)/2/t-s.y));t=null;return this.graph.dialect!=mxConstants.DIALECT_SVG||mxClient.NO_FO||null==this.graph.view.getCanvas().ownerSVGElement?((t=this.graph.container.cloneNode(!1)).innerHTML=this.graph.container.innerHTML,!mxClient.IS_QUIRKS&&8!=document.documentMode||(t.firstChild.style.overflow="visible")):t=this.graph.view.getCanvas().ownerSVGElement.cloneNode(!0),this.graph.getModel().clear(),mxClient.NO_FO=h,mxClient.IS_IE6&&(i.style.backgroundImage="url("+this.editorUi.editor.transparentImage+")"),t.style.position="relative",t.style.overflow="hidden",t.style.left=this.thumbBorder+"px",t.style.top=this.thumbBorder+"px",t.style.width=e+"px",t.style.height=n+"px",t.style.visibility="",t.style.minWidth="",t.style.minHeight="",i.appendChild(t),this.sidebarTitles&&null!=l&&0!=o&&(o=mxClient.IS_QUIRKS?2*this.thumbPadding+2:0,i.style.height=this.thumbHeight+o+this.sidebarTitleSize+8+"px",(o=document.createElement("div")).style.fontSize=this.sidebarTitleSize+"px",o.style.color="#303030",o.style.textAlign="center",o.style.whiteSpace="nowrap",mxClient.IS_IE&&(o.style.height=this.sidebarTitleSize+12+"px"),o.style.paddingTop="4px",mxUtils.write(o,l),i.appendChild(o)),s},Sidebar.prototype.createItem=function(e,n,i,t,l,s,o){var r=document.createElement("a");r.className="geItem",r.style.overflow="hidden";var a=mxClient.IS_QUIRKS?8+2*this.thumbPadding:2*this.thumbBorder;r.style.width=this.thumbWidth+a+"px",r.style.height=this.thumbHeight+a+"px",r.style.padding=this.thumbPadding+"px",mxClient.IS_IE6&&(r.style.border="none"),mxEvent.addListener(r,"click",function(t){mxEvent.consume(t)}),this.createThumb(e,this.thumbWidth,this.thumbHeight,r,n,i,t,l,s);var h,d=new mxRectangle(0,0,l,s);return 1this.dropTargetDelay&&!this.isDropStyleTargetIgnored(s)&&(i.model.isVertex(s.cell)&&null!=f||i.model.isEdge(s.cell)&&i.model.isEdge(y[0]))?(w=s,r=new mxRectangle((r=i.model.isEdge(s.cell)?i.view.getPoint(s):new mxPoint(s.getCenterX(),s.getCenterY())).x-this.refreshTarget.width/2,r.y-this.refreshTarget.height/2,this.refreshTarget.width,this.refreshTarget.height),M.style.left=Math.floor(r.x)+"px",M.style.top=Math.floor(r.y)+"px",null==R&&(i.container.appendChild(M),R=M.parentNode),H(t,e,r,M)):null==w||!mxUtils.contains(w,t,e)||1500this.dropTargetDelay||i.model.isEdge(l)?s:null)&&r){for(var a,h,d,u,p,m=[P,U,T,A,L,I],c=0;cr||Math.abs(a.y-mxEvent.getClientY(t))>r)&&(this.dragElement.style.display="",mxUtils.setOpacity(e,100)),s.apply(this,arguments)},n.mouseUp=function(t){try{mxEvent.isPopupTrigger(t)||null!=this.currentGraph||null==this.dragElement||"none"!=this.dragElement.style.display||h.itemClicked(i,n,t,e),o.apply(n,arguments),mxUtils.setOpacity(e,100),a=null,h.currentElt=e}catch(t){n.reset(),h.editorUi.handleError(t)}}},Sidebar.prototype.createVertexTemplateEntry=function(t,e,n,i,l,s,o,r){return r=null!=r&&0l||Math.abs(x.point.y-e.getGraphY())>l)&&(null==(s=this.selectionCellsHandler.getHandler(a.cell))&&this.model.isEdge(a.cell)&&(s=this.createHandler(a)),null!=s&&null!=s.bends&&0'+n+""));return new mxImage("data:image/svg+xml;base64,"+(window.btoa?btoa(n):Base64.encode(n,!0)),t,e)},Graph.zapGremlins=function(t){for(var e=0,n=[],i=0;is&&"%"==e.charAt(match.index-1))r=o.substring(1);else{var a=o.substring(1,o.length-1);if("id"==a)r=t.id;else if(a.indexOf("{")<0)for(var h=t;null==r&&null!=h;)null!=h.value&&"object"==typeof h.value&&(Graph.translateDiagram&&null!=Graph.diagramLanguage&&(r=h.getAttribute(a+"_"+Graph.diagramLanguage)),null==r&&(r=h.hasAttribute(a)?null!=h.getAttribute(a)?h.getAttribute(a):"":null)),h=this.model.getParent(h);null==r&&(r=this.getGlobalVariable(a)),null==r&&null!=n&&(r=n[a])}l.push(e.substring(s,match.index)+(null!=r?r:o)),s=match.index+o.length}}l.push(e.substring(s))}return l.join("")},Graph.prototype.restoreSelection=function(t){if(null!=t&&0e.name?1:0});for(o=0;o"+s[o].name+": ":"")+mxUtils.htmlEntities(s[o].value)+"\n");0'+e+""))}}return e},Graph.prototype.stringToBytes=function(t){return Graph.stringToBytes(t)},Graph.prototype.bytesToString=function(t){return Graph.bytesToString(t)},Graph.prototype.compressNode=function(t){return Graph.compressNode(t)},Graph.prototype.compress=function(t,e){return Graph.compress(t,e)},Graph.prototype.decompress=function(t,e){return Graph.decompress(t,e)},Graph.prototype.zapGremlins=function(t){return Graph.zapGremlins(t)},HoverIcons=function(t){this.graph=t,this.init()},HoverIcons.prototype.arrowSpacing=2,HoverIcons.prototype.updateDelay=500,HoverIcons.prototype.activationDelay=140,HoverIcons.prototype.currentState=null,HoverIcons.prototype.activeArrow=null,HoverIcons.prototype.inactiveOpacity=15,HoverIcons.prototype.cssCursor="copy",HoverIcons.prototype.checkCollisions=!0,HoverIcons.prototype.arrowFill="#29b6f2",HoverIcons.prototype.triangleUp=mxClient.IS_SVG?Graph.createSvgImage(18,28,''):new mxImage(IMAGE_PATH+"/triangle-up.png",26,14),HoverIcons.prototype.triangleRight=mxClient.IS_SVG?Graph.createSvgImage(26,18,''):new mxImage(IMAGE_PATH+"/triangle-right.png",14,26),HoverIcons.prototype.triangleDown=mxClient.IS_SVG?Graph.createSvgImage(18,26,''):new mxImage(IMAGE_PATH+"/triangle-down.png",26,14),HoverIcons.prototype.triangleLeft=mxClient.IS_SVG?Graph.createSvgImage(28,18,''):new mxImage(IMAGE_PATH+"/triangle-left.png",14,26),HoverIcons.prototype.roundDrop=mxClient.IS_SVG?Graph.createSvgImage(26,26,''):new mxImage(IMAGE_PATH+"/round-drop.png",26,26),HoverIcons.prototype.refreshTarget=new mxImage(mxClient.IS_SVG?"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjM2cHgiIGhlaWdodD0iMzZweCI+PGVsbGlwc2UgZmlsbD0iIzI5YjZmMiIgY3g9IjEyIiBjeT0iMTIiIHJ4PSIxMiIgcnk9IjEyIi8+PHBhdGggdHJhbnNmb3JtPSJzY2FsZSgwLjgpIHRyYW5zbGF0ZSgyLjQsIDIuNCkiIHN0cm9rZT0iI2ZmZiIgZmlsbD0iI2ZmZiIgZD0iTTEyIDZ2M2w0LTQtNC00djNjLTQuNDIgMC04IDMuNTgtOCA4IDAgMS41Ny40NiAzLjAzIDEuMjQgNC4yNkw2LjcgMTQuOGMtLjQ1LS44My0uNy0xLjc5LS43LTIuOCAwLTMuMzEgMi42OS02IDYtNnptNi43NiAxLjc0TDE3LjMgOS4yYy40NC44NC43IDEuNzkuNyAyLjggMCAzLjMxLTIuNjkgNi02IDZ2LTNsLTQgNCA0IDR2LTNjNC40MiAwIDgtMy41OCA4LTggMC0xLjU3LS40Ni0zLjAzLTEuMjQtNC4yNnoiLz48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PC9zdmc+Cg==":IMAGE_PATH+"/refresh.png",38,38),HoverIcons.prototype.tolerance=mxClient.IS_TOUCH?6:0,HoverIcons.prototype.init=function(){this.arrowUp=this.createArrow(this.triangleUp,mxResources.get("plusTooltip")),this.arrowRight=this.createArrow(this.triangleRight,mxResources.get("plusTooltip")),this.arrowDown=this.createArrow(this.triangleDown,mxResources.get("plusTooltip")),this.arrowLeft=this.createArrow(this.triangleLeft,mxResources.get("plusTooltip")),this.elts=[this.arrowUp,this.arrowRight,this.arrowDown,this.arrowLeft],this.resetHandler=mxUtils.bind(this,function(){this.reset()}),this.repaintHandler=mxUtils.bind(this,function(){this.repaint()}),this.graph.selectionModel.addListener(mxEvent.CHANGE,this.resetHandler),this.graph.model.addListener(mxEvent.CHANGE,this.repaintHandler),this.graph.view.addListener(mxEvent.SCALE_AND_TRANSLATE,this.repaintHandler),this.graph.view.addListener(mxEvent.TRANSLATE,this.repaintHandler),this.graph.view.addListener(mxEvent.SCALE,this.repaintHandler),this.graph.view.addListener(mxEvent.DOWN,this.repaintHandler),this.graph.view.addListener(mxEvent.UP,this.repaintHandler),this.graph.addListener(mxEvent.ROOT,this.repaintHandler),this.graph.addListener(mxEvent.ESCAPE,this.resetHandler),mxEvent.addListener(this.graph.container,"scroll",this.resetHandler),this.graph.addListener(mxEvent.ESCAPE,mxUtils.bind(this,function(){this.mouseDownPoint=null})),mxEvent.addListener(this.graph.container,"mouseleave",mxUtils.bind(this,function(t){null!=t.relatedTarget&&mxEvent.getSource(t)==this.graph.container&&this.setDisplay("none")})),this.graph.addListener(mxEvent.START_EDITING,mxUtils.bind(this,function(t){this.reset()}));var e=this.graph.click;this.graph.click=mxUtils.bind(this,function(t){e.apply(this.graph,arguments),null==this.currentState||this.graph.isCellSelected(this.currentState.cell)||!mxEvent.isTouchEvent(t.getEvent())||this.graph.model.isVertex(t.getCell())||this.reset()});var i=!1;this.graph.addMouseListener({mouseDown:mxUtils.bind(this,function(t,e){i=!1;var n=e.getEvent();this.isResetEvent(n)?this.reset():this.isActive()||(null==(e=this.getState(e.getState()))&&mxEvent.isTouchEvent(n)||this.update(e)),this.setDisplay("none")}),mouseMove:mxUtils.bind(this,function(t,e){var n=e.getEvent();this.isResetEvent(n)?this.reset():this.graph.isMouseDown||mxEvent.isTouchEvent(n)||this.update(this.getState(e.getState()),e.getGraphX(),e.getGraphY()),null!=this.graph.connectionHandler&&null!=this.graph.connectionHandler.shape&&(i=!0)}),mouseUp:mxUtils.bind(this,function(t,e){var n=e.getEvent();mxUtils.convertPoint(this.graph.container,mxEvent.getClientX(n),mxEvent.getClientY(n));this.isResetEvent(n)?this.reset():this.isActive()&&!i&&null!=this.mouseDownPoint?this.click(this.currentState,this.getDirection(),e):this.isActive()?1==this.graph.getSelectionCount()&&this.graph.model.isEdge(this.graph.getSelectionCell())?this.reset():this.update(this.getState(this.graph.view.getState(this.graph.getCellAt(e.getGraphX(),e.getGraphY())))):mxEvent.isTouchEvent(n)||null!=this.bbox&&mxUtils.contains(this.bbox,e.getGraphX(),e.getGraphY())?(this.setDisplay(""),this.repaint()):mxEvent.isTouchEvent(n)||this.reset(),i=!1,this.resetActiveArrow()})})},HoverIcons.prototype.isResetEvent=function(t,e){return mxEvent.isAltDown(t)||null==this.activeArrow&&mxEvent.isShiftDown(t)||mxEvent.isPopupTrigger(t)&&!this.graph.isCloneEvent(t)},HoverIcons.prototype.createArrow=function(t,e){var n=null;return mxClient.IS_IE&&!mxClient.IS_SVG?(mxClient.IS_IE6&&"CSS1Compat"!=document.compatMode?((n=document.createElement(mxClient.VML_PREFIX+":image")).setAttribute("src",t.src),n.style.borderStyle="none"):((n=document.createElement("div")).style.backgroundImage="url("+t.src+")",n.style.backgroundPosition="center",n.style.backgroundRepeat="no-repeat"),n.style.width=t.width+4+"px",n.style.height=t.height+4+"px",n.style.display=mxClient.IS_QUIRKS?"inline":"inline-block"):((n=mxUtils.createImage(t.src)).style.width=t.width+"px",n.style.height=t.height+"px",n.style.padding=this.tolerance+"px"),null!=e&&n.setAttribute("title",e),n.style.position="absolute",n.style.cursor=this.cssCursor,mxEvent.addGestureListeners(n,mxUtils.bind(this,function(t){null==this.currentState||this.isResetEvent(t)||(this.mouseDownPoint=mxUtils.convertPoint(this.graph.container,mxEvent.getClientX(t),mxEvent.getClientY(t)),this.drag(t,this.mouseDownPoint.x,this.mouseDownPoint.y),this.activeArrow=n,this.setDisplay("none"),mxEvent.consume(t))})),mxEvent.redirectMouseEvents(n,this.graph,this.currentState),mxEvent.addListener(n,"mouseenter",mxUtils.bind(this,function(t){mxEvent.isMouseEvent(t)&&(null!=this.activeArrow&&this.activeArrow!=n&&mxUtils.setOpacity(this.activeArrow,this.inactiveOpacity),this.graph.connectionHandler.constraintHandler.reset(),mxUtils.setOpacity(n,100),this.activeArrow=n)})),mxEvent.addListener(n,"mouseleave",mxUtils.bind(this,function(t){this.graph.isMouseDown||this.resetActiveArrow()})),n},HoverIcons.prototype.resetActiveArrow=function(){null!=this.activeArrow&&(mxUtils.setOpacity(this.activeArrow,this.inactiveOpacity),this.activeArrow=null)},HoverIcons.prototype.getDirection=function(){var t=mxConstants.DIRECTION_EAST;return this.activeArrow==this.arrowUp?t=mxConstants.DIRECTION_NORTH:this.activeArrow==this.arrowDown?t=mxConstants.DIRECTION_SOUTH:this.activeArrow==this.arrowLeft&&(t=mxConstants.DIRECTION_WEST),t},HoverIcons.prototype.visitNodes=function(t){for(var e=0;ethis.activationDelay)&&this.currentState!=t&&(i>this.updateDelay&&null!=t||null==this.bbox||null==e||null==n||!mxUtils.contains(this.bbox,e,n))&&(null!=t&&this.graph.isEnabled()?(this.removeNodes(),this.setCurrentState(t),this.repaint(),this.graph.connectionHandler.constraintHandler.currentFocus!=t&&this.graph.connectionHandler.constraintHandler.reset()):this.reset()))},HoverIcons.prototype.setCurrentState=function(t){"eastwest"!=t.style.portConstraint&&(this.graph.container.appendChild(this.arrowUp),this.graph.container.appendChild(this.arrowDown)),this.graph.container.appendChild(this.arrowRight),this.graph.container.appendChild(this.arrowLeft),this.currentState=t},Graph.prototype.createParent=function(t,e,n,i,l){t=this.cloneCell(t);for(var s=0;sn||Math.abs(E.y-a.y)>n)&&(Math.abs(E.x-r.x)>n||Math.abs(E.y-r.y)>n)&&(Math.abs(E.x-x.x)>n||Math.abs(E.y-x.y)>n)&&(Math.abs(E.x-g.x)>n||Math.abs(E.y-g.y)>n)){for(var y=E.x-a.x,f=E.y-a.y,C={distSq:y*y+f*f,x:E.x,y:E.y},v=0;vC.distSq){h.splice(v,0,C),C=null;break}null==C||0!=h.length&&h[h.length-1].x===C.x&&h[h.length-1].y===C.y||h.push(C)}}}for(c=0;cl||!n&&0e&&n[i].deleteCell(e)},Graph.prototype.pasteHtmlAtCaret=function(t){var e,n;if(window.getSelection){if((e=window.getSelection()).getRangeAt&&e.rangeCount){(n=e.getRangeAt(0)).deleteContents();var i=document.createElement("div");i.innerHTML=t;for(var l,s=document.createDocumentFragment();l=i.firstChild;)lastNode=s.appendChild(l);n.insertNode(s)}}else(e=document.selection)&&"Control"!=e.type&&e.createRange().pasteHTML(t)},Graph.prototype.createLinkForHint=function(e,t){function n(t,e){return t.length>e&&(t=t.substring(0,Math.round(e/2))+"..."+t.substring(t.length-Math.round(e/4))),t}e=null!=e?e:"javascript:void(0);",null!=t&&0!=t.length||(t=this.isCustomLink(e)?this.getLinkTitle(e):e);var i=document.createElement("a");return i.setAttribute("rel",this.linkRelation),i.setAttribute("href",this.getAbsoluteUrl(e)),i.setAttribute("title",n(this.isCustomLink(e)?this.getLinkTitle(e):e,80)),null!=this.linkTarget&&i.setAttribute("target",this.linkTarget),mxUtils.write(i,n(t,40)),this.isCustomLink(e)&&mxEvent.addListener(i,"click",mxUtils.bind(this,function(t){this.customLinkClicked(e),mxEvent.consume(t)})),i},Graph.prototype.initTouch=function(){this.connectionHandler.marker.isEnabled=function(){return null!=this.graph.connectionHandler.first},this.addListener(mxEvent.START_EDITING,function(t,e){this.popupMenuHandler.hideMenu()});var n=this.updateMouseEvent,i=!(this.updateMouseEvent=function(t){var e;return t=n.apply(this,arguments),mxEvent.isTouchEvent(t.getEvent())&&null==t.getState()&&(null!=(e=this.getCellAt(t.graphX,t.graphY))&&this.isSwimlane(e)&&this.hitsSwimlaneContent(e,t.graphX,t.graphY)?e=null:(t.state=this.view.getState(e),null!=t.state&&null!=t.state.shape&&(this.container.style.cursor=t.state.shape.node.style.cursor))),null==t.getState()&&this.isEnabled()&&(this.container.style.cursor="default"),t}),l=!1,s=!1,o=this.fireMouseEvent;this.fireMouseEvent=function(t,e,n){t==mxEvent.MOUSE_DOWN&&(e=this.updateMouseEvent(e),i=this.isCellSelected(e.getCell()),l=this.isSelectionEmpty(),s=this.popupMenuHandler.isMenuShowing()),o.apply(this,arguments)},this.popupMenuHandler.mouseUp=mxUtils.bind(this,function(t,e){this.popupMenuHandler.popupTrigger=!this.isEditing()&&this.isEnabled()&&(null==e.getState()||!e.isSource(e.getState().control))&&(this.popupMenuHandler.popupTrigger||!s&&!mxEvent.isMouseEvent(e.getEvent())&&(l&&null==e.getCell()&&this.isSelectionEmpty()||i&&this.isCellSelected(e.getCell()))),mxPopupMenuHandler.prototype.mouseUp.apply(this.popupMenuHandler,arguments)})},mxCellEditor.prototype.isContentEditing=function(){var t=this.graph.view.getState(this.editingCell);return null!=t&&1==t.style.html},mxCellEditor.prototype.isTableSelected=function(){return null!=this.graph.getParentByName(this.graph.getSelectedElement(),"TABLE",this.textarea)},mxCellEditor.prototype.alignText=function(t,e){var n,i=null!=e&&mxEvent.isShiftDown(e);(i||null!=window.getSelection&&null!=window.getSelection().containsNode)&&(n=!0,this.graph.processElements(this.textarea,function(t){i||window.getSelection().containsNode(t,!0)?(t.removeAttribute("align"),t.style.textAlign=null):n=!1}),n&&this.graph.cellEditor.setAlign(t)),document.execCommand("justify"+t.toLowerCase(),!1,null)},mxCellEditor.prototype.saveSelection=function(){if(window.getSelection){var t=window.getSelection();if(t.getRangeAt&&t.rangeCount){for(var e=[],n=0,i=t.rangeCount;n")||0<=this.textarea.innerHTML.indexOf("\x3c!--[if !mso]>")?function t(e,n){if(null!=e)if(n.originalNode!=e)l(e);else for(e=e.firstChild,n=n.firstChild;null!=e;){var i=e.nextSibling;null==n?l(e):(t(e,n),n=n.nextSibling),e=i}}(this.textarea,e):Graph.removePasteFormatting(this.textarea))}),0)}))},mxCellEditor.prototype.toggleViewMode=function(){var t,e,n,i,l,s,o,r,a,h=this.graph.view.getState(this.editingCell);null!=h&&(t=null!=h&&"0"!=mxUtils.getValue(h.style,"nl2Br","1"),e=this.saveSelection(),this.codeViewMode?(0<(r=mxUtils.extractTextWithWhitespace(this.textarea.childNodes)).length&&"\n"==r.charAt(r.length-1)&&(r=r.substring(0,r.length-1)),r=this.graph.sanitizeHtml(t?r.replace(/\n/g,"
"):r,!0),this.textarea.className="mxCellEditor geContentEditable",a=mxUtils.getValue(h.style,mxConstants.STYLE_FONTSIZE,mxConstants.DEFAULT_FONTSIZE),n=mxUtils.getValue(h.style,mxConstants.STYLE_FONTFAMILY,mxConstants.DEFAULT_FONTFAMILY),i=mxUtils.getValue(h.style,mxConstants.STYLE_ALIGN,mxConstants.ALIGN_LEFT),l=(mxUtils.getValue(h.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD,s=(mxUtils.getValue(h.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_ITALIC)==mxConstants.FONT_ITALIC,o=[],(mxUtils.getValue(h.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_UNDERLINE)==mxConstants.FONT_UNDERLINE&&o.push("underline"),(mxUtils.getValue(h.style,mxConstants.STYLE_FONTSTYLE,0)&mxConstants.FONT_STRIKETHROUGH)==mxConstants.FONT_STRIKETHROUGH&&o.push("line-through"),this.textarea.style.lineHeight=mxConstants.ABSOLUTE_LINE_HEIGHT?Math.round(a*mxConstants.LINE_HEIGHT)+"px":mxConstants.LINE_HEIGHT,this.textarea.style.fontSize=Math.round(a)+"px",this.textarea.style.textDecoration=o.join(" "),this.textarea.style.fontWeight=l?"bold":"normal",this.textarea.style.fontStyle=s?"italic":"",this.textarea.style.fontFamily=n,this.textarea.style.textAlign=i,this.textarea.style.padding="0px",this.textarea.innerHTML!=r&&(this.textarea.innerHTML=r,0==this.textarea.innerHTML.length&&(this.textarea.innerHTML=this.getEmptyLabelText(),this.clearOnChange=0
")),r=this.graph.sanitizeHtml(t?r.replace(/\n/g,"").replace(/<br\s*.?>/g,"
"):r,!0),this.textarea.className="mxCellEditor mxPlainTextEditor",a=mxConstants.DEFAULT_FONTSIZE,this.textarea.style.lineHeight=mxConstants.ABSOLUTE_LINE_HEIGHT?Math.round(a*mxConstants.LINE_HEIGHT)+"px":mxConstants.LINE_HEIGHT,this.textarea.style.fontSize=Math.round(a)+"px",this.textarea.style.textDecoration="",this.textarea.style.fontWeight="normal",this.textarea.style.fontStyle="",this.textarea.style.fontFamily=mxConstants.DEFAULT_FONTFAMILY,this.textarea.style.textAlign="left",this.textarea.style.padding="2px",this.textarea.innerHTML!=r&&(this.textarea.innerHTML=r),this.codeViewMode=!0),this.textarea.focus(),null!=this.switchSelectionState&&this.restoreSelection(this.switchSelectionState),this.switchSelectionState=e,this.resize())};var g=mxCellEditor.prototype.resize;mxCellEditor.prototype.resize=function(t,e){var n,i;null!=this.textarea&&(t=this.graph.getView().getState(this.editingCell),this.codeViewMode&&null!=t?(n=t.view.scale,this.bounds=mxRectangle.fromRectangle(t),0==this.bounds.width&&0==this.bounds.height&&(this.bounds.width=160*n,this.bounds.height=60*n,null==(i=null!=t.text?t.text.margin:null)&&(i=mxUtils.getAlignmentAsPoint(mxUtils.getValue(t.style,mxConstants.STYLE_ALIGN,mxConstants.ALIGN_CENTER),mxUtils.getValue(t.style,mxConstants.STYLE_VERTICAL_ALIGN,mxConstants.ALIGN_MIDDLE))),this.bounds.x+=i.x*this.bounds.width,this.bounds.y+=i.y*this.bounds.height),this.textarea.style.width=Math.round((this.bounds.width-4)/n)+"px",this.textarea.style.height=Math.round((this.bounds.height-4)/n)+"px",this.textarea.style.overflow="auto",this.textarea.clientHeight")),n=this.graph.sanitizeHtml(n,!0)},mxCellEditorGetCurrentValue=mxCellEditor.prototype.getCurrentValue,mxCellEditor.prototype.getCurrentValue=function(t){if("0"==mxUtils.getValue(t.style,"html","0"))return mxCellEditorGetCurrentValue.apply(this,arguments);var e=this.graph.sanitizeHtml(this.textarea.innerHTML,!0);return e="1"==mxUtils.getValue(t.style,"nl2Br","1")?e.replace(/\r\n/g,"
").replace(/\n/g,"
"):e.replace(/\r\n/g,"").replace(/\n/g,"")};var x=mxCellEditor.prototype.stopEditing;mxCellEditor.prototype.stopEditing=function(t){this.codeViewMode&&this.toggleViewMode(),x.apply(this,arguments),this.focusContainer()},mxCellEditor.prototype.focusContainer=function(){try{this.graph.container.focus()}catch(t){}};var y=mxCellEditor.prototype.applyValue;function f(){var t=document.createElement("div");return t.className="geHint",t.style.whiteSpace="nowrap",t.style.position="absolute",t}function C(t,e){switch(e){case mxConstants.POINTS:return t;case mxConstants.MILLIMETERS:return(t/mxConstants.PIXELS_PER_MM).toFixed(1);case mxConstants.INCHES:return(t/mxConstants.PIXELS_PER_INCH).toFixed(2)}}mxCellEditor.prototype.applyValue=function(t,e){this.graph.getModel().beginUpdate();try{y.apply(this,arguments),""==e&&this.graph.isCellDeletable(t.cell)&&0==this.graph.model.getChildCount(t.cell)&&this.graph.isTransparentState(t)&&this.graph.removeCells([t.cell],!1)}finally{this.graph.getModel().endUpdate()}},mxCellEditor.prototype.getBackgroundColor=function(t){var e=mxUtils.getValue(t.style,mxConstants.STYLE_LABEL_BACKGROUNDCOLOR,null);return null!=e&&e!=mxConstants.NONE||null==t.cell.geometry||!(0'):new mxImage(IMAGE_PATH+"/handle-main.png",17,17),HoverIcons.prototype.secondaryHandle=mxClient.IS_SVG?Graph.createSvgImage(16,16,''):new mxImage(IMAGE_PATH+"/handle-secondary.png",17,17),HoverIcons.prototype.fixedHandle=mxClient.IS_SVG?Graph.createSvgImage(18,18,''):new mxImage(IMAGE_PATH+"/handle-fixed.png",17,17),HoverIcons.prototype.terminalHandle=mxClient.IS_SVG?Graph.createSvgImage(18,18,''):new mxImage(IMAGE_PATH+"/handle-terminal.png",17,17),HoverIcons.prototype.rotationHandle=mxClient.IS_SVG?Graph.createSvgImage(16,16,'',24,24):new mxImage(IMAGE_PATH+"/handle-rotate.png",16,16),mxClient.IS_SVG&&(mxConstraintHandler.prototype.pointImage=Graph.createSvgImage(5,5,'')),mxVertexHandler.TABLE_HANDLE_COLOR="#fca000",mxVertexHandler.prototype.handleImage=HoverIcons.prototype.mainHandle,mxVertexHandler.prototype.secondaryHandleImage=HoverIcons.prototype.secondaryHandle,mxEdgeHandler.prototype.handleImage=HoverIcons.prototype.mainHandle,mxEdgeHandler.prototype.terminalHandleImage=HoverIcons.prototype.terminalHandle,mxEdgeHandler.prototype.fixedHandleImage=HoverIcons.prototype.fixedHandle,mxEdgeHandler.prototype.labelHandleImage=HoverIcons.prototype.secondaryHandle,mxOutline.prototype.sizerImage=HoverIcons.prototype.mainHandle,null!=window.Sidebar&&(Sidebar.prototype.triangleUp=HoverIcons.prototype.triangleUp,Sidebar.prototype.triangleRight=HoverIcons.prototype.triangleRight,Sidebar.prototype.triangleDown=HoverIcons.prototype.triangleDown,Sidebar.prototype.triangleLeft=HoverIcons.prototype.triangleLeft,Sidebar.prototype.refreshTarget=HoverIcons.prototype.refreshTarget,Sidebar.prototype.roundDrop=HoverIcons.prototype.roundDrop),mxClient.IS_SVG||((new Image).src=HoverIcons.prototype.mainHandle.src,(new Image).src=HoverIcons.prototype.fixedHandle.src,(new Image).src=HoverIcons.prototype.terminalHandle.src,(new Image).src=HoverIcons.prototype.secondaryHandle.src,(new Image).src=HoverIcons.prototype.rotationHandle.src,(new Image).src=HoverIcons.prototype.triangleUp.src,(new Image).src=HoverIcons.prototype.triangleRight.src,(new Image).src=HoverIcons.prototype.triangleDown.src,(new Image).src=HoverIcons.prototype.triangleLeft.src,(new Image).src=HoverIcons.prototype.refreshTarget.src,(new Image).src=HoverIcons.prototype.roundDrop.src),mxVertexHandler.prototype.rotationEnabled=!0,mxVertexHandler.prototype.manageSizers=!0,mxVertexHandler.prototype.livePreview=!0,mxGraphHandler.prototype.maxLivePreview=16,mxRubberband.prototype.defaultOpacity=30,mxConnectionHandler.prototype.outlineConnect=!0,mxCellHighlight.prototype.keepOnTop=!0,mxVertexHandler.prototype.parentHighlightEnabled=!0,mxEdgeHandler.prototype.parentHighlightEnabled=!0,mxEdgeHandler.prototype.dblClickRemoveEnabled=!0,mxEdgeHandler.prototype.straightRemoveEnabled=!0,mxEdgeHandler.prototype.virtualBendsEnabled=!0,mxEdgeHandler.prototype.mergeRemoveEnabled=!0,mxEdgeHandler.prototype.manageLabelHandle=!0,mxEdgeHandler.prototype.outlineConnect=!0,mxEdgeHandler.prototype.isAddVirtualBendEvent=function(t){return!mxEvent.isShiftDown(t.getEvent())},mxEdgeHandler.prototype.isCustomHandleEvent=function(t){return!mxEvent.isShiftDown(t.getEvent())},Graph.touchStyle?((mxClient.IS_TOUCH||0l||Math.abs(i)>l)&&(null==this.div&&(this.div=this.createShape()),mxUtils.clearSelection(),this.update(s,o),this.isSpaceEvent(e)?(l=this.x+this.width,s=this.y+this.height,o=this.graph.view.scale,mxEvent.isAltDown(e.getEvent())||(this.width=this.graph.snap(this.width/o)*o,this.height=this.graph.snap(this.height/o)*o,this.graph.isGridEnabled()||(this.width=this.state.absolutePoints.length-1||this.constructor==mxElbowEdgeHandler&&2==t)?this.graph.getConnectionConstraint(this.state,i,n):null,i=null!=(null!=t?this.graph.getConnectionPoint(this.state.getVisibleTerminalState(n),t):null)?this.fixedHandleImage:null!=t&&null!=i?this.terminalHandleImage:this.handleImage;if(null!=i){var l=new mxImageShape(new mxRectangle(0,0,i.width,i.height),i.src);return l.preserveImageAspect=!1,l}l=mxConstants.HANDLE_SIZE;return this.preferHtml&&--l,new mxRectangleShape(new mxRectangle(0,0,l,l),mxConstants.HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR)};var k=mxVertexHandler.prototype.createSizerShape;mxVertexHandler.prototype.createSizerShape=function(t,e,n){return this.handleImage=e==mxEvent.ROTATION_HANDLE?HoverIcons.prototype.rotationHandle:e==mxEvent.LABEL_HANDLE?this.secondaryHandleImage:this.handleImage,k.apply(this,arguments)};var V=mxGraphHandler.prototype.getBoundingBox;mxGraphHandler.prototype.getBoundingBox=function(t){if(null!=t&&1==t.length){var e=this.graph.getModel(),n=e.getParent(t[0]),i=this.graph.getCellGeometry(t[0]);if(e.isEdge(n)&&null!=i&&i.relative){i=this.graph.view.getState(t[0]);if(null!=i&&i.width<2&&i.height<2&&null!=i.text&&null!=i.text.boundingBox)return mxRectangle.fromRectangle(i.text.boundingBox)}}return V.apply(this,arguments)};var F=mxGraphHandler.prototype.getGuideStates;mxGraphHandler.prototype.getGuideStates=function(){for(var t=F.apply(this,arguments),e=[],n=0;n',!mxClient.IS_QUIRKS&&8!=document.documentMode||(m.firstChild.style.margin="0px"),null!=t&&t!=mxConstants.NONE?(a.setAttribute("checked","checked"),a.defaultChecked=!0,a.checked=!0):(a.removeAttribute("checked"),a.defaultChecked=!1,a.checked=!1),m.style.display=a.checked||r?"":"none",null!=o&&o(t),e||(u=t,(n||r||i()!=u)&&l(u)),p=!1)}var u=i(),p=!1,m=null;return(m=mxUtils.button("",mxUtils.bind(this,function(t){this.editorUi.pickColor(u,function(t){d(t,null,!0)}),mxEvent.consume(t)}))).style.position="absolute",m.style.marginTop="-4px",m.style.right=mxClient.IS_QUIRKS?"0px":"20px",m.style.height="22px",m.className="geColorBtn",m.style.display=a.checked||r?"":"none",n.appendChild(m),mxEvent.addListener(n,"click",function(t){t=mxEvent.getSource(t);t!=a&&"INPUT"==t.nodeName||(t!=a&&(a.checked=!a.checked),a.checked||null==u||u==mxConstants.NONE||s==mxConstants.NONE||(s=u),d(a.checked?s:mxConstants.NONE))}),d(u,!0),null!=e&&(e.install(d),this.listeners.push(e)),n},BaseFormatPanel.prototype.createCellColorOption=function(t,n,e,i,l){var s=this.editorUi,o=s.editor.graph;return this.createColorOption(t,function(){var t=o.view.getState(o.getSelectionCell());return null!=t?mxUtils.getValue(t.style,n,null):null},function(t){o.getModel().beginUpdate();try{o.setCellStyles(n,t,o.getSelectionCells()),null!=l&&l(t),s.fireEvent(new mxEventObject("styleChanged","keys",[n],"values",[t],"cells",o.getSelectionCells()))}finally{o.getModel().endUpdate()}},e||mxConstants.NONE,{install:function(e){this.listener=function(){var t=o.view.getState(o.getSelectionCell());null!=t&&e(mxUtils.getValue(t.style,n,null))},o.getModel().addListener(mxEvent.CHANGE,this.listener)},destroy:function(){o.getModel().removeListener(this.listener)}},i)},BaseFormatPanel.prototype.addArrow=function(t,e){e=null!=e?e:10;var n=document.createElement("div");n.style.display=mxClient.IS_QUIRKS?"inline":"inline-block",n.style.padding="6px",n.style.paddingRight="4px";var i=10-e;2==i?n.style.paddingTop="6px":0',mxUtils.setOpacity(n,70);e=t.getElementsByTagName("div")[0];return null!=e&&(e.style.paddingRight="6px",e.style.marginLeft="4px",e.style.marginTop="-1px",e.style.display=mxClient.IS_QUIRKS?"inline":"inline-block",mxUtils.setOpacity(e,60)),mxUtils.setOpacity(t,100),t.style.border="1px solid #a0a0a0",t.style.backgroundColor=this.buttonBackgroundColor,t.style.backgroundImage="none",t.style.width="auto",t.className+=" geColorBtn",mxUtils.setPrefixedStyle(t.style,"borderRadius","3px"),t.appendChild(n),e},BaseFormatPanel.prototype.addUnitInput=function(t,e,n,i,l,s,o,r,a){o=null!=o?o:0;var h=document.createElement("input");h.style.position="absolute",h.style.textAlign="right",h.style.marginTop="-2px",h.style.right=n+12+"px",h.style.width=i+"px",t.appendChild(h);a=this.createStepper(h,l,s,null,r,null,a);return a.style.marginTop=o-2+"px",a.style.right=n+"px",t.appendChild(a),h},BaseFormatPanel.prototype.createRelativeOption=function(t,i,e,l,n){e=null!=e?e:44;var s=this.editorUi.editor.graph,o=this.createPanel();o.style.paddingTop="10px",o.style.paddingBottom="10px",mxUtils.write(o,t),o.style.fontWeight="bold";var r,t=mxUtils.bind(this,function(t){var e,n;null!=l?l(a):(e=parseInt(a.value),e=Math.min(100,Math.max(0,isNaN(e)?100:e)),null!=(n=s.view.getState(s.getSelectionCell()))&&e!=mxUtils.getValue(n.style,i,100)&&(100==e&&(e=null),s.setCellStyles(i,e,s.getSelectionCells()),this.editorUi.fireEvent(new mxEventObject("styleChanged","keys",[i],"values",[e],"cells",s.getSelectionCells()))),a.value=(null!=e?e:"100")+" %"),mxEvent.consume(t)}),a=this.addUnitInput(o,"%",20,e,t,10,-15,null!=l);return null!=i&&(r=mxUtils.bind(this,function(t,e,n){!n&&a==document.activeElement||(n=this.format.getSelectionState(),n=parseInt(mxUtils.getValue(n.style,i,100)),a.value=isNaN(n)?"":n+" %")}),mxEvent.addListener(a,"keydown",function(t){13==t.keyCode?(s.container.focus(),mxEvent.consume(t)):27==t.keyCode&&(r(null,null,!0),s.container.focus(),mxEvent.consume(t))}),s.getModel().addListener(mxEvent.CHANGE,r),this.listeners.push({destroy:function(){s.getModel().removeListener(r)}}),r()),mxEvent.addListener(a,"blur",t),mxEvent.addListener(a,"change",t),null!=n&&n(a),o},BaseFormatPanel.prototype.addLabel=function(t,e,n,i){i=null!=i?i:61;var l=document.createElement("div");mxUtils.write(l,e),l.style.position="absolute",l.style.right=n+"px",l.style.width=i+"px",l.style.marginTop="6px",l.style.textAlign="center",t.appendChild(l)},BaseFormatPanel.prototype.addKeyHandler=function(t,e){mxEvent.addListener(t,"keydown",mxUtils.bind(this,function(t){13==t.keyCode?(this.editorUi.editor.graph.container.focus(),mxEvent.consume(t)):27==t.keyCode&&(null!=e&&e(null,null,!0),this.editorUi.editor.graph.container.focus(),mxEvent.consume(t))}))},BaseFormatPanel.prototype.styleButtons=function(t){for(var e=0;e=n.length||l[i]!=n[i].node||l[i]==n[i].node&&l[i].getAttribute("color")!=n[i].color){var s=l[i].firstChild;if(null!=s&&"A"==s.nodeName&&null==s.nextSibling&&null!=s.firstChild){l[i].parentNode.insertBefore(s,l[i]);for(e=s.firstChild;null!=e;){var o=e.nextSibling;l[i].appendChild(e),e=o}s.appendChild(l[i])}break}}else document.execCommand("forecolor",!1,t!=mxConstants.NONE?t:"transparent")},null!=n[mxConstants.STYLE_FONTCOLOR]?n[mxConstants.STYLE_FONTCOLOR]:"#000000",{install:function(t){V=t},destroy:function(){V=null}},null,!0):this.createCellColorOption(mxResources.get("fontColor"),mxConstants.STYLE_FONTCOLOR,null!=n[mxConstants.STYLE_FONTCOLOR]?n[mxConstants.STYLE_FONTCOLOR]:"#000000",function(t){t==mxConstants.NONE?B.style.display="none":B.style.display="",z.style.display=B.style.display},function(t){t==mxConstants.NONE?c.setCellStyles(mxConstants.STYLE_NOLABEL,"1",c.getSelectionCells()):c.setCellStyles(mxConstants.STYLE_NOLABEL,null,c.getSelectionCells()),c.updateCellStyles(mxConstants.STYLE_FONTCOLOR,t,c.getSelectionCells()),c.updateLabelElements(c.getSelectionCells(),function(t){t.removeAttribute("color"),t.style.color=null})});s.style.fontWeight="bold",l.appendChild(s),l.appendChild(B),c.cellEditor.isContentEditing()||l.appendChild(z),t.appendChild(l);P=this.createPanel();P.style.paddingTop="2px",P.style.paddingBottom="4px";n=this.createCellOption(mxResources.get("wordWrap"),mxConstants.STYLE_WHITE_SPACE,null,"wrap","null",null,null,!0);n.style.fontWeight="bold",g.containsLabel||g.autoSize||0!=g.edges.length||P.appendChild(n);s=this.createCellOption(mxResources.get("formattedText"),"html","0",null,null,null,e.actions.get("formattedText"));s.style.fontWeight="bold",P.appendChild(s);l=this.createPanel();l.style.paddingTop="10px",l.style.paddingBottom="28px",l.style.fontWeight="normal";n=document.createElement("div");n.style.position="absolute",n.style.width="70px",n.style.marginTop="0px",n.style.fontWeight="bold",mxUtils.write(n,mxResources.get("spacing")),l.appendChild(n);var Y=this.addUnitInput(l,"pt",91,44,function(){nt.apply(this,arguments)}),W=this.addUnitInput(l,"pt",20,44,function(){et.apply(this,arguments)});mxUtils.br(l),this.addLabel(l,mxResources.get("top"),91),this.addLabel(l,mxResources.get("global"),20),mxUtils.br(l),mxUtils.br(l);var j,X,Z,K=this.addUnitInput(l,"pt",162,44,function(){st.apply(this,arguments)}),Q=this.addUnitInput(l,"pt",91,44,function(){lt.apply(this,arguments)}),J=this.addUnitInput(l,"pt",20,44,function(){it.apply(this,arguments)});function q(t,e){mxClient.IS_IE&&(mxClient.IS_QUIRKS||document.documentMode<10)?t.style.filter=e?"progid:DXImageTransform.Microsoft.Gradient(StartColorStr='#c5ecff', EndColorStr='#87d4fb', GradientType=0)":"":t.style.backgroundImage=e?"linear-gradient(#c5ecff 0px,#87d4fb 100%)":""}mxUtils.br(l),this.addLabel(l,mxResources.get("left"),162),this.addLabel(l,mxResources.get("bottom"),91),this.addLabel(l,mxResources.get("right"),20),c.cellEditor.isContentEditing()?(X=j=null,t.appendChild(this.createRelativeOption(mxResources.get("lineheight"),null,null,function(t){var e=""==t.value?120:parseInt(t.value),e=Math.max(0,isNaN(e)?120:e);null!=j&&(c.cellEditor.restoreSelection(j),j=null);for(var n=c.getSelectedElement();null!=n&&n.nodeType!=mxConstants.NODETYPE_ELEMENT;)n=n.parentNode;null!=n&&n==c.cellEditor.textarea&&null!=c.cellEditor.textarea.firstChild&&("P"!=c.cellEditor.textarea.firstChild.nodeName&&(c.cellEditor.textarea.innerHTML="

"+c.cellEditor.textarea.innerHTML+"

"),n=c.cellEditor.textarea.firstChild),null!=n&&null!=c.cellEditor.textarea&&n!=c.cellEditor.textarea&&c.cellEditor.textarea.contains(n)&&(n.style.lineHeight=e+"%"),t.value=e+" %"},function(t){X=t,mxEvent.addListener(t,"mousedown",function(){document.activeElement==c.cellEditor.textarea&&(j=c.cellEditor.saveSelection())}),mxEvent.addListener(t,"touchstart",function(){document.activeElement==c.cellEditor.textarea&&(j=c.cellEditor.saveSelection())}),t.value="120 %"})),(s=i.cloneNode(!1)).style.paddingLeft="0px",n=this.editorUi.toolbar.addItems(["link","image"],s,!0),Z=[this.editorUi.toolbar.addButton("geSprite-horizontalrule",mxResources.get("insertHorizontalRule"),function(){document.execCommand("inserthorizontalrule",!1)},s),this.editorUi.toolbar.addMenuFunctionInContainer(s,"geSprite-table",mxResources.get("table"),!1,mxUtils.bind(this,function(t){this.editorUi.menus.addInsertTableItem(t)}))],this.styleButtons(n),this.styleButtons(Z),(n=this.createPanel()).style.paddingTop="10px",n.style.paddingBottom="10px",n.appendChild(this.createTitle(mxResources.get("insert"))),n.appendChild(s),t.appendChild(n),mxClient.IS_QUIRKS&&(n.style.height="70"),(s=i.cloneNode(!1)).style.paddingLeft="0px",Z=[this.editorUi.toolbar.addButton("geSprite-insertcolumnbefore",mxResources.get("insertColumnBefore"),mxUtils.bind(this,function(){try{null!=T&&c.insertColumn(T,null!=A?A.cellIndex:0)}catch(t){this.editorUi.handleError(t)}}),s),this.editorUi.toolbar.addButton("geSprite-insertcolumnafter",mxResources.get("insertColumnAfter"),mxUtils.bind(this,function(){try{null!=T&&c.insertColumn(T,null!=A?A.cellIndex+1:-1)}catch(t){this.editorUi.handleError(t)}}),s),this.editorUi.toolbar.addButton("geSprite-deletecolumn",mxResources.get("deleteColumn"),mxUtils.bind(this,function(){try{null!=T&&null!=A&&c.deleteColumn(T,A.cellIndex)}catch(t){this.editorUi.handleError(t)}}),s),this.editorUi.toolbar.addButton("geSprite-insertrowbefore",mxResources.get("insertRowBefore"),mxUtils.bind(this,function(){try{null!=T&&null!=L&&c.insertRow(T,L.sectionRowIndex)}catch(t){this.editorUi.handleError(t)}}),s),this.editorUi.toolbar.addButton("geSprite-insertrowafter",mxResources.get("insertRowAfter"),mxUtils.bind(this,function(){try{null!=T&&null!=L&&c.insertRow(T,L.sectionRowIndex+1)}catch(t){this.editorUi.handleError(t)}}),s),this.editorUi.toolbar.addButton("geSprite-deleterow",mxResources.get("deleteRow"),mxUtils.bind(this,function(){try{null!=T&&null!=L&&c.deleteRow(T,L.sectionRowIndex)}catch(t){this.editorUi.handleError(t)}}),s)],this.styleButtons(Z),Z[2].style.marginRight="9px",(n=this.createPanel()).style.paddingTop="10px",n.style.paddingBottom="10px",n.appendChild(this.createTitle(mxResources.get("table"))),n.appendChild(s),mxClient.IS_QUIRKS&&(mxUtils.br(t),n.style.height="70"),(i=i.cloneNode(!1)).style.paddingLeft="0px",Z=[this.editorUi.toolbar.addButton("geSprite-strokecolor",mxResources.get("borderColor"),mxUtils.bind(this,function(n){var t;null!=T&&(t=T.style.borderColor.replace(/\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,function(t,e,n,i){return"#"+("0"+Number(e).toString(16)).substr(-2)+("0"+Number(n).toString(16)).substr(-2)+("0"+Number(i).toString(16)).substr(-2)}),this.editorUi.pickColor(t,function(t){var e=null==A||null!=n&&mxEvent.isShiftDown(n)?T:A;c.processElements(e,function(t){t.style.border=null}),null==t||t==mxConstants.NONE?(e.removeAttribute("border"),e.style.border="",e.style.borderCollapse=""):(e.setAttribute("border","1"),e.style.border="1px solid "+t,e.style.borderCollapse="collapse")}))}),i),this.editorUi.toolbar.addButton("geSprite-fillcolor",mxResources.get("backgroundColor"),mxUtils.bind(this,function(n){var t;null!=T&&(t=T.style.backgroundColor.replace(/\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,function(t,e,n,i){return"#"+("0"+Number(e).toString(16)).substr(-2)+("0"+Number(n).toString(16)).substr(-2)+("0"+Number(i).toString(16)).substr(-2)}),this.editorUi.pickColor(t,function(t){var e=null==A||null!=n&&mxEvent.isShiftDown(n)?T:A;c.processElements(e,function(t){t.style.backgroundColor=null}),null==t||t==mxConstants.NONE?e.style.backgroundColor="":e.style.backgroundColor=t}))}),i),this.editorUi.toolbar.addButton("geSprite-fit",mxResources.get("spacing"),function(){var t;null!=T&&(t=T.getAttribute("cellPadding")||0,t=new FilenameDialog(e,t,mxResources.get("apply"),mxUtils.bind(this,function(t){null!=t&&0e.length+1)return t.substring(t.length-e.length-1,t.length)=="-"+e}return!1}null!=s&&(q(y[0],"bold"==s.fontWeight||400'+mxUtils.htmlEntities(mxResources.get("none"))+"","connector"==h.style.shape||"filledEdge"==h.style.shape?(this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_CLASSIC,1],"geIcon geSprite geSprite-startclassic",null,!1).setAttribute("title",mxResources.get("classic")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_CLASSIC_THIN,1],"geIcon geSprite geSprite-startclassicthin",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_OPEN,0],"geIcon geSprite geSprite-startopen",null,!1).setAttribute("title",mxResources.get("openArrow")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_OPEN_THIN,0],"geIcon geSprite geSprite-startopenthin",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["openAsync",0],"geIcon geSprite geSprite-startopenasync",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_BLOCK,1],"geIcon geSprite geSprite-startblock",null,!1).setAttribute("title",mxResources.get("block")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_BLOCK_THIN,1],"geIcon geSprite geSprite-startblockthin",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["async",1],"geIcon geSprite geSprite-startasync",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_OVAL,1],"geIcon geSprite geSprite-startoval",null,!1).setAttribute("title",mxResources.get("oval")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_DIAMOND,1],"geIcon geSprite geSprite-startdiamond",null,!1).setAttribute("title",mxResources.get("diamond")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_DIAMOND_THIN,1],"geIcon geSprite geSprite-startthindiamond",null,!1).setAttribute("title",mxResources.get("diamondThin")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_CLASSIC,0],"geIcon geSprite geSprite-startclassictrans",null,!1).setAttribute("title",mxResources.get("classic")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_CLASSIC_THIN,0],"geIcon geSprite geSprite-startclassicthintrans",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_BLOCK,0],"geIcon geSprite geSprite-startblocktrans",null,!1).setAttribute("title",mxResources.get("block")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_BLOCK_THIN,0],"geIcon geSprite geSprite-startblockthintrans",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["async",0],"geIcon geSprite geSprite-startasynctrans",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_OVAL,0],"geIcon geSprite geSprite-startovaltrans",null,!1).setAttribute("title",mxResources.get("oval")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_DIAMOND,0],"geIcon geSprite geSprite-startdiamondtrans",null,!1).setAttribute("title",mxResources.get("diamond")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],[mxConstants.ARROW_DIAMOND_THIN,0],"geIcon geSprite geSprite-startthindiamondtrans",null,!1).setAttribute("title",mxResources.get("diamondThin")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["box",0],"geIcon geSprite geSvgSprite geSprite-box",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["halfCircle",0],"geIcon geSprite geSvgSprite geSprite-halfCircle",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["dash",0],"geIcon geSprite geSprite-startdash",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["cross",0],"geIcon geSprite geSprite-startcross",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["circlePlus",0],"geIcon geSprite geSprite-startcircleplus",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["circle",1],"geIcon geSprite geSprite-startcircle",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["ERone",0],"geIcon geSprite geSprite-starterone",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["ERmandOne",0],"geIcon geSprite geSprite-starteronetoone",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["ERmany",0],"geIcon geSprite geSprite-startermany",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["ERoneToMany",0],"geIcon geSprite geSprite-starteronetomany",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["ERzeroToOne",1],"geIcon geSprite geSprite-starteroneopt",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW,"startFill"],["ERzeroToMany",1],"geIcon geSprite geSprite-startermanyopt",null,!1)):this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_STARTARROW],[mxConstants.ARROW_BLOCK],"geIcon geSprite geSprite-startblocktrans",null,!1).setAttribute("title",mxResources.get("block")))})),T=this.editorUi.toolbar.addMenuFunctionInContainer(s,"geSprite-endclassic",mxResources.get("lineend"),!1,mxUtils.bind(this,function(t){var e;"connector"!=h.style.shape&&"flexArrow"!=h.style.shape&&"filledEdge"!=h.style.shape||((e=this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.NONE,0],"geIcon",null,!1)).setAttribute("title",mxResources.get("none")),e.firstChild.firstChild.innerHTML=''+mxUtils.htmlEntities(mxResources.get("none"))+"","connector"==h.style.shape||"filledEdge"==h.style.shape?(this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_CLASSIC,1],"geIcon geSprite geSprite-endclassic",null,!1).setAttribute("title",mxResources.get("classic")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_CLASSIC_THIN,1],"geIcon geSprite geSprite-endclassicthin",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_OPEN,0],"geIcon geSprite geSprite-endopen",null,!1).setAttribute("title",mxResources.get("openArrow")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_OPEN_THIN,0],"geIcon geSprite geSprite-endopenthin",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["openAsync",0],"geIcon geSprite geSprite-endopenasync",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_BLOCK,1],"geIcon geSprite geSprite-endblock",null,!1).setAttribute("title",mxResources.get("block")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_BLOCK_THIN,1],"geIcon geSprite geSprite-endblockthin",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["async",1],"geIcon geSprite geSprite-endasync",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_OVAL,1],"geIcon geSprite geSprite-endoval",null,!1).setAttribute("title",mxResources.get("oval")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_DIAMOND,1],"geIcon geSprite geSprite-enddiamond",null,!1).setAttribute("title",mxResources.get("diamond")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_DIAMOND_THIN,1],"geIcon geSprite geSprite-endthindiamond",null,!1).setAttribute("title",mxResources.get("diamondThin")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_CLASSIC,0],"geIcon geSprite geSprite-endclassictrans",null,!1).setAttribute("title",mxResources.get("classic")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_CLASSIC_THIN,0],"geIcon geSprite geSprite-endclassicthintrans",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_BLOCK,0],"geIcon geSprite geSprite-endblocktrans",null,!1).setAttribute("title",mxResources.get("block")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_BLOCK_THIN,0],"geIcon geSprite geSprite-endblockthintrans",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["async",0],"geIcon geSprite geSprite-endasynctrans",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_OVAL,0],"geIcon geSprite geSprite-endovaltrans",null,!1).setAttribute("title",mxResources.get("oval")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_DIAMOND,0],"geIcon geSprite geSprite-enddiamondtrans",null,!1).setAttribute("title",mxResources.get("diamond")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],[mxConstants.ARROW_DIAMOND_THIN,0],"geIcon geSprite geSprite-endthindiamondtrans",null,!1).setAttribute("title",mxResources.get("diamondThin")),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["box",0],"geIcon geSprite geSvgSprite geFlipSprite geSprite-box",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["halfCircle",0],"geIcon geSprite geSvgSprite geFlipSprite geSprite-halfCircle",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["dash",0],"geIcon geSprite geSprite-enddash",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["cross",0],"geIcon geSprite geSprite-endcross",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["circlePlus",0],"geIcon geSprite geSprite-endcircleplus",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["circle",1],"geIcon geSprite geSprite-endcircle",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["ERone",0],"geIcon geSprite geSprite-enderone",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["ERmandOne",0],"geIcon geSprite geSprite-enderonetoone",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["ERmany",0],"geIcon geSprite geSprite-endermany",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["ERoneToMany",0],"geIcon geSprite geSprite-enderonetomany",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["ERzeroToOne",1],"geIcon geSprite geSprite-enderoneopt",null,!1),this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW,"endFill"],["ERzeroToMany",1],"geIcon geSprite geSprite-endermanyopt",null,!1)):this.editorUi.menus.edgeStyleChange(t,"",[mxConstants.STYLE_ENDARROW],[mxConstants.ARROW_BLOCK],"geIcon geSprite geSprite-endblocktrans",null,!1).setAttribute("title",mxResources.get("block")))}));this.addArrow(y,8),this.addArrow(w),this.addArrow(b),this.addArrow(T);o=this.addArrow(g,9);o.className="geIcon",o.style.width="auto";p=this.addArrow(f,9);p.className="geIcon",p.style.width="22px";var A=document.createElement("div");A.style.width="85px",A.style.height="1px",A.style.borderBottom="1px solid "+this.defaultStrokeColor,A.style.marginBottom="9px",o.appendChild(A);var L=document.createElement("div");L.style.width="23px",L.style.height="1px",L.style.borderBottom="1px solid "+this.defaultStrokeColor,L.style.marginBottom="9px",p.appendChild(L),g.style.height="15px",f.style.height="15px",y.style.height="15px",w.style.height="17px",b.style.marginLeft="3px",b.style.height="17px",T.style.marginLeft="3px",T.style.height="17px",t.appendChild(e),t.appendChild(x),t.appendChild(m);p=m.cloneNode(!1);p.style.paddingBottom="6px",p.style.paddingTop="4px",p.style.fontWeight="normal";g=document.createElement("div");g.style.position="absolute",g.style.marginLeft="3px",g.style.marginBottom="12px",g.style.marginTop="2px",g.style.fontWeight="normal",g.style.width="76px",mxUtils.write(g,mxResources.get("lineend")),p.appendChild(g);var I=this.addUnitInput(p,"pt",74,33,function(){D.apply(this,arguments)}),M=this.addUnitInput(p,"pt",20,33,function(){_.apply(this,arguments)});mxUtils.br(p);f=document.createElement("div");f.style.height="8px",p.appendChild(f),g=g.cloneNode(!1),mxUtils.write(g,mxResources.get("linestart")),p.appendChild(g);var R=this.addUnitInput(p,"pt",74,33,function(){H.apply(this,arguments)}),P=this.addUnitInput(p,"pt",20,33,function(){N.apply(this,arguments)});mxUtils.br(p),this.addLabel(p,mxResources.get("spacing"),74,50),this.addLabel(p,mxResources.get("size"),20,50),mxUtils.br(p);e=e.cloneNode(!1);e.style.fontWeight="normal",e.style.position="relative",e.style.paddingLeft="16px",e.style.marginBottom="2px",e.style.marginTop="6px",e.style.borderWidth="0px",e.style.paddingBottom="18px",(g=document.createElement("div")).style.position="absolute",g.style.marginLeft="3px",g.style.marginBottom="12px",g.style.marginTop="1px",g.style.fontWeight="normal",g.style.width="120px",mxUtils.write(g,mxResources.get("perimeter")),e.appendChild(g);var U=this.addUnitInput(e,"pt",20,41,function(){G.apply(this,arguments)});h.edges.length==a.getSelectionCount()?(t.appendChild(s),mxClient.IS_QUIRKS&&(mxUtils.br(t),mxUtils.br(t)),t.appendChild(p)):h.vertices.length==a.getSelectionCount()&&(mxClient.IS_QUIRKS&&mxUtils.br(t),t.appendChild(e));var O=mxUtils.bind(this,function(t,e,n){h=this.format.getSelectionState();mxUtils.getValue(h.style,u,null);!n&&document.activeElement==C||(s=parseInt(mxUtils.getValue(h.style,mxConstants.STYLE_STROKEWIDTH,1)),C.value=isNaN(s)?"":s+" pt"),!n&&document.activeElement==v||(s=parseInt(mxUtils.getValue(h.style,mxConstants.STYLE_STROKEWIDTH,1)),v.value=isNaN(s)?"":s+" pt"),d.style.visibility="connector"==h.style.shape||"filledEdge"==h.style.shape?"":"hidden","1"==mxUtils.getValue(h.style,mxConstants.STYLE_CURVED,null)?d.value="curved":"1"==mxUtils.getValue(h.style,mxConstants.STYLE_ROUNDED,null)&&(d.value="rounded"),"1"==mxUtils.getValue(h.style,mxConstants.STYLE_DASHED,null)?null==mxUtils.getValue(h.style,mxConstants.STYLE_DASH_PATTERN,null)?A.style.borderBottom="1px dashed "+this.defaultStrokeColor:A.style.borderBottom="1px dotted "+this.defaultStrokeColor:A.style.borderBottom="1px solid "+this.defaultStrokeColor,L.style.borderBottom=A.style.borderBottom;var i=w.getElementsByTagName("div")[0];null!=i&&(o=mxUtils.getValue(h.style,mxConstants.STYLE_EDGE,null),"1"==mxUtils.getValue(h.style,mxConstants.STYLE_NOEDGESTYLE,null)&&(o=null),"orthogonalEdgeStyle"==o&&"1"==mxUtils.getValue(h.style,mxConstants.STYLE_CURVED,null)?i.className="geSprite geSprite-curved":i.className="straight"==o||"none"==o||null==o?"geSprite geSprite-straight":"entityRelationEdgeStyle"==o?"geSprite geSprite-entity":"elbowEdgeStyle"==o?"geSprite "+("vertical"==mxUtils.getValue(h.style,mxConstants.STYLE_ELBOW,null)?"geSprite-verticalelbow":"geSprite-horizontalelbow"):"isometricEdgeStyle"==o?"geSprite "+("vertical"==mxUtils.getValue(h.style,mxConstants.STYLE_ELBOW,null)?"geSprite-verticalisometric":"geSprite-horizontalisometric"):"geSprite geSprite-orthogonal");i=y.getElementsByTagName("div")[0];function l(t,e,n,i){n=n.getElementsByTagName("div")[0];return null!=n&&(n.className=r.getCssClassForMarker(i,h.style.shape,t,e),"geSprite geSprite-noarrow"==n.className&&(n.innerHTML=mxUtils.htmlEntities(mxResources.get("none")),n.style.backgroundImage="none",n.style.verticalAlign="top",n.style.marginTop="5px",n.style.fontSize="10px",n.style.filter="none",n.style.color=this.defaultStrokeColor,n.nextSibling.style.marginTop="0px")),n}null!=i&&("link"==h.style.shape?i.className="geSprite geSprite-linkedge":"flexArrow"==h.style.shape?i.className="geSprite geSprite-arrow":"arrow"==h.style.shape?i.className="geSprite geSprite-simplearrow":i.className="geSprite geSprite-connection"),h.edges.length==a.getSelectionCount()?(x.style.display="",m.style.display="none"):(x.style.display="none",m.style.display="");var s,o=l(mxUtils.getValue(h.style,mxConstants.STYLE_STARTARROW,null),mxUtils.getValue(h.style,"startFill","1"),b,"start"),i=l(mxUtils.getValue(h.style,mxConstants.STYLE_ENDARROW,null),mxUtils.getValue(h.style,"endFill","1"),T,"end");null!=o&&null!=i&&("arrow"==h.style.shape?(o.className="geSprite geSprite-noarrow",i.className="geSprite geSprite-endblocktrans"):"link"==h.style.shape&&(o.className="geSprite geSprite-noarrow",i.className="geSprite geSprite-noarrow")),mxUtils.setOpacity(w,"arrow"==h.style.shape?30:100),"connector"!=h.style.shape&&"flexArrow"!=h.style.shape&&"filledEdge"!=h.style.shape?(mxUtils.setOpacity(b,30),mxUtils.setOpacity(T,30)):(mxUtils.setOpacity(b,100),mxUtils.setOpacity(T,100)),!n&&document.activeElement==P||(s=parseInt(mxUtils.getValue(h.style,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_MARKERSIZE)),P.value=isNaN(s)?"":s+" pt"),!n&&document.activeElement==R||(s=parseInt(mxUtils.getValue(h.style,mxConstants.STYLE_SOURCE_PERIMETER_SPACING,0)),R.value=isNaN(s)?"":s+" pt"),!n&&document.activeElement==M||(s=parseInt(mxUtils.getValue(h.style,mxConstants.STYLE_ENDSIZE,mxConstants.DEFAULT_MARKERSIZE)),M.value=isNaN(s)?"":s+" pt"),!n&&document.activeElement==R||(s=parseInt(mxUtils.getValue(h.style,mxConstants.STYLE_TARGET_PERIMETER_SPACING,0)),I.value=isNaN(s)?"":s+" pt"),!n&&document.activeElement==U||(s=parseInt(mxUtils.getValue(h.style,mxConstants.STYLE_PERIMETER_SPACING,0)),U.value=isNaN(s)?"":s+" pt")}),N=this.installInputHandler(P,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_MARKERSIZE,0,999," pt"),H=this.installInputHandler(R,mxConstants.STYLE_SOURCE_PERIMETER_SPACING,0,-999,999," pt"),_=this.installInputHandler(M,mxConstants.STYLE_ENDSIZE,mxConstants.DEFAULT_MARKERSIZE,0,999," pt"),D=this.installInputHandler(I,mxConstants.STYLE_TARGET_PERIMETER_SPACING,0,-999,999," pt"),G=this.installInputHandler(U,mxConstants.STYLE_PERIMETER_SPACING,0,0,999," pt");return this.addKeyHandler(C,O),this.addKeyHandler(P,O),this.addKeyHandler(R,O),this.addKeyHandler(M,O),this.addKeyHandler(I,O),this.addKeyHandler(U,O),a.getModel().addListener(mxEvent.CHANGE,O),this.listeners.push({destroy:function(){a.getModel().removeListener(O)}}),O(),t},StyleFormatPanel.prototype.addLineJumps=function(t){var i=this.format.getSelectionState();if(Graph.lineJumpsEnabled&&0o+a?t.y=n.y:t.x=n.x),mxUtils.getPerimeterPoint(r,t,n)},mxStyleRegistry.putValue("parallelogramPerimeter",mxPerimeter.ParallelogramPerimeter),mxPerimeter.TrapezoidPerimeter=function(t,e,n,i){var l="0"!=mxUtils.getValue(e.style,"fixedSize","0"),s=l?E.prototype.fixedSize:E.prototype.size;null!=e&&(s=mxUtils.getValue(e.style,"size",s)),l&&(s*=e.view.scale);var o,r,a=t.x,h=t.y,d=t.width,u=t.height,p=null!=e?mxUtils.getValue(e.style,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST):mxConstants.DIRECTION_EAST,e=[];e=p==mxConstants.DIRECTION_EAST?[new mxPoint(a+(o=l?Math.max(0,Math.min(.5*d,s)):d*Math.max(0,Math.min(1,s))),h),new mxPoint(a+d-o,h),new mxPoint(a+d,h+u),new mxPoint(a,h+u),new mxPoint(a+o,h)]:p==mxConstants.DIRECTION_WEST?(o=l?Math.max(0,Math.min(d,s)):d*Math.max(0,Math.min(1,s)),[new mxPoint(a,h),new mxPoint(a+d,h),new mxPoint(a+d-o,h+u),new mxPoint(a+o,h+u),new mxPoint(a,h)]):p==mxConstants.DIRECTION_NORTH?[new mxPoint(a,h+(r=l?Math.max(0,Math.min(u,s)):u*Math.max(0,Math.min(1,s)))),new mxPoint(a+d,h),new mxPoint(a+d,h+u),new mxPoint(a,h+u-r),new mxPoint(a,h+r)]:(r=l?Math.max(0,Math.min(u,s)):u*Math.max(0,Math.min(1,s)),[new mxPoint(a,h),new mxPoint(a+d,h+r),new mxPoint(a+d,h+u-r),new mxPoint(a,h+u),new mxPoint(a,h)]);t=new mxPoint(t.getCenterX(),t.getCenterY());return i&&(n.xa+d?t.y=n.y:t.x=n.x),mxUtils.getPerimeterPoint(e,t,n)},mxStyleRegistry.putValue("trapezoidPerimeter",mxPerimeter.TrapezoidPerimeter),mxPerimeter.StepPerimeter=function(t,e,n,i){var l="0"!=mxUtils.getValue(e.style,"fixedSize","0"),s=l?O.prototype.fixedSize:O.prototype.size;null!=e&&(s=mxUtils.getValue(e.style,"size",s)),l&&(s*=e.view.scale);var o,r,a=t.x,h=t.y,d=t.width,u=t.height,p=t.getCenterX(),t=t.getCenterY(),e=null!=e?mxUtils.getValue(e.style,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST):mxConstants.DIRECTION_EAST;h=e==mxConstants.DIRECTION_EAST?(o=l?Math.max(0,Math.min(d,s)):d*Math.max(0,Math.min(1,s)),[new mxPoint(a,h),new mxPoint(a+d-o,h),new mxPoint(a+d,t),new mxPoint(a+d-o,h+u),new mxPoint(a,h+u),new mxPoint(a+o,t),new mxPoint(a,h)]):e==mxConstants.DIRECTION_WEST?[new mxPoint(a+(o=l?Math.max(0,Math.min(d,s)):d*Math.max(0,Math.min(1,s))),h),new mxPoint(a+d,h),new mxPoint(a+d-o,t),new mxPoint(a+d,h+u),new mxPoint(a+o,h+u),new mxPoint(a,t),new mxPoint(a+o,h)]:e==mxConstants.DIRECTION_NORTH?[new mxPoint(a,h+(r=l?Math.max(0,Math.min(u,s)):u*Math.max(0,Math.min(1,s)))),new mxPoint(p,h),new mxPoint(a+d,h+r),new mxPoint(a+d,h+u),new mxPoint(p,h+u-r),new mxPoint(a,h+u),new mxPoint(a,h+r)]:(r=l?Math.max(0,Math.min(u,s)):u*Math.max(0,Math.min(1,s)),[new mxPoint(a,h),new mxPoint(p,h+r),new mxPoint(a+d,h),new mxPoint(a+d,h+u-r),new mxPoint(p,h+u),new mxPoint(a,h+u-r),new mxPoint(a,h)]);t=new mxPoint(p,t);return i&&(n.xa+d?t.y=n.y:t.x=n.x),mxUtils.getPerimeterPoint(h,t,n)},mxStyleRegistry.putValue("stepPerimeter",mxPerimeter.StepPerimeter),mxPerimeter.HexagonPerimeter2=function(t,e,n,i){var l="0"!=mxUtils.getValue(e.style,"fixedSize","0"),s=l?N.prototype.fixedSize:N.prototype.size;null!=e&&(s=mxUtils.getValue(e.style,"size",s)),l&&(s*=e.view.scale);var o=t.x,r=t.y,a=t.width,h=t.height,d=t.getCenterX(),t=t.getCenterY(),e=null!=e?mxUtils.getValue(e.style,mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_EAST):mxConstants.DIRECTION_EAST;r=e==mxConstants.DIRECTION_NORTH||e==mxConstants.DIRECTION_SOUTH?(e=l?Math.max(0,Math.min(h,s)):h*Math.max(0,Math.min(1,s)),[new mxPoint(d,r),new mxPoint(o+a,r+e),new mxPoint(o+a,r+h-e),new mxPoint(d,r+h),new mxPoint(o,r+h-e),new mxPoint(o,r+e),new mxPoint(d,r)]):[new mxPoint(o+(s=l?Math.max(0,Math.min(a,s)):a*Math.max(0,Math.min(1,s))),r),new mxPoint(o+a-s,r),new mxPoint(o+a,t),new mxPoint(o+a-s,r+h),new mxPoint(o+s,r+h),new mxPoint(o,t),new mxPoint(o+s,r)];t=new mxPoint(d,t);return i&&(n.xo+a?t.y=n.y:t.x=n.x),mxUtils.getPerimeterPoint(r,t,n)},mxStyleRegistry.putValue("hexagonPerimeter2",mxPerimeter.HexagonPerimeter2),mxUtils.extend(Q,mxShape),Q.prototype.size=10,Q.prototype.paintBackground=function(t,e,n,i,l){var s=parseFloat(mxUtils.getValue(this.style,"size",this.size));t.translate(e,n),t.ellipse((i-s)/2,0,s,s),t.fillAndStroke(),t.begin(),t.moveTo(i/2,s),t.lineTo(i/2,l),t.end(),t.stroke()},mxCellRenderer.registerShape("lollipop",Q),mxUtils.extend(J,mxShape),J.prototype.size=10,J.prototype.inset=2,J.prototype.paintBackground=function(t,e,n,i,l){var s=parseFloat(mxUtils.getValue(this.style,"size",this.size)),o=parseFloat(mxUtils.getValue(this.style,"inset",this.inset))+this.strokewidth;t.translate(e,n),t.begin(),t.moveTo(i/2,s+o),t.lineTo(i/2,l),t.end(),t.stroke(),t.begin(),t.moveTo((i-s)/2-o,s/2),t.quadTo((i-s)/2-o,s+o,i/2,s+o),t.quadTo((i+s)/2+o,s+o,(i+s)/2+o,s/2),t.end(),t.stroke()},mxCellRenderer.registerShape("requires",J),mxUtils.extend(q,mxShape),q.prototype.paintBackground=function(t,e,n,i,l){t.translate(e,n),t.begin(),t.moveTo(0,0),t.quadTo(i,0,i,l/2),t.quadTo(i,l,0,l),t.end(),t.stroke()},mxCellRenderer.registerShape("requiredInterface",q),mxUtils.extend($,mxShape),$.prototype.inset=2,$.prototype.paintBackground=function(t,e,n,i,l){var s=parseFloat(mxUtils.getValue(this.style,"inset",this.inset))+this.strokewidth;t.translate(e,n),t.ellipse(0,s,i-2*s,l-2*s),t.fillAndStroke(),t.begin(),t.moveTo(i/2,0),t.quadTo(i,0,i,l/2),t.quadTo(i,l,i/2,l),t.end(),t.stroke()},mxCellRenderer.registerShape("providedRequiredInterface",$),mxUtils.extend(tt,mxCylinder),tt.prototype.jettyWidth=20,tt.prototype.jettyHeight=10,tt.prototype.redrawPath=function(t,e,n,i,l,s){var o=parseFloat(mxUtils.getValue(this.style,"jettyWidth",this.jettyWidth)),r=parseFloat(mxUtils.getValue(this.style,"jettyHeight",this.jettyHeight)),a=o/2,h=a+o/2,d=Math.min(r,l-r),o=Math.min(d+2*r,l-r);s?(t.moveTo(a,d),t.lineTo(h,d),t.lineTo(h,d+r),t.lineTo(a,d+r),t.moveTo(a,o),t.lineTo(h,o),t.lineTo(h,o+r),t.lineTo(a,o+r)):(t.moveTo(a,0),t.lineTo(i,0),t.lineTo(i,l),t.lineTo(a,l),t.lineTo(a,o+r),t.lineTo(0,o+r),t.lineTo(0,o),t.lineTo(a,o),t.lineTo(a,d+r),t.lineTo(0,d+r),t.lineTo(0,d),t.lineTo(a,d),t.close()),t.end()},mxCellRenderer.registerShape("module",tt),mxUtils.extend(et,mxCylinder),et.prototype.jettyWidth=32,et.prototype.jettyHeight=12,et.prototype.redrawPath=function(t,e,n,i,l,s){var o=parseFloat(mxUtils.getValue(this.style,"jettyWidth",this.jettyWidth)),r=parseFloat(mxUtils.getValue(this.style,"jettyHeight",this.jettyHeight)),a=o/2,h=a+o/2,d=.3*l-r/2,o=.7*l-r/2;s?(t.moveTo(a,d),t.lineTo(h,d),t.lineTo(h,d+r),t.lineTo(a,d+r),t.moveTo(a,o),t.lineTo(h,o),t.lineTo(h,o+r),t.lineTo(a,o+r)):(t.moveTo(a,0),t.lineTo(i,0),t.lineTo(i,l),t.lineTo(a,l),t.lineTo(a,o+r),t.lineTo(0,o+r),t.lineTo(0,o),t.lineTo(a,o),t.lineTo(a,d+r),t.lineTo(0,d+r),t.lineTo(0,d),t.lineTo(a,d),t.close()),t.end()},mxCellRenderer.registerShape("component",et),mxUtils.extend(nt,mxRectangleShape),nt.prototype.paintForeground=function(t,e,n,i,l){var s=i/2,o=l/2,r=mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,mxConstants.LINE_ARCSIZE)/2;t.begin(),this.addPoints(t,[new mxPoint(e+s,n),new mxPoint(e+i,n+o),new mxPoint(e+s,n+l),new mxPoint(e,n+o)],this.isRounded,r,!0),t.stroke(),mxRectangleShape.prototype.paintForeground.apply(this,arguments)},mxCellRenderer.registerShape("associativeEntity",nt),mxUtils.extend(it,mxDoubleEllipse),it.prototype.outerStroke=!0,it.prototype.paintVertexShape=function(t,e,n,i,l){var s=Math.min(4,Math.min(i/5,l/5));0/g,"\n")),(i=document.createElement("div")).innerHTML=d.sanitizeHtml(l),l=mxUtils.extractTextWithWhitespace(i.childNodes),d.cellLabelChanged(state.cell,l),d.setCellStyles("html",e,[s[o]])):"0"==n&&"1"==e&&(l=mxUtils.htmlEntities(d.convertValueToString(state.cell),!1),"0"!=mxUtils.getValue(state.style,"nl2Br","1")&&(l=l.replace(/\n/g,"
")),d.cellLabelChanged(state.cell,d.sanitizeHtml(l)),d.setCellStyles("html",e,[s[o]])));a.fireEvent(new mxEventObject("styleChanged","keys",["html"],"values",[null!=e?e:"0"],"cells",s))}finally{d.getModel().endUpdate()}}}),this.addAction("wordWrap",function(){var t=d.getView().getState(d.getSelectionCell()),e="wrap";d.stopEditing(),null!=t&&"wrap"==t.style[mxConstants.STYLE_WHITE_SPACE]&&(e=null),d.setCellStyles(mxConstants.STYLE_WHITE_SPACE,e)}),this.addAction("rotation",function(){var t="0",e=d.getView().getState(d.getSelectionCell());null!=e&&(t=e.style[mxConstants.STYLE_ROTATION]||t);t=new FilenameDialog(a,t,mxResources.get("apply"),function(t){null!=t&&0"))}),i)}t(mxResources.get("normal"),"p"),t("","h1").firstChild.nextSibling.innerHTML='

'+mxResources.get("heading")+" 1

",t("","h2").firstChild.nextSibling.innerHTML='

'+mxResources.get("heading")+" 2

",t("","h3").firstChild.nextSibling.innerHTML='

'+mxResources.get("heading")+" 3

",t("","h4").firstChild.nextSibling.innerHTML='

'+mxResources.get("heading")+" 4

",t("","h5").firstChild.nextSibling.innerHTML='
'+mxResources.get("heading")+" 5
",t("","h6").firstChild.nextSibling.innerHTML='
'+mxResources.get("heading")+" 6
",t("","pre").firstChild.nextSibling.innerHTML='
'+mxResources.get("formatted")+"
",t("","blockquote").firstChild.nextSibling.innerHTML='
'+mxResources.get("blockquote")+"
"}))),this.put("fontSize",new Menu(mxUtils.bind(this,function(t,e){for(var n=[6,8,9,10,11,12,14,18,24,36,48,72],i=mxUtils.bind(this,function(n){this.styleChange(t,n,[mxConstants.STYLE_FONTSIZE],[n],null,e,function(){if(null!=s.cellEditor.textarea){document.execCommand("fontSize",!1,"3");for(var t=s.cellEditor.textarea.getElementsByTagName("font"),e=0;e"],i=0;i");for(var l=0;l
");n.push("")}return n.push(""),n.join("")}(e,n));var r=i.cellEditor.textarea.getElementsByTagName("table");if(r.length==s.length+1)for(o=r.length-1;0<=o;o--)if(0==o||r[o]!=s[o-1]){i.selectNode(r[o].rows[0].cells[0]);break}}});var r=this.editorUi.editor.graph,a=null,h=null;var e=t.addItem("",null,null,e,null,null,null,!0),d='';e.firstChild.innerHTML="";var u=function(t,e){var n=document.createElement("table");n.setAttribute("border","1"),n.style.borderCollapse="collapse",n.style.borderStyle="solid",mxClient.IS_QUIRKS||n.setAttribute("cellPadding","8");for(var i=0;i',Toolbar.prototype.selectedBackground="#d0d0d0",Toolbar.prototype.unselectedBackground="none",Toolbar.prototype.staticElements=null,Toolbar.prototype.init=function(){var t,e=screen.width;700<=(e-=740'+this.dropdownImageHtml,t.style.width=mxClient.IS_QUIRKS?i+"px":i-o+"px",mxClient.IS_QUIRKS&&(t.style.height=EditorUi.compactUi?"24px":"26px"),EditorUi.compactUi&&(t.getElementsByTagName("img")[0].style.left="24px",t.getElementsByTagName("img")[0].style.top="5px",t.style.width=mxClient.IS_QUIRKS?n+"px":n-10+"px")},Toolbar.prototype.setFontName=function(t){null!=this.fontMenu&&(this.fontMenu.innerHTML='
'+mxUtils.htmlEntities(t)+"
"+this.dropdownImageHtml)},Toolbar.prototype.setFontSize=function(t){null!=this.sizeMenu&&(this.sizeMenu.innerHTML='
'+mxUtils.htmlEntities(t)+"
"+this.dropdownImageHtml)},Toolbar.prototype.createTextToolbar=function(){var s=this.editorUi.editor.graph,t=this.addMenu("",mxResources.get("style"),!0,"formatBlock");t.style.position="relative",t.style.whiteSpace="nowrap",t.style.overflow="hidden",t.innerHTML=mxResources.get("style")+this.dropdownImageHtml,EditorUi.compactUi&&(t.style.paddingRight="18px",t.getElementsByTagName("img")[0].style.right="1px",t.getElementsByTagName("img")[0].style.top="5px"),this.addSeparator(),this.fontMenu=this.addMenu("",mxResources.get("fontFamily"),!0,"fontFamily"),this.fontMenu.style.position="relative",this.fontMenu.style.whiteSpace="nowrap",this.fontMenu.style.overflow="hidden",this.fontMenu.style.width=mxClient.IS_QUIRKS?"80px":"60px",this.setFontName(Menus.prototype.defaultFont),EditorUi.compactUi&&(this.fontMenu.style.paddingRight="18px",this.fontMenu.getElementsByTagName("img")[0].style.right="1px",this.fontMenu.getElementsByTagName("img")[0].style.top="5px"),this.addSeparator(),this.sizeMenu=this.addMenu(Menus.prototype.defaultFontSize,mxResources.get("fontSize"),!0,"fontSize"),this.sizeMenu.style.position="relative",this.sizeMenu.style.whiteSpace="nowrap",this.sizeMenu.style.overflow="hidden",this.sizeMenu.style.width=mxClient.IS_QUIRKS?"44px":"24px",this.setFontSize(Menus.prototype.defaultFontSize),EditorUi.compactUi&&(this.sizeMenu.style.paddingRight="18px",this.sizeMenu.getElementsByTagName("img")[0].style.right="1px",this.sizeMenu.getElementsByTagName("img")[0].style.top="5px");t=this.addItems(["-","undo","redo","-","bold","italic","underline"]);t[1].setAttribute("title",mxResources.get("undo")+" ("+this.editorUi.actions.get("undo").shortcut+")"),t[2].setAttribute("title",mxResources.get("redo")+" ("+this.editorUi.actions.get("redo").shortcut+")"),t[4].setAttribute("title",mxResources.get("bold")+" ("+this.editorUi.actions.get("bold").shortcut+")"),t[5].setAttribute("title",mxResources.get("italic")+" ("+this.editorUi.actions.get("italic").shortcut+")"),t[6].setAttribute("title",mxResources.get("underline")+" ("+this.editorUi.actions.get("underline").shortcut+")");t=this.addMenuFunction("",mxResources.get("align"),!1,mxUtils.bind(this,function(t){(e=t.addItem("",null,mxUtils.bind(this,function(t){s.cellEditor.alignText(mxConstants.ALIGN_LEFT,t)}),null,"geIcon geSprite geSprite-left")).setAttribute("title",mxResources.get("left")),(e=t.addItem("",null,mxUtils.bind(this,function(t){s.cellEditor.alignText(mxConstants.ALIGN_CENTER,t)}),null,"geIcon geSprite geSprite-center")).setAttribute("title",mxResources.get("center")),(e=t.addItem("",null,mxUtils.bind(this,function(t){s.cellEditor.alignText(mxConstants.ALIGN_RIGHT,t)}),null,"geIcon geSprite geSprite-right")).setAttribute("title",mxResources.get("right")),(e=t.addItem("",null,mxUtils.bind(this,function(){document.execCommand("justifyfull",!1,null)}),null,"geIcon geSprite geSprite-justifyfull")).setAttribute("title",mxResources.get("justifyfull")),(e=t.addItem("",null,mxUtils.bind(this,function(){document.execCommand("insertorderedlist",!1,null)}),null,"geIcon geSprite geSprite-orderedlist")).setAttribute("title",mxResources.get("numberedList")),(e=t.addItem("",null,mxUtils.bind(this,function(){document.execCommand("insertunorderedlist",!1,null)}),null,"geIcon geSprite geSprite-unorderedlist")).setAttribute("title",mxResources.get("bulletedList")),(e=t.addItem("",null,mxUtils.bind(this,function(){document.execCommand("outdent",!1,null)}),null,"geIcon geSprite geSprite-outdent")).setAttribute("title",mxResources.get("decreaseIndent")),(e=t.addItem("",null,mxUtils.bind(this,function(){document.execCommand("indent",!1,null)}),null,"geIcon geSprite geSprite-indent")).setAttribute("title",mxResources.get("increaseIndent"))}));t.style.position="relative",t.style.whiteSpace="nowrap",t.style.overflow="hidden",t.innerHTML='
'+this.dropdownImageHtml,t.style.width=mxClient.IS_QUIRKS?"50px":"30px",EditorUi.compactUi&&(t.getElementsByTagName("img")[0].style.left="22px",t.getElementsByTagName("img")[0].style.top="5px");t=this.addMenuFunction("",mxResources.get("format"),!1,mxUtils.bind(this,function(t){(e=t.addItem("",null,this.editorUi.actions.get("subscript").funct,null,"geIcon geSprite geSprite-subscript")).setAttribute("title",mxResources.get("subscript")+" ("+Editor.ctrlKey+"+,)"),(e=t.addItem("",null,this.editorUi.actions.get("superscript").funct,null,"geIcon geSprite geSprite-superscript")).setAttribute("title",mxResources.get("superscript")+" ("+Editor.ctrlKey+"+.)"),(e=t.addItem("",null,this.editorUi.actions.get("fontColor").funct,null,"geIcon geSprite geSprite-fontcolor")).setAttribute("title",mxResources.get("fontColor")),(e=t.addItem("",null,this.editorUi.actions.get("backgroundColor").funct,null,"geIcon geSprite geSprite-fontbackground")).setAttribute("title",mxResources.get("backgroundColor")),(e=t.addItem("",null,mxUtils.bind(this,function(){document.execCommand("removeformat",!1,null)}),null,"geIcon geSprite geSprite-removeformat")).setAttribute("title",mxResources.get("removeFormat"))}));t.style.position="relative",t.style.whiteSpace="nowrap",t.style.overflow="hidden",t.innerHTML='
'+this.dropdownImageHtml,t.style.width=mxClient.IS_QUIRKS?"50px":"30px",EditorUi.compactUi&&(t.getElementsByTagName("img")[0].style.left="22px",t.getElementsByTagName("img")[0].style.top="5px"),this.addSeparator(),this.addButton("geIcon geSprite geSprite-code",mxResources.get("html"),function(){s.cellEditor.toggleViewMode(),0'+this.dropdownImageHtml,t.style.width=mxClient.IS_QUIRKS?"36px":"16px",EditorUi.compactUi&&(t.getElementsByTagName("img")[0].style.left="24px",t.getElementsByTagName("img")[0].style.top="5px",t.style.width=mxClient.IS_QUIRKS?"50px":"30px"),this.addSeparator();var e=this.addMenuFunction("geIcon geSprite geSprite-table",mxResources.get("table"),!1,mxUtils.bind(this,function(t){var e,n=s.getSelectedElement(),i=s.getParentByNames(n,["TD","TH"],s.cellEditor.text2),l=s.getParentByName(n,"TR",s.cellEditor.text2);null==l?this.editorUi.menus.addInsertTableItem(t):(e=s.getParentByName(l,"TABLE",s.cellEditor.text2),(n=t.addItem("",null,mxUtils.bind(this,function(){try{s.selectNode(s.insertColumn(e,null!=i?i.cellIndex:0))}catch(t){this.editorUi.handleError(t)}}),null,"geIcon geSprite geSprite-insertcolumnbefore")).setAttribute("title",mxResources.get("insertColumnBefore")),(n=t.addItem("",null,mxUtils.bind(this,function(){try{s.selectNode(s.insertColumn(e,null!=i?i.cellIndex+1:-1))}catch(t){this.editorUi.handleError(t)}}),null,"geIcon geSprite geSprite-insertcolumnafter")).setAttribute("title",mxResources.get("insertColumnAfter")),(n=t.addItem("Delete column",null,mxUtils.bind(this,function(){if(null!=i)try{s.deleteColumn(e,i.cellIndex)}catch(t){this.editorUi.handleError(t)}}),null,"geIcon geSprite geSprite-deletecolumn")).setAttribute("title",mxResources.get("deleteColumn")),(n=t.addItem("",null,mxUtils.bind(this,function(){try{s.selectNode(s.insertRow(e,l.sectionRowIndex))}catch(t){this.editorUi.handleError(t)}}),null,"geIcon geSprite geSprite-insertrowbefore")).setAttribute("title",mxResources.get("insertRowBefore")),(n=t.addItem("",null,mxUtils.bind(this,function(){try{s.selectNode(s.insertRow(e,l.sectionRowIndex+1))}catch(t){this.editorUi.handleError(t)}}),null,"geIcon geSprite geSprite-insertrowafter")).setAttribute("title",mxResources.get("insertRowAfter")),(n=t.addItem("",null,mxUtils.bind(this,function(){try{s.deleteRow(e,l.sectionRowIndex)}catch(t){this.editorUi.handleError(t)}}),null,"geIcon geSprite geSprite-deleterow")).setAttribute("title",mxResources.get("deleteRow")),(n=t.addItem("",null,mxUtils.bind(this,function(){var t=e.style.borderColor.replace(/\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,function(t,e,n,i){return"#"+("0"+Number(e).toString(16)).substr(-2)+("0"+Number(n).toString(16)).substr(-2)+("0"+Number(i).toString(16)).substr(-2)});this.editorUi.pickColor(t,function(t){null==t||t==mxConstants.NONE?(e.removeAttribute("border"),e.style.border="",e.style.borderCollapse=""):(e.setAttribute("border","1"),e.style.border="1px solid "+t,e.style.borderCollapse="collapse")})}),null,"geIcon geSprite geSprite-strokecolor")).setAttribute("title",mxResources.get("borderColor")),(n=t.addItem("",null,mxUtils.bind(this,function(){var t=e.style.backgroundColor.replace(/\brgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,function(t,e,n,i){return"#"+("0"+Number(e).toString(16)).substr(-2)+("0"+Number(n).toString(16)).substr(-2)+("0"+Number(i).toString(16)).substr(-2)});this.editorUi.pickColor(t,function(t){null==t||t==mxConstants.NONE?e.style.backgroundColor="":e.style.backgroundColor=t})}),null,"geIcon geSprite geSprite-fillcolor")).setAttribute("title",mxResources.get("backgroundColor")),(n=t.addItem("",null,mxUtils.bind(this,function(){var t=e.getAttribute("cellPadding")||0,t=new FilenameDialog(this.editorUi,t,mxResources.get("apply"),mxUtils.bind(this,function(t){null!=t&&0r.div.clientHeight&&(r.div.style.width="40px"),r.hideMenu=mxUtils.bind(this,function(){mxPopupMenu.prototype.hideMenu.apply(r,arguments),this.editorUi.resetCurrentMenu(),r.destroy()}),r.addListener(mxEvent.EVENT_HIDE,mxUtils.bind(this,function(){this.currentElt=null}))),a=!0,mxEvent.consume(t)})),mxEvent.addListener(n,mxClient.IS_POINTER?"pointerdown":"mousedown",mxUtils.bind(this,function(t){a=this.currentElt!=n,t.preventDefault()})))},Toolbar.prototype.destroy=function(){null!=this.gestureHandler&&(mxEvent.removeGestureListeners(document,this.gestureHandler),this.gestureHandler=null)};var OpenDialog=function(){var t=document.createElement("iframe");t.style.backgroundColor="transparent",t.allowTransparency="true",t.style.borderStyle="none",t.style.borderWidth="0px",t.style.overflow="hidden",t.frameBorder="0";var e=mxClient.IS_VML&&(null==document.documentMode||document.documentMode<8)?20:0;t.setAttribute("width",(Editor.useLocalStorage?640:320)+e+"px"),t.setAttribute("height",(Editor.useLocalStorage?480:220)+e+"px"),t.setAttribute("src",OPEN_FORM),this.container=t},ColorDialog=function(e,t,n,i){this.editorUi=e;var d=document.createElement("input");d.style.marginBottom="10px",d.style.width="216px",mxClient.IS_IE&&(d.style.marginTop="10px",document.body.appendChild(d));var l=null!=n?n:this.createApplyFunction();function u(){var t=d.value;/(^#?[a-zA-Z0-9]*$)/.test(t)?("none"!=t&&"#"!=t.charAt(0)&&(t="#"+t),ColorDialog.addRecentColor("none"!=t?t.substring(1):t,12),l(t),e.hideDialog()):e.handleError({message:mxResources.get("invalidInput")})}this.init=function(){mxClient.IS_TOUCH||d.focus()};var p=new mxJSColor.color(d);p.pickerOnfocus=!1,p.showPicker();var s=document.createElement("div");mxJSColor.picker.box.style.position="relative",mxJSColor.picker.box.style.width="230px",mxJSColor.picker.box.style.height="100px",mxJSColor.picker.box.style.paddingBottom="10px",s.appendChild(mxJSColor.picker.box);var m=document.createElement("center");function c(){var t=o(0==ColorDialog.recentColors.length?["FFFFFF"]:ColorDialog.recentColors,11,"FFFFFF",!0);return t.style.marginBottom="8px",t}function o(t,e,n,i){e=null!=e?e:12;var l=document.createElement("table");l.style.borderCollapse="collapse",l.setAttribute("cellspacing","0"),l.style.marginBottom="20px",l.style.cellSpacing="0px";var s=document.createElement("tbody");l.appendChild(s);for(var o=t.length/e,r=0;r=e&&ColorDialog.recentColors.pop())},ColorDialog.resetRecentColors=function(){ColorDialog.recentColors=[]};var AboutDialog=function(t){var e=document.createElement("div");e.setAttribute("align","center");var n=document.createElement("h3");mxUtils.write(n,mxResources.get("about")+" GraphEditor"),e.appendChild(n);n=document.createElement("img");n.style.border="0px",n.setAttribute("width","176"),n.setAttribute("width","151"),n.setAttribute("src",IMAGE_PATH+"/logo.png"),e.appendChild(n),mxUtils.br(e),mxUtils.write(e,"Powered by mxGraph "+mxClient.VERSION),mxUtils.br(e);n=document.createElement("a");n.setAttribute("href","http://www.jgraph.com/"),n.setAttribute("target","_blank"),mxUtils.write(n,"www.jgraph.com"),e.appendChild(n),mxUtils.br(e),mxUtils.br(e);n=mxUtils.button(mxResources.get("close"),function(){t.hideDialog()});n.className="geBtn gePrimaryBtn",e.appendChild(n),this.container=e},TextareaDialog=function(t,e,n,i,l,s,o,r,a,h,d,u,p,m){o=null!=o?o:300,r=null!=r?r:120,h=null!=h&&h;var c,g=document.createElement("table"),x=document.createElement("tbody"),y=document.createElement("tr");(c=document.createElement("td")).style.fontSize="10pt",c.style.width="100px",mxUtils.write(c,e),y.appendChild(c),x.appendChild(y),y=document.createElement("tr"),c=document.createElement("td");var f=document.createElement("textarea");if(d&&f.setAttribute("wrap","off"),f.setAttribute("spellcheck","false"),f.setAttribute("autocorrect","off"),f.setAttribute("autocomplete","off"),f.setAttribute("autocapitalize","off"),mxUtils.write(f,n||""),f.style.resize="none",f.style.width=o+"px",f.style.height=r+"px",this.textarea=f,this.init=function(){f.focus(),f.scrollTop=0},c.appendChild(f),y.appendChild(c),x.appendChild(y),y=document.createElement("tr"),(c=document.createElement("td")).style.paddingTop="14px",c.style.whiteSpace="nowrap",c.setAttribute("align","right"),null!=p&&((r=mxUtils.button(mxResources.get("help"),function(){t.editor.graph.openLink(p)})).className="geBtn",c.appendChild(r)),null!=m)for(var C=0;CMAX_AREA||p.value<=0?p.style.backgroundColor="red":p.style.backgroundColor="",p.value*m.value>MAX_AREA||m.value<=0?m.style.backgroundColor="red":m.style.backgroundColor=""}C.setAttribute("type","number"),C.setAttribute("value",ExportDialog.lastBorderValue),C.style.width="180px",(e=document.createElement("td")).appendChild(C),t.appendChild(e),a.appendChild(t),s.appendChild(a),mxEvent.addListener(d,"change",v),v(),mxEvent.addListener(u,"change",function(){y=!0;var t=Math.max(0,parseFloat(u.value)||100)/100;u.value=parseFloat((100*t).toFixed(2)),0e.name?1:0}),null!=p&&((A=document.createElement("div")).style.width="100%",A.style.fontSize="11px",A.style.textAlign="center",mxUtils.write(A,p),o.addField(mxResources.get("id")+":",A));for(var x,y,f,g=0;g',mxEvent.addListener(r,"click",function(t){if(d.isEnabled()){d.model.beginUpdate();try{var e=d.model.root.getIndex(g);d.removeCells([g],!1),0==d.model.getChildCount(d.model.root)?(d.model.add(d.model.root,new mxCell),d.setDefaultParent(null)):0',mxEvent.addListener(a,"click",function(t){var e;d.isEnabled()&&!d.isSelectionEmpty()&&(e=mxUtils.getOffset(a),h.showPopupMenu(mxUtils.bind(this,function(n,i){for(var t=c-1;0<=t;t--)mxUtils.bind(this,function(t){var e=n.addItem(d.convertValueToString(t)||mxResources.get("background"),null,mxUtils.bind(this,function(){d.moveCells(d.getSelectionCells(),0,0,!1,t)}),i);1==d.getSelectionCount()&&d.model.isAncestor(t,d.getSelectionCell())&&n.addCheckmark(e,Editor.checkmarkImage)})(d.model.getChildAt(d.model.root,t))}),e.x,e.y+a.offsetHeight,t))}),o.appendChild(a);var x=s.cloneNode();x.innerHTML='
',x.setAttribute("title",mxResources.get("rename")),mxEvent.addListener(x,"click",function(t){d.isEnabled()&&h.showDataDialog(g),mxEvent.consume(t)}),d.isEnabled()||(x.className="geButton mxDisabled"),o.appendChild(x);var y=s.cloneNode();y.innerHTML='
',mxEvent.addListener(y,"click",function(t){if(d.isEnabled()){var e=null;d.model.beginUpdate();try{e=d.cloneCell(g),d.cellLabelChanged(e,mxResources.get("untitledLayer")),e.setVisible(!0),e=d.addCell(e,d.model.root),d.setDefaultParent(e)}finally{d.model.endUpdate()}null==e||d.isCellLocked(e)||d.selectAll(e)}}),d.isEnabled()||(y.className="geButton mxDisabled"),o.appendChild(y);s=s.cloneNode();function f(){function e(e,t,n,i){var l=document.createElement("div");l.className="geToolbarContainer",l.style.overflow="hidden",l.style.position="relative",l.style.padding="4px",l.style.height="22px",l.style.display="block",l.style.backgroundColor="white"==Dialog.backdropColor?"whiteSmoke":Dialog.backdropColor,l.style.borderWidth="0px 0px 1px 0px",l.style.borderColor="#c3c3c3",l.style.borderStyle="solid",l.style.whiteSpace="nowrap",l.setAttribute("title",t);var s=document.createElement("div");s.style.display="inline-block",s.style.width="100%",s.style.textOverflow="ellipsis",s.style.overflow="hidden",mxEvent.addListener(l,"dragover",function(t){t.dataTransfer.dropEffect="move",m=e,t.stopPropagation(),t.preventDefault()}),mxEvent.addListener(l,"dragstart",function(t){p=l,mxClient.IS_FF&&t.dataTransfer.setData("Text","")}),mxEvent.addListener(l,"dragend",function(t){null!=p&&null!=m&&d.addCell(n,d.model.root,m),m=p=null,t.stopPropagation(),t.preventDefault()});var o=document.createElement("img");o.setAttribute("draggable","false"),o.setAttribute("align","top"),o.setAttribute("border","0"),o.style.padding="4px",o.setAttribute("title",mxResources.get("lockUnlock"));var r=d.getCurrentCellStyle(n);"1"==mxUtils.getValue(r,"locked","0")?o.setAttribute("src",Dialog.prototype.lockedImage):o.setAttribute("src",Dialog.prototype.unlockedImage),d.isEnabled()&&(o.style.cursor="pointer"),mxEvent.addListener(o,"click",function(t){if(d.isEnabled()){var e=null;d.getModel().beginUpdate();try{e="1"==mxUtils.getValue(r,"locked","0")?null:"1",d.setCellStyles("locked",e,[n])}finally{d.getModel().endUpdate()}"1"==e&&d.removeSelectionCells(d.getModel().getDescendants(n)),mxEvent.consume(t)}}),s.appendChild(o);var a,o=document.createElement("input");o.setAttribute("type","checkbox"),o.setAttribute("title",mxResources.get("hideIt",[n.value||mxResources.get("background")])),o.style.marginLeft="4px",o.style.marginRight="6px",o.style.marginTop="4px",s.appendChild(o),d.model.isVisible(n)&&(o.setAttribute("checked","checked"),o.defaultChecked=!0),mxEvent.addListener(o,"click",function(t){d.model.setVisible(n,!d.model.isVisible(n)),mxEvent.consume(t)}),mxUtils.write(s,t),l.appendChild(s),d.isEnabled()&&((mxClient.IS_TOUCH||mxClient.IS_POINTER||mxClient.IS_VML||mxClient.IS_IE&&document.documentMode<10)&&((s=document.createElement("div")).style.display="block",s.style.textAlign="right",s.style.whiteSpace="nowrap",s.style.position="absolute",s.style.right="6px",s.style.top="6px",0{const[t,s]=e;e[0]=(t-a)*o-(s-l)*i+a,e[1]=(t-a)*i+(s-l)*o+l})}}function y(e,t,s){const a=[];e.forEach(e=>a.push(...e)),c(a,t,s)}function k(e){const t=e[0],s=e[1];return u(r(t[0]-s[0],2)+r(t[1]-s[1],2))}function m(e,t){const s=t.hachureAngle+90;let a=t.hachureGap;0>a&&(a=4*t.strokeWidth),a=n(a,.1);const l=[0,0];if(s)for(const t of e)c(t,l,s);const h=S(e,a);if(s){for(const t of e)c(t,l,-s);y(h,l,-s)}return h}function S(e,t){const s=[];for(const a of e){const e=[...a];e[0].join(",")!==e[e.length-1].join(",")&&e.push([e[0][0],e[0][1]]),2e.ymint.ymin?1:e.xt.x?1:e.ymax===t.ymax?0:(e.ymax-t.ymax)/l(e.ymax-t.ymax)),!o.length)return h;let p=[],u=o[0].ymin;for(;p.length||o.length;){if(o.length){let e=-1;for(let t=0;tu);t++)e=t;const t=o.splice(0,e+1);t.forEach(e=>{p.push({s:u,edge:e})})}if(p=p.filter(e=>!(e.edge.ymax<=u)),p.sort((e,t)=>e.edge.x===t.edge.x?0:(e.edge.x-t.edge.x)/l(e.edge.x-t.edge.x)),1=p.length)break;const s=p[e].edge,l=p[t].edge;h.push([[a(s.x),u],[a(l.x),u]])}u+=t,p.forEach(e=>{e.edge.x+=t*e.edge.islope})}return h}function T(e,t){let s=e.fillStyle||"hachure";if(!Oe[s])switch(s){case"zigzag":Oe[s]||(Oe[s]=new me(t));break;case"cross-hatch":Oe[s]||(Oe[s]=new Se(t));break;case"dots":Oe[s]||(Oe[s]=new Te(t));break;case"dashed":Oe[s]||(Oe[s]=new xe(t));break;case"zigzag-line":Oe[s]||(Oe[s]=new ve(t));break;case"hachure":default:s="hachure",Oe[s]||(Oe[s]=new ke(t));}return Oe[s]}function x(){return s(Math.random()*2147483648)}function v(e){const t=[];for(;""!==e;)if(e.match(/^([ \t\r\n,]+)/))e=e.substr(RegExp.$1.length);else if(e.match(/^([aAcChHlLmMqQsStTvVzZ])/))t[t.length]={type:_e,text:RegExp.$1},e=e.substr(RegExp.$1.length);else if(e.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/))t[t.length]={type:Ce,text:`${parseFloat(RegExp.$1)}`},e=e.substr(RegExp.$1.length);else return[];return t[t.length]={type:Ee,text:""},t}function O(e,t){return e.type===t}function b(e){const t=[],s=v(e);let a="BOD",l=0,h=s[l];for(;!O(h,Ee);){let o=0;const p=[];if(!("BOD"===a))O(h,Ce)?o=Ve[a]:(l++,o=Ve[h.text],a=h.text);else if("M"===h.text||"m"===h.text)l++,o=Ve[h.text],a=h.text;else return b("M0,0"+e);if(l+oa%2?e+s:e+t);h.push({key:"C",data:e}),t=e[4],s=e[5];break}case"Q":h.push({key:"Q",data:[...i]}),t=i[2],s=i[3];break;case"q":{const e=i.map((e,a)=>a%2?e+s:e+t);h.push({key:"Q",data:e}),t=e[2],s=e[3];break}case"A":h.push({key:"A",data:[...i]}),t=i[5],s=i[6];break;case"a":t+=i[5],s+=i[6],h.push({key:"A",data:[i[0],i[1],i[2],i[3],i[4],t,s]});break;case"H":h.push({key:"H",data:[...i]}),t=i[0];break;case"h":t+=i[0],h.push({key:"H",data:[t]});break;case"V":h.push({key:"V",data:[...i]}),s=i[0];break;case"v":s+=i[0],h.push({key:"V",data:[s]});break;case"S":h.push({key:"S",data:[...i]}),t=i[2],s=i[3];break;case"s":{const e=i.map((e,a)=>a%2?e+s:e+t);h.push({key:"S",data:e}),t=e[2],s=e[3];break}case"T":h.push({key:"T",data:[...i]}),t=i[0],s=i[1];break;case"t":t+=i[0],s+=i[1],h.push({key:"T",data:[t,s]});break;case"Z":case"z":h.push({key:"Z",data:[]}),t=a,s=l;}return h}function C(e){const t=[];let s="",a=0,h=0,o=0,i=0,p=0,n=0;for(const{key:u,data:r}of e){switch(u){case"M":t.push({key:"M",data:[...r]}),[a,h]=r,[o,i]=r;break;case"C":t.push({key:"C",data:[...r]}),a=r[4],h=r[5],p=r[2],n=r[3];break;case"L":t.push({key:"L",data:[...r]}),[a,h]=r;break;case"H":a=r[0],t.push({key:"L",data:[a,h]});break;case"V":h=r[0],t.push({key:"L",data:[a,h]});break;case"S":{let e=0,l=0;"C"===s||"S"===s?(e=a+(a-p),l=h+(h-n)):(e=a,l=h),t.push({key:"C",data:[e,l,...r]}),p=r[0],n=r[1],a=r[2],h=r[3];break}case"T":{const[e,l]=r;let o=0,i=0;"Q"===s||"T"===s?(o=a+(a-p),i=h+(h-n)):(o=a,i=h);const u=a+2*(o-a)/3,d=h+2*(i-h)/3,g=e+2*(o-e)/3,f=l+2*(i-l)/3;t.push({key:"C",data:[u,d,g,f,e,l]}),p=o,n=i,a=e,h=l;break}case"Q":{const[e,s,l,o]=r,i=a+2*(e-a)/3,u=h+2*(s-h)/3;t.push({key:"C",data:[i,u,l+2*(e-l)/3,o+2*(s-o)/3,l,o]}),p=e,n=s,a=l,h=o;break}case"A":{const e=l(r[0]),s=l(r[1]),o=r[2],i=r[3],p=r[4],n=r[5],u=r[6];if(0===e||0===s)t.push({key:"C",data:[a,h,n,u,n,u]}),a=n,h=u;else if(a!==n||h!==u){const l=A(a,h,n,u,e,s,o,i,p);l.forEach(function(e){t.push({key:"C",data:e})}),a=n,h=u}break}case"Z":t.push({key:"Z",data:[]}),a=o,h=i;}s=u}return t}function E(e){return f*e/180}function V(e,t,s){const a=e*g(s)-t*d(s),l=e*d(s)+t*g(s);return[a,l]}function A(e,s,a,o,i,p,h,n,r,c){var y=Math.tan,m=Math.asin;const S=E(h);let T=[],v=0,O=0,b=0,_=0;if(c)[v,O,b,_]=c;else{[e,s]=V(e,s,-S),[a,o]=V(a,o,-S);const t=(e-a)/2,d=(s-o)/2;let g=t*t/(i*i)+d*d/(p*p);1v&&(v=2*f+v),0>O&&(O=2*f+O),r&&v>O&&(v-=2*f),!r&&O>v&&(O-=2*f)}let k=O-v;if(l(k)>120*f/180){const e=O,t=a,s=o;O=r&&O>v?v+1*(120*f/180):v+-1*(120*f/180),a=b+i*g(O),o=_+p*d(O),T=A(a,o,t,s,i,p,h,0,r,[O,e,b,_])}k=O-v;const x=g(v),C=d(v),N=g(O),L=d(O),W=y(k/4),t=4/3*i*W,M=4/3*p*W,P=[e,s],z=[e+t*C,s-M*x],G=[a+t*L,o-M*N],R=[a,o];if(z[0]=2*P[0]-z[0],z[1]=2*P[1]-z[1],c)return[z,G,R].concat(T);else{T=[z,G,R].concat(T);const e=[];for(let t=0;tm;)m+=2*f,S+=2*f;S-m>2*f&&(m=0,S=2*f);const T=2*f/r.curveStepCount,x=i(T/2,(S-m)/2),v=X(x,o,c,y,k,m,S,1,r);if(!r.disableMultiStroke){const e=X(x,o,c,y,k,m,S,1.5,r);v.push(...e)}return n&&(u?v.push(...J(o,c,o+y*g(m),c+k*d(m),r),...J(o,c,o+y*g(S),c+k*d(S),r)):v.push({op:"lineTo",data:[o,c]},{op:"lineTo",data:[o+y*g(m),c+k*d(m)]})),{type:"path",ops:v}}function F(e,t){const s=C(_(b(e))),a=[];let l=[0,0],h=[0,0];for(const{key:o,data:i}of s)switch(o){case"M":{const e=1*(t.maxRandomnessOffset||0),s=t.preserveVertices;a.push({op:"move",data:i.map(a=>a+(s?0:B(e,t)))}),h=[i[0],i[1]],l=[i[0],i[1]];break}case"L":a.push(...J(h[0],h[1],i[0],i[1],t)),h=[i[0],i[1]];break;case"C":{const[e,s,l,o,p,n]=i;a.push(...U(e,s,l,o,p,n,h,t)),h=[p,n];break}case"Z":a.push(...J(h[0],h[1],l[0],l[1],t)),h=[l[0],l[1]];}return{type:"path",ops:a}}function w(e,t){const s=[];for(const a of e)if(a.length){const e=t.maxRandomnessOffset||0,l=a.length;if(2c;)c+=2*f,y+=2*f;y-c>2*f&&(c=0,y=2*f);const k=(y-c)/p.curveStepCount,m=[];for(let l=c;l<=y;l+=k)m.push([o+u*g(l),n+r*d(l)]);return m.push([o+u*g(y),n+r*d(y)]),m.push([o,n]),q([m],p)}function I(e){const t=Object.assign({},e);return t.randomizer=void 0,e.seed&&(t.seed=e.seed+1),t}function D(e){return e.randomizer||(e.randomizer=new be(e.seed||0)),e.randomizer.next()}function Y(e,t,s,a=1){return s.roughness*a*(D(s)*(t-e)+e)}function B(e,t,s=1){return Y(-e,e,t,s)}function J(e,t,s,a,l,h=!1){const o=h?l.disableMultiStrokeFill:l.disableMultiStroke,i=Q(e,t,s,a,l,!0,!1);if(o)return i;const p=Q(e,t,s,a,l,!0,!0);return i.concat(p)}function Q(e,t,s,a,l,h,o){const i=r(e-s,2)+r(t-a,2),p=u(i);let n=1;n=200>p?1:500i&&(d=p/10);const g=d/2,f=.2+.2*D(l);let c=l.bowing*l.maxRandomnessOffset*(a-t)/200,y=l.bowing*l.maxRandomnessOffset*(e-s)/200;c=B(c,l,n),y=B(y,l,n);const k=[],m=()=>B(g,l,n),S=()=>B(d,l,n),T=l.preserveVertices;return h&&(o?k.push({op:"move",data:[e+(T?0:m()),t+(T?0:m())]}):k.push({op:"move",data:[e+(T?0:B(d,l,n)),t+(T?0:B(d,l,n))]})),o?k.push({op:"bcurveTo",data:[c+e+(s-e)*f+m(),y+t+(a-t)*f+m(),c+e+2*(s-e)*f+m(),y+t+2*(a-t)*f+m(),s+(T?0:m()),a+(T?0:m())]}):k.push({op:"bcurveTo",data:[c+e+(s-e)*f+S(),y+t+(a-t)*f+S(),c+e+2*(s-e)*f+S(),y+t+2*(a-t)*f+S(),s+(T?0:S()),a+(T?0:S())]}),k}function H(e,t,s){const a=[[e[0][0]+B(t,s),e[0][1]+B(t,s)],[e[0][0]+B(t,s),e[0][1]+B(t,s)]];for(let l=1;ls)throw new Error("A curve must have at least three points.");const a=[];if(3===s)a.push(K(e[0]),K(e[1]),K(e[2]),K(e[2]));else{const l=[e[0],e[0]];for(let t=1;te&&(e=a,n=u)}return u(e)>h?(pe(t,a,n+1,h,i),pe(t,n,l,h,i)):(!i.length&&i.push(p),i.push(s)),i}function ne(e,t=.15,s){const a=[],l=(e.length-1)/3;for(let h=0;h{4<=p.length&&o.push(...ne(p,t)),p=[]},u=()=>{n(),o.length&&(h.push(o),o=[])};for(const{key:a,data:h}of l)switch(a){case"M":u(),i=[h[0],h[1]],o.push(i);break;case"L":n(),o.push([h[0],h[1]]);break;case"C":if(!p.length){const e=o.length?o[o.length-1]:i;p.push([e[0],e[1]])}p.push([h[0],h[1]]),p.push([h[2],h[3]]),p.push([h[4],h[5]]);break;case"Z":n(),o.push([i[0],i[1]]);}if(u(),!s)return h;const r=[];for(const a of h){const e=ie(a,s);e.length&&r.push(e)}return r}function re(){mxShape.prototype.createSvgCanvas=function(){const e=ge(this.node,this);e.strokeTolerance=this.pointerEvents?this.svgStrokeTolerance:0,e.pointerEventsValue=this.svgPointerEvents;const t=this.getSvgScreenOffset();return 0==t?this.node.removeAttribute("transform"):this.node.setAttribute("transform","translate("+t+","+t+")"),e.minStrokeWidth=this.minSvgStrokeWidth,this.antiAlias||(e.format=function(e){return a(parseFloat(e))}),e}}function de(e){return!e.outline&&!0==mxUtils.getValue(e.style,"sketch",!1)}function ge(e,t){return de(t)?new Me(e,t):new mxSvgCanvas2D(e,!1)}function fe(e){if(!e)return;const t=mxShape.prototype.paint;mxShape.prototype.paint=function(e){let s=null,a=!0;if(null!=this.style&&(a="1"==mxUtils.getValue(this.style,mxConstants.STYLE_POINTER_EVENTS,"1"),s=mxUtils.getValue(this.style,"fillStyle","auto"),null!=this.state&&"auto"==s&&null!=this.style.fill&&null!=this.gradient&&(s="solid")),a&&e instanceof Me&&!this.outline&&(null==this.fill||this.fill==mxConstants.NONE||"solid"!=s)){e.save();const s=this.fill,a=this.stroke;this.fill=null,this.stroke=null,e.passThrough=!0,t.apply(this,[e]),e.passThrough=!1,this.fill=s,this.stroke=a,e.restore()}t.apply(this,[e])}}function ce(e){if(!e)return;const t=mxRectangleShape.prototype.paintBackground;mxRectangleShape.prototype.paintBackground=function(e,s,a,l,o){if(!(e instanceof Me))t.apply(this,[e,s,a,l,o]);else{let t=!0;if(null!=this.style&&(t="1"==mxUtils.getValue(this.style,mxConstants.STYLE_POINTER_EVENTS,"1")),t||null!=this.fill&&this.fill!=mxConstants.NONE||null!=this.stroke&&this.stroke!=mxConstants.NONE){if(t||null!=this.fill&&this.fill!=mxConstants.NONE||(e.pointerEvents=!1),e.begin(),this.isRounded){let t=0;if("1"==mxUtils.getValue(this.style,mxConstants.STYLE_ABSOLUTE_ARCSIZE,0))t=i(l/2,i(o/2,mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,mxConstants.LINE_ARCSIZE)/2));else{const e=mxUtils.getValue(this.style,mxConstants.STYLE_ARCSIZE,100*mxConstants.RECTANGLE_ROUNDING_FACTOR)/100;t=i(l*e,o*e)}e.moveTo(s+t,a),e.lineTo(s+l-t,a),e.quadTo(s+l,a,s+l,a+t),e.lineTo(s+l,a+o-t),e.quadTo(s+l,a+o,s+l-t,a+o),e.lineTo(s+t,a+o),e.quadTo(s,a+o,s,a+o-t),e.lineTo(s,a+t),e.quadTo(s,a,s+t,a)}else e.moveTo(s,a),e.lineTo(s+l,a),e.lineTo(s+l,a+o),e.lineTo(s,a+o),e.lineTo(s,a);e.close(),e.end(),e.fillAndStroke()}}}}function ye(e){if(!e)return;const t=mxRectangleShape.prototype.paintForeground;mxRectangleShape.prototype.paintForeground=function(e,s,a,l,o){e instanceof Me||t.apply(this,[e,s,a,l,o])}}class ke{constructor(e){this.helper=e}fillPolygons(e,t){return this._fillPolygons(e,t)}_fillPolygons(e,t){const s=m(e,t),a=this.renderLines(s,t);return{type:"fillSketch",ops:a}}renderLines(e,t){const s=[];for(const a of e)s.push(...this.helper.doubleLineOps(a[0][0],a[0][1],a[1][0],a[1][1],t));return s}}class me extends ke{fillPolygons(e,t){let s=t.hachureGap;0>s&&(s=4*t.strokeWidth),s=n(s,.1);const a=Object.assign({},t,{hachureGap:s}),l=m(e,a),h=f/180*t.hachureAngle,o=[],i=.5*s*g(h),p=.5*s*d(h);for(const[s,a]of l)k([s,a])&&o.push([[s[0]-i,s[1]+p],[...a]],[[s[0]+i,s[1]-p],[...a]]);const u=this.renderLines(o,t);return{type:"fillSketch",ops:u}}}class Se extends ke{fillPolygons(e,t){const s=this._fillPolygons(e,t),a=Object.assign({},t,{hachureAngle:t.hachureAngle+90}),l=this._fillPolygons(e,a);return s.ops=s.ops.concat(l.ops),s}}class Te{constructor(e){this.helper=e}fillPolygons(e,t){t=Object.assign({},t,{hachureAngle:0});const s=m(e,t);return this.dotsOnLines(s,t)}dotsOnLines(e,s){const a=[];let l=s.hachureGap;0>l&&(l=4*s.strokeWidth),l=n(l,.1);let h=s.fillWeight;0>h&&(h=s.strokeWidth/2);const o=l/4;for(const p of e){const e=k(p),n=e/l,u=t(n)-1,r=e-u*l,d=(p[0][0]+p[1][0])/2-l/4,g=i(p[0][1],p[1][1]);for(let e=0;ea.dashOffset?0>a.hachureGap?4*a.strokeWidth:a.hachureGap:a.dashOffset,h=0>a.dashGap?0>a.hachureGap?4*a.strokeWidth:a.hachureGap:a.dashGap,o=[];return t.forEach(t=>{const i=k(t),p=s(i/(l+h)),n=(i+h-p*(l+h))/2;let u=t[0],r=t[1];u[0]>r[0]&&(u=t[1],r=t[0]);const f=e((r[1]-u[1])/(r[0]-u[0]));for(let e=0;et.hachureGap?4*t.strokeWidth:t.hachureGap,a=0>t.zigzagOffset?s:t.zigzagOffset;t=Object.assign({},t,{hachureGap:s+a});const l=m(e,t);return{type:"fillSketch",ops:this.zigzagLines(l,a,t)}}zigzagLines(t,s,l){const h=[];return t.forEach(t=>{const o=k(t),p=a(o/(2*s));let n=t[0],i=t[1];n[0]>i[0]&&(n=t[1],i=t[0]);const c=e((i[1]-n[1])/(i[0]-n[0]));for(let e=0;es.simplification),i=o?4-4*s.simplification:(1+s.roughness)/2,p=ue(e,1,i);return l&&("solid"===s.fillStyle?a.push(w(p,s)):a.push(q(p,s))),h&&(o?p.forEach(e=>{a.push(L(e,!1,s))}):a.push(F(e,s))),this._d("path",a,s)}opsToPath(e,t){let s="";for(const a of e.ops){const e="number"==typeof t&&0<=t?a.data.map(e=>+e.toFixed(t)):a.data;switch(a.op){case"move":s+=`M${e[0]} ${e[1]} `;break;case"bcurveTo":s+=`C${e[0]} ${e[1]}, ${e[2]} ${e[3]}, ${e[4]} ${e[5]} `;break;case"lineTo":s+=`L${e[0]} ${e[1]} `;}}return s.trim()}toPaths(e){const t=e.sets||[],s=e.options||this.defaultOptions,a=[];for(const l of t){let e=null;switch(l.type){case"path":e={d:this.opsToPath(l),stroke:s.stroke,strokeWidth:s.strokeWidth,fill:Ne};break;case"fillPath":e={d:this.opsToPath(l),stroke:Ne,strokeWidth:0,fill:s.fill||Ne};break;case"fillSketch":e=this.fillSketch(l,s);}e&&a.push(e)}return a}fillSketch(e,t){let s=t.fillWeight;return 0>s&&(s=t.strokeWidth/2),{d:this.opsToPath(e),stroke:t.fill||Ne,strokeWidth:s,fill:Ne}}}class We{constructor(e,t){this.c=e,this.config=t,this.gen=new Le(t)}draw(e){const t=e.sets||[],s=e.options||this.getDefaultOptions();for(let a=0;ai&&(i=t.strokeWidth/2),this.c.setStrokeAlpha(this.c.state.fillAlpha),this.c.setStrokeColor(t.fill||""),this.c.setStrokeWidth(i),this.c.setDashed(!1,o),this._drawToContext(e,t),this.c.setDashed(h,o),this.c.setStrokeWidth(a),this.c.setStrokeColor(s),this.c.setStrokeAlpha(l)}_drawToContext(e,t){this.c.begin();for(let s=0;s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/client/public/diagram/ styles/sprites.png b/packages/client/public/diagram/ styles/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..23e1b491b6d3fafd7887dba6d1b32309e04bd3b2 GIT binary patch literal 10155 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/button.gif b/packages/client/public/diagram/images/button.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad55cab610a0422be13288ace4cf717afaf613b3 GIT binary patch literal 137 zcmZ?wbhEHbR|Gs_u z_T$Ho@7}%p|NlP&7%2W^0n<7l5@ZGgitAS1881_0U#MvDLd literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/checkmark.gif b/packages/client/public/diagram/images/checkmark.gif new file mode 100644 index 0000000000000000000000000000000000000000..d79444daa99b23d12ca3fd0af8b66c5042bed1f2 GIT binary patch literal 1253 zcmZ?wbhEHb6lD-)I3mxGlao_ZQ`6Pe)z;Sb?c2AaqM~2FejPY)VAiZz(b3V9Cr^I) z@?~RVWy6LI zWo2d0o;};QZ(mwk+W-Im75{Tb_y#DrB$gxsX&d{Bg2d$P)DnfH)bz|eTc!8A_bVx6 zrr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9IEy7UZUuBq~(o=HwMyRoE&e zrsOB3S^?Q0VSOb9u#%E&TO~)3gaXJ;=lr5n1yel(-DCqZ0|hffJwsy?b8~YY1tSAP z1APM{eM2K%Lvt%*BP#;~1t?Gg+E$d3W)Uo-)&qM-FF8L~zap_f-%!s0@{(ZdJ#@7=v~`_|1H*RNf@a{1E53+K6ZM9qnzcEzM1h4fS=kHPuy>73F26CB;RB1^IcoIoVm68R==MDalER3Gs2U zG0{A;Cd`0selzKHgrQ9`0_gF3wJl4)%7oHr7^_7UpKACdNj<45g>5qphW> zp{}N?qO7E-ATK8?BP}H=r8~Q zs5D|=^?0D(my$UzW7WEx)kV|1gBp~(-Iea%f5Is+^Wnq5J4Vg(6In0lh%@pxA9z*4 jHl;~jpit4~0k4}|hnUnJuZM?(18;xWQKQGr$Y2csh?(E! literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/clear.gif b/packages/client/public/diagram/images/clear.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6acf0a43455a3272d4b584de82d7583cbb401d7 GIT binary patch literal 1114 zcmZ?wbhEHbIIg#cFVINM%8) zeo$(0erZv1Dp0vH$f^P>=c3falKi5O{QMkPCP(UIa|kjQ{`r{qy_R&mZ5vef{$J z)5j0*-@SeF`qj%9&!0Vg^7zri2lwyYy>t84%^TORUA=Po(!~qs&z(JU`qar2$B!L7 za`@1}1N-;w-Lrew&K=vgZQZhY)5ZeMTG_VdAT{+S(zE>X{jm6 zNr?&Zaj`McQIQehVWAmo_rKzE=rmCW>q^KY-Co3Z@B`F~;CMqH&FX#K^#)_>%=l qGBW5e00F4XU|xM5wf*XucTS2hSOWl)*@>wD literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/close.gif b/packages/client/public/diagram/images/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..1069e94bb6b8555de51a4a47b835d9d151277f97 GIT binary patch literal 70 zcmZ?wbhEHbi;Ln<76uT|0TCb>1}52_e)iM3A8yPJyt+jx#L{D5 UsmJ!p)D;WU9;@U9FfdpH0IG}?*Z=?k literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/close.png b/packages/client/public/diagram/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..d319efb6e1ccda38d7228deb645634808f3b6992 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4|3?y&GPYDK6YymzYuGO>l{{R1f!=%%iKoO>r zAiv=M3{STkcma8`o-U3d9J0wbt{+f1eBi>x0|grz9~#bJ+0>}?TZ*CdCdVq1vPfm1 OLIzJ)KbLh*2~7Z!bS2#Y literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/collapsed.gif b/packages/client/public/diagram/images/collapsed.gif new file mode 100644 index 0000000000000000000000000000000000000000..0276444a611969e0437c83d0149e1481f89c77e8 GIT binary patch literal 877 zcmZ?wbhEHbi zGH1?|IZKxwySMh(wYA6YZQZ(e>)vBq_ntd;?A)<)_l{k=ckbM|YxnM5yZ8Ja2t2>{ z{QdLi??K@E|M&m@e+Pp9qhK@y24e{5fN}sRFEDTfG01Wl1T0`+X5yCPU^p1i;w-?% z)9^!q$)ST^UO?l31=E2J0U0iV6&wmcJrXh+i z#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaozEwNPs zx)kDt+yc0-^T+pZU%!0*^zp;{cW>Xke)aOj^Jh<=Jbv`>!To!8@7%t1^TzdSSFc>Ybn(LZ zb7#+-K6UcM@nc7i96ogL!2W%E_w3%abI0~=Teoc9v~k1wb!*qGUbS+?@?}exEMBy5 z!Tfo1=ggipbH?;(Q>RRxG;umQ)5GYU2RQuRb@qaS!qdeQDH%T zUT#iyR%S+eT53viQer}UTx?8qRAfYWSZGLaP+)++pRbR%m#2rjo2!enlcR&Zovn?v zm8FHbnW>4f5im>X>FQ`}X=f4NtU=qlmzFem6RtIr7}3CgaTBb24NWo|M2VQ19~Sf77gE4eLJ0p1A1oCo1_>Me_*O|QcbdU&z~Iop$e`ONuG7tV+Y4wngQu&X%Q~loCIA_z BL?-|M literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/edit.gif b/packages/client/public/diagram/images/edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c07607352ff29f679e2e6b3383857f5f5b5cb03 GIT binary patch literal 66 zcmZ?wbhEHb0N*f2C$8O)^6RqcJHyZ$F8kCc5mz6V|$OCI|c;j&K)~d(ZCy z!Sm<$-hT%Y&w=Fo|Ifewe-8rR-+%x9{{Md<@f`^M0|A%-F-E~?2n;|7=zwwnC@(N@ z1T)C8XgDl5*uco5q#}@b$fc`YjY~mbA`?rOsHTko%fzIkoFd95S{{rGQcm)+N=%SA p_{q7Qo0To+!GeWM?OX=p2@M8`hnhJBxLh&_IsgCw literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/handle-fixed.png b/packages/client/public/diagram/images/handle-fixed.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b600b1a50dd62b02fe0a159172df0baa602269 GIT binary patch literal 1293 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVix(bUYG&eP`1g19yq1O?oUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZnv1@G!Lpb z1-Dx)aO%|uIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@i&R+6jJp%({qo<2wNX4x+ zA&y>$0|d_g&$^uRYSD{BIx!kfFIHJkU$p!}Rbv&)LFF$3O;?-53lx`zpK#N;mddhp zDVMLO*V*#8KlXEv?Fz8^FyqXb)2CDZsT_*RQF@-J^}K#UWsbtlt(QD*Y>iS$%3}%R zG+TJUMXhCq!PO);gT0O1YXs(aE#36+cirCm@6Fv8UzD{;dJ=fuW@f#x$~BIqZi_d{ zw>@lDs;=@4Sw4G-T$|0S2buexte;r+pz_|g3Y&NP+P$vo*-tGsJlh~qdF5cTEayq9 zjnQkbbw0MJPT$^n_03s%rbkv!1J&bv&-+B}6xP_WuKG%K@U^d>w>vx!Irmfg)MCFq z&SoVC*|l?S>+P>OGq0{->Jp|8#{%@lx>LV>$T4`i^LU}nji~vZ5{#EQdA@3NvDJjD zaH}~AY$-QyE#0HM$!~|dT0fhdEP)&a^;65}wA1&^Yus$bVHv8>x-6RHGb`&G=v7l9*a2%6Lm?dl$x zUAo*7xPp$LOYPEb$m}`-yx8`AzZXT(D30TKmSt;boMDHbaTOxP7usPMzU6uTp+&y8 zN4?q{&l&&E&+>umd=u>U_u0g$`>3rG!EN@FKTR&)C&?X4fRcmD*kkMpYU z0GcRS666=mV0`!8&X#l=xfhqqlsOK4JGo+Jsn4peNReNTTi*i}6?wWihDcm)?ei9D zHsEoVwf?`%;dJ=-{Tc~I!VwFn{&l<5q38O2X?xNy`;Nku`zISRznK25yM$B5XXQT~ zJ2f-u&4C{pmm0~GvoC+Z?q6c&XJ+ESo8hu_V$`a~TS9b|%+@jgb_(%4mUHl_oh?iG c&-+`MtM;*I3Dg|u1lrEv>FVdQ&MBb@02VHN`v3p{ literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/handle-secondary.png b/packages/client/public/diagram/images/handle-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a30900a9ceebc96313e919c1b2f3080e0485e5 GIT binary patch literal 1270 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVil$G&eP`1g19yq1ObbUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZnqfXG!Lpb z1-Dy_aO%|uIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@i{(9KTj)8$O%hSa%q~g|^ zkh6Zx4g&XFbzd~jFo}C}uv@%IJa67t%~k#nlwVkXk=?Um{ey!hb`JU~y`2}e=P6V$ zF!|noTa$87GeNjsZKjU#=eNfP)SQOQlNwAXl6eA5xWowicFewR&Z z15-|a@zq`Yyr@;N->N_=|HF9=>jIhQ8mBj1KOeI4=#!wc`L1s}Cc4X7T${MY-G2co$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|80+w{G(j&jGsVil+1S<9#nsZx+|<<2(ACt!(#+V!$i&6j(bdG+ z)!723*Cju>G&eP`1g19yq1O?oUQklVEdbi=l3J8mmYU*Ll%J~r_OewbZnv1@G!Lpb z1-Dx)aO%|uIz}H9u}BdO69T3l5EGtkfgE_kPt60S_99@i?)bxy%D})_<>}%WQgLfd z$U(2e4gzP_-7=Y8p;5Jgoxdxf>eSiAFTykaHvZylnt!2RV2#)xM*g5*+&eptR`o2{ z5~9fIyE5{5tM8m66#=_G%$PfK`{bK5Z*nZI>1;X@#QL-O%vX^~Z>PGQ`L;^Oqe>t` zbw&#pw~@L_ODo?rHXptZ4B9NKZ|3CfSa(~l|9I^E@9z~B9_HKs?BpZggb3vubN$lo zIhxpAU%xaBYfhZwp>yLQyZ>j^{ce*S7hk-=cevn(oW|8%e?pEORbnmy%JrwJsGL6X z=4+MuwA8nA?;dk2pOVk?#q8!o^*HbAK2oiGA+Nsvy7qQ2(y)vBl1JQ_gXAyqxnze*bfpZ}*?Iq&IinKGC7}rN(OR zy~{^-O}Oy2=Ekh)sT-$k-~1)~&-?!;r!z1!cNswPK z!&JwbyygG}Uv4($1rsveO?9+Hdg@D3L#zxmXU4~!xxnNBRNCt4;us=vIk)FFU$X&^ z^W?aN;aogyIlup(kJ;4mv1w`4w~4_!uJ4G7{mapsRS^FKcBZ2j8|11OQaNr2M!a%-_Ep|TbKZgy`vcdDE*TyFd)O}j4Yxm^`u`0~ tLWx(y^%Y;O*%Q8*w;;)e{w6_--d;)=l!nE?h%Hfdm3a?MR_VAI~a{|RRSnBbgRo!0eL z)gmr$#uz?weZ~eLyBPVVwS_5c;7!NNaX(Kw9CYj)x0cpL-OuBuv$7xH>VCOq?QdC% z%`M)9*+^vqE~X}o+-)yZqa4@QRoOYd7C6|4(5)PI8dP1cz&r^sO!H#W5*I|cfOwRe zmu2}nltd&7q9h1hhCKa%yrL77;=gvj&-#EWrC zL!hqzAL_azbVv<+7VkfW!`hyY1p|jzh%N1BKLfqKD z8a=#X(-R*@W6O-u;A4+Xd%(u}_mjk3_9QM=R%?ZWgM&_|b9{WbVNOgO6W~w-h+H sK3rLxeEIa+!+GJ^kA^C|d-3brrFF1-?;LW`$s48vN`tCjbBd literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/logo.png b/packages/client/public/diagram/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..053a1eb2b18b59b6807b9324ac7186b988ac146b GIT binary patch literal 8999 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 aAb>-yja#QE9sj?-uBa+%!fO>Q!~YM!0BCgp literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/maximize.gif b/packages/client/public/diagram/images/maximize.gif new file mode 100644 index 0000000000000000000000000000000000000000..e27cf3e19f622e66991b11bf09f20bf15495ff78 GIT binary patch literal 843 zcmZ?wbhEHbWV4q+~q qfC~=}wed3>_*4Wua_$n=589F;sC>LrTCyldLuj#62P-oZgEauQf)%F# literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/minimize.gif b/packages/client/public/diagram/images/minimize.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e95e7cae4027b7a102220aed8629fa2cf0c7bc8 GIT binary patch literal 64 zcmZ?wbhEHb1}5>Ae(}?}yobAUf;iu8nsR)) NM#79r0ZB0iYXA(c5v~9L literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/move.png b/packages/client/public/diagram/images/move.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4bc916a35de7d16a8815b31aaf9def3a5b7ac0 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*t3?v(r4=o2$S^+*Gu0UFS>sQSkpEb4t(I+i1 zsk!Z==Jqd|+dhHO2hHuDfs9)(n>GMd^Ogkp1v8kKeEX1_Gdcdi?t{Dk>8_ImN-Xho zaSV~ToP2;wLNs8TaxiE$IK=2lpBW4%Vh+d0#?9<`?4D{Z<_xt(#vAH5rSYANd&n43@C z&0MH(bm7c$*+voJLmG?%OL?|-92d|z#ZuhHut~YFI`QY7+Z_B&Z};(B=iDTnqV9A{ mJVl*Jqxr3iN3)6{BZL23(|alxQX7HpW$<+Mb6Mw<&;$UT(s#=M literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/nocolor.png b/packages/client/public/diagram/images/nocolor.png new file mode 100644 index 0000000000000000000000000000000000000000..aec4534d6ae7836a8cfb151aa5e11e9b1e2a662e GIT binary patch literal 948 zcmaJ=zi!$<9JUgvs!*e5OuO{ts8WVvpY4Ld!ik8_G)OT*fD}fIeSk&mbL^uwOr;&F zZhe40L5GfAGIXxQ6Z8Q(bm=3|GXc_}^d$T4e)_)e_xCPjei{9n>#Si|vQm z_i&&6Px6o3YtC?Fg=krz^r1Rzti`(#3Oo<(|>f*)>WgLqvgRxmNOLs1f7meK}jS^tOn{uUk6 z7QT=7pTcox8e*}9V={>x*0{lO<|@>T2-}oI9YU@*Rcww3CGm)az-Sl1l^3`qiC1XL z(&|A>?ZClxr1Oj~c%G|O6;!TDCM*>twoK_DT9X%yLvm)lT}O-+QxHJLw&P`TXm%9Jlv~ WGY`4>^G~-Qvv*WC8|ce<@9iHWV4q+~r s2m^+OR(5H-5{bZvM><*L<8pRvSbVgDPcw|A^PigP)q@hG?SCbaS>w(}^q^C`3MDYo+e|Nr*<|9a8)U&!^Z z^ftTm+w=YH`Tpeg{mt(Dq~Q8Qzx1`{`;^=Hht~K{&Fz^0000bhQchC<(!=kkm~LMu z8BtNYX;8HQ00CA>L_t(I%axSbl7t`(Ma8XcCjk|gUi|;>oHR{Hu&A1v`yv#_Y$Q}# zL*JSPpfPPfRAt?2P^xbQWHb=u6J~y{Ovgvl3`t#v+{M#`imLC5F`yt#8KG*(pv;!U z!&=;HN1;?)Bk%nKS&AA1WZ2P$Nlt|oYN&!CZIKb(Bx+Bm);gFXxSLoyoL2PL)yCbo?84;h~Jiiqo2$DM^*`0y0Kzb6h$;GsBwc+jq6AT;#rINQ? zOgPub5cE7yC)=lM0cOxW?B}y2XppvK2CdB-p-!z5qh;-jY87resRMrUdV|PF`zmUJ zOrs2fqH?AyjMRLA>f&(D8D#VbYgP!E>{@(Bh{^STKLRWtPIuwJ9HO^ literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/round-drop.png b/packages/client/public/diagram/images/round-drop.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e2fb603c745f98849d48b31b96651240e9ba27 GIT binary patch literal 1216 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=og`u07v8$=6fr+c3p{t3bp|h*2iHU)Ug`2sB znTsV%uSMv>2~2MaLa!N4y`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-@<(X&zK> z3U0TU;MA)Rbc{YIVv!;mCIn19ASOK70y*%6pPC0u?M1+3{iy2s9tH+R6Hgb%kcwML zfByfsXSQV!W}eHy-E(lqKW07CTMln{j!bh{!+zvbz{hrn8qSV>=8tg-`?`ET|94;v z>E6J=s^G`)C_^FapwfEQqk;}K>>bmYJ~AoPHC%VkIKbG^-FTz@!~{mmC2}3TjXT6U z_yvUB6}+Q7Hn2$kaQJE^u*rk*m2fuKqq|aBZA^CELMOg(n$1^zu*pMO>f;rrivh-l zIz`7O?mEG$1!8Vm;%K+^NZLd>UY$#a(P%W*9oe39(OGK7e}UPq(=!q-s^*Bv zE^l-_zADR=t9Ukp+6WtJY8 zv^c<6PGD8P!_+X|nRd6Cu2whPkov}O#Wnq7$kP{s{oA$DTTHiS+_gxQDSKbP0l+XkK`s(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-8c9S!RCwBK(XmUFaTJH~&%IY^YmiWohW-GDh6Ka)T0{{zIB3JAK^k-thqF1j z9CvNBDF~OEn%=cA2SE^BqB&3yoUV}fZTY=&!TZ1&&hVUb_?}i>*CL{g1-!>IT;VIe zWab}3bo%}N7&h?rYudU#b;)z5CX`?nF=c!9(LUT00LU@B|e9z2*lFB}o zu@@1WI4Xl)VhcC8XePAEALg-#8JuApPtd{xoZv%d{%X~A4I<)kiSlXrLsjnH!4%H1 ydM7kQ#5e|-d0YA=>|zqf_k>YI#0s|Y`Tqd(7-D7{ea^@L0000;jF-siv0egDVL!_|Id(Z?5>3=Gx)k9{Vl literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/triangle-down.png b/packages/client/public/diagram/images/triangle-down.png new file mode 100644 index 0000000000000000000000000000000000000000..d03b98fc5fe41063eabf961062e81775c54968f0 GIT binary patch literal 1104 zcmaJ=O-K|`9G_Cl#Lr8iL`|cHg}XDe?z+zCrrXS#ON}h+LR%ebcIN30?tD1&Y*+EH zZ5}ovFf%iXis~342~h-D;=!n>AR;za_VLuNiz&%Yq(qvgm73x8Wd9w&8p2Q@W7Hx#ej;g;kKd}(+8oCK#{Jbpc-qk znzdRcR4_6n8YJzc?38jqLHIvZRoBoK41@J}|0!%mh73T4fu#?c5^7v;t?kNSITMIb zHzT^9$W<{E*P(93bpz*mJh&iAie}r(ctK!;ngvBo0zuwKAO)wQ$gHP@!#=y%FXbcJICd9X;1|k%yH#)u0Jo=9tG7vo_Sy@CxP5)>MFjRGOOf| z#hX`el`H3ur6n(yM8S}DWB+P&?g~wheOwz`WULK7(9pD-Xsnk8o;%Q!m=E&)Na{mO zj{dlIYDaoY)=K|uKQ~abaC1+`)d2VEcEPvCtqpx_Sk&H literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/triangle-left.png b/packages/client/public/diagram/images/triangle-left.png new file mode 100644 index 0000000000000000000000000000000000000000..44b842551164fa8e0d87d5b08ffa0e4e0ed7c3fa GIT binary patch literal 1123 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM4!3HGT`Ez4{lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#24v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`Gtf;oFf&jvGt@IQ zHZeCh*HJJsFf`CNFw!?P(ls=ndS0-B(gnVDi`?&fIjXm0FiX=dhTXy|HcVQFgOY;Iy;XklPt z>Edhx)9aF-T$-DjR|37L*#bH6grAxROzlO$WUU*&I~|xM zu6w#ThE&{|a^)iXp#YKNA47#V+G|#Iy;$ioG3b`}e_wywslA%rI<`yxt-h!HOZMH_ z(z|!7&ppf*mM?#sm+f-ZTId|tQ(whfi)80|JYahp=*{%<6W=SFhlg4l{|Pq*PkDLz z@gYvDofG)`YF6;^1$N%r_dnq<<0_{UZMAwviTrm1+kcw~yjirIC3D7)ck}r7U680< zGU1ux(Py!$Hjk64%b9mwRk3HA)&irH&(b!se s=FYYlS>uykYJN+#Us=A={l#g(@ZzX4`}S3Z8$j9K)78&qol`;+0HxQ06aWAK literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/triangle-right.png b/packages/client/public/diagram/images/triangle-right.png new file mode 100644 index 0000000000000000000000000000000000000000..98656281fcbb894b38a90c55d0b3f35eb98268d2 GIT binary patch literal 1103 zcmaJ=O-K|`9G?&@qz@zs6RKgXNNRUx)}7s*X*bCk&8=q9buF!g#+j!(>dc#Fp6%$Z zBCJD%6rBV?E5n1-p+h7|Ntibe8WnX3!5~nIf(ZI}WA56aZQ#v&|Htq5`+vTx^@$^! zipq)zg4h(VlahGfj91x)Lj3RFVw}O-c2v`h8eu!iC^jGtYp@NFaYN|U8Q&DPq5q*S}=3tKTNjgTeK zbS9JWXDa>B?x0zo=RJ);z=sh&r`JS^>ocA5tbzm_)z&SfLzDCrl{VOeVib<_PYQ;W zlQo^yGU0;Ju42)wpYc-40%iICP{YWf9h3xX@%~fTN%dNQP67w^*eY&Zd%5Sz5=0v) z2-+zKyR%iSPeTNqG_**ukt1bA)lJV{!OOA`HyxyyDu_!l3M=?^T@$#7D2DkOjt_-u zS+<6Y@LW&~2N^cP1bImeX1NkndkkQrELU6OhVpW~Q7|m*Spv3x9%!{TG{}{d1wDT( zm3j46xmx~Mf_b?#4uSU-4I!Qm${6_*aD+&6=B zPm9(yl=OdM7hb=pzI~-+;Q2&x@xXBK#Lx*$gxUrnRHkq C0&@-k literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/triangle-up.png b/packages/client/public/diagram/images/triangle-up.png new file mode 100644 index 0000000000000000000000000000000000000000..6d936767357bd402adab9725610d4e8e351eb45b GIT binary patch literal 1086 zcmaJ=O-K|`93MY2F%1im5`$q(Q*h^F-4AzgwQa`Dg+|tO!%YwE?95XqosVXo?dVC( z%mSgJq&kE_k*Dwjy>tk|!%AK{CIlTkL=YZ}2a6oKzT;82j*3o0Q*aZWb@?j>oL zMEhvm$B;~u$M5$y;%=IuDcVgjZWrTco7^l-jxD1OkqR+wDRKmo=(E(ROK8O;&*imSidhRCEn@6vdQ20)qsKbT0+fIFQw> z{W76~QMPDM3`sjFWr2e5f2gV+pe+~!hw=VX*ou!DfQkW2A2B7=xc(Z)mBDf*5TS0y zb$vKn#ps|8b!$*JaIV{n3!dmdoqXhzc~A<;sWLa89l>3aWuT^T1SY06A>xD!!XCtK^P_ z%c-}|m2=0!=j2i-7|LnvUyaUQq3Lms2V;wjgTV(HnsyV7b?e&pZ}cRVBYY@sZ>8kK z_h%FQ=e+f+<3EZUo<7bj$~EOX`KfcgSGJF?PL<6BChTJkbIkqZ#^|Beq~nct7m%37Yjcvm&aUpCx1>onOc8WG?J)Ts+_1G zi4P}FC8xj65^`7mk-7Q4x$*bJz4hu6S7>dxwfxodzK5lc=BH~j$+}H{4gt(7m%i;lE+@~C;tGMyuN29CCjLf-$lrKb|3bD4SS{lcTEwB@Lu%GS6$o;UQH4clSnDev;WR}J(Y9X3 zWo7*++-%L@M(ePc{P=pP(?8{H6;>T z6{h$eS3%~g16|zXS|?m}AU7Tb$0ME<=-X@1n)8tZIw?!`;8-#P^}1YZa4gw@T$TjG z#*O`}(Y-4&J@K(Ww#4WUK6J^n`(&&$k6+v+PvU%GL07l7wsv-Qn$2dtUOzlMY_(dA zMx)(s^Pj%Qm=RpemxviJ>f6J&cjBj%Q)cz(KyTeVM}gtt{acNn&6TJ6?{~@Fy-n)u z_S)AEQdq6L|F!RZ-n@KCJ~;jS-jyHQ($VXyd(@L>r$StUyF`b|sd?p9=Kg~}W#Cav literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/warning.gif b/packages/client/public/diagram/images/warning.gif new file mode 100644 index 0000000000000000000000000000000000000000..705235f95c6a58100385aa6b689d40dcf6803fe4 GIT binary patch literal 276 zcmZ?wbhEHb6krfwI3maZ1RNY3K|z+q#g^684As?|OP2~PU8=cuZP2-M4A-umyLXS_ z-aUcu-zC0(SN#56^Z$R47UF^8e{Mh5kYH!W09PYD17=2`PQ{-roJI_S3_2iFK+a%b z4NFkzOUdlwESkk}g-3g*!v(=^-M0rmUXo~Q%f0Hw!qjYeRy3=G!B)-7ShX(a P^}Yg~^Ch|ciVW5Oz=%=n literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/warning.png b/packages/client/public/diagram/images/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7878964ce8fcad001eaf06e3a60c751b781437 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+AuIMT6?-UhE&{2`t$$4J+mrhyQQQZvOZ9GPi((1usJ;i`U=(|6(827jAr7AH&ALBH+jT?k=-;RE&T@EHsr`XJ3l_ZRadVU3uuDXt!61fV zv#dyijEqbIPf~I*tB0ZkL*fpHz(U!uZVQWd%&`X>75M}lH1r(4S#RP_VC;IwH9^6F zVdH~MvBAMj2Tywoo|!gf55G!$LoB0-z)?m9MwW8MsuPD7@wWsfy9fhSGk{co-o5l` zX&b-%g~N}m1hNnP1S&IQo&8oJCUz|+FEitsbqs|JOdXu@Cmu5iggeY(6L9ePA+l{t zO!|+1f7vfI@mpL4dQ|y@WKT~IkN0%0Kl{txGEdCAkdl$Rm+u<4KmvpO^52Wr-Yf=% OHG`+CpUXO@geCy=#hxkv literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/window-title.gif b/packages/client/public/diagram/images/window-title.gif new file mode 100644 index 0000000000000000000000000000000000000000..231def8bb5a44af3708c65e26d9d4196c00e8c94 GIT binary patch literal 275 zcmZ?wbhEHb6lV};IKsei{rdG&r%pY5`0(7ha|aF_IC${j`Sa%=J$m%y$&-s0FW$a= z`^AeF@87?_fB*i^pFeNjym{@~wa1Si_w@8!zI^$?g9mr--hKA$*_ktE7;pf^pDbV* z9S{k!lYw=Df}+sTjA>6at#V%PGdO*wB=`R3Mel3gzn-?Bz(Yr>|HP7@jtr~$7cz{U z)<&(5Sd~z1k+c7S!3-z8+2=EglF#PtzW=(b#&7-Yr(JvM&cA;y-_Y39+|t0%-qG3B z-7e7AKVjmeKH;g;rq7r;m2=MAdGi;{VOz|+blLJ1E5ui?S-WoiYQ{~Qw`|?ENoeP; M-Fx=#RAjIQ0Glw5tpET3 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/images/window.gif b/packages/client/public/diagram/images/window.gif new file mode 100644 index 0000000000000000000000000000000000000000..6631c4f5f20e1090fbbbfce38c873e26f6259c0c GIT binary patch literal 75 zcmZ?wbhEHblwuHJXkcJ?^XAQm4<8hNvM_*v4u}BBFfb|g^shX{2},然后返回此标签以尝试再次保存。 +errorSendingFeedback=发送反馈出错。 +errorUpdatingPreview=更新预览出错。 +exit=退出 +exitGroup=退出编辑组 +expand=展开 +export=导出 +exporting=正在导出 +exportAs=导出为 +exportOptionsDisabled=已禁止导出 +exportOptionsDisabledDetails=所有者已禁止评论者及浏览者下载、打印或复制该文件。 +externalChanges=外部修改 +extras=其它 +facebook=Facebook +failedToSaveTryReconnect=保存失败,正在尝试重新连接 +featureRequest=增加功能请求 +feedback=反馈 +feedbackSent=反馈发送成功 +floorplans=平面图 +file=文件 +fileChangedOverwriteDialog=文件已经被修改。是否保存文件并覆盖这些更改? +fileChangedSyncDialog=文件已经被修改。是否要同步这些修改? +fileChangedSync=文件已经被修改。点击这里进行同步。 +overwrite=覆盖 +synchronize=同步 +filename=文件名 +fileExists=文件已存在 +fileMovedToTrash=文件已经移到垃圾箱 +fileNearlyFullSeeFaq=文件即将达到上限,请参阅常见问题 +fileNotFound=未找到文件 +repositoryNotFound=未找到资源库 +fileNotFoundOrDenied=文件未找到。其不存在或您没有查阅权限。 +fileNotLoaded=文件无法加载 +fileNotSaved=文件无法保存 +fileOpenLocation=你想如何打开这些文件? +filetypeHtml=.html 会保存文件为 HTML 格式并重定向到云端 URL +filetypePng=.png 会保存文件为 PNG 格式并包含嵌入数据 +filetypeSvg=.svg 会保存文件为 SVG 格式并包含嵌入数据 +fileWillBeSavedInAppFolder={1} 将保存至应用软件文件夹 +fill=填充 +fillColor=填充色 +filterCards=卡片筛选 +find=查找 +fit=适应大小 +fitContainer=调整容器尺寸 +fitIntoContainer=适应容器尺寸 +fitPage=整页显示 +fitPageWidth=适应页面宽度 +fitTo=适应 +fitToSheetsAcross=横向页数 +fitToBy=按 +fitToSheetsDown=纵向页数 +fitTwoPages=双页 +fitWindow=适应窗口大小 +flip=翻转 +flipH=水平翻转 +flipV=垂直翻转 +flowchart=流程图 +folder=文件夹 +font=字体 +fontColor=字体颜色 +fontFamily=字体 +fontSize=字体大小 +forbidden=您没有该文件的访问权限 +format=格式 +formatPanel=格式面板 +formatted=格式化 +formattedText=格式化文本 +formatPng=PNG +formatGif=GIF +formatJpg=JPEG +formatPdf=PDF +formatSql=SQL +formatSvg=SVG +formatHtmlEmbedded=HTML +formatSvgEmbedded=SVG(XML) +formatVsdx=VSDX +formatVssx=VSSX +formatXmlPlain=XML(文本文件) +formatXml=XML +forum=讨论组 / 帮助论坛 +freehand=自由绘图 +fromTemplate=从模板 +fromTemplateUrl=从模板 URL 地址 +fromText=从文本 +fromUrl=从 URL 地址 +fromThisPage=从当前页 +fullscreen=全屏 +gap=间隙 +gcp=GCP +general=通用 +getNotionChromeExtension=获取 Notion Chrome 扩展程序 +github=GitHub +gitlab=GitLab +gliffy=Gliffy +global=全局 +googleDocs=Google 文档 +googleDrive=Google Drive +googleGadget=Google Gadget +googlePlus=Google+ +googleSharingNotAvailable=分享只有使用 Google Drive 时可用. 请点击下方的打开, 从更多操作菜单中分享. +googleSlides=Google 幻灯片 +googleSites=Google 协作平台 +googleSheets=Google 表格 +gradient=渐变 +gradientColor=颜色 +grid=网格 +gridColor=网格线颜色 +gridSize=网格大小 +group=组合 +guides=参考线 +hateApp=我讨厌 draw.io +heading=标题 +height=高 +help=帮助 +helpTranslate=帮助我们翻译此应用 +hide=隐藏 +hideIt=隐藏 {1} +hidden=已隐藏 +home=首页 +horizontal=水平 +horizontalFlow=水平流 +horizontalTree=水平树 +howTranslate=你所选语言的翻译质量如何? +html=HTML +htmlText=HTML 文本 +id=ID +iframe=IFrame +ignore=忽略 +image=图片 +imageUrl=图片 URL 地址 +images=图片 +imagePreviewError=无法预览图片。请检查 URL 地址。 +imageTooBig=图片太大 +imgur=Imgur +import=导入 +importFrom=从...导入 +includeCopyOfMyDiagram=包含绘图副本 +increaseIndent=增加缩进 +decreaseIndent=减少缩进 +insert=插入 +insertColumnBefore=左边插入列 +insertColumnAfter=右边插入列 +insertEllipse=插入椭圆 +insertImage=插入图片 +insertHorizontalRule=插入水平标尺 +insertLink=插入链接 +insertPage=插入页面 +insertRectangle=插入矩形 +insertRhombus=插入菱形 +insertRowBefore=上方插入行 +insertRowAfter=下方插入行 +insertText=插入文本 +inserting=正在插入 +installApp=安装应用 +invalidFilename=绘图名称不能包含以下特殊字符: \ / | : ; { } < > & + ? = " +invalidLicenseSeeThisPage=您的许可无效,请参阅此页面。 +invalidInput=无效输入 +invalidName=无效名称 +invalidOrMissingFile=无效或丢失的文件 +invalidPublicUrl=无效的公开 URL 地址 +isometric=等尺寸 +ios=iOS +italic=斜体 +kennedy=Kennedy +keyboardShortcuts=快捷键 +labels=标签 +layers=图层 +landscape=横向 +language=语言 +leanMapping=价值流图 +lastChange={1}以前最新更改 +lessThanAMinute=一分钟以内 +licensingError=授权出错 +licenseHasExpired={1} 的许可证已于 {2} 过期。请点击此处。 +licenseRequired=该功能需要 draw.io 被授权 +licenseWillExpire={1} 的许可证将于 {2} 过期。请点击此处。 +lineJumps=跨线 +linkAccountRequired=如果绘图未公开,则需要提供谷歌账户才能查看该链接。 +linkText=链接文本 +list=列表 +minute=分钟 +minutes=分钟 +hours=小时 +days=天 +months=月 +years=年 +restartForChangeRequired=更改将在页面刷新后生效。 +laneColor=泳道颜色 +lastModified=最近修改 +layout=布局 +left=左 +leftAlign=左对齐 +leftToRight=右对齐 +libraryTooltip=将图形拖放至此或单击+以插入。双击进行编辑。 +lightbox=灯箱特效 +line=线条 +lineend=线末端 +lineheight=行高 +linestart=线始端 +linewidth=线宽 +link=连接 +links=连接 +loading=加载中 +lockUnlock=锁定 / 解锁 +loggedOut=注销 +logIn=登录 +loveIt=我爱 {1} +lucidchart=Lucidchart +maps=地图 +mathematicalTypesetting=数学排版 +makeCopy=创建副本 +manual=手册 +merge=合并 +mermaid=Mermaid +microsoftOffice=Microsoft Office +microsoftExcel=Microsoft Excel +microsoftPowerPoint=Microsoft PowerPoint +microsoftWord=Microsoft Word +middle=垂直居中 +minimal=Minimal +misc=杂项 +mockups=实体模型 +modificationDate=修改日期 +modifiedBy=修改者 +more=更多 +moreResults=更多结果 +moreShapes=更多图形 +move=移动 +moveToFolder=移动至文件夹 +moving=移动中 +moveSelectionTo=将所选移至 {1} +name=名称 +navigation=导航 +network=网络 +networking=网络 +new=新建 +newLibrary=新增图库 +nextPage=下一页 +no=否 +noPickFolder=不,选择文件夹 +noAttachments=未找到附件 +noColor=无颜色 +noFiles=无文件 +noFileSelected=未选择文件 +noLibraries=未找到图库 +noMoreResults=无其他结果 +none=无 +noOtherViewers=无其他查阅者 +noPlugins=无插件 +noPreview=无预览 +noResponse=服务器无响应 +noResultsFor=未找到 '{1}' 的相关结果 +noRevisions=无修订 +noSearchResults=查询无结果 +noPageContentOrNotSaved=此页面上找不到锚点,或尚未保存 +normal=正常 +north=向上 +notADiagramFile=非绘图文件 +notALibraryFile=非图库文件 +notAvailable=不可用 +notAUtf8File=非 UTF-8 格式文件 +notConnected=未连接 +note=备注 +notion=Notion +notSatisfiedWithImport=对导入不满意? +notUsingService=未使用 {1}? +numberedList=编号列表 +offline=离线 +ok=确定 +oneDrive=OneDrive +online=线上 +opacity=不透明度 +open=打开 +openArrow=开放的箭头 +openExistingDiagram=打开现有绘图 +openFile=打开文件 +openFrom=从...打开 +openLibrary=打开图库 +openLibraryFrom=从...打开图库 +openLink=打开链接 +openInNewWindow=在新窗口打开 +openInThisWindow=在当前窗口打开 +openIt=打开{1} +openRecent=打开最近使用的文件 +openSupported=支持的格式有本软件保存的文件 (.xml), .vsdx 及 .gliffy +options=选项 +organic=力导向图 +orgChart=组织结构图 +orthogonal=正交 +otherViewer=其他查阅者 +otherViewers=其他查阅者 +outline=缩略图 +oval=椭圆形 +page=页面 +pageContent=页面内容 +pageNotFound=未找到页面 +pageWithNumber=第 {1} 页 +pages=页面 +pageView=页面视图 +pageSetup=页面设置 +pageScale=页面比例 +pan=移动画布 +panTooltip=按住空格键并拖拽以移动画布 +paperSize=页面尺寸 +pattern=样式 +parallels=Parallels +paste=粘贴 +pasteData=粘贴数据 +pasteHere=在这粘贴 +pasteSize=粘贴大小 +pasteStyle=粘贴样式 +perimeter=周长 +permissionAnyone=任何人均可编辑 +permissionAuthor=只有本人可编辑 +pickFolder=选择文件夹 +pickLibraryDialogTitle=选择图库 +publicDiagramUrl=绘图的公共 URL 地址 +placeholders=占位符 +plantUml=PlantUML +plugins=插件 +pluginUrl=插件 URL 地址 +pluginWarning=本页面已要求载入以下插件:\n \n {1}\n \n 是否现在载入这些插件?\n \n 备注:确保在完全理解与此相关的安全问题的情况下再允许这些插件运行。\n +plusTooltip=单击进行连接与复制(ctrl+单击进行复制,shift+单击进行连接)。拖拽进行连接(ctrl+拖拽进行复制)。 +portrait=竖向 +position=位置 +posterPrint=海报样式 +preferences=喜好 +preview=预览 +previousPage=上一页 +print=打印 +printAllPages=打印所有页 +procEng=工艺流程 +project=方案 +priority=优先级 +properties=属性 +publish=发布 +quickStart=快速入门视频 +rack=机架 +radial=Radial +radialTree=径向树 +readOnly=只读 +reconnecting=重新连接 +recentlyUpdated=最近更新 +recentlyViewed=最近阅览 +rectangle=矩形 +redirectToNewApp=该文件是在此应用软件的新版本中所创建或修改的。正在重新定向。 +realtimeTimeout=似乎您在离线状态下做过更改。对不起,这些更改不予保存。 +redo=重做 +refresh=刷新 +regularExpression=正则表达式 +relative=相对 +relativeUrlNotAllowed=不允许使用相对 URL 地址 +rememberMe=记住我 +rememberThisSetting=记住此设置 +removeFormat=清除格式 +removeFromGroup=移出组合 +removeIt=删除 {1} +removeWaypoint=删除航点 +rename=重命名 +renamed=已重命名 +renameIt=重命名 {1} +renaming=正在重命名 +replace=替换 +replaceIt={1} 已经存在了。确定要替换它吗? +replaceExistingDrawing=替换当前绘图 +required=必填 +reset=重置 +resetView=重置视图 +resize=调整大小 +resizeLargeImages=您是否想调整大图片的大小使应用运行更快? +retina=Retina +responsive=响应式 +restore=恢复 +restoring=正在恢复 +retryingIn={1} 秒后重试 +retryingLoad=载入失败,正在重试... +retryingLogin=登录超时,正在重试... +reverse=翻转 +revision=修订 +revisionHistory=修订历史 +rhombus=菱形 +right=右 +rightAlign=右对齐 +rightToLeft=由右至左 +rotate=旋转 +rotateTooltip=点选拖拽旋转,或点击选择90度 +rotation=旋转 +rounded=圆角 +save=保存 +saveAndExit=保存并退出 +saveAs=另存为 +saveAsXmlFile=另存为XML文件? +saved=已保存 +saveDiagramFirst=请先保存绘图 +saveDiagramsTo=保存绘图到 +saveLibrary403=没有足够的权限编辑此图库 +saveLibrary500=保存图库时出错 +saveLibraryReadOnly=只读模式开启时无法保存图库 +saving=正在保存 +scratchpad=便笺本 +scrollbars=滚动条 +search=搜索 +searchShapes=搜索图形 +selectAll=全选 +selectionOnly=仅所选内容 +selectCard=选择卡片 +selectEdges=选择边线 +selectFile=选择文件 +selectFolder=选择文件夹 +selectFont=选择字体 +selectNone=全不选 +selectTemplate=选择模板 +selectVertices=选择顶点 +sendBackward=下移一层 +sendMessage=发送 +sendYourFeedback=发送您的反馈 +serviceUnavailableOrBlocked=服务无法使用或已被屏蔽 +sessionExpired=会话已过期,请刷新浏览器窗口。 +sessionTimeoutOnSave=会话已超时,您的 Google Drive 连接已断开。按确定键登录并保存。 +setAsDefaultStyle=设置为默认样式 +shadow=阴影 +shape=形状 +shapes=形状 +share=共享 +shareCursor=Share Mouse Cursor +shareLink=共享编辑的链接 +sharingAvailable=共享可用于 Google Drive 和 OneDrive 文件. +sharp=锐利 +show=显示 +showRemoteCursors=Show Remote Mouse Cursors +showStartScreen=显示开始画面 +sidebarTooltip=单击以展开。将图形拖拽至绘图中。Shift+单击以改变所选内容。Alt+单击以插入及连接。 +signs=标识 +signOut=注销 +simple=简单 +simpleArrow=简单箭头 +simpleViewer=Simple Viewer +size=大小 +sketch=草图 +snapToGrid=对齐到网格 +solid=实线 +sourceSpacing=源距 +south=向下 +software=软件 +space=空间 +spacing=间距 +specialLink=特殊链接 +standard=标准 +startDrawing=开始绘图 +stopDrawing=结束绘图 +starting=开启中 +straight=直线 +strikethrough=删除线 +strokeColor=线条颜色 +style=样式 +subscript=下标 +summary=概要 +superscript=上标 +support=支持 +swimlaneDiagram=泳道图 +sysml=SysML +tags=标签 +table=表格 +tables=表格 +takeOver=Take Over +targetSpacing=目标间距 +template=模板 +templates=模板 +text=文本 +textAlignment=文本对齐 +textOpacity=字体不透明度 +theme=主题 +timeout=超时 +title=标题 +to=至 +toBack=移至最后 +toFront=移至最前 +tooLargeUseDownload=Too large, use download instead. +toolbar=工具栏 +tooltips=提示 +top=上 +topAlign=向上对齐 +topLeft=左上 +topRight=右上 +transparent=透明 +transparentBackground=透明背景 +trello=Trello +tryAgain=重试 +tryOpeningViaThisPage=尝试通过此页面开启 +turn=旋转90° +type=类型 +twitter=Twitter +uml=UML +underline=下划线 +undo=撤销 +ungroup=取消组合 +unmerge=取消合并 +unsavedChanges=未保存的更改 +unsavedChangesClickHereToSave=修改未保存。点击此处保存。 +untitled=未命名 +untitledDiagram=未命名绘图 +untitledLayer=未命名图层 +untitledLibrary=未命名图库 +unknownError=未知错误 +updateFile=更新{1} +updatingDocument=文件更新中。请稍候... +updatingPreview=预览更新中。请稍候... +updatingSelection=选择更新中。请稍候... +upload=上传 +url=URL +useOffline=离线使用 +useRootFolder=要使用根目录吗? +userManual=用户手册 +vertical=垂直 +verticalFlow=垂直流 +verticalTree=垂直树 +view=查看 +viewerSettings=Viewer Settings +viewUrl=用于查看的链接:{1} +voiceAssistant=语音助手(测试版) +warning=警告 +waypoints=航点 +west=向左 +width=宽 +wiki=Wiki +wordWrap=自动换行 +writingDirection=书写方向 +yes=是 +yourEmailAddress=您的电子邮件地址 +zoom=缩放 +zoomIn=放大 +zoomOut=缩小 +basic=基本 +businessprocess=业务流程图 +charts=图表 +engineering=工程 +flowcharts=流程图 +gmdl=材料设计 +mindmaps=思维导图 +mockups=模型图 +networkdiagrams=网络结构图 +nothingIsSelected=未选择 +other=其他 +softwaredesign=软件设计图 +venndiagrams=维恩图 +webEmailOrOther=网站、电子邮件或其他网络地址 +webLink=Web链接 +wireframes=线框图 +property=属性 +value=值 +showMore=显示更多 +showLess=显示更少 +myDiagrams=我的绘图 +allDiagrams=全部绘图 +recentlyUsed=最近使用 +listView=列表视图 +gridView=网格视图 +resultsFor={1}' 的结果 +oneDriveCharsNotAllowed=不允许下列字符: ~ " # % * : < > ? / \ { | } +oneDriveInvalidDeviceName=指定的设备名称无效 +officeNotLoggedOD=您没有登录到 OneDrive. 请先打开 draw.io 任务栏并登录. +officeSelectSingleDiag=请选择一个没有其他内容的 draw.io 绘图 +officeSelectDiag=请选择 draw.io 绘图 +officeCannotFindDiagram=在选择中无法找到 draw.io 绘图 +noDiagrams=没有找到绘图 +authFailed=认证失败 +officeFailedAuthMsg=无法成功认证用户或认证应用 +convertingDiagramFailed=转换绘图失败 +officeCopyImgErrMsg=由于主机应用的一些限制, 图片无法被插入. 请手动赋值图片然后粘贴到文档中. +insertingImageFailed=插入图片失败 +officeCopyImgInst=说明: 右键点击下方的图片. 在上下文菜单中选择 "复制图片". 然后在文档中, 右键点击并在上下文菜单中选择 "粘贴" +folderEmpty=文件夹为空 +recent=最近 +sharedWithMe=与我分享 +sharepointSites=Sharepoint 站点 +errorFetchingFolder=获取文件夹项目出错 +errorAuthOD=OneDrive 认证出错 +officeMainHeader=添加 draw.io 绘图到您的文档 +officeStepsHeader=该加载项执行以下步骤: +officeStep1=连接到 Microsoft OneDrive, Google Drive 或您的设备 +officeStep2=选择 draw.io 绘图 +officeStep3=插入绘图到文档 +officeAuthPopupInfo=请在弹出的窗口中完成认证 +officeSelDiag=选择 draw.io 绘图 +files=文件 +shared=已分享 +sharepoint=Sharepoint +officeManualUpdateInst=说明: 从文档中复制 draw.io 绘图. 然后在下方的框中右键点击然后在上下文菜单中选择 "粘贴". +officeClickToEdit=点击图标开始编辑 +pasteDiagram=在这里粘贴 draw.io 绘图 +connectOD=连接到 OneDrive +selectChildren=选择子元素 +selectSiblings=选择同级元素 +selectParent=选择父元素 +selectDescendants=选择后续元素 +lastSaved=上次保存 {1} 之前 +resolve=解决 +reopen=重新打开 +showResolved=显示已解决 +reply=回复 +objectNotFound=找不到对象 +reOpened=重新打开的 +markedAsResolved=标记为已解决 +noCommentsFound=找不到评论 +comments=评论 +timeAgo={1} 之前 +confluenceCloud=Confluence 云 +libraries=库 +confAnchor=Confluence 页面锚点 +confTimeout=连接超时 +confSrvTakeTooLong={1} 服务器响应时间过长 +confCannotInsertNew=无法在新的 Confluence 页中插入 draw.io 绘图 +confSaveTry=请保存页面并重试 +confCannotGetID=无法确定页面ID +confContactAdmin=请联系您的 Confluence 管理员 +readErr=读取错误 +editingErr=编辑错误 +confExtEditNotPossible=绘图无法在外部编辑. 请尝试在编辑页面时编辑它. +confEditedExt=绘图/页面 已在外部编辑 +diagNotFound=绘图找不到 +confEditedExtRefresh=绘图/页面 已在外部编辑. 请刷新页面. +confCannotEditDraftDelOrExt=无法在草稿页面中进行编辑, 该绘图已经在其他页面删除或外部编辑. 请检查页面. +retBack=Return back +confDiagNotPublished=改绘图不属于已发布的页面 +createdByDraw=使用 draw.io 创建 +filenameShort=文件名太短 +invalidChars=无效的字符 +alreadyExst={1} 已经存在 +draftReadErr=草稿读取错误 +diagCantLoad=无法加载绘图 +draftWriteErr=草稿写入错误 +draftCantCreate=无法创建草稿 +confDuplName=检测到重复的绘图名. 请重新选择. +confSessionExpired=似乎登陆已经过期. 重新登录以避免中断. +login=登录 +drawPrev=draw.io 预览 +drawDiag=draw.io 绘图 +invalidCallFnNotFound=无效调用: 无法找到 {1} +invalidCallErrOccured=无效调用: 检测到错误, {1} +anonymous=匿名 +confGotoPage=Go to containing page +showComments=显示评论 +confError=错误: {1} +gliffyImport=导入 Gliffy +gliffyImportInst1=点击 "开始导入" 按钮导入所有 Gliffy 绘图到 draw.io。 +gliffyImportInst2=请注意,导入过程需要一些时间,导入完成前浏览器窗口必须保持打开状态。 +startImport=开始导入 +drawConfig=draw.io 配置 +customLib=自定义库 +customTemp=自定义模板 +pageIdsExp=导出页面 ID +drawReindex=draw.io re-indexing (beta) +working=Working +drawConfigNotFoundInst=draw.io 配置空间 (DRAWIOCONFIG) 不存在. 存储 draw.io 配置文件和自定义库/模板时需要该空间. +createConfSp=创建配置空间 +unexpErrRefresh=发生意外错误, 请刷新页面, 然后重试. +configJSONInst=在下方编辑器填写 draw.io JSON 配置内容然后点击保存. 如果需要帮助, 请参考 +thisPage=this page +curCustLib=Current Custom Libraries +libName=Library Name +action=操作 +drawConfID=draw.io 配置 ID +addLibInst=Click the "Add Library" button to upload a new library. +addLib=Add Library +customTempInst1=Custom templates are draw.io diagrams saved in children pages of +customTempInst2=For more details, please refer to +tempsPage=Templates page +pageIdsExpInst1=Select export target, then click the "Start Export" button to export all pages IDs. +pageIdsExpInst2=Please note that the export procedure will take some time and the browser window must remain open until the export is completed. +startExp=开始导出 +refreshDrawIndex=Refresh draw.io Diagrams Index +reindexInst1=Click the "Start Indexing" button to refresh draw.io diagrams index. +reindexInst2=Please note that the indexing procedure will take some time and the browser window must remain open until the indexing is completed. +startIndexing=Start Indexing +confAPageFoundFetch=Page "{1}" found. Fetching +confAAllDiagDone=All {1} diagrams processed. Process finished. +confAStartedProcessing=Started processing page "{1}" +confAAllDiagInPageDone=All {1} diagrams in page "{2}" processed successfully. +confAPartialDiagDone={1} out of {2} {3} diagrams in page "{4}" processed successfully. +confAUpdatePageFailed=Updating page "{1}" failed. +confANoDiagFoundInPage=No {1} diagrams found in page "{2}". +confAFetchPageFailed=Fetching the page failed. +confANoDiagFound=No {1} diagrams found. Process finished. +confASearchFailed=Searching for {1} diagrams failed. Please try again later. +confAGliffyDiagFound={2} diagram "{1}" found. Importing +confAGliffyDiagImported={2} diagram "{1}" imported successfully. +confASavingImpGliffyFailed=Saving imported {2} diagram "{1}" failed. +confAImportedFromByDraw=Imported from "{1}" by draw.io +confAImportGliffyFailed=Importing {2} diagram "{1}" failed. +confAFetchGliffyFailed=Fetching {2} diagram "{1}" failed. +confACheckBrokenDiagLnk=Checking for broken diagrams links. +confADelDiagLinkOf=Deleting diagram link of "{1}" +confADupLnk=(duplicate link) +confADelDiagLnkFailed=Deleting diagram link of "{1}" failed. +confAUnexpErrProcessPage=Unexpected error during processing the page with id: {1} +confADiagFoundIndex=Diagram "{1}" found. Indexing +confADiagIndexSucc=Diagram "{1}" indexed successfully. +confAIndexDiagFailed=Indexing diagram "{1}" failed. +confASkipDiagOtherPage=Skipped "{1}" as it belongs to another page! +confADiagUptoDate=Diagram "{1}" is up to date. +confACheckPagesWDraw=Checking pages having draw.io diagrams. +confAErrOccured=An error occurred! +savedSucc=保存成功 +confASaveFailedErr=Saving Failed (Unexpected Error) +character=字符 +confAConfPageDesc=This page contains draw.io configuration file (configuration.json) as attachment +confALibPageDesc=This page contains draw.io custom libraries as attachments +confATempPageDesc=This page contains draw.io custom templates as attachments +working=Working +confAConfSpaceDesc=This space is used to store draw.io configuration files and custom libraries/templates +confANoCustLib=No Custom Libraries +delFailed=删除失败! +showID=Show ID +confAIncorrectLibFileType=Incorrect file type. Libraries should be XML files. +uploading=正在上传 +confALibExist=This library already exists +confAUploadSucc=Uploaded successfully +confAUploadFailErr=Upload Failed (Unexpected Error) +hiResPreview=高分辨率预览 +officeNotLoggedGD=You are not logged in to Google Drive. Please open draw.io task pane and login first. +officePopupInfo=Please complete the process in the pop-up window. +pickODFile=选择 OneDrive 文件 +createODFile=Create OneDrive File +pickGDriveFile=选择 Google Drive 文件 +createGDriveFile=Create Google Drive File +pickDeviceFile=选择设备文件 +vsdNoConfig="vsdurl" is not configured +ruler=标尺 +units=单位 +points=点 +inches=英寸 +millimeters=毫米 +confEditDraftDelOrExt=This diagram is in a draft page, is deleted from the page, or is edited externally. It will be saved as a new attachment version and may not be reflected in the page. +confDiagEditedExt=Diagram is edited in another session. It will be saved as a new attachment version but the page will show other session's modifications. +macroNotFound=Macro Not Found +confAInvalidPageIdsFormat=Incorrect Page IDs file format +confACollectingCurPages=Collecting current pages +confABuildingPagesMap=Building pages mapping +confAProcessDrawDiag=Started processing imported draw.io diagrams +confAProcessDrawDiagDone=Finished processing imported draw.io diagrams +confAProcessImpPages=Started processing imported pages +confAErrPrcsDiagInPage=Error processing draw.io diagrams in page "{1}" +confAPrcsDiagInPage=Processing draw.io diagrams in page "{1}" +confAImpDiagram=Importing diagram "{1}" +confAImpDiagramFailed=Importing diagram "{1}" failed. Cannot find its new page ID. Maybe it points to a page that is not imported. +confAImpDiagramError=Error importing diagram "{1}". Cannot fetch or save the diagram. Cannot fix this diagram links. +confAUpdateDgrmCCFailed=Updating link to diagram "{1}" failed. +confImpDiagramSuccess=Updating diagram "{1}" done successfully. +confANoLnksInDrgm=No links to update in: {1} +confAUpdateLnkToPg=Updated link to page: "{1}" in diagram: "{2}" +confAUpdateLBLnkToPg=Updated lightbox link to page: "{1}" in diagram: "{2}" +confAUpdateLnkBase=Updated base URL from: "{1}" to: "{2}" in diagram: "{3}" +confAPageIdsImpDone=Page IDs Import finished +confAPrcsMacrosInPage=Processing draw.io macros in page "{1}" +confAErrFetchPage=Error fetching page "{1}" +confAFixingMacro=Fixing macro of diagram "{1}" +confAErrReadingExpFile=Error reading export file +confAPrcsDiagInPageDone=Processing draw.io diagrams in page "{1}" finished +confAFixingMacroSkipped=Fixing macro of diagram "{1}" failed. Cannot find its new page ID. Maybe it points to a page that is not imported. +pageIdsExpTrg=Export target +confALucidDiagImgImported={2} diagram "{1}" image extracted successfully +confASavingLucidDiagImgFailed=Extracting {2} diagram "{1}" image failed +confGetInfoFailed=Fetching file info from {1} failed. +confCheckCacheFailed=Cannot get cached file info. +confReadFileErr=Cannot read "{1}" file from {2}. +confSaveCacheFailed=Unexpected error. Cannot save cached file +orgChartType=组织结构图类型 +linear=线性 +hanger2=Hanger 2 +hanger4=Hanger 4 +fishbone1=Fishbone 1 +fishbone2=Fishbone 2 +1ColumnLeft=单列居左 +1ColumnRight=单列居右 +smart=智能 +parentChildSpacing=父子间距 +siblingSpacing=兄弟间距 +confNoPermErr=Sorry, you don't have enough permissions to view this embedded diagram from page {1} +copyAsImage=复制为图像 +lucidImport=导入 Lucidchart +lucidImportInst1=点击 "开始导入" 按钮导入所有 Lucidchart 图表 +installFirst=请先安装 {1} +drawioChromeExt=draw.io Chrome 扩展 +loginFirstThen=请先登录 {1},然后 {2} +errFetchDocList=错误: 无法获取文档列表 +builtinPlugins=内置插件 +extPlugins=扩展插件 +backupFound=Backup file found +chromeOnly=该功能只适用于 Google Chrome +msgDeleted=消息已经删除 +confAErrFetchDrawList=Error fetching diagrams list. Some diagrams are skipped. +confAErrCheckDrawDiag=Cannot check diagram {1} +confAErrFetchPageList=Error fetching pages list +confADiagImportIncom={1} diagram "{2}" is imported partially and may have missing shapes +invalidSel=Invalid selection +diagNameEmptyErr=Diagram name cannot be empty +openDiagram=打开绘图 +newDiagram=新绘图 +editable=可编辑 +confAReimportStarted=Re-import {1} diagrams started... +spaceFilter=Filter by spaces +curViewState=Current Viewer State +pageLayers=页面和图层 +customize=自定义 +firstPage=第一页 (所有图层) +curEditorState=Current Editor State +noAnchorsFound=No anchors found +attachment=附件 +curDiagram=当前绘图 +recentDiags=最近绘图 +csvImport=导入 CSV +chooseFile=选择文件... +choose=选择 +gdriveFname=Google Drive 文件名 +widthOfViewer=Width of the viewer (px) +heightOfViewer=Height of the viewer (px) +autoSetViewerSize=Automatically set the size of the viewer +thumbnail=缩略图 +prevInDraw=在 draw.io 中预览 +onedriveFname=OneDrive 文件名 +diagFname=绘图文件名 +diagUrl=绘图地址 +showDiag=显示绘图 +diagPreview=绘图预览 +csvFileUrl=CSV 文件 URL +generate=生成 +selectDiag2Insert=Please select a diagram to insert it. +errShowingDiag=Unexpected error. Cannot show diagram +noRecentDiags=No recent diagrams found +fetchingRecentFailed=Failed to fetch recent diagrams +useSrch2FindDiags=Use the search box to find draw.io diagrams +cantReadChckPerms=Cannot read the specified diagram. Please check you have read permission on that file. +cantFetchChckPerms=Cannot fetch diagram info. Please check you have read permission on that file. +searchFailed=Searching failed. Please try again later. +plsTypeStr=Please type a search string. +unsupportedFileChckUrl=Unsupported file. Please check the specified URL +diagNotFoundChckUrl=Diagram not found or cannot be accessed. Please check the specified URL +csvNotFoundChckUrl=CSV file not found or cannot be accessed. Please check the specified URL +cantReadUpload=Cannot read the uploaded diagram +select=Select +errCantGetIdType=Unexpected Error: Cannot get content id or type. +errGAuthWinBlocked=Error: Google Authentication window blocked +authDrawAccess=Authorize draw.io to access {1} +connTimeout=The connection has timed out +errAuthSrvc=Error authenticating to {1} +plsSelectFile=Please select a file +mustBgtZ={1} must be greater than zero +cantLoadPrev=Cannot load file preview. +errAccessFile=Error: Access Denied. You do not have permission to access "{1}". +noPrevAvail=No preview is available. +personalAccNotSup=Personal accounts are not supported. +errSavingTryLater=Error occurred during saving, please try again later. +plsEnterFld=Please enter {1} +invalidDiagUrl=Invalid Diagram URL +unsupportedVsdx=Unsupported vsdx file +unsupportedImg=Unsupported image file +unsupportedFormat=Unsupported file format +plsSelectSingleFile=Please select a single file only +attCorrupt=Attachment file "{1}" is corrupted +loadAttFailed=Failed to load attachment "{1}" +embedDrawDiag=Embed draw.io Diagram +addDiagram=Add Diagram +embedDiagram=嵌入绘图 +editOwningPg=Edit owning page +deepIndexing=Deep Indexing (Index diagrams that aren't used in any page also) +confADeepIndexStarted=Deep Indexing Started +confADeepIndexDone=Deep Indexing Done +officeNoDiagramsSelected=No diagrams found in the selection +officeNoDiagramsInDoc=No diagrams found in the document +officeNotSupported=This feature is not supported in this host application +someImagesFailed={1} out of {2} failed due to the following errors +importingNoUsedDiagrams=Importing {1} Diagrams not used in pages +importingDrafts=Importing {1} Diagrams in drafts +processingDrafts=Processing drafts +updatingDrafts=Updating drafts +updateDrafts=Update drafts +notifications=Notifications +drawioImp=draw.io Import +confALibsImp=Importing draw.io Libraries +confALibsImpFailed=Importing {1} library failed +contributors=贡献者 +drawDiagrams=draw.io 绘图 +errFileNotFoundOrNoPer=Error: Access Denied. File not found or you do not have permission to access "{1}" on {2}. +confACheckPagesWEmbed=Checking pages having embedded draw.io diagrams. +confADelBrokenEmbedDiagLnk=Removing broken embedded diagram links +replaceWith=替换为 +replaceAll=全部替换 +confASkipDiagModified=Skipped "{1}" as it was modified after initial import +replFind=替换 / 查找 +matchesRepl={1} 个匹配已替换 +draftErrDataLoss=An error occurred while reading the draft file. The diagram cannot be edited now to prevent any possible data loss. Please try again later or contact support. +ibm=IBM +linkToDiagramHint=Add a link to this diagram. The diagram can only be edited from the page that owns it. +linkToDiagram=Link to Diagram +changedBy=Changed By +lastModifiedOn=最后修改于 +searchResults=搜索结果 +showAllTemps=显示所有模板 +notionToken=Notion 令牌 +selectDB=Select Database +noDBs=No Databases +diagramEdited={1} diagram "{2}" edited +confDraftPermissionErr=Draft cannot be written. Do you have attachment write/read permission on this page? +confDraftTooBigErr=Draft size is too large. Pease check "Attachment Maximum Size" of "Attachment Settings" in Confluence Configuration? +owner=所有者 +repository=仓库 +branch=分支 +meters=米 +teamsNoEditingMsg=Editor functionality is only available in Desktop environment (in MS Teams App or a web browser) +contactOwner=联系所有者 +viewerOnlyMsg=You cannot edit the diagrams in the mobile platform, please use the desktop client or a web browser. +website=网站 +check4Updates=检查更新 +attWriteFailedRetry={1}: Attachment write failed, trying again in {2} seconds... +confPartialPageList=We couldn't fetch all pages due to an error in Confluence. Continuing using {1} pages only. +spellCheck=拼写检查 +noChange=无变化 +lblToSvg=转换标签为 SVG +txtSettings=文本设置 +LinksLost=连接将会丢失 +arcSize=弧度 +editConnectionPoints=编辑连接点 +notInOffline=离线时不支持 +notInDesktop=桌面应用中不支持 +confConfigSpaceArchived=draw.io Configuration space (DRAWIOCONFIG) is archived. Please restore it first. +confACleanOldVerStarted=Cleaning old diagram draft versions started +confACleanOldVerDone=Cleaning old diagram draft versions finished +confACleaningFile=Cleaning diagram draft "{1}" old versions +confAFileCleaned=Cleaning diagram draft "{1}" done +confAFileCleanFailed=Cleaning diagram draft "{1}" failed +confACleanOnly=Clean Diagram Drafts Only +brush=Brush +openDevTools=Open Developer Tools +autoBkp=Automatic Backup +atlassian=Atlassian +citrix=Citrix \ No newline at end of file diff --git a/packages/client/public/diagram/stencils/arrows.xml b/packages/client/public/diagram/stencils/arrows.xml new file mode 100644 index 0000000..5e39b3c --- /dev/null +++ b/packages/client/public/diagram/stencils/arrows.xml @@ -0,0 +1,849 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/client/public/diagram/stencils/atlassian.xml b/packages/client/public/diagram/stencils/atlassian.xml new file mode 100644 index 0000000..9c01671 --- /dev/null +++ b/packages/client/public/diagram/stencils/atlassian.xml @@ -0,0 +1,713 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/client/public/diagram/stencils/basic.xml b/packages/client/public/diagram/stencils/basic.xml new file mode 100644 index 0000000..39dbaed --- /dev/null +++ b/packages/client/public/diagram/stencils/basic.xml @@ -0,0 +1,1028 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/client/public/diagram/stencils/bpmn.xml b/packages/client/public/diagram/stencils/bpmn.xml new file mode 100644 index 0000000..af8918d --- /dev/null +++ b/packages/client/public/diagram/stencils/bpmn.xml @@ -0,0 +1,1162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/client/public/diagram/stencils/citrix.xml b/packages/client/public/diagram/stencils/citrix.xml new file mode 100644 index 0000000..ac11ab1 --- /dev/null +++ b/packages/client/public/diagram/stencils/citrix.xml @@ -0,0 +1,19709 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/client/public/diagram/stencils/clipart/Credit_Card_128x128.png b/packages/client/public/diagram/stencils/clipart/Credit_Card_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..d280580ccdf91869d0c6ca475dd2d11cc4e8b0e4 GIT binary patch literal 15493 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 Hu0mjfxJow< literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Database_128x128.png b/packages/client/public/diagram/stencils/clipart/Database_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..4add7147c6a58e0cd988aa024aeb72c05840ffea GIT binary patch literal 10455 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Doctor1_128x128.png b/packages/client/public/diagram/stencils/clipart/Doctor1_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a4bb7b40807c6b36fc676113d5bdbc3072cb39 GIT binary patch literal 9441 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Email_128x128.png b/packages/client/public/diagram/stencils/clipart/Email_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..af81e0ba44cdbbda4e2289df0918610312eafdc1 GIT binary patch literal 7410 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Firewall_02_128x128.png b/packages/client/public/diagram/stencils/clipart/Firewall_02_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf90fdd69674e103f32ddd56a14afb158bcb4b5 GIT binary patch literal 8428 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 KMNUMnLSTY)O;54_ literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Gear_128x128.png b/packages/client/public/diagram/stencils/clipart/Gear_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..a44e376c30c3e67589fe0ce7ed7f3b72f00ee019 GIT binary patch literal 9193 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Laptop_128x128.png b/packages/client/public/diagram/stencils/clipart/Laptop_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..ab7ea65966b8c15245705d9e52da2bd48df3437c GIT binary patch literal 12593 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 T`?jPB00000NkvXXu0mjfo8-Oe literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Lock_128x128.png b/packages/client/public/diagram/stencils/clipart/Lock_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..d815f0eb9213d17bb2e745423bf16eb629315d43 GIT binary patch literal 13233 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/MacBook_128x128.png b/packages/client/public/diagram/stencils/clipart/MacBook_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6802ccfaff72aaddb71cf486277dacfacbacbc GIT binary patch literal 12713 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Monitor_Tower_128x128.png b/packages/client/public/diagram/stencils/clipart/Monitor_Tower_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..223b27ad7940ec9fe5d6b57b6c3081e2c8a6c73d GIT binary patch literal 10301 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 P00000NkvXXu0mjfmi}s~ literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Piggy_Bank_128x128.png b/packages/client/public/diagram/stencils/clipart/Piggy_Bank_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..89f51c15436fe01404c85c2484560c7c24ccec95 GIT binary patch literal 12780 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 NHRTsd6-bNF{{cZv_@Mv* literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Printer_128x128.png b/packages/client/public/diagram/stencils/clipart/Printer_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..3cee0427c8b243db1065d2c923a08f55e7eb8650 GIT binary patch literal 12104 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 KMNUMnLSTaFwhycT literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Server_Tower_128x128.png b/packages/client/public/diagram/stencils/clipart/Server_Tower_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..a0ec7b16ddeeaafde4e3393df84e4f2bacf5dc65 GIT binary patch literal 13352 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Software_128x128.png b/packages/client/public/diagram/stencils/clipart/Software_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..a3deb93e792241eb2fc903ed6fcf857c9f0c8edb GIT binary patch literal 11020 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 =881qCIkOaPe%;^oc) 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
clAghkd>xEonQf+ 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 atYVRrC;d}(dH1a-fR>uR>U(AD$o~VPRAKJ` literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Suit3_128x128.png b/packages/client/public/diagram/stencils/clipart/Suit3_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..68a1f1c635f052ca0a05cc4c4d7e483977ca71ee GIT binary patch literal 8326 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.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 L)#WOlqXYj36@F>L literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Tech1_128x128.png b/packages/client/public/diagram/stencils/clipart/Tech1_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..95e411012636fb96f3245ea4adf391c2c2dbfeec GIT binary patch literal 7146 zcmV>5W#39FZQ!L!S`%v#u2LO32Ep;VRyF<$2?g4q$*#Wscm2Pl}0tu9PJ}q}k z^FQzCJ?;P?&t!6a$!%??2L7i%tVlz-PO(Rl$5a;mp!Hbqe>woj6KSmRFKz4Wzg->1 z-`!B*-FoEAz#QmH)rkUfS^3qz7Y?238&>6`fbwTHRu?aG!oVDs2?76)51;P8b)>G} zerDjtsiVtgJ0>6pWm0X))dx=Xt&kN>7|GA6F7b4n><-pC43J}Tx-ax}Jmvd~TtpIw zj*U}2p+NH}|6+#$a%uF}`7i&nqi?m{&n$9FWZvWenb994UAnw4xKnlb{;%Q+D`V6Q{DaaIS;(n1s?q8c)OT1wB1yHC& z6)NcffOAnW006DIu7ZrOtsp9d_W&ZIC<-(cSVAGPtdOuQ)7IP5LyjIlNh-=K$ds|w zWLH}!35JE6;G=%x03eG3bUxquSY5f7)K~h51PT^KP`tz%V}S?*5TX$zNL3YxDyW1Z zNu!Tz01OeHg9h(I02CJ&la|H++4My_fq8`sohTs70!lc4u)X$Ds>jif4e8uu0i)r$ z%VivmbNZa|m}D@9-Xxtl;993T&j7GQ(lWLR7(khx4}Db73;=ZAH|PhuVB`~2zDSR# zKo`dXB4vib41la4DEJVLe0UsQt7;Naz%)p}0t#I3Y0bEhc5M?fC)F9IQ0dpSFEc6fb!z7WL;6&3m1i|Gn zKo$k`bkO=(Ur;6|y81||uZSv5lm`0&)I1mrfTLYdjnPjDK%*lcokD!A!lDO32SF$p zB3_RRqXq2)S&#A;h}$KE9Uma;K7h2tK3fO$EfC$_3%Vo6oImE!;Xm~DMGXH~RDfWRH0t>) z_&Oyze}LBuheD*Jq>Ol7V!z`9WSarX&ThBM@OKS_%_u-Lasjlt#3;|7KS~@!h?346 z5~p~YKcJaJg&vEGTwM+WWLfs?(SlyLONAQ0D4_QT!@7+(s9rRcYp?*v0BGw8Jtx#0 zh^olhetf@Z(m!=9;d&~7z~^zDasZG6;&BNf@cX>%?`vl_lS!kisPfSaxZN&2o;Py= zh9fBGUcD-4X7Yz6eW>jhqN!itnyM<8Wy|_){G^YK50sJS z+HyiOy`Z=vx0^bDqM6i*q=hK};Gd#u5$~V(`i+cXwDNVo0#nAL%6*3%A0Uge<7oFw zdybvGW$wfp4|{AzQw<&YNa;ARy)YTXE8n#9E+bj;d>wy^ukOaQ>18221TWXT~d_eCmK#8a~=i5@nfT( z7?VhS{e5U6dL0vxMG5$e+CkH0sP3j3AL$E)NfFKf0O5Dd)i@uEJ~SQ+72_fq@!zqjIAyqqsof)+#V>2Q9m2G zJPVj0VBw$X;oI2!DCO(32PPY6`O&up3xE>0^xlcCAlZ5N48-ITX%3VVHpSzn**;>J z0}cd&0Rk=};FT{#v}`0AxN~AWXJ#R_fMWu(DXO@+v$r48vM%BWdq26pm}rKg^!gyC zOkxWHWB| zYx;ZQi)LJlhlJ*G0FZsz))Xi;Mt?-YA=w0je$dY~L*c5b*Ztvt@PVXfQ8gAt#F}Xb>Fu!{#=pA}E(c)=0M-DILqYXfg;Ds$r-|l`mo~ zA2SyQ1F#XTa%Mm=d;vw{Sil5>=@@Rwmwq{C03Z-uK@$1^s6=ZpndR1oD0M1i0m)(pSmFhCB-{{8#!sj8})y?*_AY2&K@?bEAz z(Pj(O7YIR0I24w-l|W$sDeXt9f?3F?`v6LW4fv?Q1Ou7^<)^Rx>DWGp0dhbF1_tgw zbLNaRW%6XDzx%A0I)Io7G?a?xJ-q|8hL2Hv)X0~WL0Q3wFQBKB)hHm4ZNV{ZzsxJ= zxKNdU;J|^#a5&s_>eMOHFnTl@H*tEm!aQ{|`=@98x_g2o1R!A9Kc;*>DWu4{sZjXz zFwX>oIO=?;=0m;_zf zN(2nD@izm3=?kc4hS2!?;pa9S_$2Sb<3dzEDBKqch5i+kuOa~Y`}@h4Uw-LY_?uTe z{_?7R)i4Emh^L!_FqHrF^aWvgcgSD?IpP?yl(3l^R?LvlV1Nz1wfi2<%jl@kHi-h| zqc^u4!np68K7G0u#LsNJ%jF{D#*S6itXOt(!;0r?MOgpO)&jUh!6^L}VKou13lO7o z0cvFA>m~yC2ZDWq!tz-)9K7JSYYyyp0FWC1cmxg$QF)!6uvt?us6rE243AP@Uk?^L z*!f>SzN-Q>D6#bb0<8ij=30MAVoSX=)6?g}MG62#{+nms+w*+h=0^$%0HFNa;jonc zFk^{UM@NSSHeO)!`RqB5$3q(G>j&Ol_M0<*UiW65i|rD|s(=k3=q#X`Glq(h6VUww z`HQFDYi-HrJ`)Q_`Io@qY5p;!c2K}@rW6);v%Csui zUYApK?=M>V?dt04 z*Buj(*#yr-Xv^VrEmM9X0jCcgLa+cX4b1>+%q-}ufg}tU-PL0zHU8w;cTWVyOze%y z1z6~R!i;%%=|{oG_>RK>84$?pSHdX$7dZWUWbJq(-ugG5x3{;$W)N--`~iV?2HBBc zBnq#C{r)Njw!FXM^eex9xLz*&CZ` zQFRUUy6}40_+C3soH+3h(A*9HhEMs|!eJ-0$DvgX z?&LnE85)L%yY}wg`vycH_XG2kIX*!0%Ewi;{|D_a64~`sd;lhx9RwC2lP2l7LSAeh!}P|3=m)W zsFe+<{E_+$C=j7ue0O&@jR<&UTN|%@l)#uKf3T>Uyz#~xJbd`DP+3_S#Q=O%U{yZK%P+r7 zo_z92(^+h3X(5k2_82;tb-)6<01#8HpM?N8cI+5bAB8RiQ}d|dFggstDIfFq7(V@b zCX|m-T3Sj+C(^TZ#PjDCb|Q-wEsA<<&z?QxgAYES3I;&<;zc0f6yoW*gdt##@z>J&#|lwg42+ycP%?b{nb={rE-cR^=LI0_pZ8)<0P z*49QlF_VJ60M-olz)hd*1V{KMpL{}&A3qK|i+Kk{3@BJ_gcD7y;3SdhfoK7*`;Za7>#vjXd+rGn6f2F$6{y zcHpoRbUb1H08bwV7HBwU0I+rI*2SRwDeP}7#N??TJFuy#3DdP11p(ymk(Q~ldF3PJ z<99^4;DQUtv(G+D6G>LV?>ic*juFU-aw>e30l-0fa?d#dfNk5h%>nAa+xj@tCU!pG zLF31dr=5z_nhC+oAA0E!7Mi<&Am#I)kFUYR(Tgv>NX-QT7a6RptBdU1xs!s$+(IT% zhXc?dAw&~WAa}#jUGM+^MdQ4^WcM77GB(m!XCnx3_6`A(31K4}!#NBMd7l8CH#TyS zz7Zq{4pcrKv8`LT&YUJr$`-=)N=i!bTDXwN8ikm6esT&-!LT0{}+FBhX1wyw_kS zA_#cF5rT@rQJD!rg`lTz4HfOeM`pelXd$#s`SZ|cFc_oY0k9y+*F~`a3OZNl5Td=! zgkVI#1i@ez_cMmTQH64|MpZANB7o|qwlqdF*X7t zQ!Id=hl;U_>-q1-W)hJB@O$H&K&rwVOkk2Zg$jU6(|Au*RDd0XVH1X0RueH&$sy+G z#j^iwN#i|K(Fg(-mm>gJ_Ar}*;9#b~n)k== zxn|9pbOC_3nimQV0HDCMrgvHAvRZtjW}iA>nP7o}0+B>zAp)Q@ zo%iwedPuX(Lq`WJ8#9NzTy)Vz@toeMJVFW}CNgBT90WdCtn6W0trjtcMf z<~;zQTJ~}n!D;8W`4zm@L4gZ0*yzu62^kZduEyL%EWznvYXK=nH9ilnG*-#Jqq40P zfNNHOe^Hh9006mWC?lVRelcvN=^r2vvgHe4^-?TBV6IxVD(W#zAeEO0bgQ|&?O|Kf z0hz>mAU%8q`h09#V|lqZuK@t`Uo!;oBplV4tIxI>NCW^>Dozvg!1fh;Ntq8O ze*m=Ww(KPzfBZ3hZtB#jxPFjLG2@y6DX#&5CT}PJKrcTY2zWohu9zefGIs3Pgs;Ih zguGz+dvl-%wxW~Cgr){Ed-iNvk7$v4lEEc=BV__SLu3#Nf>;S5WB`8TTc?mSAy}-E zNZxtp9n(Z1)nl6Y{yWBzaZq>C6E3wieb9Hcg#dsdRl4$X0CpfikD4#SWV464#sC-z zY}l}Yp5sWz@^bVAYAXdY5K?3HU7!$5K-vh#A_;z;J=TH?oSWyVKT{RNOfW6Y?Gh4G zAiqE8_tjSkBq+x;aWy1^>orD-0n!3MJcU~Y!zvyCcA3MG6r}8A%m4zw`n_73ib>GI zSX}f|0lx+NPsnEmNb9~Iqur>aflz8c2Ua(#; z6#y8KKwg^wWuyUs&J-UB;QKQ@nU*XA;2sDm0-!pt82~)=AEl~{Q~|)Q&k{mem`P0< z0O$uKDiyPQ|BAe3fH`yK{0idT<*C^JRE5z$dv7+1MUyoFiCDm^KIVOy>boF##xcyO1OR0Lga% zpeg78Q*a(AX?KFKG39Hc?YHI)GHnJ@F#$L`n1Tr?F9Zgla^Zy+cEau&(*Xn@4(D|- z2Vez2rqjU~iNsn)W)<9x%-9tqnLJ9xYp=Z~+ zz(AtMrWF~DKQH2bKoJy9c3yGC6+c_DWXZq5`v2D9Qi|Prf?O~GC|DVk$P57euU@fY zMNf?Wi|S|ev9bmLPWkRMn)xH1c;bm&^XAQaj z4Jqva0O4)Nqq&l8zzD~oy#cv{ckjIO&S_U& zb=B-CAd+RG07o~jzq9V@#hzo^wqybX!wCTRzVhnTtDk@Ct+zU%&XM&UQklv%#jd|` zFluSg-cSJ`#Asri=Mps$lRQs7^;9dg{je0Qc-E|00ob#*7HZ~epw3Q#aOyMwB*XVxx?YEb}Z~ho=iWy3yZ$*;EEbLGLpcyUJZ4@!Fyc-iPfNqq zWJ?QkEyUV=_uaP&7E*49{*tpD1=wvUnG68H*=t?Ac=3Nso;>-VUw!q}!^Uq(r_bQt zmRefKAM#zpj4V|mhtHMdwt_vJ^zh%?T;7$VgMnQ;^Qe@it)D;OYvOj zX&xa-_%NY%;7dDJcf!%1~s2PIw58VNhHU!cjaAg3^0n z@1G-3-hC33s@TNkyd$hy99rwSY~$=I$pAqc0cB_#Q=b2 zQN9%jY6?J*4TWbkk&!buk2cIjyb&*^G3v!QBVR}Z09p(H#A5?H^I)0=Ez1hXxx0tQ z0ETEo`^k>_;Q#>P6s{#<4hDfh%h8U`c>ttfQWE9OMH~7TVkkeJ!mW=HEsr~~AOPS< g`XV}AaBj>01L>R2OF5D)yZ`_I07*qoM6N<$f=N{f8UO$Q literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Telesales1_128x128.png b/packages/client/public/diagram/stencils/clipart/Telesales1_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef7b8a7f78d138bec079e8c615d5d6c66f5abfc GIT binary patch literal 8257 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Virus_128x128.png b/packages/client/public/diagram/stencils/clipart/Virus_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..f0dfbcb71109eafed077b3ca675828ee4380aa9e GIT binary patch literal 11358 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

m3*ydkcVn&cZC?%&cvt9*x$gzA~G> zzqRe7-2%Ai%CWI89-~9-Y6q#EG9}UXi*qle%r`vk-g_rkdgCN%`g{QQS>{%IpE*JH zgm8k6J4_0Kow;{Uz~@q;$G&oG?9OAgen@3ue|JHTKjuvsaCbj7wu4DWp98im|chy=HWD^cW}a@5$o88CB|R zjg`?WMo0f$Tl*@_yu%pt?3e7^8LjqsuiU@?XAE4Pr}^?6a;nWk!vT85`1swgT;;rQ z3vBlQ*&wk@nc0*qAo?np`Gv#7Uw*;Pou~irUAyi-W;f{A*cXWTT{8&<3$5*%oBI2E z9}*d$+wA9rOc*Osa(p1x$nqLko7RkRa7c5@5obbPOV>FG)aF9wwLVO88wN1mw_9=d{>^t zco^oYY%Sl@mU8;SgLUXX-oL+o)!5kUuRL(zoL7vG-~BMmRmVScS24ct8y)=)9)jB` z0h5KewE*@(F|iNBJWgAsRQf)E$hDiF#Y1#EC1Ac}=gtVs-vjfvt{NNr?!z!o_GVLv gYZdT9JcPIZ59mpWL`c|mT>t<807*qoM6N<$f;<@mHvj+t literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Wireless_Router_N_128x128.png b/packages/client/public/diagram/stencils/clipart/Wireless_Router_N_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..9bace31753aa82f9808c07e0d4ca14706aceb26a GIT binary patch literal 7468 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 DCcjbW literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/Workstation_128x128.png b/packages/client/public/diagram/stencils/clipart/Workstation_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..9aeef9e1f3fdb45108d438ffdb1b3b2bdadef202 GIT binary patch literal 13635 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�ot%q=k|Y@ntGWV54g#)g3%p5+NlB7C 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 DNeeIn literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/clipart/iPad_128x128.png b/packages/client/public/diagram/stencils/clipart/iPad_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..88dc8070296eca2a664b9345d364711f196b6f17 GIT binary patch literal 11727 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/diagram/stencils/flowchart.xml b/packages/client/public/diagram/stencils/flowchart.xml new file mode 100644 index 0000000..e6ec9d2 --- /dev/null +++ b/packages/client/public/diagram/stencils/flowchart.xml @@ -0,0 +1,920 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/client/public/diagram/styles/default.xml b/packages/client/public/diagram/styles/default.xml new file mode 100644 index 0000000..82fb1b2 --- /dev/null +++ b/packages/client/public/diagram/styles/default.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/client/public/diagram/styles/sprites.png b/packages/client/public/diagram/styles/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..23e1b491b6d3fafd7887dba6d1b32309e04bd3b2 GIT binary patch literal 10155 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 literal 0 HcmV?d00001 diff --git a/packages/client/public/favicon.ico b/packages/client/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7c6b60cead2d689b307296abee644f8446e1471a GIT binary patch literal 15406 zcmeHN32YQ)6rLVnX-jP@v|`eBksb>su$Dt8Eut~eco3sdt2Uw-v>+ul5eX0w5eX1Q zr8R&DMq|)&1r$_{$PI0g!%C?TsO73aOG`^ZQOxswTmE&r-Rb@_vq#tTPhS7&?7aW` z-h2Nw?;k}8QbLsIXoYKwk{7BdLli}^SX%zK#wf~izGt)D{5@4s_V!d1D?h_3tkH6x zD|aQBABd2Y5U0lS`Tu&B8Z%Im`%JM@l+kiiWpKtoSjsNg_d|Vvu-@Ch28z(C( z=+54~rS#E8OmsAD;~0SZiOM6aYfZ|Z zU+AKk89yy8D2kc!E85UqW1g|FjAX(56hH<33S;5fQi=1RbmO)}T=}w13F14sEM+X0 zS+09n8gI4@3}87I+(+Maj1w8j+Z)1!0fu)WGVgvt(-@RP}3z(vypCR7f z#ue=Y3z(v4;)jHU5O)@#=c!r>KR7s;)~@`TcK*1P)~{JbpMAWH-d!-CrcZsH@?IKG zV@5wg(b2aW;UtC6&Y{iUZD_S#iM3bMKWtb}kr5GkIY{GwvHX*E@xfy)ufJhoVR|@7 z<1d&u*DXFcEdOXJg@%U8a*)O^$e$#I|M%4jgNkWcos~aM1M5aOLIV9m^EX%NALxQ+^2Ks%B72L zIRN{u*>AKr7IfLK9!sMheS{h={;tWP1$$O|*zk#Ad~kW-{`;u5=1dz7lGvv4!C}bY zL3HZGF$V`=&zU{bo!z28n6h8Q!x$1BS1^Uj=E(%2rcUvR+tSN_BavUYpae!;;& z?d*T-^>I(|^L7m^V2XnG4ea^7jVsy*7BEHe_x>9^{Q3R?e1E@xfddL+;g9!EJ9y_G z-+I8xa5k3bSpqCi!i+l$dq9j=&bTXmSWEh?mWbKa!aUM-*(#*U@OM?FR( zGBYXNW~00M^`n%OWJ*j-pzvbC!_ny`^hcS$^)GGsVAPa=zW? z>YSpx>+`3pDfgKiLjUu?xG}{)Cwq*pe5J7M+;1o8x!h-|tNA#X;y;q}-d7vy9QifD zPo}OuUTGial4k*0u`9SnwCl@f2}a&f7l2c zN_X$1VMFiHn;R7NnDW1czl%9kR$`dHu%V2ud4Sb06zB z_9O8eSIM=(6n~sqWegiiKkeJ&kr=>MoPQO*zldUEV`XeG#UDPx{EhGIwtT-)_gbtK z8|<529{-}ucs9)+HXsgZsj2i0f4_h}pv6n(zI{&JwS#N}2KdDP>VArE^wzB^HngXJ zZ7pkB31wvtm+`&n@vG)8uJ7p8i zXQA}o2!1cwwcW@X<`w?11K)5K@jTMx<}BOZXLt?I8ZO;u)Z@Zy{9!{>RFwU@gql-T zF8dPt%s%#e*6<8Hea2_}VM7FexAe+{JgPl+x|I#^JGiH(+hoV8nzy+2s{h4!z`NG? zapS0_y2?JsfIIemnHd>oxWfjY@P{4vZYn1`n<@?;puIb`G529c`;73tPx-?J!~uJK zE3b7D-#@8&YF+!x|DrE>xcVAPzX^!&#X>&#!UT1rD<3*ZioXbd>K0Ft4~eFLe;@yy)~m Krw0Pl1OEbyg+K@Z literal 0 HcmV?d00001 diff --git a/packages/client/public/icon120.png b/packages/client/public/icon120.png new file mode 100644 index 0000000000000000000000000000000000000000..005f8a85d2b08a57c0cf560490e984ac5b8eb212 GIT binary patch literal 3235 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 VrnOl67d!v}002ovPDHLkV1nrBKF0t6 literal 0 HcmV?d00001 diff --git a/packages/client/public/icon128.png b/packages/client/public/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..d5abf294e82fb28ada373ba8e63eff5699808a09 GIT binary patch literal 2627 zcmV-J3cU4+P)OagtXr*H%*qOp8(ZM<*(E=(-5E+mV9>qvP-mgtSYsrHMQr<@L z+D9Hh5=cgC)shk`6o#7CQY{(OicT$$mH|m3PAz3HcFvNtk!Ewx-E;Qd-?@9v%uZ&q z=lss^_x*nM?%h3m&y9d?VXZ(!SXZx$hXx?bAFfU&p0W<(%u0WWVAL=8( zH~_Z+7!~F^ir|0T_Nd;02%oz;ZIB=|p%GXaumrs3Q*m>`R^#`g6XKl;oag z-xEwR`m%@zfD!=3T=T#kT11Hc1-t7t8XOUl2|wYu^p6uNSGhEwjN0Wfl>wCs80yVeZZt-9(Z z6c#8Afd*hW0Jd(gKuT)bu#D7H?SiWy$A}}U&uahzIaBMYN8*yDT*lQ@?}95|NeDCm zH#!^<5rL+bHpIox<1&AsQ*Cu63i7i}jUmuk12EWx(W6IWZ*v=F#y%93H?=jDD9BR^ z0u8``)8nI}(A3<9X)*T%W&Xe*cTE-Y^Vrq#N;C}svne`yGWNE#`Txpj?%FEk=PCh# z1|TNpUhHjY#rW~;Cyw%(r?wh-xta0;h9**Y128l8VKlY0A~JGxNaXdntC5#O8iMcz zAU@%7>}_rZJL?Z+^SW!0o0AdBDMVt2Cjd*5mZ8R7CnB7wv0hINaVQ%FY3fT^e|cT2NJ8V^CBxF)vi39 z2f(;-o>7;*R6|{N!djJFJ@(PMj=Fr3bD=)WU`BHXwJTj_tW9a|B>l?VdZ|O+hf>9N2sQ;X}U> zjw3068b^RTCPm{<@12xXvwdNb5*Ol^ufAem0{=g=8UQ>n<3aqYoy@ByCa#^n!g?BN=3< z1_0$7HX$dsz*uc!J$CNciszmkdW$(Csj2~h$J>A>6O)K&#+L@6tAB<|SPcMPd*fix z8#nRUCAU{w>prYpp#-pM0PxQ76PSGG59GQOqG$(yeE7o^ss6GaOT`aeEZg0 zrB^RIVCUP%{EItRuCRMDD$(czFlyAzxY+##c{NX-?D8+}T)1$7e6E8Mqz}NviQhxl z`=>~YdgkT3kDW=Ao6MX=ROV-0h@MqvD zPp?FC({5g&srI7}KxMTD%a;Fylz{Bs0PG$C4rufNc=;EvW7h0P$Y@lNOIqAld*#MNPnmr#`h+ul56PVBrFD_Ybl)VRMty24LE> z7#u#@X|5!Ry^kF`>i?GS>eZ_fqml|m8-T~=#$#Wr++WdNyLJsd-QDQ!>AwEAyBj?{ zm#+W4;s0G-f5xTHJ|pFrx}V3trCdazvz zbO4ww3V;VdvRxJEd4&}40(e>!fD!=3LTTv1b}3K_fcY1&@w^2@131xtGGSLCdS3Gi zu#@*G0EXSFlm`GdHQW1)-pzTSoM(yX10+_*5f*AnVM*cLf;pV9{y!tEx(8^P?830&34FQj;_V(d6pQULQ z01bh?<{Hgz%KTsf7=R#4pA#7QVcGNSJ)dn<%yrlwoK-MKfWhP0r-MWQ>~>ge(Lp!s z6kwn8TL3ikob3lnOB8^Cxa`X!2Eum$e0R`ely!PIdM382$Ch*lKbY~t_oI;oKp^#_ z`k~Mu1kWck{WJguf%Fz?0Hi0Z1IkrE10YvV<)Uc-l(S53!Wsa%dMX!91E8E`aue17 l$kkK1Xc_?JER&n?e*jmY<)4WC*YyAZ002ovPDHLkV1oUi&yfHC literal 0 HcmV?d00001 diff --git a/packages/client/public/icon144.png b/packages/client/public/icon144.png new file mode 100644 index 0000000000000000000000000000000000000000..3200d16c07224f41eb4c49a22a7f8dd0592e4b03 GIT binary patch literal 4314 zcmV<05GC)4P)HS|NGxx z_TFa?|E_};Z2=!FP{)U7^`qJXXn-^XK3PBmNpBovtm$2$Dzy6jv?ul?l^v z6R3}X?Z6Sc@@hvx{s0IAh69m6N3)iZ=1OWK*VT@+?861l|FPyiwU(fTS-I1xy9H0J>}SPMv>=s94cRSi7>NZz)V0poO^$Etai3nzV| z4M4Qjw=+)w8V1Aw{gpF|R@f5@6aou@Y%33W0?-n(?;`_)T7uUCUz&ZP#a6Ot1t6J@ z=me}YYacz%W5u%ShLLe1sfES^N8L?(SOG|YnFL4;q-!5_!SFat`{7=jQ<5FJ$l0MRZ0J4sxrCtaY zGGxhmqEqI&u5W8v+32nlEo*tYnd?TRCeji*7Lb}p)_HwuE|0xt&fNhdeV*HZEr9fe zw1kcYr0;V#u)n5`v^#(Vnx6sdH9(<5j+s*d=ssWTY zWet#>)^x>n(@j0NH7uNq7ca7L!)vvXgj3?w0NGsbJ^C&>bnM8vbEOm%

8k*#lTro3EMKm?U&fb1&Hu&{8ZOq)UE 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 IM6N<$f+2J;ApigX literal 0 HcmV?d00001 diff --git a/packages/client/public/icon152.png b/packages/client/public/icon152.png new file mode 100644 index 0000000000000000000000000000000000000000..7531f37f69d303b7804318a691f7a683ab6b00f4 GIT binary patch literal 4580 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 as81z%GvK=Y%hTx%z{KE|KKTav>Hh%w(agdC literal 0 HcmV?d00001 diff --git a/packages/client/public/icon180.png b/packages/client/public/icon180.png new file mode 100644 index 0000000000000000000000000000000000000000..6fffbebfe9775858d8c637218b0cf3f9a6130135 GIT binary patch literal 6001 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 Hb$IzdqZxzr literal 0 HcmV?d00001 diff --git a/packages/client/public/icon192.png b/packages/client/public/icon192.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9a6b2305716bd55cc49158e03897398f2abc6a GIT binary patch literal 6600 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 literal 0 HcmV?d00001 diff --git a/packages/client/pwa-cache.js b/packages/client/pwa-cache.js new file mode 100644 index 0000000..a5117db --- /dev/null +++ b/packages/client/pwa-cache.js @@ -0,0 +1,143 @@ +module.exports = [ + { + urlPattern: /^https:\/\/fonts\.(?:gstatic)\.com\/.*/i, + handler: 'CacheFirst', + options: { + cacheName: 'google-fonts-webfonts', + expiration: { + maxEntries: 4, + maxAgeSeconds: 365 * 24 * 60 * 60, // 365 days + }, + }, + }, + { + urlPattern: /^https:\/\/fonts\.(?:googleapis)\.com\/.*/i, + handler: 'StaleWhileRevalidate', + options: { + cacheName: 'google-fonts-stylesheets', + expiration: { + maxEntries: 4, + maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days + }, + }, + }, + { + urlPattern: /\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i, + handler: 'StaleWhileRevalidate', + options: { + cacheName: 'static-font-assets', + expiration: { + maxEntries: 4, + maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days + }, + }, + }, + { + urlPattern: /\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i, + handler: 'StaleWhileRevalidate', + options: { + cacheName: 'static-image-assets', + expiration: { + maxEntries: 64, + maxAgeSeconds: 24 * 60 * 60, // 24 hours + }, + }, + }, + { + urlPattern: /\/_next\/image\?url=.+$/i, + handler: 'StaleWhileRevalidate', + options: { + cacheName: 'next-image', + expiration: { + maxEntries: 64, + maxAgeSeconds: 24 * 60 * 60, // 24 hours + }, + }, + }, + { + urlPattern: /\.(?:mp3|wav|ogg)$/i, + handler: 'CacheFirst', + options: { + rangeRequests: true, + cacheName: 'static-audio-assets', + expiration: { + maxEntries: 32, + maxAgeSeconds: 24 * 60 * 60, // 24 hours + }, + }, + }, + { + urlPattern: /\.(?:mp4)$/i, + handler: 'CacheFirst', + options: { + rangeRequests: true, + cacheName: 'static-video-assets', + expiration: { + maxEntries: 32, + maxAgeSeconds: 24 * 60 * 60, // 24 hours + }, + }, + }, + { + urlPattern: /\.(?:js)$/i, + handler: 'StaleWhileRevalidate', + options: { + cacheName: 'static-js-assets', + expiration: { + maxEntries: 32, + maxAgeSeconds: 24 * 60 * 60, // 24 hours + }, + }, + }, + { + urlPattern: /\.(?:css|less)$/i, + handler: 'StaleWhileRevalidate', + options: { + cacheName: 'static-style-assets', + expiration: { + maxEntries: 32, + maxAgeSeconds: 24 * 60 * 60, // 24 hours + }, + }, + }, + { + urlPattern: /\/_next\/data\/.+\/.+\.json$/i, + handler: 'StaleWhileRevalidate', + options: { + cacheName: 'next-data', + expiration: { + maxEntries: 32, + maxAgeSeconds: 24 * 60 * 60, // 24 hours + }, + }, + }, + { + urlPattern: /\.(?:json|xml|csv)$/i, + handler: 'NetworkFirst', + options: { + cacheName: 'static-data-assets', + expiration: { + maxEntries: 32, + maxAgeSeconds: 24 * 60 * 60, // 24 hours + }, + }, + }, + { + urlPattern: ({ url }) => { + const isSameOrigin = self.origin === url.origin; + if (!isSameOrigin) return false; + const pathname = url.pathname; + if (pathname.startsWith('/api/')) return false; + return true; + }, + handler: 'NetworkFirst', + options: { + cacheName: 'others', + expiration: { + maxEntries: 32, + maxAgeSeconds: 24 * 60 * 60, // 24 hours + }, + networkTimeoutSeconds: 10, + }, + }, +]; diff --git a/packages/client/src/components/admin/system-config/ad/index.tsx b/packages/client/src/components/admin/system-config/ad/index.tsx new file mode 100644 index 0000000..4e34fe3 --- /dev/null +++ b/packages/client/src/components/admin/system-config/ad/index.tsx @@ -0,0 +1,141 @@ +import React, { useCallback, useMemo, useRef, useState } from 'react'; + +import { Avatar, Button, Form, Image, Modal, Space, Table } from '@douyinfe/semi-ui'; +import { FormApi } from '@douyinfe/semi-ui/lib/es/form'; + +import { AdType } from '@think/domains'; + +import { DataRender } from 'components/data-render'; +import { Upload } from 'components/upload'; +import { useAd } from 'data/ad'; + +const { Option } = Form.Select; + +const AdTypeTextMap = { + [AdType.shareDocCover]: '分享文档主图位', + [AdType.shareDocAside]: '分享文档侧边位', +}; + +const columns0 = [ + { + title: '类型', + dataIndex: 'type', + render: (type) => { + return AdTypeTextMap[type]; + }, + }, + { + title: '广告图', + dataIndex: 'cover', + render: (url) => { + return ( +
+ +
+ ); + }, + }, + { + title: '广告链接', + dataIndex: 'url', + }, +]; + +export const Ad = () => { + const { data, loading, error, createAd, deleteAd } = useAd(); + const [visible, toggleVisible] = useState(false); + const $form = useRef(); + const [currentCover, setCurrentCover] = useState(''); + + const columns = useMemo(() => { + return [ + ...columns0, + { + title: '操作', + dataIndex: 'id', + render: (id) => { + return ( + + ); + }, + }, + ]; + }, [deleteAd]); + + const setCover = useCallback((url) => { + $form.current.setValue('cover', url); + setCurrentCover(url); + }, []); + + const handleOk = useCallback(() => { + $form.current.validate().then((values) => { + if (!values.email) { + delete values.email; + } + createAd(values).then(() => { + $form.current.reset(); + setCover(''); + toggleVisible(false); + }); + }); + }, [createAd, setCover, toggleVisible]); + + return ( + ( +
+ + { + toggleVisible(false); + }} + style={{ maxWidth: '96vw' }} + onOk={handleOk} + > +
($form.current = formApi)} + labelPosition="left" + > + + + + + + + + + + + + + +
+
+ + + )} + /> + ); +}; diff --git a/packages/client/src/components/admin/system-config/index.tsx b/packages/client/src/components/admin/system-config/index.tsx new file mode 100644 index 0000000..11b7b81 --- /dev/null +++ b/packages/client/src/components/admin/system-config/index.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { TabPane, Tabs } from '@douyinfe/semi-ui'; + +import { Ad } from './ad'; +import { Mail } from './mail'; +import { System } from './system'; + +interface IProps { + tab?: string; + onNavigate: (arg: string) => void; +} + +const TitleMap = { + base: '系统管理', + mail: '邮箱服务', + ad: '广告管理', +}; + +export const SystemConfig: React.FC = ({ tab, onNavigate }) => { + return ( + + + + + + + + + + + + + + ); +}; diff --git a/packages/client/src/components/admin/system-config/mail/index.tsx b/packages/client/src/components/admin/system-config/mail/index.tsx new file mode 100644 index 0000000..dc0a9d0 --- /dev/null +++ b/packages/client/src/components/admin/system-config/mail/index.tsx @@ -0,0 +1,92 @@ +import React, { useCallback } from 'react'; + +import { Banner, Button, Form, Toast } from '@douyinfe/semi-ui'; + +import { DataRender } from 'components/data-render'; +import { useSystemConfig } from 'data/user'; +import { useToggle } from 'hooks/use-toggle'; + +export const Mail = () => { + const { data, loading, error, sendTestEmail, updateSystemConfig } = useSystemConfig(); + const [changed, toggleChanged] = useToggle(false); + + const onFormChange = useCallback(() => { + toggleChanged(true); + }, [toggleChanged]); + + const onFinish = useCallback( + (values) => { + updateSystemConfig(values).then(() => { + Toast.success('操作成功'); + }); + }, + [updateSystemConfig] + ); + + return ( + ( +
+ + + {/* + // @ts-ignore */} +
+ + + + + + + + + + + + +
+ )} + /> + ); +}; diff --git a/packages/client/src/components/admin/system-config/system/index.tsx b/packages/client/src/components/admin/system-config/system/index.tsx new file mode 100644 index 0000000..03f2023 --- /dev/null +++ b/packages/client/src/components/admin/system-config/system/index.tsx @@ -0,0 +1,74 @@ +import React, { useCallback } from 'react'; + +import { IconHelpCircle } from '@douyinfe/semi-icons'; +import { Banner, Button, Form, Toast, Tooltip } from '@douyinfe/semi-ui'; + +import { DataRender } from 'components/data-render'; +import { useSystemConfig } from 'data/user'; +import { useToggle } from 'hooks/use-toggle'; + +export const System = () => { + const { data, loading, error, updateSystemConfig } = useSystemConfig(); + const [changed, toggleChanged] = useToggle(false); + + const onFormChange = useCallback(() => { + toggleChanged(true); + }, [toggleChanged]); + + const onFinish = useCallback( + (values) => { + updateSystemConfig(values).then(() => { + Toast.success('操作成功'); + }); + }, + [updateSystemConfig] + ); + + return ( + ( +
+ {/* + // @ts-ignore */} +
+ + + + ), + }} + /> + + + + ), + }} + /> + + + +
+ )} + /> + ); +}; diff --git a/packages/client/src/components/author.tsx b/packages/client/src/components/author.tsx new file mode 100644 index 0000000..ba1c3fd --- /dev/null +++ b/packages/client/src/components/author.tsx @@ -0,0 +1,26 @@ +import { IconLikeHeart } from '@douyinfe/semi-icons'; +import { Space, Typography } from '@douyinfe/semi-ui'; + +import { RuntimeConfig } from 'hooks/use-runtime-config'; + +const { Text } = Typography; + +export const Author = () => { + const config = RuntimeConfig.useHook(); + + return ( +
+ {config.copyrightInformation ? ( +
+ ) : ( + + + Develop by + fantasticit + with + + + )} +
+ ); +}; diff --git a/packages/client/src/components/banner/index.tsx b/packages/client/src/components/banner/index.tsx new file mode 100644 index 0000000..b5b1288 --- /dev/null +++ b/packages/client/src/components/banner/index.tsx @@ -0,0 +1,34 @@ +import React, { useEffect, useRef } from 'react'; + +import { IconClose } from '@douyinfe/semi-icons'; +import { Banner as SemiBanner } from '@douyinfe/semi-ui'; +import { BannerProps } from '@douyinfe/semi-ui/banner'; + +import { useToggle } from 'hooks/use-toggle'; + +interface IProps extends BannerProps { + duration?: number; + closeable?: boolean; +} + +export const Banner: React.FC = ({ type, description, duration = 0, closeable = true }) => { + const timer = useRef>(); + const [visible, toggleVisible] = useToggle(true); + + useEffect(() => { + clearTimeout(timer.current); + if (duration <= 0) return; + + timer.current = setTimeout(() => { + toggleVisible(false); + }, duration); + + return () => { + clearTimeout(timer.current); + }; + }, [duration, toggleVisible]); + + if (!visible) return null; + + return : null} />; +}; diff --git a/packages/client/src/components/color-picker/index.tsx b/packages/client/src/components/color-picker/index.tsx new file mode 100644 index 0000000..e510e47 --- /dev/null +++ b/packages/client/src/components/color-picker/index.tsx @@ -0,0 +1,151 @@ +import React, { useMemo } from 'react'; + +import { Dropdown, SideSheet, Typography } from '@douyinfe/semi-ui'; + +import { IsOnMobile } from 'hooks/use-on-mobile'; +import { useToggle } from 'hooks/use-toggle'; + +import styles from './style.module.scss'; + +const { Text } = Typography; + +const colors = [ + '#000000', + '#262626', + '#595959', + '#8C8C8C', + '#BFBFBF', + '#D9D9D9', + '#E9E9E9', + '#F5F5F5', + '#FAFAFA', + '#FFFFFF', + '#F5222D', + '#FA541C', + '#FA8C16', + '#FADB14', + '#52C41A', + '#13C2C2', + '#1890FF', + '#2F54EB', + '#722ED1', + '#EB2F96', + '#FFE8E6', + '#FFECE0', + '#FFEFD1', + '#FCFCCA', + '#E4F7D2', + '#D3F5F0', + '#D4EEFC', + '#DEE8FC', + '#EFE1FA', + '#FAE1EB', + '#FFA39E', + '#FFBB96', + '#FFD591', + '#FFFB8F', + '#B7EB8F', + '#87E8DE', + '#91D5FF', + '#ADC6FF', + '#D3ADF7', + '#FFADD2', + '#FF4D4F', + '#FF7A45', + '#FFA940', + '#FFEC3D', + '#73D13D', + '#36CFC9', + '#40A9FF', + '#597EF7', + '#9254DE', + '#F759AB', + '#CF1322', + '#D4380D', + '#D46B08', + '#D4B106', + '#389E0D', + '#08979C', + '#096DD9', + '#1D39C4', + '#531DAB', + '#C41D7F', + '#820014', + '#871400', + '#873800', + '#614700', + '#135200', + '#00474F', + '#003A8C', + '#061178', + '#22075E', + '#780650', +]; + +export const ColorPicker: React.FC<{ + title?: string; + onSetColor: (arg: string) => void; + disabled?: boolean; +}> = ({ children, title = '颜色管理', onSetColor, disabled = false }) => { + const { isMobile } = IsOnMobile.useHook(); + const [visible, toggleVisible] = useToggle(false); + + const content = useMemo( + () => + !visible ? null : ( +
+
onSetColor(null)}> + + 无颜色 +
+ +
+ {colors.map((color) => { + return ( +
onSetColor(color)}> + +
+ ); + })} +
+
+ ), + [onSetColor, isMobile, visible] + ); + + if (disabled) return {children}; + + return ( + + {isMobile ? ( + <> + + {content} + + toggleVisible(true)}> + {children} + + + ) : ( + + {children} + + )} + + ); +}; diff --git a/packages/client/src/components/color-picker/style.module.scss b/packages/client/src/components/color-picker/style.module.scss new file mode 100644 index 0000000..adce77c --- /dev/null +++ b/packages/client/src/components/color-picker/style.module.scss @@ -0,0 +1,73 @@ +.emptyWrap { + display: flex; + cursor: pointer; + border: 1px solid transparent; + flex-wrap: nowrap; + + &:hover { + background-color: var(--semi-color-fill-1); + } + + > span:first-child { + position: relative; + display: block; + width: 20px; + height: 20px; + margin: 0 8px 0 1px; + border: 1px solid #e8e8e8; + border-radius: 2px; + + &::after { + position: absolute; + top: 8px; + left: 0; + display: block; + width: 17px; + height: 0; + content: ''; + transform: rotate(45deg); + border-bottom: 2px solid #ff5151; + } + } +} + +.colorWrap { + display: flex; + flex-wrap: wrap; + margin-top: 8px; + + .colorItem { + display: flex; + width: 24px; + height: 24px; + cursor: pointer; + border: 1px solid transparent; + border-radius: 4px; + justify-content: center; + align-items: center; + + &:nth-of-type(n + 11) { + margin-top: 4px; + } + + &:hover { + border-color: rgb(193 199 208); + } + + > span { + display: block; + width: 20px; + height: 20px; + border: 1px solid var(--semi-color-border); + border-radius: 2px; + } + } +} + +.visible { + display: block; +} + +.hidden { + display: none; +} diff --git a/packages/client/src/components/data-render/constant.tsx b/packages/client/src/components/data-render/constant.tsx new file mode 100644 index 0000000..1e43698 --- /dev/null +++ b/packages/client/src/components/data-render/constant.tsx @@ -0,0 +1,47 @@ +import React, { useMemo } from 'react'; + +import { Spin, Typography } from '@douyinfe/semi-ui'; + +import { Empty } from 'illustrations/empty'; + +const { Text } = Typography; + +export const defaultLoading = ( +
+ +
+); + +export const defaultRenderError = (error) => { + return {(error && error.message) || '未知错误'}; +}; + +const emptyStyle: React.CSSProperties = { + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + flexDirection: 'column', + position: 'relative', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', +}; + +export const defaultEmpty = ( +
+
+ +
+ 暂无数据 +
+); + +export const Render: React.FC<{ fn: ((arg: unknown) => React.ReactNode) | React.ReactNode; args?: unknown[] }> = ({ + fn, + args = [], +}) => { + // eslint-disable-next-line react-hooks/exhaustive-deps + const content = useMemo(() => (typeof fn === 'function' ? fn.apply(null, ...args) : fn), [args]); + + return <>{content}; +}; diff --git a/packages/client/src/components/data-render/index.tsx b/packages/client/src/components/data-render/index.tsx new file mode 100644 index 0000000..9f1179a --- /dev/null +++ b/packages/client/src/components/data-render/index.tsx @@ -0,0 +1,44 @@ +import React from 'react'; + +import deepEqual from 'deep-equal'; + +import { defaultEmpty, defaultLoading, defaultRenderError, Render } from './constant'; +import { LoadingWrap } from './loading'; + +type RenderProps = React.ReactNode | (() => React.ReactNode); + +interface IProps { + loading: boolean; + error: Error | null | unknown; + empty?: boolean; + loadingContent?: RenderProps; + errorContent?: RenderProps; + emptyContent?: RenderProps; + normalContent: RenderProps; +} + +export const _DataRender: React.FC = ({ + loading, + error, + empty, + loadingContent = defaultLoading, + errorContent = defaultRenderError, + emptyContent = defaultEmpty, + normalContent, +}) => { + if (error) { + return ; + } + + if (empty) { + return ; + } + + return ( + + ); +}; + +export const DataRender = React.memo(_DataRender, (prevProps, nextProps) => { + return deepEqual(prevProps, nextProps); +}); diff --git a/packages/client/src/components/data-render/loading.tsx b/packages/client/src/components/data-render/loading.tsx new file mode 100644 index 0000000..c696342 --- /dev/null +++ b/packages/client/src/components/data-render/loading.tsx @@ -0,0 +1,34 @@ +import React, { useEffect, useRef } from 'react'; + +import { useToggle } from 'hooks/use-toggle'; + +import { Render } from './constant'; + +export const LoadingWrap = ({ loading, delay = 200, loadingContent, normalContent }) => { + const timer = useRef>(null); + const [showLoading, toggleShowLoading] = useToggle(false); + + useEffect(() => { + clearTimeout(timer.current); + + if (!loading) return; + + timer.current = setTimeout(() => { + if (loading) { + toggleShowLoading(true); + } else { + toggleShowLoading(false); + } + }, delay); + + return () => { + clearTimeout(timer.current); + }; + }, [delay, loading, toggleShowLoading]); + + if (loading) { + return showLoading ? : null; + } + + return ; +}; diff --git a/packages/client/src/components/divider.tsx b/packages/client/src/components/divider.tsx new file mode 100644 index 0000000..0915b01 --- /dev/null +++ b/packages/client/src/components/divider.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +export const _Divider = ({ vertical = false, margin = 6 }) => { + return ( +
+ ); +}; + +export const Divider = React.memo(_Divider, (prevProps, nextProps) => { + return prevProps.vertical === nextProps.vertical; +}); diff --git a/packages/client/src/components/document-creator/index.tsx b/packages/client/src/components/document-creator/index.tsx new file mode 100644 index 0000000..fa1b073 --- /dev/null +++ b/packages/client/src/components/document-creator/index.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +import { Button } from '@douyinfe/semi-ui'; + +import { DocumentCreator as DocumenCreatorForm } from 'components/document/create'; +import { useRouterQuery } from 'hooks/use-router-query'; +import { useToggle } from 'hooks/use-toggle'; + +interface IProps { + onCreateDocument?: () => void; +} + +export const DocumentCreator: React.FC = ({ onCreateDocument, children }) => { + const { wikiId, documentId } = useRouterQuery<{ wikiId?: string; documentId?: string }>(); + const [visible, toggleVisible] = useToggle(false); + + return ( + <> + {children || ( + + )} + {wikiId && ( + + )} + + ); +}; diff --git a/packages/client/src/components/document/actions/index.module.scss b/packages/client/src/components/document/actions/index.module.scss new file mode 100644 index 0000000..6030de9 --- /dev/null +++ b/packages/client/src/components/document/actions/index.module.scss @@ -0,0 +1,8 @@ +.hoverVisible { + opacity: 0; + + &:hover, + &.isActive { + opacity: 1; + } +} diff --git a/packages/client/src/components/document/actions/index.tsx b/packages/client/src/components/document/actions/index.tsx new file mode 100644 index 0000000..1fd9130 --- /dev/null +++ b/packages/client/src/components/document/actions/index.tsx @@ -0,0 +1,229 @@ +import React, { useCallback } from 'react'; + +import { IconArticle, IconBranch, IconExport, IconHistory, IconMore, IconPlus, IconStar } from '@douyinfe/semi-icons'; +import { Button, Dropdown, Space, Typography } from '@douyinfe/semi-ui'; +import { ButtonProps } from '@douyinfe/semi-ui/button/Button'; + +import { IDocument, IOrganization, IWiki } from '@think/domains'; + +import cls from 'classnames'; +import { DocumentCreator } from 'components/document/create'; +import { DocumentDeletor } from 'components/document/delete'; +import { DocumentExporter } from 'components/document/export'; +import { DocumentLinkCopyer } from 'components/document/link'; +import { DocumentShare } from 'components/document/share'; +import { DocumentStar } from 'components/document/star'; +import { DocumentStyle } from 'components/document/style'; +import { DocumentVersionTrigger } from 'components/document/version'; +import { useToggle } from 'hooks/use-toggle'; + +import styles from './index.module.scss'; + +interface IProps { + organizationId: IOrganization['id']; + wikiId: IWiki['id']; + documentId: IDocument['id']; + document?: IDocument; + hoverVisible?: boolean; + onStar?: () => void; + onCreate?: () => void; + onDelete?: () => void; + onVisibleChange?: () => void; + showCreateDocument?: boolean; + size?: ButtonProps['size']; + hideDocumentVersion?: boolean; + hideDocumentStyle?: boolean; +} + +const { Text } = Typography; + +export const DocumentActions: React.FC = ({ + organizationId, + wikiId, + documentId, + hoverVisible, + document, + onStar, + onCreate, + onDelete, + onVisibleChange, + showCreateDocument, + size = 'default', + hideDocumentVersion = false, + hideDocumentStyle = false, +}) => { + const [popoverVisible, togglePopoverVisible] = useToggle(false); + const [createVisible, toggleCreateVisible] = useToggle(false); + + const create = useCallback(() => { + togglePopoverVisible(false); + toggleCreateVisible(true); + }, [togglePopoverVisible, toggleCreateVisible]); + + const wrapedOnDelete = useCallback(() => { + togglePopoverVisible(false); + onDelete && onDelete(); + }, [onDelete, togglePopoverVisible]); + + const wrapOnVisibleChange = useCallback( + (visible) => { + togglePopoverVisible(visible); + onVisibleChange && onVisibleChange(); + }, + [onVisibleChange, togglePopoverVisible] + ); + + return ( + <> + + {showCreateDocument && ( + + + + + 新建子文档 + + + + )} + + { + return ( + + + + + {isPublic ? '分享中' : '分享'} + + + + ); + }} + /> + + ( + { + toggleStar().then(onStar); + }} + > + + + + {text} + + + + )} + /> + + { + return ( + + {children} + + ); + }} + /> + + {!hideDocumentVersion && ( + { + return ( + { + togglePopoverVisible(false); + onClick(); + }} + > + + + + 历史记录 + + + + ); + }} + /> + )} + + {document && ( + { + return ( + toggleVisible(true)}> + + + + 文档导出 + + + + ); + }} + /> + )} + + + + { + return {children}; + }} + /> + + } + > + + + + + + ) : ( +
+ 写下评论... +
+ )} + + + + ); +}; diff --git a/packages/client/src/components/document/create/index.module.scss b/packages/client/src/components/document/create/index.module.scss new file mode 100644 index 0000000..f6ca037 --- /dev/null +++ b/packages/client/src/components/document/create/index.module.scss @@ -0,0 +1,3 @@ +.isActive { + border: 1px solid var(--semi-color-link); +} diff --git a/packages/client/src/components/document/create/index.tsx b/packages/client/src/components/document/create/index.tsx new file mode 100644 index 0000000..d392158 --- /dev/null +++ b/packages/client/src/components/document/create/index.tsx @@ -0,0 +1,111 @@ +import { Dispatch, SetStateAction, useCallback, useEffect, useState } from 'react'; + +import { Checkbox, Modal, TabPane, Tabs } from '@douyinfe/semi-ui'; + +import { IDocument, IWiki } from '@think/domains'; + +import { TemplateCardEmpty } from 'components/template/card'; +import { TemplateList } from 'components/template/list'; +import { useCreateDocument } from 'data/document'; +import { useOwnTemplates, usePublicTemplates } from 'data/template'; +import { useRouterQuery } from 'hooks/use-router-query'; +import Router from 'next/router'; + +import styles from './index.module.scss'; + +interface IProps { + wikiId: IWiki['id']; + parentDocumentId?: IDocument['id']; + visible: boolean; + toggleVisible: Dispatch>; + onCreate?: () => void; +} + +export const DocumentCreator: React.FC = ({ parentDocumentId, wikiId, visible, toggleVisible, onCreate }) => { + const { organizationId } = useRouterQuery<{ organizationId?: string }>(); + const { loading, create } = useCreateDocument(); + const [createChildDoc, setCreateChildDoc] = useState(false); + const [templateId, setTemplateId] = useState(''); + + const handleOk = () => { + const data = { + organizationId, + wikiId, + parentDocumentId: createChildDoc ? parentDocumentId : null, + templateId, + }; + create(data).then((res) => { + toggleVisible(false); + onCreate && onCreate(); + setTemplateId(''); + Router.push({ + pathname: `/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]/edit`, + query: { organizationId, wikiId, documentId: res.id }, + }); + }); + }; + const handleCancel = useCallback(() => { + toggleVisible(false); + }, [toggleVisible]); + + useEffect(() => { + setCreateChildDoc(!!parentDocumentId); + }, [parentDocumentId]); + + return ( + + setCreateChildDoc(e.target.checked)}> + 为该文档创建子文档 + + ) + } + > + + setTemplateId(id)} + getClassNames={(id) => id === templateId && styles.isActive} + firstListItem={ + !templateId && styles.isActive} + onClick={() => setTemplateId('')} + /> + } + /> + + + setTemplateId(id)} + getClassNames={(id) => id === templateId && styles.isActive} + firstListItem={ + !templateId && styles.isActive} + onClick={() => setTemplateId('')} + /> + } + /> + + + + ); +}; diff --git a/packages/client/src/components/document/delete/index.tsx b/packages/client/src/components/document/delete/index.tsx new file mode 100644 index 0000000..9f92329 --- /dev/null +++ b/packages/client/src/components/document/delete/index.tsx @@ -0,0 +1,67 @@ +import React, { useCallback, useMemo } from 'react'; + +import { IconDelete } from '@douyinfe/semi-icons'; +import { Popconfirm, Space, Typography } from '@douyinfe/semi-ui'; + +import { useDeleteDocument } from 'data/document'; +import { useRouterQuery } from 'hooks/use-router-query'; +import Router from 'next/router'; + +interface IProps { + wikiId: string; + documentId: string; + onDelete?: () => void; + render?: (arg: { children: React.ReactNode }) => React.ReactNode; +} + +const { Text } = Typography; + +export const DocumentDeletor: React.FC = ({ wikiId, documentId, render, onDelete }) => { + const { + organizationId, + wikiId: currentWikiId, + documentId: currentDocumentId, + } = useRouterQuery<{ organizationId: string; wikiId?: string; documentId?: string }>(); + const { deleteDocument: api, loading } = useDeleteDocument(documentId); + + const deleteAction = useCallback(() => { + api().then(() => { + const navigate = () => { + if (wikiId !== currentWikiId || documentId !== currentDocumentId) { + return; + } + Router.push({ + pathname: `/app/org/[organizationId]/wiki/[wikiId]`, + query: { organizationId, wikiId }, + }); + }; + + navigate(); + onDelete && onDelete(); + }); + }, [organizationId, wikiId, documentId, api, onDelete, currentWikiId, currentDocumentId]); + + const content = useMemo( + () => ( + + + + 删除 + + + ), + [] + ); + + return ( + + {render ? render({ children: content }) : content} + + ); +}; diff --git a/packages/client/src/components/document/editor/editor.tsx b/packages/client/src/components/document/editor/editor.tsx new file mode 100644 index 0000000..fd1899c --- /dev/null +++ b/packages/client/src/components/document/editor/editor.tsx @@ -0,0 +1,53 @@ +import React, { useEffect, useRef } from 'react'; + +import { IAuthority, ILoginUser } from '@think/domains'; + +import { CollaborationEditor, ICollaborationRefProps } from 'tiptap/editor'; + +import cls from 'classnames'; +import { event, triggerChangeDocumentTitle, triggerJoinUser, USE_DOCUMENT_VERSION } from 'event'; +import { useMount } from 'hooks/use-mount'; + +import styles from './index.module.scss'; + +interface IProps { + user: ILoginUser; + documentId: string; + authority: IAuthority; +} + +export const Editor: React.FC = ({ user: currentUser, documentId, authority }) => { + const $editor = useRef(); + const mounted = useMount(); + + useEffect(() => { + const handler = (data) => { + const editor = $editor.current && $editor.current.getEditor(); + if (!editor) return; + editor.commands.setContent(data); + }; + + event.on(USE_DOCUMENT_VERSION, handler); + + return () => { + event.off(USE_DOCUMENT_VERSION, handler); + }; + }, []); + + return ( +
+ {mounted && ( + + )} +
+ ); +}; diff --git a/packages/client/src/components/document/editor/index.module.scss b/packages/client/src/components/document/editor/index.module.scss new file mode 100644 index 0000000..e23330f --- /dev/null +++ b/packages/client/src/components/document/editor/index.module.scss @@ -0,0 +1,33 @@ +/* stylelint-disable no-descending-specificity */ +.wrap { + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; + + > header { + position: relative; + z-index: 110; + background-color: var(--semi-color-nav-bg); + user-select: none; + + .mobileToolbar { + padding: 12px 16px; + overflow: auto; + text-align: center; + border-bottom: 1px solid var(--semi-color-border); + } + } + + > main { + height: calc(100% - 60px); + overflow: hidden; + background-color: var(--semi-color-nav-bg); + flex: 1; + } +} + +.editorWrap { + height: 100%; + overflow: hidden; +} diff --git a/packages/client/src/components/document/editor/index.tsx b/packages/client/src/components/document/editor/index.tsx new file mode 100644 index 0000000..642e04f --- /dev/null +++ b/packages/client/src/components/document/editor/index.tsx @@ -0,0 +1,150 @@ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; + +import { IconChevronLeft } from '@douyinfe/semi-icons'; +import { Button, Nav, Skeleton, Space, Tooltip, Typography } from '@douyinfe/semi-ui'; + +import { DataRender } from 'components/data-render'; +import { Divider } from 'components/divider'; +import { DocumentCollaboration } from 'components/document/collaboration'; +import { DocumentStar } from 'components/document/star'; +import { DocumentVersion } from 'components/document/version'; +import { Seo } from 'components/seo'; +import { Theme } from 'components/theme'; +import { User } from 'components/user'; +import { useDocumentDetail } from 'data/document'; +import { useUser } from 'data/user'; +import { CHANGE_DOCUMENT_TITLE, event, triggerUseDocumentVersion } from 'event'; +import { triggerRefreshTocs } from 'event'; +import { IsOnMobile } from 'hooks/use-on-mobile'; +import { useWindowSize } from 'hooks/use-window-size'; +import { SecureDocumentIllustration } from 'illustrations/secure-document'; +import Router from 'next/router'; + +import { DocumentActions } from '../actions'; +import { Editor } from './editor'; + +import styles from './index.module.scss'; + +const { Text } = Typography; + +interface IProps { + documentId: string; +} + +const ErrorContent = () => { + return ( +
+ +
+ ); +}; + +export const DocumentEditor: React.FC = ({ documentId }) => { + const { isMobile } = IsOnMobile.useHook(); + const { width: windowWith } = useWindowSize(); + const [title, setTitle] = useState(''); + const { user } = useUser(); + const { data: documentAndAuth, loading: docAuthLoading, error: docAuthError } = useDocumentDetail(documentId); + const { document, authority } = documentAndAuth || {}; + + const goback = useCallback(() => { + Router.push({ + pathname: `/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]`, + query: { organizationId: document.organizationId, wikiId: document.wikiId, documentId: document.id }, + }).then(() => { + triggerRefreshTocs(); + }); + }, [document]); + + const actions = useMemo( + () => ( + + {document && authority.readable && ( + + )} + {document && ( + + )} + {document && ( + + )} + + + ), + [documentId, document, authority] + ); + + useEffect(() => { + event.on(CHANGE_DOCUMENT_TITLE, setTitle); + + return () => { + event.off(CHANGE_DOCUMENT_TITLE, setTitle); + }; + }, []); + + return ( +
+
+
+
+ } + normalContent={() => { + return ( + <> + {document && } + {user && } + + ); + }} + /> +
+
+ ); +}; diff --git a/packages/client/src/components/document/export/index.module.scss b/packages/client/src/components/document/export/index.module.scss new file mode 100644 index 0000000..6956c8e --- /dev/null +++ b/packages/client/src/components/document/export/index.module.scss @@ -0,0 +1,16 @@ +.templateItem { + display: flex; + width: 118px; + padding: 12px; + cursor: pointer; + border: 1px solid transparent; + border-radius: var(--border-radius); + justify-content: center; + align-items: center; + flex-direction: column; + + &:hover { + border-color: var(--semi-color-border); + box-shadow: var(--box-shadow); + } +} diff --git a/packages/client/src/components/document/export/index.tsx b/packages/client/src/components/document/export/index.tsx new file mode 100644 index 0000000..00f6577 --- /dev/null +++ b/packages/client/src/components/document/export/index.tsx @@ -0,0 +1,186 @@ +import React, { useCallback, useEffect, useMemo } from 'react'; + +import { Badge, Button, Dropdown, Modal, Space, Typography } from '@douyinfe/semi-ui'; + +import { IDocument } from '@think/domains'; + +import { createEditor } from 'tiptap/core'; +import { AllExtensions } from 'tiptap/core/all-kit'; +import { prosemirrorToMarkdown } from 'tiptap/markdown/prosemirror-to-markdown'; + +import { IconJSON, IconMarkdown, IconPDF, IconWord } from 'components/icons'; +import { useDocumentDetail } from 'data/document'; +import FileSaver from 'file-saver'; +import { safeJSONParse, safeJSONStringify } from 'helpers/json'; +import { IsOnMobile } from 'hooks/use-on-mobile'; +import { useToggle } from 'hooks/use-toggle'; + +import { printEditorContent } from './pdf'; + +import styles from './index.module.scss'; + +const { Text } = Typography; + +interface IProps { + document: IDocument; + render?: (arg: { toggleVisible: (arg: boolean) => void }) => React.ReactNode; +} + +export const DocumentExporter: React.FC = ({ document, render }) => { + const { isMobile } = IsOnMobile.useHook(); + const [visible, toggleVisible] = useToggle(false); + const { exportDocx } = useDocumentDetail(document.id); + + const editor = useMemo(() => { + return createEditor({ + editable: false, + extensions: AllExtensions, + content: '', + editorProps: { + // @ts-ignore + print: true, + }, + }); + }, []); + + const exportMarkdown = useCallback(() => { + const md = prosemirrorToMarkdown({ content: editor.state.doc.slice(0).content }); + const blob = new Blob([md], { type: 'text/plain;charset=utf-8' }); + FileSaver.saveAs(blob, `${document.title}.md`); + }, [document, editor]); + + const exportJSON = useCallback(() => { + const blob = new Blob([safeJSONStringify(editor.getJSON())], { type: 'text/plain;charset=utf-8' }); + FileSaver.saveAs(blob, `${document.title}.json`); + }, [document, editor]); + + const exportWord = useCallback(() => { + const editorContent = editor.view.dom.closest('.ProseMirror'); + if (editorContent) { + exportDocx(editorContent.outerHTML).then((res) => { + const blob = new Blob([Buffer.from(res as Buffer)], { type: 'text/plain;charset=utf-8' }); + FileSaver.saveAs(blob, `${document.title}.docx`); + }); + } + }, [editor, exportDocx, document]); + + const exportPDF = useCallback(() => { + printEditorContent(editor.view); + }, [editor]); + + const content = useMemo( + () => ( +
+ +
+
+ +
+
+ Markdown +
+
+ .md +
+
+ +
+
+ +
+
+ JSON +
+
+ .json +
+
+ +
+
+ + + +
+
+ Word +
+
+ .docx +
+
+ +
+
+ + + +
+
+ PDF +
+
+ .pdf +
+
+
+
+ ), + [exportMarkdown, exportJSON, exportWord, exportPDF] + ); + + const btn = useMemo( + () => + render ? ( + render({ toggleVisible }) + ) : ( + + ), + [render, toggleVisible] + ); + + useEffect(() => { + const c = safeJSONParse(document && document.content); + const json = c.default || c; + editor.commands.setContent(json); + }, [editor, document]); + + return ( + <> + {isMobile ? ( + <> + + {content} + + {btn} + + ) : ( + {content}} + > + {btn} + + )} + + ); +}; diff --git a/packages/client/src/components/document/export/pdf.ts b/packages/client/src/components/document/export/pdf.ts new file mode 100644 index 0000000..69d1689 --- /dev/null +++ b/packages/client/src/components/document/export/pdf.ts @@ -0,0 +1,56 @@ +import { EditorView } from 'prosemirror-view'; + +function printHtml(dom: Element) { + const style: string = Array.from(document.querySelectorAll('style, link')).reduce( + (str, style) => str + style.outerHTML, + '' + ); + + const content: string = style + dom.outerHTML; + + const iframe: HTMLIFrameElement = document.createElement('iframe'); + iframe.setAttribute('style', 'position: absolute; width: 0; height: 0; top: 0; left: 0;'); + document.body.appendChild(iframe); + + const frameWindow = iframe.contentWindow; + const doc = iframe.contentDocument || (iframe.contentWindow && iframe.contentWindow.document); + + if (doc) { + doc.open(); + doc.write(content); + doc.close(); + } + + if (frameWindow) { + iframe.onload = function () { + try { + setTimeout(() => { + frameWindow.focus(); + try { + if (!frameWindow.document.execCommand('print', false)) { + frameWindow.print(); + } + } catch (e) { + frameWindow.print(); + } + frameWindow.close(); + }, 10); + } catch (err) { + console.error(err); + } + + setTimeout(function () { + document.body.removeChild(iframe); + }, 100); + }; + } +} + +export function printEditorContent(view: EditorView) { + const editorContent = view.dom.closest('.ProseMirror'); + if (editorContent) { + printHtml(editorContent); + return true; + } + return false; +} diff --git a/packages/client/src/components/document/fullscreen/index.module.scss b/packages/client/src/components/document/fullscreen/index.module.scss new file mode 100644 index 0000000..0d65f6b --- /dev/null +++ b/packages/client/src/components/document/fullscreen/index.module.scss @@ -0,0 +1,143 @@ +.wrap { + width: 100vw; + height: 100vh; + overflow: auto; + background-color: var(--semi-color-bg-0); +} + +.fullscreenContainer { + position: fixed; + background: var(--semi-color-bg-0); + + .show { + z-index: 2; + opacity: 1; + } + + .hidden { + z-index: -1; + opacity: 0; + } + + .fullscreenContent { + position: relative; + min-width: 100%; + min-height: 100%; + + .header { + position: fixed; + z-index: 2; + display: flex; + width: 100%; + height: 60px; + padding: 0 24px; + background-color: var(--semi-color-bg-0); + opacity: 0.9; + align-items: center; + } + + .content { + position: relative; + z-index: 1; + width: auto; + height: 100vh; + min-height: 680px; + padding: 60px 120px 0; + margin: 0 auto; + overflow: auto; + letter-spacing: 0.05em; + background: var(--semi-color-bg-1); + transition: width 0.3s linear, padding 0.3s linear; + + .title { + display: flex; + align-items: flex-start; + flex-direction: column; + justify-content: center; + height: 100vh; + font-size: 4rem; + line-height: 4.6rem; + color: var(--semi-color-text-0); + text-align: left; + word-wrap: break-word; + vertical-align: middle; + overflow-wrap: break-word; + + .imgCover { + position: relative; + width: 100%; + height: 62.5%; + margin-bottom: 16px; + overflow: hidden; + + > img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-position: center 50%; + object-fit: cover; + } + } + } + + .node-title.is-empty { + display: none !important; + } + } + } +} + +.fullScreenToolbar { + position: fixed; + bottom: 40px; + left: 50%; + z-index: 2; + padding: 12px; + background-color: rgb(var(--semi-grey-9)); + border-radius: var(--semi-border-radius-medium); + opacity: 0; + transform: translateX(-50%); + transition: opacity 0.5s ease-in-out; + + &.isVisible { + opacity: 1; + } + + .selected { + background-color: rgb(var(--semi-grey-8)) !important; + } + + .customButton { + display: flex; + height: 32px; + min-width: 32px; + padding: 0 8px; + font-size: 14px; + color: rgb(var(--semi-grey-0)); + cursor: pointer; + background: none; + border: none; + border-radius: 2px; + outline: none; + align-items: center; + + &:hover { + background-color: rgb(var(--semi-grey-8)); + } + } + + .divider { + width: 1px; + height: 1em; + background: rgb(var(--semi-grey-0)); + } +} + +.drawingCursor { + position: fixed; + top: 0; + left: 0; + z-index: 999999; +} diff --git a/packages/client/src/components/document/fullscreen/index.tsx b/packages/client/src/components/document/fullscreen/index.tsx new file mode 100644 index 0000000..82ef869 --- /dev/null +++ b/packages/client/src/components/document/fullscreen/index.tsx @@ -0,0 +1,156 @@ +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { FullScreen, useFullScreenHandle } from 'react-full-screen'; + +import { IconShrinkScreenStroked } from '@douyinfe/semi-icons'; +import { Button, Space, Tooltip, Typography } from '@douyinfe/semi-ui'; + +import { EditorContent, useEditor } from '@tiptap/react'; +import { CollaborationKit, Document } from 'tiptap/editor'; + +import cls from 'classnames'; +import { IconFullscreen } from 'components/icons/IconFullscreen'; +import { IconPencil } from 'components/icons/IconPencil'; +import { safeJSONParse } from 'helpers/json'; +import { useDrawingCursor } from 'hooks/use-cursor'; +import { useToggle } from 'hooks/use-toggle'; + +import styles from './index.module.scss'; + +const { Title } = Typography; + +// 控制器 +const FullscreenController = ({ handle: fullscreenHandler, isDrawing, toggleDrawing }) => { + const timerRef = useRef>(null); + const [visible, toggleVisible] = useState(true); + + const startDrawing = useCallback(() => { + toggleDrawing(!isDrawing); + }, [isDrawing, toggleDrawing]); + + const close = useCallback(() => { + fullscreenHandler.exit(); + toggleDrawing(false); + }, [fullscreenHandler, toggleDrawing]); + + useEffect(() => { + timerRef.current = setTimeout(() => { + toggleVisible(false); + }, 2000); + }, [toggleVisible]); + + return ( +
{ + clearTimeout(timerRef.current); + toggleVisible(true); + }} + onMouseLeave={() => toggleVisible(false)} + > + + +
+ +
+
+ ); +}; + +// 画笔 +const DrawingCursor = ({ isDrawing }) => { + useDrawingCursor(isDrawing); + return isDrawing &&
; +}; + +interface IProps { + data?: any; +} + +// 全屏按钮 +export const DocumentFullscreen: React.FC = ({ data }) => { + const fullscreenHandler = useFullScreenHandle(); + const [visible, toggleVisible] = useToggle(false); + const [isDrawing, toggleDrawing] = useToggle(false); + const [cover, setCover] = useState(''); + + const editor = useEditor( + { + editable: false, + extensions: CollaborationKit.filter((ext) => ['title', 'doc'].indexOf(ext.name) < 0).concat(Document), + content: { type: 'doc', content: [] }, + }, + [] + ); + + const startPowerpoint = useCallback(() => { + toggleVisible(true); + fullscreenHandler.enter(); + }, [toggleVisible, fullscreenHandler]); + + const fullscreenChange = useCallback( + (state) => { + if (!state) { + toggleVisible(false); + toggleDrawing(false); + } + }, + [toggleVisible, toggleDrawing] + ); + + useEffect(() => { + if (!editor || !visible) return; + const docJSON = safeJSONParse(data.content, { default: {} }).default; + const titleNode = docJSON.content.find((item) => item.type === 'title'); + docJSON.content = docJSON.content.filter((item) => item.type !== 'title'); + setCover(titleNode?.attrs?.cover ?? ''); + editor.commands.setContent(docJSON); + }, [editor, data, visible]); + + return ( + + + + + ); + } + // @ts-ignore + return ( +
+ + + {(error && (error as Error).message) || "未知错误"} + +
+ ); + } + + return ( + <> + {data && } + {mounted && ( + + )} + + ); + }, [error, data, mounted, documentId, renderAuthor, handleOk]); + + return ( + +
+ +
+
+ {(ads || []) + .filter((ad) => ad.type === AdType.shareDocCover) + .map((ad) => { + return ( +
+ + + +
+ ); + })} +
+
+ {content} +
+ +
+ + {(ads || []) + .filter((ad) => ad.type === AdType.shareDocAside) + .map((ad) => { + return ( +
+ + + +
+ ); + })} +
+
+
+ ); +}; diff --git a/packages/client/src/components/document/share/index.tsx b/packages/client/src/components/document/share/index.tsx new file mode 100644 index 0000000..e223024 --- /dev/null +++ b/packages/client/src/components/document/share/index.tsx @@ -0,0 +1,169 @@ +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; + +import { IconLink } from '@douyinfe/semi-icons'; +import { Button, Dropdown, Input, Modal, Space, Toast, Typography } from '@douyinfe/semi-ui'; + +import { isPublicDocument } from '@think/domains'; + +import { useDocumentDetail } from 'data/document'; +import { getDocumentShareURL } from 'helpers/url'; +import { IsOnMobile } from 'hooks/use-on-mobile'; +import { useToggle } from 'hooks/use-toggle'; +import { ShareIllustration } from 'illustrations/share'; + +interface IProps { + documentId: string; + disabled?: boolean; + render?: (arg: { isPublic: boolean; disabled: boolean; toggleVisible: () => void }) => React.ReactNode; +} + +const { Text } = Typography; + +export const DocumentShare: React.FC = ({ documentId, disabled = false, render }) => { + const { isMobile } = IsOnMobile.useHook(); + const ref = useRef(); + const [visible, toggleVisible] = useToggle(false); + const { data, loading, toggleStatus } = useDocumentDetail(documentId, { enabled: visible }); + const [sharePassword, setSharePassword] = useState(''); + const isPublic = useMemo(() => data && isPublicDocument(data.document.status), [data]); + const shareUrl = useMemo(() => data && getDocumentShareURL(data.document.id), [data]); + + const copyable = useMemo( + () => ({ + onCopy: () => Toast.success({ content: '复制文本成功' }), + successTip: '已复制', + }), + [] + ); + + const prevent = useCallback((e) => { + e.stopPropagation(); + }, []); + + const viewUrl = useCallback(() => { + window.open(shareUrl, '_blank'); + }, [shareUrl]); + + const handleOk = useCallback(() => { + toggleStatus({ sharePassword: isPublic ? '' : sharePassword }); + }, [isPublic, sharePassword, toggleStatus]); + + const content = useMemo( + () => ( +
+
+ +
+ {isPublic ? ( + } + copyable={copyable} + style={{ + width: 280, + }} + > + {shareUrl} + + ) : ( + + )} +
+ + {isPublic + ? '分享开启后,该页面包含的所有内容均可访问,请谨慎开启' + : ' 分享关闭后,非协作成员将不能继续访问该页面'} + +
+ + + + {isPublic && ( + + )} + +
+ ), + [copyable, handleOk, isPublic, prevent, sharePassword, shareUrl, toggleVisible, viewUrl] + ); + + const btn = useMemo( + () => + render ? ( + render({ isPublic, disabled, toggleVisible }) + ) : ( + + ), + [disabled, isPublic, render, toggleVisible] + ); + + useEffect(() => { + if (loading || !data) return; + setSharePassword(data.document && data.document.sharePassword); + }, [loading, data]); + + useEffect(() => { + if (visible) { + setTimeout(() => ref.current?.focus(), 100); + } + }, [visible]); + + return ( + <> + {isMobile ? ( + <> + + {content} + + {btn} + + ) : ( + + {content} + + } + > + {btn} + + )} + + ); +}; diff --git a/packages/client/src/components/document/star/index.tsx b/packages/client/src/components/document/star/index.tsx new file mode 100644 index 0000000..d21f1ff --- /dev/null +++ b/packages/client/src/components/document/star/index.tsx @@ -0,0 +1,67 @@ +import React, { useCallback } from 'react'; +import VisibilitySensor from 'react-visibility-sensor'; + +import { IconStar } from '@douyinfe/semi-icons'; +import { Button, Tooltip } from '@douyinfe/semi-ui'; + +import { IDocument, IOrganization, IWiki } from '@think/domains'; + +import { useDocumentStarToggle } from 'data/star'; +import { useToggle } from 'hooks/use-toggle'; + +interface IProps { + organizationId: IOrganization['id']; + wikiId: IWiki['id']; + documentId: IDocument['id']; + disabled?: boolean; + render?: (arg: { + star: boolean; + disabled: boolean; + text: string; + toggleStar: () => Promise; + }) => React.ReactNode; +} + +export const DocumentStar: React.FC = ({ organizationId, wikiId, documentId, disabled = false, render }) => { + const [visible, toggleVisible] = useToggle(false); + const { data, toggle: toggleStar } = useDocumentStarToggle(organizationId, wikiId, documentId, { enabled: visible }); + const text = data ? '取消收藏' : '收藏文档'; + + const onViewportChange = useCallback( + (visible) => { + if (visible) { + toggleVisible(true); + } + }, + [toggleVisible] + ); + + const toggleStarAction = useCallback( + (e) => { + e.stopPropagation(); + e.preventDefault(); + toggleStar(); + }, + [toggleStar] + ); + + return ( + + {render ? ( + render({ star: data, disabled, toggleStar, text }) + ) : ( + + + + + + } + footer={null} + > + ( +
+
+
+ {diffVersion ? ( +
+ ) : ( + + )} +
+
+ +
+ )} + /> + + + ); +}; + +export const DocumentVersionTrigger: React.FC> = ({ render, disabled }) => { + const { toggleVisible } = DocumentVersionControl.useHook(); + + return ( + <> + {render ? ( + render({ onClick: toggleVisible, disabled }) + ) : ( + <> + + + )} + + ); +}; diff --git a/packages/client/src/components/emoji-picker/constants.ts b/packages/client/src/components/emoji-picker/constants.ts new file mode 100644 index 0000000..fde80d3 --- /dev/null +++ b/packages/client/src/components/emoji-picker/constants.ts @@ -0,0 +1,562 @@ +export const EXPRESSIONES = [ + '😀', + '😃', + '😄', + '😁', + '😆', + '😅', + '😂', + '🤣', + '🥲', + '😊', + '😇', + '🙂', + '🙃', + '😉', + '😌', + '😍', + '🥰', + '😘', + '😗', + '😙', + '😚', + '😋', + '😛', + '😝', + '😜', + '🤪', + '🤨', + '🧐', + '🤓', + '😎', + '🥸', + '🤩', + '🥳', + '😏', + '😒', + '😞', + '😔', + '😟', + '😕', + '🙁', + '😣', + '😖', + '😫', + '😩', + '🥺', + '😢', + '😭', + '😤', + '😠', + '😡', + '🤬', + '🤯', + '😳', + '🥵', + '🥶', + '😱', + '😨', + '😰', + '😥', + '😓', + '🤗', + '🤔', + '🤭', + '🤫', + '🤥', + '😶', + '😐', + '😑', + '😬', + '🙄', + '😯', + '😦', + '😧', + '😮', + '😲', + '🥱', + '😴', + '🤤', + '😪', + '😵', + '🤐', + '🥴', + '🤢', + '🤮', + '🤧', + '😷', + '🤒', + '🤕', + '🤑', + '🤠', + '😈', + '👿', + '👹', + '👺', + '🤡', + '💩', + '👻', + '💀', + '☠️', + '👽', + '👾', + '🤖', + '🎃', + '😺', + '😸', + '😹', + '😻', + '😼', + '😽', + '🙀', + '😿', + '😾', +]; + +export const GESTURES = [ + '👋', + '🤚', + '🖐', + '✋', + '🖖', + '👌', + '🤌', + '🤏', + '✌️', + '🤞', + '🤟', + '🤘', + '🤙', + '👈', + '👉', + '👆', + '🖕', + '👇', + '☝️', + '👍', + '👎', + '✊', + '👊', + '🤛', + '🤜', + '👏', + '🙌', + '👐', + '🤲', + '🤝', + '🙏', + '✍️', + '💅', + '🤳', + '💪', + '🦾', + '🦵', + '🦿', + '🦶', + '👣', + '👂', + '🦻', + '👃', + '🫀', + '🫁', + '🧠', + '🦷', + '🦴', + '👀', + '👁', + '👅', + '👄', + '💋', + '🩸', +]; + +export const SYMBOLS = [ + '✅', + '❎', + '✳️', + '♻️', + '❇️', + '✴️', + '❓', + '❗', + '❌', + '⭕', + '❔', + '❕', + '☑️', + '#️⃣', + '*️⃣', + '0️⃣', + '1️⃣', + '2️⃣', + '3️⃣', + '4️⃣', + '5️⃣', + '6️⃣', + '7️⃣', + '8️⃣', + '9️⃣', + '🔟', + '🆗', + '🔠', + '🔡', + '🔢', + '🔣', + '🔤', + '🆕', + '🆖', + '🆒', + '🆓', + 'ℹ️', + '🆎', + '🆑', + '🆘', + '🆙', + '🆚', + '🈁', + '⛔', + '🚫', + '🚳', + '🚭', + '🚯', + '🚱', + '🚷', + '📵', + '🔞', + '☢️', + '☣️', + '↩️', + '↪️', + '⤴️', + '⤵️', + '🔃', + '🔄', + '♈', + '♉', + '♊', + '♋', + '♌', + '♍', + '♎', + '♏', + '♐', + '♑', + '♒', + '♓', + '⛎', + '🛐', + '⚛️', + '🕉️', + '🕉', + '✡️', + '☸️', + '☯️', + '✝️', + '☦️', + '☪️', + '☮️', + '🕎', + '🔯', + '🔀', + '🔁', + '🔂', + '⏩', + '⏭️', + '⏭', + '⏯️', + '⏯', + '⏪', + '⏮️', + '⏮', + '🔼', + '⏫', + '🔽', + '⏬', + '⏸️', + '⏸', + '⏹️', + '⏹', + '⏺️', + '⏺', + '⏏️', + '🎦', + '📶', + '📳', + '📴', + '🏧', + '🚮', + '♿', + '🚹', + '🚺', + '🚻', + '🚼', + '🚾', + '🛂', + '🛃', + '🛄', + '🛅', + '🚸', +]; + +export const OBJECTS = [ + '🔒', + '🔓', + '🔏', + '🔐', + '🔑', + '💼', + '📁', + '📂', + '🗂️', + '🗂', + '📅', + '📆', + '🗒️', + '🗒', + '🗓️', + '🗓', + '📇', + '📈', + '📉', + '📊', + '📋', + '📌', + '📍', + '✏️', + '✏', + '✒️', + '✒', + '🖋️', + '🖋', + '🖊️', + '🖊', + '🖌️', + '🖌', + '🖍️', + '🖍', + '📝', + '✉️', + '📧', + '📨', + '📩', + '📤', + '📥', + '📦', + '📫', + '📪', + '📬', + '📭', + '📮', + '🗳️', + '🗳', + '💰', + '🪙', + '💴', + '💵', + '💶', + '💷', + '💸', + '💳', + '🧾', + '💹', + '📔', + '📕', + '📖', + '📗', + '📘', + '📙', + '📚', + '📓', + '📒', + '📃', + '📜', + '📄', + '📰', + '🗞️', + '🗞', + '📑', + '🔖', + '🏷️', + '🏷', + '👓', + '🕶️', + '🕶', + '🥽', + '🥼', + '🦺', + '👔', + '👕', + '👖', + '🧣', + '🧤', + '🧥', + '🧦', + '👗', + '👘', + '🥻', + '🩱', + '🩲', + '🩳', + '👙', + '👚', + '👛', + '👜', + '👝', + '🛍️', + '🛍', + '🎒', + '🩴', + '👞', + '👟', + '🥾', + '🥿', + '👠', + '👡', + '🩰', + '👢', + '👑', + '👒', + '🎩', + '🎓', + '🧢', + '🪖', + '⛑️', + '⛑', + '📿', + '💄', + '💍', + '💎', +]; + +export const ACTIVITIES = [ + '⚽', + '⚾', + '🥎', + '🏀', + '🏐', + '🏈', + '🏉', + '🎾', + '🥏', + '🎳', + '🏏', + '🏑', + '🏒', + '🥍', + '🏓', + '🏸', + '🥊', + '🥋', + '🥅', + '⛳', + '⛸️', + '⛸', + '🎣', + '🤿', + '🎽', + '🎿', + '🛷', + '🥌', + '🎯', + '🪀', + '🪁', + '🎱', + '🔮', + '🪄', + '🧿', + '🎮', + '🕹️', + '🕹', + '🎰', + '🎲', + '🧩', + '🧸', + '🪅', + '🪆', + '♠️', + '♠', + '♥️', + '♥', + '♦️', + '♦', + '♣️', + '♣', + '🃏', + '🀄', + '🎴', + '🎖️', + '🎖', + '🏆', + '🏅', + '🥇', + '🥈', + '🥉', +]; + +export const SKY_WEATHER = [ + '🌑', + '🌒', + '🌓', + '🌔', + '🌕', + '🌖', + '🌗', + '🌘', + '🌙', + '🌚', + '🌛', + '🌜', + '🌡️', + '🌡', + '☀️', + '☀', + '🌝', + '🌞', + '🪐', + '⭐', + '🌟', + '🌠', + '🌌', + '☁️', + '☁', + '⛅', + '⛈️', + '⛈', + '🌤️', + '🌤', + '🌥️', + '🌥', + '🌦️', + '🌦', + '🌧️', + '🌧', + '🌨️', + '🌨', + '🌩️', + '🌩', + '🌪️', + '🌪', + '🌫️', + '🌫', + '🌬️', + '🌬', + '🌀', + '🌈', + '🌂', + '☂️', + '☂', + '☔', + '⛱️', + '⛱', + '⚡', + '❄️', + '❄', + '☃️', + '☃', + '⛄', + '☄️', + '☄', + '🔥', + '💧', + '🌊', +]; diff --git a/packages/client/src/components/emoji-picker/emoji.json b/packages/client/src/components/emoji-picker/emoji.json new file mode 100644 index 0000000..7b9747c --- /dev/null +++ b/packages/client/src/components/emoji-picker/emoji.json @@ -0,0 +1,4792 @@ +{ + "Smileys & Emotion (face-smiling)": [ + "😀", + "😃", + "😄", + "😁", + "😆", + "😅", + "🤣", + "😂", + "🙂", + "🙃", + "😉", + "😊", + "😇" + ], + "Smileys & Emotion (face-affection)": [ + "🥰", + "😍", + "🤩", + "😘", + "😗", + "☺️", + "☺", + "😚", + "😙", + "🥲" + ], + "Smileys & Emotion (face-tongue)": [ + "😋", + "😛", + "😜", + "🤪", + "😝", + "🤑" + ], + "Smileys & Emotion (face-hand)": [ + "🤗", + "🤭", + "🤫", + "🤔" + ], + "Smileys & Emotion (face-neutral-skeptical)": [ + "🤐", + "🤨", + "😐", + "😑", + "😶", + "😶‍🌫️", + "😶‍🌫", + "😏", + "😒", + "🙄", + "😬", + "😮‍💨", + "🤥" + ], + "Smileys & Emotion (face-sleepy)": [ + "😌", + "😔", + "😪", + "🤤", + "😴" + ], + "Smileys & Emotion (face-unwell)": [ + "😷", + "🤒", + "🤕", + "🤢", + "🤮", + "🤧", + "🥵", + "🥶", + "🥴", + "😵", + "😵‍💫", + "🤯" + ], + "Smileys & Emotion (face-hat)": [ + "🤠", + "🥳", + "🥸" + ], + "Smileys & Emotion (face-glasses)": [ + "😎", + "🤓", + "🧐" + ], + "Smileys & Emotion (face-concerned)": [ + "😕", + "😟", + "🙁", + "☹️", + "☹", + "😮", + "😯", + "😲", + "😳", + "🥺", + "😦", + "😧", + "😨", + "😰", + "😥", + "😢", + "😭", + "😱", + "😖", + "😣", + "😞", + "😓", + "😩", + "😫", + "🥱" + ], + "Smileys & Emotion (face-negative)": [ + "😤", + "😡", + "😠", + "🤬", + "😈", + "👿", + "💀", + "☠️", + "☠" + ], + "Smileys & Emotion (face-costume)": [ + "💩", + "🤡", + "👹", + "👺", + "👻", + "👽", + "👾", + "🤖" + ], + "Smileys & Emotion (cat-face)": [ + "😺", + "😸", + "😹", + "😻", + "😼", + "😽", + "🙀", + "😿", + "😾" + ], + "Smileys & Emotion (monkey-face)": [ + "🙈", + "🙉", + "🙊" + ], + "Smileys & Emotion (emotion)": [ + "💋", + "💌", + "💘", + "💝", + "💖", + "💗", + "💓", + "💞", + "💕", + "💟", + "❣️", + "❣", + "💔", + "❤️‍🔥", + "❤‍🔥", + "❤️‍🩹", + "❤‍🩹", + "❤️", + "❤", + "🧡", + "💛", + "💚", + "💙", + "💜", + "🤎", + "🖤", + "🤍", + "💯", + "💢", + "💥", + "💫", + "💦", + "💨", + "🕳️", + "🕳", + "💣", + "💬", + "👁️‍🗨️", + "👁‍🗨️", + "👁️‍🗨", + "👁‍🗨", + "🗨️", + "🗨", + "🗯️", + "🗯", + "💭", + "💤" + ], + "People & Body (hand-fingers-open)": [ + "👋", + "👋🏻", + "👋🏼", + "👋🏽", + "👋🏾", + "👋🏿", + "🤚", + "🤚🏻", + "🤚🏼", + "🤚🏽", + "🤚🏾", + "🤚🏿", + "🖐️", + "🖐", + "🖐🏻", + "🖐🏼", + "🖐🏽", + "🖐🏾", + "🖐🏿", + "✋", + "✋🏻", + "✋🏼", + "✋🏽", + "✋🏾", + "✋🏿", + "🖖", + "🖖🏻", + "🖖🏼", + "🖖🏽", + "🖖🏾", + "🖖🏿" + ], + "People & Body (hand-fingers-partial)": [ + "👌", + "👌🏻", + "👌🏼", + "👌🏽", + "👌🏾", + "👌🏿", + "🤌", + "🤌🏻", + "🤌🏼", + "🤌🏽", + "🤌🏾", + "🤌🏿", + "🤏", + "🤏🏻", + "🤏🏼", + "🤏🏽", + "🤏🏾", + "🤏🏿", + "✌️", + "✌", + "✌🏻", + "✌🏼", + "✌🏽", + "✌🏾", + "✌🏿", + "🤞", + "🤞🏻", + "🤞🏼", + "🤞🏽", + "🤞🏾", + "🤞🏿", + "🤟", + "🤟🏻", + "🤟🏼", + "🤟🏽", + "🤟🏾", + "🤟🏿", + "🤘", + "🤘🏻", + "🤘🏼", + "🤘🏽", + "🤘🏾", + "🤘🏿", + "🤙", + "🤙🏻", + "🤙🏼", + "🤙🏽", + "🤙🏾", + "🤙🏿" + ], + "People & Body (hand-single-finger)": [ + "👈", + "👈🏻", + "👈🏼", + "👈🏽", + "👈🏾", + "👈🏿", + "👉", + "👉🏻", + "👉🏼", + "👉🏽", + "👉🏾", + "👉🏿", + "👆", + "👆🏻", + "👆🏼", + "👆🏽", + "👆🏾", + "👆🏿", + "🖕", + "🖕🏻", + "🖕🏼", + "🖕🏽", + "🖕🏾", + "🖕🏿", + "👇", + "👇🏻", + "👇🏼", + "👇🏽", + "👇🏾", + "👇🏿", + "☝️", + "☝", + "☝🏻", + "☝🏼", + "☝🏽", + "☝🏾", + "☝🏿" + ], + "People & Body (hand-fingers-closed)": [ + "👍", + "👍🏻", + "👍🏼", + "👍🏽", + "👍🏾", + "👍🏿", + "👎", + "👎🏻", + "👎🏼", + "👎🏽", + "👎🏾", + "👎🏿", + "✊", + "✊🏻", + "✊🏼", + "✊🏽", + "✊🏾", + "✊🏿", + "👊", + "👊🏻", + "👊🏼", + "👊🏽", + "👊🏾", + "👊🏿", + "🤛", + "🤛🏻", + "🤛🏼", + "🤛🏽", + "🤛🏾", + "🤛🏿", + "🤜", + "🤜🏻", + "🤜🏼", + "🤜🏽", + "🤜🏾", + "🤜🏿" + ], + "People & Body (hands)": [ + "👏", + "👏🏻", + "👏🏼", + "👏🏽", + "👏🏾", + "👏🏿", + "🙌", + "🙌🏻", + "🙌🏼", + "🙌🏽", + "🙌🏾", + "🙌🏿", + "👐", + "👐🏻", + "👐🏼", + "👐🏽", + "👐🏾", + "👐🏿", + "🤲", + "🤲🏻", + "🤲🏼", + "🤲🏽", + "🤲🏾", + "🤲🏿", + "🤝", + "🙏", + "🙏🏻", + "🙏🏼", + "🙏🏽", + "🙏🏾", + "🙏🏿" + ], + "People & Body (hand-prop)": [ + "✍️", + "✍", + "✍🏻", + "✍🏼", + "✍🏽", + "✍🏾", + "✍🏿", + "💅", + "💅🏻", + "💅🏼", + "💅🏽", + "💅🏾", + "💅🏿", + "🤳", + "🤳🏻", + "🤳🏼", + "🤳🏽", + "🤳🏾", + "🤳🏿" + ], + "People & Body (body-parts)": [ + "💪", + "💪🏻", + "💪🏼", + "💪🏽", + "💪🏾", + "💪🏿", + "🦾", + "🦿", + "🦵", + "🦵🏻", + "🦵🏼", + "🦵🏽", + "🦵🏾", + "🦵🏿", + "🦶", + "🦶🏻", + "🦶🏼", + "🦶🏽", + "🦶🏾", + "🦶🏿", + "👂", + "👂🏻", + "👂🏼", + "👂🏽", + "👂🏾", + "👂🏿", + "🦻", + "🦻🏻", + "🦻🏼", + "🦻🏽", + "🦻🏾", + "🦻🏿", + "👃", + "👃🏻", + "👃🏼", + "👃🏽", + "👃🏾", + "👃🏿", + "🧠", + "🫀", + "🫁", + "🦷", + "🦴", + "👀", + "👁️", + "👁", + "👅", + "👄" + ], + "People & Body (person)": [ + "👶", + "👶🏻", + "👶🏼", + "👶🏽", + "👶🏾", + "👶🏿", + "🧒", + "🧒🏻", + "🧒🏼", + "🧒🏽", + "🧒🏾", + "🧒🏿", + "👦", + "👦🏻", + "👦🏼", + "👦🏽", + "👦🏾", + "👦🏿", + "👧", + "👧🏻", + "👧🏼", + "👧🏽", + "👧🏾", + "👧🏿", + "🧑", + "🧑🏻", + "🧑🏼", + "🧑🏽", + "🧑🏾", + "🧑🏿", + "👱", + "👱🏻", + "👱🏼", + "👱🏽", + "👱🏾", + "👱🏿", + "👨", + "👨🏻", + "👨🏼", + "👨🏽", + "👨🏾", + "👨🏿", + "🧔", + "🧔🏻", + "🧔🏼", + "🧔🏽", + "🧔🏾", + "🧔🏿", + "🧔‍♂️", + "🧔‍♂", + "🧔🏻‍♂️", + "🧔🏻‍♂", + "🧔🏼‍♂️", + "🧔🏼‍♂", + "🧔🏽‍♂️", + "🧔🏽‍♂", + "🧔🏾‍♂️", + "🧔🏾‍♂", + "🧔🏿‍♂️", + "🧔🏿‍♂", + "🧔‍♀️", + "🧔‍♀", + "🧔🏻‍♀️", + "🧔🏻‍♀", + "🧔🏼‍♀️", + "🧔🏼‍♀", + "🧔🏽‍♀️", + "🧔🏽‍♀", + "🧔🏾‍♀️", + "🧔🏾‍♀", + "🧔🏿‍♀️", + "🧔🏿‍♀", + "👨‍🦰", + "👨🏻‍🦰", + "👨🏼‍🦰", + "👨🏽‍🦰", + "👨🏾‍🦰", + "👨🏿‍🦰", + "👨‍🦱", + "👨🏻‍🦱", + "👨🏼‍🦱", + "👨🏽‍🦱", + "👨🏾‍🦱", + "👨🏿‍🦱", + "👨‍🦳", + "👨🏻‍🦳", + "👨🏼‍🦳", + "👨🏽‍🦳", + "👨🏾‍🦳", + "👨🏿‍🦳", + "👨‍🦲", + "👨🏻‍🦲", + "👨🏼‍🦲", + "👨🏽‍🦲", + "👨🏾‍🦲", + "👨🏿‍🦲", + "👩", + "👩🏻", + "👩🏼", + "👩🏽", + "👩🏾", + "👩🏿", + "👩‍🦰", + "👩🏻‍🦰", + "👩🏼‍🦰", + "👩🏽‍🦰", + "👩🏾‍🦰", + "👩🏿‍🦰", + "🧑‍🦰", + "🧑🏻‍🦰", + "🧑🏼‍🦰", + "🧑🏽‍🦰", + "🧑🏾‍🦰", + "🧑🏿‍🦰", + "👩‍🦱", + "👩🏻‍🦱", + "👩🏼‍🦱", + "👩🏽‍🦱", + "👩🏾‍🦱", + "👩🏿‍🦱", + "🧑‍🦱", + "🧑🏻‍🦱", + "🧑🏼‍🦱", + "🧑🏽‍🦱", + "🧑🏾‍🦱", + "🧑🏿‍🦱", + "👩‍🦳", + "👩🏻‍🦳", + "👩🏼‍🦳", + "👩🏽‍🦳", + "👩🏾‍🦳", + "👩🏿‍🦳", + "🧑‍🦳", + "🧑🏻‍🦳", + "🧑🏼‍🦳", + "🧑🏽‍🦳", + "🧑🏾‍🦳", + "🧑🏿‍🦳", + "👩‍🦲", + "👩🏻‍🦲", + "👩🏼‍🦲", + "👩🏽‍🦲", + "👩🏾‍🦲", + "👩🏿‍🦲", + "🧑‍🦲", + "🧑🏻‍🦲", + "🧑🏼‍🦲", + "🧑🏽‍🦲", + "🧑🏾‍🦲", + "🧑🏿‍🦲", + "👱‍♀️", + "👱‍♀", + "👱🏻‍♀️", + "👱🏻‍♀", + "👱🏼‍♀️", + "👱🏼‍♀", + "👱🏽‍♀️", + "👱🏽‍♀", + "👱🏾‍♀️", + "👱🏾‍♀", + "👱🏿‍♀️", + "👱🏿‍♀", + "👱‍♂️", + "👱‍♂", + "👱🏻‍♂️", + "👱🏻‍♂", + "👱🏼‍♂️", + "👱🏼‍♂", + "👱🏽‍♂️", + "👱🏽‍♂", + "👱🏾‍♂️", + "👱🏾‍♂", + "👱🏿‍♂️", + "👱🏿‍♂", + "🧓", + "🧓🏻", + "🧓🏼", + "🧓🏽", + "🧓🏾", + "🧓🏿", + "👴", + "👴🏻", + "👴🏼", + "👴🏽", + "👴🏾", + "👴🏿", + "👵", + "👵🏻", + "👵🏼", + "👵🏽", + "👵🏾", + "👵🏿" + ], + "People & Body (person-gesture)": [ + "🙍", + "🙍🏻", + "🙍🏼", + "🙍🏽", + "🙍🏾", + "🙍🏿", + "🙍‍♂️", + "🙍‍♂", + "🙍🏻‍♂️", + "🙍🏻‍♂", + "🙍🏼‍♂️", + "🙍🏼‍♂", + "🙍🏽‍♂️", + "🙍🏽‍♂", + "🙍🏾‍♂️", + "🙍🏾‍♂", + "🙍🏿‍♂️", + "🙍🏿‍♂", + "🙍‍♀️", + "🙍‍♀", + "🙍🏻‍♀️", + "🙍🏻‍♀", + "🙍🏼‍♀️", + "🙍🏼‍♀", + "🙍🏽‍♀️", + "🙍🏽‍♀", + "🙍🏾‍♀️", + "🙍🏾‍♀", + "🙍🏿‍♀️", + "🙍🏿‍♀", + "🙎", + "🙎🏻", + "🙎🏼", + "🙎🏽", + "🙎🏾", + "🙎🏿", + "🙎‍♂️", + "🙎‍♂", + "🙎🏻‍♂️", + "🙎🏻‍♂", + "🙎🏼‍♂️", + "🙎🏼‍♂", + "🙎🏽‍♂️", + "🙎🏽‍♂", + "🙎🏾‍♂️", + "🙎🏾‍♂", + "🙎🏿‍♂️", + "🙎🏿‍♂", + "🙎‍♀️", + "🙎‍♀", + "🙎🏻‍♀️", + "🙎🏻‍♀", + "🙎🏼‍♀️", + "🙎🏼‍♀", + "🙎🏽‍♀️", + "🙎🏽‍♀", + "🙎🏾‍♀️", + "🙎🏾‍♀", + "🙎🏿‍♀️", + "🙎🏿‍♀", + "🙅", + "🙅🏻", + "🙅🏼", + "🙅🏽", + "🙅🏾", + "🙅🏿", + "🙅‍♂️", + "🙅‍♂", + "🙅🏻‍♂️", + "🙅🏻‍♂", + "🙅🏼‍♂️", + "🙅🏼‍♂", + "🙅🏽‍♂️", + "🙅🏽‍♂", + "🙅🏾‍♂️", + "🙅🏾‍♂", + "🙅🏿‍♂️", + "🙅🏿‍♂", + "🙅‍♀️", + "🙅‍♀", + "🙅🏻‍♀️", + "🙅🏻‍♀", + "🙅🏼‍♀️", + "🙅🏼‍♀", + "🙅🏽‍♀️", + "🙅🏽‍♀", + "🙅🏾‍♀️", + "🙅🏾‍♀", + "🙅🏿‍♀️", + "🙅🏿‍♀", + "🙆", + "🙆🏻", + "🙆🏼", + "🙆🏽", + "🙆🏾", + "🙆🏿", + "🙆‍♂️", + "🙆‍♂", + "🙆🏻‍♂️", + "🙆🏻‍♂", + "🙆🏼‍♂️", + "🙆🏼‍♂", + "🙆🏽‍♂️", + "🙆🏽‍♂", + "🙆🏾‍♂️", + "🙆🏾‍♂", + "🙆🏿‍♂️", + "🙆🏿‍♂", + "🙆‍♀️", + "🙆‍♀", + "🙆🏻‍♀️", + "🙆🏻‍♀", + "🙆🏼‍♀️", + "🙆🏼‍♀", + "🙆🏽‍♀️", + "🙆🏽‍♀", + "🙆🏾‍♀️", + "🙆🏾‍♀", + "🙆🏿‍♀️", + "🙆🏿‍♀", + "💁", + "💁🏻", + "💁🏼", + "💁🏽", + "💁🏾", + "💁🏿", + "💁‍♂️", + "💁‍♂", + "💁🏻‍♂️", + "💁🏻‍♂", + "💁🏼‍♂️", + "💁🏼‍♂", + "💁🏽‍♂️", + "💁🏽‍♂", + "💁🏾‍♂️", + "💁🏾‍♂", + "💁🏿‍♂️", + "💁🏿‍♂", + "💁‍♀️", + "💁‍♀", + "💁🏻‍♀️", + "💁🏻‍♀", + "💁🏼‍♀️", + "💁🏼‍♀", + "💁🏽‍♀️", + "💁🏽‍♀", + "💁🏾‍♀️", + "💁🏾‍♀", + "💁🏿‍♀️", + "💁🏿‍♀", + "🙋", + "🙋🏻", + "🙋🏼", + "🙋🏽", + "🙋🏾", + "🙋🏿", + "🙋‍♂️", + "🙋‍♂", + "🙋🏻‍♂️", + "🙋🏻‍♂", + "🙋🏼‍♂️", + "🙋🏼‍♂", + "🙋🏽‍♂️", + "🙋🏽‍♂", + "🙋🏾‍♂️", + "🙋🏾‍♂", + "🙋🏿‍♂️", + "🙋🏿‍♂", + "🙋‍♀️", + "🙋‍♀", + "🙋🏻‍♀️", + "🙋🏻‍♀", + "🙋🏼‍♀️", + "🙋🏼‍♀", + "🙋🏽‍♀️", + "🙋🏽‍♀", + "🙋🏾‍♀️", + "🙋🏾‍♀", + "🙋🏿‍♀️", + "🙋🏿‍♀", + "🧏", + "🧏🏻", + "🧏🏼", + "🧏🏽", + "🧏🏾", + "🧏🏿", + "🧏‍♂️", + "🧏‍♂", + "🧏🏻‍♂️", + "🧏🏻‍♂", + "🧏🏼‍♂️", + "🧏🏼‍♂", + "🧏🏽‍♂️", + "🧏🏽‍♂", + "🧏🏾‍♂️", + "🧏🏾‍♂", + "🧏🏿‍♂️", + "🧏🏿‍♂", + "🧏‍♀️", + "🧏‍♀", + "🧏🏻‍♀️", + "🧏🏻‍♀", + "🧏🏼‍♀️", + "🧏🏼‍♀", + "🧏🏽‍♀️", + "🧏🏽‍♀", + "🧏🏾‍♀️", + "🧏🏾‍♀", + "🧏🏿‍♀️", + "🧏🏿‍♀", + "🙇", + "🙇🏻", + "🙇🏼", + "🙇🏽", + "🙇🏾", + "🙇🏿", + "🙇‍♂️", + "🙇‍♂", + "🙇🏻‍♂️", + "🙇🏻‍♂", + "🙇🏼‍♂️", + "🙇🏼‍♂", + "🙇🏽‍♂️", + "🙇🏽‍♂", + "🙇🏾‍♂️", + "🙇🏾‍♂", + "🙇🏿‍♂️", + "🙇🏿‍♂", + "🙇‍♀️", + "🙇‍♀", + "🙇🏻‍♀️", + "🙇🏻‍♀", + "🙇🏼‍♀️", + "🙇🏼‍♀", + "🙇🏽‍♀️", + "🙇🏽‍♀", + "🙇🏾‍♀️", + "🙇🏾‍♀", + "🙇🏿‍♀️", + "🙇🏿‍♀", + "🤦", + "🤦🏻", + "🤦🏼", + "🤦🏽", + "🤦🏾", + "🤦🏿", + "🤦‍♂️", + "🤦‍♂", + "🤦🏻‍♂️", + "🤦🏻‍♂", + "🤦🏼‍♂️", + "🤦🏼‍♂", + "🤦🏽‍♂️", + "🤦🏽‍♂", + "🤦🏾‍♂️", + "🤦🏾‍♂", + "🤦🏿‍♂️", + "🤦🏿‍♂", + "🤦‍♀️", + "🤦‍♀", + "🤦🏻‍♀️", + "🤦🏻‍♀", + "🤦🏼‍♀️", + "🤦🏼‍♀", + "🤦🏽‍♀️", + "🤦🏽‍♀", + "🤦🏾‍♀️", + "🤦🏾‍♀", + "🤦🏿‍♀️", + "🤦🏿‍♀", + "🤷", + "🤷🏻", + "🤷🏼", + "🤷🏽", + "🤷🏾", + "🤷🏿", + "🤷‍♂️", + "🤷‍♂", + "🤷🏻‍♂️", + "🤷🏻‍♂", + "🤷🏼‍♂️", + "🤷🏼‍♂", + "🤷🏽‍♂️", + "🤷🏽‍♂", + "🤷🏾‍♂️", + "🤷🏾‍♂", + "🤷🏿‍♂️", + "🤷🏿‍♂", + "🤷‍♀️", + "🤷‍♀", + "🤷🏻‍♀️", + "🤷🏻‍♀", + "🤷🏼‍♀️", + "🤷🏼‍♀", + "🤷🏽‍♀️", + "🤷🏽‍♀", + "🤷🏾‍♀️", + "🤷🏾‍♀", + "🤷🏿‍♀️", + "🤷🏿‍♀" + ], + "People & Body (person-role)": [ + "🧑‍⚕️", + "🧑‍⚕", + "🧑🏻‍⚕️", + "🧑🏻‍⚕", + "🧑🏼‍⚕️", + "🧑🏼‍⚕", + "🧑🏽‍⚕️", + "🧑🏽‍⚕", + "🧑🏾‍⚕️", + "🧑🏾‍⚕", + "🧑🏿‍⚕️", + "🧑🏿‍⚕", + "👨‍⚕️", + "👨‍⚕", + "👨🏻‍⚕️", + "👨🏻‍⚕", + "👨🏼‍⚕️", + "👨🏼‍⚕", + "👨🏽‍⚕️", + "👨🏽‍⚕", + "👨🏾‍⚕️", + "👨🏾‍⚕", + "👨🏿‍⚕️", + "👨🏿‍⚕", + "👩‍⚕️", + "👩‍⚕", + "👩🏻‍⚕️", + "👩🏻‍⚕", + "👩🏼‍⚕️", + "👩🏼‍⚕", + "👩🏽‍⚕️", + "👩🏽‍⚕", + "👩🏾‍⚕️", + "👩🏾‍⚕", + "👩🏿‍⚕️", + "👩🏿‍⚕", + "🧑‍🎓", + "🧑🏻‍🎓", + "🧑🏼‍🎓", + "🧑🏽‍🎓", + "🧑🏾‍🎓", + "🧑🏿‍🎓", + "👨‍🎓", + "👨🏻‍🎓", + "👨🏼‍🎓", + "👨🏽‍🎓", + "👨🏾‍🎓", + "👨🏿‍🎓", + "👩‍🎓", + "👩🏻‍🎓", + "👩🏼‍🎓", + "👩🏽‍🎓", + "👩🏾‍🎓", + "👩🏿‍🎓", + "🧑‍🏫", + "🧑🏻‍🏫", + "🧑🏼‍🏫", + "🧑🏽‍🏫", + "🧑🏾‍🏫", + "🧑🏿‍🏫", + "👨‍🏫", + "👨🏻‍🏫", + "👨🏼‍🏫", + "👨🏽‍🏫", + "👨🏾‍🏫", + "👨🏿‍🏫", + "👩‍🏫", + "👩🏻‍🏫", + "👩🏼‍🏫", + "👩🏽‍🏫", + "👩🏾‍🏫", + "👩🏿‍🏫", + "🧑‍⚖️", + "🧑‍⚖", + "🧑🏻‍⚖️", + "🧑🏻‍⚖", + "🧑🏼‍⚖️", + "🧑🏼‍⚖", + "🧑🏽‍⚖️", + "🧑🏽‍⚖", + "🧑🏾‍⚖️", + "🧑🏾‍⚖", + "🧑🏿‍⚖️", + "🧑🏿‍⚖", + "👨‍⚖️", + "👨‍⚖", + "👨🏻‍⚖️", + "👨🏻‍⚖", + "👨🏼‍⚖️", + "👨🏼‍⚖", + "👨🏽‍⚖️", + "👨🏽‍⚖", + "👨🏾‍⚖️", + "👨🏾‍⚖", + "👨🏿‍⚖️", + "👨🏿‍⚖", + "👩‍⚖️", + "👩‍⚖", + "👩🏻‍⚖️", + "👩🏻‍⚖", + "👩🏼‍⚖️", + "👩🏼‍⚖", + "👩🏽‍⚖️", + "👩🏽‍⚖", + "👩🏾‍⚖️", + "👩🏾‍⚖", + "👩🏿‍⚖️", + "👩🏿‍⚖", + "🧑‍🌾", + "🧑🏻‍🌾", + "🧑🏼‍🌾", + "🧑🏽‍🌾", + "🧑🏾‍🌾", + "🧑🏿‍🌾", + "👨‍🌾", + "👨🏻‍🌾", + "👨🏼‍🌾", + "👨🏽‍🌾", + "👨🏾‍🌾", + "👨🏿‍🌾", + "👩‍🌾", + "👩🏻‍🌾", + "👩🏼‍🌾", + "👩🏽‍🌾", + "👩🏾‍🌾", + "👩🏿‍🌾", + "🧑‍🍳", + "🧑🏻‍🍳", + "🧑🏼‍🍳", + "🧑🏽‍🍳", + "🧑🏾‍🍳", + "🧑🏿‍🍳", + "👨‍🍳", + "👨🏻‍🍳", + "👨🏼‍🍳", + "👨🏽‍🍳", + "👨🏾‍🍳", + "👨🏿‍🍳", + "👩‍🍳", + "👩🏻‍🍳", + "👩🏼‍🍳", + "👩🏽‍🍳", + "👩🏾‍🍳", + "👩🏿‍🍳", + "🧑‍🔧", + "🧑🏻‍🔧", + "🧑🏼‍🔧", + "🧑🏽‍🔧", + "🧑🏾‍🔧", + "🧑🏿‍🔧", + "👨‍🔧", + "👨🏻‍🔧", + "👨🏼‍🔧", + "👨🏽‍🔧", + "👨🏾‍🔧", + "👨🏿‍🔧", + "👩‍🔧", + "👩🏻‍🔧", + "👩🏼‍🔧", + "👩🏽‍🔧", + "👩🏾‍🔧", + "👩🏿‍🔧", + "🧑‍🏭", + "🧑🏻‍🏭", + "🧑🏼‍🏭", + "🧑🏽‍🏭", + "🧑🏾‍🏭", + "🧑🏿‍🏭", + "👨‍🏭", + "👨🏻‍🏭", + "👨🏼‍🏭", + "👨🏽‍🏭", + "👨🏾‍🏭", + "👨🏿‍🏭", + "👩‍🏭", + "👩🏻‍🏭", + "👩🏼‍🏭", + "👩🏽‍🏭", + "👩🏾‍🏭", + "👩🏿‍🏭", + "🧑‍💼", + "🧑🏻‍💼", + "🧑🏼‍💼", + "🧑🏽‍💼", + "🧑🏾‍💼", + "🧑🏿‍💼", + "👨‍💼", + "👨🏻‍💼", + "👨🏼‍💼", + "👨🏽‍💼", + "👨🏾‍💼", + "👨🏿‍💼", + "👩‍💼", + "👩🏻‍💼", + "👩🏼‍💼", + "👩🏽‍💼", + "👩🏾‍💼", + "👩🏿‍💼", + "🧑‍🔬", + "🧑🏻‍🔬", + "🧑🏼‍🔬", + "🧑🏽‍🔬", + "🧑🏾‍🔬", + "🧑🏿‍🔬", + "👨‍🔬", + "👨🏻‍🔬", + "👨🏼‍🔬", + "👨🏽‍🔬", + "👨🏾‍🔬", + "👨🏿‍🔬", + "👩‍🔬", + "👩🏻‍🔬", + "👩🏼‍🔬", + "👩🏽‍🔬", + "👩🏾‍🔬", + "👩🏿‍🔬", + "🧑‍💻", + "🧑🏻‍💻", + "🧑🏼‍💻", + "🧑🏽‍💻", + "🧑🏾‍💻", + "🧑🏿‍💻", + "👨‍💻", + "👨🏻‍💻", + "👨🏼‍💻", + "👨🏽‍💻", + "👨🏾‍💻", + "👨🏿‍💻", + "👩‍💻", + "👩🏻‍💻", + "👩🏼‍💻", + "👩🏽‍💻", + "👩🏾‍💻", + "👩🏿‍💻", + "🧑‍🎤", + "🧑🏻‍🎤", + "🧑🏼‍🎤", + "🧑🏽‍🎤", + "🧑🏾‍🎤", + "🧑🏿‍🎤", + "👨‍🎤", + "👨🏻‍🎤", + "👨🏼‍🎤", + "👨🏽‍🎤", + "👨🏾‍🎤", + "👨🏿‍🎤", + "👩‍🎤", + "👩🏻‍🎤", + "👩🏼‍🎤", + "👩🏽‍🎤", + "👩🏾‍🎤", + "👩🏿‍🎤", + "🧑‍🎨", + "🧑🏻‍🎨", + "🧑🏼‍🎨", + "🧑🏽‍🎨", + "🧑🏾‍🎨", + "🧑🏿‍🎨", + "👨‍🎨", + "👨🏻‍🎨", + "👨🏼‍🎨", + "👨🏽‍🎨", + "👨🏾‍🎨", + "👨🏿‍🎨", + "👩‍🎨", + "👩🏻‍🎨", + "👩🏼‍🎨", + "👩🏽‍🎨", + "👩🏾‍🎨", + "👩🏿‍🎨", + "🧑‍✈️", + "🧑‍✈", + "🧑🏻‍✈️", + "🧑🏻‍✈", + "🧑🏼‍✈️", + "🧑🏼‍✈", + "🧑🏽‍✈️", + "🧑🏽‍✈", + "🧑🏾‍✈️", + "🧑🏾‍✈", + "🧑🏿‍✈️", + "🧑🏿‍✈", + "👨‍✈️", + "👨‍✈", + "👨🏻‍✈️", + "👨🏻‍✈", + "👨🏼‍✈️", + "👨🏼‍✈", + "👨🏽‍✈️", + "👨🏽‍✈", + "👨🏾‍✈️", + "👨🏾‍✈", + "👨🏿‍✈️", + "👨🏿‍✈", + "👩‍✈️", + "👩‍✈", + "👩🏻‍✈️", + "👩🏻‍✈", + "👩🏼‍✈️", + "👩🏼‍✈", + "👩🏽‍✈️", + "👩🏽‍✈", + "👩🏾‍✈️", + "👩🏾‍✈", + "👩🏿‍✈️", + "👩🏿‍✈", + "🧑‍🚀", + "🧑🏻‍🚀", + "🧑🏼‍🚀", + "🧑🏽‍🚀", + "🧑🏾‍🚀", + "🧑🏿‍🚀", + "👨‍🚀", + "👨🏻‍🚀", + "👨🏼‍🚀", + "👨🏽‍🚀", + "👨🏾‍🚀", + "👨🏿‍🚀", + "👩‍🚀", + "👩🏻‍🚀", + "👩🏼‍🚀", + "👩🏽‍🚀", + "👩🏾‍🚀", + "👩🏿‍🚀", + "🧑‍🚒", + "🧑🏻‍🚒", + "🧑🏼‍🚒", + "🧑🏽‍🚒", + "🧑🏾‍🚒", + "🧑🏿‍🚒", + "👨‍🚒", + "👨🏻‍🚒", + "👨🏼‍🚒", + "👨🏽‍🚒", + "👨🏾‍🚒", + "👨🏿‍🚒", + "👩‍🚒", + "👩🏻‍🚒", + "👩🏼‍🚒", + "👩🏽‍🚒", + "👩🏾‍🚒", + "👩🏿‍🚒", + "👮", + "👮🏻", + "👮🏼", + "👮🏽", + "👮🏾", + "👮🏿", + "👮‍♂️", + "👮‍♂", + "👮🏻‍♂️", + "👮🏻‍♂", + "👮🏼‍♂️", + "👮🏼‍♂", + "👮🏽‍♂️", + "👮🏽‍♂", + "👮🏾‍♂️", + "👮🏾‍♂", + "👮🏿‍♂️", + "👮🏿‍♂", + "👮‍♀️", + "👮‍♀", + "👮🏻‍♀️", + "👮🏻‍♀", + "👮🏼‍♀️", + "👮🏼‍♀", + "👮🏽‍♀️", + "👮🏽‍♀", + "👮🏾‍♀️", + "👮🏾‍♀", + "👮🏿‍♀️", + "👮🏿‍♀", + "🕵️", + "🕵", + "🕵🏻", + "🕵🏼", + "🕵🏽", + "🕵🏾", + "🕵🏿", + "🕵️‍♂️", + "🕵‍♂️", + "🕵️‍♂", + "🕵‍♂", + "🕵🏻‍♂️", + "🕵🏻‍♂", + "🕵🏼‍♂️", + "🕵🏼‍♂", + "🕵🏽‍♂️", + "🕵🏽‍♂", + "🕵🏾‍♂️", + "🕵🏾‍♂", + "🕵🏿‍♂️", + "🕵🏿‍♂", + "🕵️‍♀️", + "🕵‍♀️", + "🕵️‍♀", + "🕵‍♀", + "🕵🏻‍♀️", + "🕵🏻‍♀", + "🕵🏼‍♀️", + "🕵🏼‍♀", + "🕵🏽‍♀️", + "🕵🏽‍♀", + "🕵🏾‍♀️", + "🕵🏾‍♀", + "🕵🏿‍♀️", + "🕵🏿‍♀", + "💂", + "💂🏻", + "💂🏼", + "💂🏽", + "💂🏾", + "💂🏿", + "💂‍♂️", + "💂‍♂", + "💂🏻‍♂️", + "💂🏻‍♂", + "💂🏼‍♂️", + "💂🏼‍♂", + "💂🏽‍♂️", + "💂🏽‍♂", + "💂🏾‍♂️", + "💂🏾‍♂", + "💂🏿‍♂️", + "💂🏿‍♂", + "💂‍♀️", + "💂‍♀", + "💂🏻‍♀️", + "💂🏻‍♀", + "💂🏼‍♀️", + "💂🏼‍♀", + "💂🏽‍♀️", + "💂🏽‍♀", + "💂🏾‍♀️", + "💂🏾‍♀", + "💂🏿‍♀️", + "💂🏿‍♀", + "🥷", + "🥷🏻", + "🥷🏼", + "🥷🏽", + "🥷🏾", + "🥷🏿", + "👷", + "👷🏻", + "👷🏼", + "👷🏽", + "👷🏾", + "👷🏿", + "👷‍♂️", + "👷‍♂", + "👷🏻‍♂️", + "👷🏻‍♂", + "👷🏼‍♂️", + "👷🏼‍♂", + "👷🏽‍♂️", + "👷🏽‍♂", + "👷🏾‍♂️", + "👷🏾‍♂", + "👷🏿‍♂️", + "👷🏿‍♂", + "👷‍♀️", + "👷‍♀", + "👷🏻‍♀️", + "👷🏻‍♀", + "👷🏼‍♀️", + "👷🏼‍♀", + "👷🏽‍♀️", + "👷🏽‍♀", + "👷🏾‍♀️", + "👷🏾‍♀", + "👷🏿‍♀️", + "👷🏿‍♀", + "🤴", + "🤴🏻", + "🤴🏼", + "🤴🏽", + "🤴🏾", + "🤴🏿", + "👸", + "👸🏻", + "👸🏼", + "👸🏽", + "👸🏾", + "👸🏿", + "👳", + "👳🏻", + "👳🏼", + "👳🏽", + "👳🏾", + "👳🏿", + "👳‍♂️", + "👳‍♂", + "👳🏻‍♂️", + "👳🏻‍♂", + "👳🏼‍♂️", + "👳🏼‍♂", + "👳🏽‍♂️", + "👳🏽‍♂", + "👳🏾‍♂️", + "👳🏾‍♂", + "👳🏿‍♂️", + "👳🏿‍♂", + "👳‍♀️", + "👳‍♀", + "👳🏻‍♀️", + "👳🏻‍♀", + "👳🏼‍♀️", + "👳🏼‍♀", + "👳🏽‍♀️", + "👳🏽‍♀", + "👳🏾‍♀️", + "👳🏾‍♀", + "👳🏿‍♀️", + "👳🏿‍♀", + "👲", + "👲🏻", + "👲🏼", + "👲🏽", + "👲🏾", + "👲🏿", + "🧕", + "🧕🏻", + "🧕🏼", + "🧕🏽", + "🧕🏾", + "🧕🏿", + "🤵", + "🤵🏻", + "🤵🏼", + "🤵🏽", + "🤵🏾", + "🤵🏿", + "🤵‍♂️", + "🤵‍♂", + "🤵🏻‍♂️", + "🤵🏻‍♂", + "🤵🏼‍♂️", + "🤵🏼‍♂", + "🤵🏽‍♂️", + "🤵🏽‍♂", + "🤵🏾‍♂️", + "🤵🏾‍♂", + "🤵🏿‍♂️", + "🤵🏿‍♂", + "🤵‍♀️", + "🤵‍♀", + "🤵🏻‍♀️", + "🤵🏻‍♀", + "🤵🏼‍♀️", + "🤵🏼‍♀", + "🤵🏽‍♀️", + "🤵🏽‍♀", + "🤵🏾‍♀️", + "🤵🏾‍♀", + "🤵🏿‍♀️", + "🤵🏿‍♀", + "👰", + "👰🏻", + "👰🏼", + "👰🏽", + "👰🏾", + "👰🏿", + "👰‍♂️", + "👰‍♂", + "👰🏻‍♂️", + "👰🏻‍♂", + "👰🏼‍♂️", + "👰🏼‍♂", + "👰🏽‍♂️", + "👰🏽‍♂", + "👰🏾‍♂️", + "👰🏾‍♂", + "👰🏿‍♂️", + "👰🏿‍♂", + "👰‍♀️", + "👰‍♀", + "👰🏻‍♀️", + "👰🏻‍♀", + "👰🏼‍♀️", + "👰🏼‍♀", + "👰🏽‍♀️", + "👰🏽‍♀", + "👰🏾‍♀️", + "👰🏾‍♀", + "👰🏿‍♀️", + "👰🏿‍♀", + "🤰", + "🤰🏻", + "🤰🏼", + "🤰🏽", + "🤰🏾", + "🤰🏿", + "🤱", + "🤱🏻", + "🤱🏼", + "🤱🏽", + "🤱🏾", + "🤱🏿", + "👩‍🍼", + "👩🏻‍🍼", + "👩🏼‍🍼", + "👩🏽‍🍼", + "👩🏾‍🍼", + "👩🏿‍🍼", + "👨‍🍼", + "👨🏻‍🍼", + "👨🏼‍🍼", + "👨🏽‍🍼", + "👨🏾‍🍼", + "👨🏿‍🍼", + "🧑‍🍼", + "🧑🏻‍🍼", + "🧑🏼‍🍼", + "🧑🏽‍🍼", + "🧑🏾‍🍼", + "🧑🏿‍🍼" + ], + "People & Body (person-fantasy)": [ + "👼", + "👼🏻", + "👼🏼", + "👼🏽", + "👼🏾", + "👼🏿", + "🎅", + "🎅🏻", + "🎅🏼", + "🎅🏽", + "🎅🏾", + "🎅🏿", + "🤶", + "🤶🏻", + "🤶🏼", + "🤶🏽", + "🤶🏾", + "🤶🏿", + "🧑‍🎄", + "🧑🏻‍🎄", + "🧑🏼‍🎄", + "🧑🏽‍🎄", + "🧑🏾‍🎄", + "🧑🏿‍🎄", + "🦸", + "🦸🏻", + "🦸🏼", + "🦸🏽", + "🦸🏾", + "🦸🏿", + "🦸‍♂️", + "🦸‍♂", + "🦸🏻‍♂️", + "🦸🏻‍♂", + "🦸🏼‍♂️", + "🦸🏼‍♂", + "🦸🏽‍♂️", + "🦸🏽‍♂", + "🦸🏾‍♂️", + "🦸🏾‍♂", + "🦸🏿‍♂️", + "🦸🏿‍♂", + "🦸‍♀️", + "🦸‍♀", + "🦸🏻‍♀️", + "🦸🏻‍♀", + "🦸🏼‍♀️", + "🦸🏼‍♀", + "🦸🏽‍♀️", + "🦸🏽‍♀", + "🦸🏾‍♀️", + "🦸🏾‍♀", + "🦸🏿‍♀️", + "🦸🏿‍♀", + "🦹", + "🦹🏻", + "🦹🏼", + "🦹🏽", + "🦹🏾", + "🦹🏿", + "🦹‍♂️", + "🦹‍♂", + "🦹🏻‍♂️", + "🦹🏻‍♂", + "🦹🏼‍♂️", + "🦹🏼‍♂", + "🦹🏽‍♂️", + "🦹🏽‍♂", + "🦹🏾‍♂️", + "🦹🏾‍♂", + "🦹🏿‍♂️", + "🦹🏿‍♂", + "🦹‍♀️", + "🦹‍♀", + "🦹🏻‍♀️", + "🦹🏻‍♀", + "🦹🏼‍♀️", + "🦹🏼‍♀", + "🦹🏽‍♀️", + "🦹🏽‍♀", + "🦹🏾‍♀️", + "🦹🏾‍♀", + "🦹🏿‍♀️", + "🦹🏿‍♀", + "🧙", + "🧙🏻", + "🧙🏼", + "🧙🏽", + "🧙🏾", + "🧙🏿", + "🧙‍♂️", + "🧙‍♂", + "🧙🏻‍♂️", + "🧙🏻‍♂", + "🧙🏼‍♂️", + "🧙🏼‍♂", + "🧙🏽‍♂️", + "🧙🏽‍♂", + "🧙🏾‍♂️", + "🧙🏾‍♂", + "🧙🏿‍♂️", + "🧙🏿‍♂", + "🧙‍♀️", + "🧙‍♀", + "🧙🏻‍♀️", + "🧙🏻‍♀", + "🧙🏼‍♀️", + "🧙🏼‍♀", + "🧙🏽‍♀️", + "🧙🏽‍♀", + "🧙🏾‍♀️", + "🧙🏾‍♀", + "🧙🏿‍♀️", + "🧙🏿‍♀", + "🧚", + "🧚🏻", + "🧚🏼", + "🧚🏽", + "🧚🏾", + "🧚🏿", + "🧚‍♂️", + "🧚‍♂", + "🧚🏻‍♂️", + "🧚🏻‍♂", + "🧚🏼‍♂️", + "🧚🏼‍♂", + "🧚🏽‍♂️", + "🧚🏽‍♂", + "🧚🏾‍♂️", + "🧚🏾‍♂", + "🧚🏿‍♂️", + "🧚🏿‍♂", + "🧚‍♀️", + "🧚‍♀", + "🧚🏻‍♀️", + "🧚🏻‍♀", + "🧚🏼‍♀️", + "🧚🏼‍♀", + "🧚🏽‍♀️", + "🧚🏽‍♀", + "🧚🏾‍♀️", + "🧚🏾‍♀", + "🧚🏿‍♀️", + "🧚🏿‍♀", + "🧛", + "🧛🏻", + "🧛🏼", + "🧛🏽", + "🧛🏾", + "🧛🏿", + "🧛‍♂️", + "🧛‍♂", + "🧛🏻‍♂️", + "🧛🏻‍♂", + "🧛🏼‍♂️", + "🧛🏼‍♂", + "🧛🏽‍♂️", + "🧛🏽‍♂", + "🧛🏾‍♂️", + "🧛🏾‍♂", + "🧛🏿‍♂️", + "🧛🏿‍♂", + "🧛‍♀️", + "🧛‍♀", + "🧛🏻‍♀️", + "🧛🏻‍♀", + "🧛🏼‍♀️", + "🧛🏼‍♀", + "🧛🏽‍♀️", + "🧛🏽‍♀", + "🧛🏾‍♀️", + "🧛🏾‍♀", + "🧛🏿‍♀️", + "🧛🏿‍♀", + "🧜", + "🧜🏻", + "🧜🏼", + "🧜🏽", + "🧜🏾", + "🧜🏿", + "🧜‍♂️", + "🧜‍♂", + "🧜🏻‍♂️", + "🧜🏻‍♂", + "🧜🏼‍♂️", + "🧜🏼‍♂", + "🧜🏽‍♂️", + "🧜🏽‍♂", + "🧜🏾‍♂️", + "🧜🏾‍♂", + "🧜🏿‍♂️", + "🧜🏿‍♂", + "🧜‍♀️", + "🧜‍♀", + "🧜🏻‍♀️", + "🧜🏻‍♀", + "🧜🏼‍♀️", + "🧜🏼‍♀", + "🧜🏽‍♀️", + "🧜🏽‍♀", + "🧜🏾‍♀️", + "🧜🏾‍♀", + "🧜🏿‍♀️", + "🧜🏿‍♀", + "🧝", + "🧝🏻", + "🧝🏼", + "🧝🏽", + "🧝🏾", + "🧝🏿", + "🧝‍♂️", + "🧝‍♂", + "🧝🏻‍♂️", + "🧝🏻‍♂", + "🧝🏼‍♂️", + "🧝🏼‍♂", + "🧝🏽‍♂️", + "🧝🏽‍♂", + "🧝🏾‍♂️", + "🧝🏾‍♂", + "🧝🏿‍♂️", + "🧝🏿‍♂", + "🧝‍♀️", + "🧝‍♀", + "🧝🏻‍♀️", + "🧝🏻‍♀", + "🧝🏼‍♀️", + "🧝🏼‍♀", + "🧝🏽‍♀️", + "🧝🏽‍♀", + "🧝🏾‍♀️", + "🧝🏾‍♀", + "🧝🏿‍♀️", + "🧝🏿‍♀", + "🧞", + "🧞‍♂️", + "🧞‍♂", + "🧞‍♀️", + "🧞‍♀", + "🧟", + "🧟‍♂️", + "🧟‍♂", + "🧟‍♀️", + "🧟‍♀" + ], + "People & Body (person-activity)": [ + "💆", + "💆🏻", + "💆🏼", + "💆🏽", + "💆🏾", + "💆🏿", + "💆‍♂️", + "💆‍♂", + "💆🏻‍♂️", + "💆🏻‍♂", + "💆🏼‍♂️", + "💆🏼‍♂", + "💆🏽‍♂️", + "💆🏽‍♂", + "💆🏾‍♂️", + "💆🏾‍♂", + "💆🏿‍♂️", + "💆🏿‍♂", + "💆‍♀️", + "💆‍♀", + "💆🏻‍♀️", + "💆🏻‍♀", + "💆🏼‍♀️", + "💆🏼‍♀", + "💆🏽‍♀️", + "💆🏽‍♀", + "💆🏾‍♀️", + "💆🏾‍♀", + "💆🏿‍♀️", + "💆🏿‍♀", + "💇", + "💇🏻", + "💇🏼", + "💇🏽", + "💇🏾", + "💇🏿", + "💇‍♂️", + "💇‍♂", + "💇🏻‍♂️", + "💇🏻‍♂", + "💇🏼‍♂️", + "💇🏼‍♂", + "💇🏽‍♂️", + "💇🏽‍♂", + "💇🏾‍♂️", + "💇🏾‍♂", + "💇🏿‍♂️", + "💇🏿‍♂", + "💇‍♀️", + "💇‍♀", + "💇🏻‍♀️", + "💇🏻‍♀", + "💇🏼‍♀️", + "💇🏼‍♀", + "💇🏽‍♀️", + "💇🏽‍♀", + "💇🏾‍♀️", + "💇🏾‍♀", + "💇🏿‍♀️", + "💇🏿‍♀", + "🚶", + "🚶🏻", + "🚶🏼", + "🚶🏽", + "🚶🏾", + "🚶🏿", + "🚶‍♂️", + "🚶‍♂", + "🚶🏻‍♂️", + "🚶🏻‍♂", + "🚶🏼‍♂️", + "🚶🏼‍♂", + "🚶🏽‍♂️", + "🚶🏽‍♂", + "🚶🏾‍♂️", + "🚶🏾‍♂", + "🚶🏿‍♂️", + "🚶🏿‍♂", + "🚶‍♀️", + "🚶‍♀", + "🚶🏻‍♀️", + "🚶🏻‍♀", + "🚶🏼‍♀️", + "🚶🏼‍♀", + "🚶🏽‍♀️", + "🚶🏽‍♀", + "🚶🏾‍♀️", + "🚶🏾‍♀", + "🚶🏿‍♀️", + "🚶🏿‍♀", + "🧍", + "🧍🏻", + "🧍🏼", + "🧍🏽", + "🧍🏾", + "🧍🏿", + "🧍‍♂️", + "🧍‍♂", + "🧍🏻‍♂️", + "🧍🏻‍♂", + "🧍🏼‍♂️", + "🧍🏼‍♂", + "🧍🏽‍♂️", + "🧍🏽‍♂", + "🧍🏾‍♂️", + "🧍🏾‍♂", + "🧍🏿‍♂️", + "🧍🏿‍♂", + "🧍‍♀️", + "🧍‍♀", + "🧍🏻‍♀️", + "🧍🏻‍♀", + "🧍🏼‍♀️", + "🧍🏼‍♀", + "🧍🏽‍♀️", + "🧍🏽‍♀", + "🧍🏾‍♀️", + "🧍🏾‍♀", + "🧍🏿‍♀️", + "🧍🏿‍♀", + "🧎", + "🧎🏻", + "🧎🏼", + "🧎🏽", + "🧎🏾", + "🧎🏿", + "🧎‍♂️", + "🧎‍♂", + "🧎🏻‍♂️", + "🧎🏻‍♂", + "🧎🏼‍♂️", + "🧎🏼‍♂", + "🧎🏽‍♂️", + "🧎🏽‍♂", + "🧎🏾‍♂️", + "🧎🏾‍♂", + "🧎🏿‍♂️", + "🧎🏿‍♂", + "🧎‍♀️", + "🧎‍♀", + "🧎🏻‍♀️", + "🧎🏻‍♀", + "🧎🏼‍♀️", + "🧎🏼‍♀", + "🧎🏽‍♀️", + "🧎🏽‍♀", + "🧎🏾‍♀️", + "🧎🏾‍♀", + "🧎🏿‍♀️", + "🧎🏿‍♀", + "🧑‍🦯", + "🧑🏻‍🦯", + "🧑🏼‍🦯", + "🧑🏽‍🦯", + "🧑🏾‍🦯", + "🧑🏿‍🦯", + "👨‍🦯", + "👨🏻‍🦯", + "👨🏼‍🦯", + "👨🏽‍🦯", + "👨🏾‍🦯", + "👨🏿‍🦯", + "👩‍🦯", + "👩🏻‍🦯", + "👩🏼‍🦯", + "👩🏽‍🦯", + "👩🏾‍🦯", + "👩🏿‍🦯", + "🧑‍🦼", + "🧑🏻‍🦼", + "🧑🏼‍🦼", + "🧑🏽‍🦼", + "🧑🏾‍🦼", + "🧑🏿‍🦼", + "👨‍🦼", + "👨🏻‍🦼", + "👨🏼‍🦼", + "👨🏽‍🦼", + "👨🏾‍🦼", + "👨🏿‍🦼", + "👩‍🦼", + "👩🏻‍🦼", + "👩🏼‍🦼", + "👩🏽‍🦼", + "👩🏾‍🦼", + "👩🏿‍🦼", + "🧑‍🦽", + "🧑🏻‍🦽", + "🧑🏼‍🦽", + "🧑🏽‍🦽", + "🧑🏾‍🦽", + "🧑🏿‍🦽", + "👨‍🦽", + "👨🏻‍🦽", + "👨🏼‍🦽", + "👨🏽‍🦽", + "👨🏾‍🦽", + "👨🏿‍🦽", + "👩‍🦽", + "👩🏻‍🦽", + "👩🏼‍🦽", + "👩🏽‍🦽", + "👩🏾‍🦽", + "👩🏿‍🦽", + "🏃", + "🏃🏻", + "🏃🏼", + "🏃🏽", + "🏃🏾", + "🏃🏿", + "🏃‍♂️", + "🏃‍♂", + "🏃🏻‍♂️", + "🏃🏻‍♂", + "🏃🏼‍♂️", + "🏃🏼‍♂", + "🏃🏽‍♂️", + "🏃🏽‍♂", + "🏃🏾‍♂️", + "🏃🏾‍♂", + "🏃🏿‍♂️", + "🏃🏿‍♂", + "🏃‍♀️", + "🏃‍♀", + "🏃🏻‍♀️", + "🏃🏻‍♀", + "🏃🏼‍♀️", + "🏃🏼‍♀", + "🏃🏽‍♀️", + "🏃🏽‍♀", + "🏃🏾‍♀️", + "🏃🏾‍♀", + "🏃🏿‍♀️", + "🏃🏿‍♀", + "💃", + "💃🏻", + "💃🏼", + "💃🏽", + "💃🏾", + "💃🏿", + "🕺", + "🕺🏻", + "🕺🏼", + "🕺🏽", + "🕺🏾", + "🕺🏿", + "🕴️", + "🕴", + "🕴🏻", + "🕴🏼", + "🕴🏽", + "🕴🏾", + "🕴🏿", + "👯", + "👯‍♂️", + "👯‍♂", + "👯‍♀️", + "👯‍♀", + "🧖", + "🧖🏻", + "🧖🏼", + "🧖🏽", + "🧖🏾", + "🧖🏿", + "🧖‍♂️", + "🧖‍♂", + "🧖🏻‍♂️", + "🧖🏻‍♂", + "🧖🏼‍♂️", + "🧖🏼‍♂", + "🧖🏽‍♂️", + "🧖🏽‍♂", + "🧖🏾‍♂️", + "🧖🏾‍♂", + "🧖🏿‍♂️", + "🧖🏿‍♂", + "🧖‍♀️", + "🧖‍♀", + "🧖🏻‍♀️", + "🧖🏻‍♀", + "🧖🏼‍♀️", + "🧖🏼‍♀", + "🧖🏽‍♀️", + "🧖🏽‍♀", + "🧖🏾‍♀️", + "🧖🏾‍♀", + "🧖🏿‍♀️", + "🧖🏿‍♀", + "🧗", + "🧗🏻", + "🧗🏼", + "🧗🏽", + "🧗🏾", + "🧗🏿", + "🧗‍♂️", + "🧗‍♂", + "🧗🏻‍♂️", + "🧗🏻‍♂", + "🧗🏼‍♂️", + "🧗🏼‍♂", + "🧗🏽‍♂️", + "🧗🏽‍♂", + "🧗🏾‍♂️", + "🧗🏾‍♂", + "🧗🏿‍♂️", + "🧗🏿‍♂", + "🧗‍♀️", + "🧗‍♀", + "🧗🏻‍♀️", + "🧗🏻‍♀", + "🧗🏼‍♀️", + "🧗🏼‍♀", + "🧗🏽‍♀️", + "🧗🏽‍♀", + "🧗🏾‍♀️", + "🧗🏾‍♀", + "🧗🏿‍♀️", + "🧗🏿‍♀" + ], + "People & Body (person-sport)": [ + "🤺", + "🏇", + "🏇🏻", + "🏇🏼", + "🏇🏽", + "🏇🏾", + "🏇🏿", + "⛷️", + "⛷", + "🏂", + "🏂🏻", + "🏂🏼", + "🏂🏽", + "🏂🏾", + "🏂🏿", + "🏌️", + "🏌", + "🏌🏻", + "🏌🏼", + "🏌🏽", + "🏌🏾", + "🏌🏿", + "🏌️‍♂️", + "🏌‍♂️", + "🏌️‍♂", + "🏌‍♂", + "🏌🏻‍♂️", + "🏌🏻‍♂", + "🏌🏼‍♂️", + "🏌🏼‍♂", + "🏌🏽‍♂️", + "🏌🏽‍♂", + "🏌🏾‍♂️", + "🏌🏾‍♂", + "🏌🏿‍♂️", + "🏌🏿‍♂", + "🏌️‍♀️", + "🏌‍♀️", + "🏌️‍♀", + "🏌‍♀", + "🏌🏻‍♀️", + "🏌🏻‍♀", + "🏌🏼‍♀️", + "🏌🏼‍♀", + "🏌🏽‍♀️", + "🏌🏽‍♀", + "🏌🏾‍♀️", + "🏌🏾‍♀", + "🏌🏿‍♀️", + "🏌🏿‍♀", + "🏄", + "🏄🏻", + "🏄🏼", + "🏄🏽", + "🏄🏾", + "🏄🏿", + "🏄‍♂️", + "🏄‍♂", + "🏄🏻‍♂️", + "🏄🏻‍♂", + "🏄🏼‍♂️", + "🏄🏼‍♂", + "🏄🏽‍♂️", + "🏄🏽‍♂", + "🏄🏾‍♂️", + "🏄🏾‍♂", + "🏄🏿‍♂️", + "🏄🏿‍♂", + "🏄‍♀️", + "🏄‍♀", + "🏄🏻‍♀️", + "🏄🏻‍♀", + "🏄🏼‍♀️", + "🏄🏼‍♀", + "🏄🏽‍♀️", + "🏄🏽‍♀", + "🏄🏾‍♀️", + "🏄🏾‍♀", + "🏄🏿‍♀️", + "🏄🏿‍♀", + "🚣", + "🚣🏻", + "🚣🏼", + "🚣🏽", + "🚣🏾", + "🚣🏿", + "🚣‍♂️", + "🚣‍♂", + "🚣🏻‍♂️", + "🚣🏻‍♂", + "🚣🏼‍♂️", + "🚣🏼‍♂", + "🚣🏽‍♂️", + "🚣🏽‍♂", + "🚣🏾‍♂️", + "🚣🏾‍♂", + "🚣🏿‍♂️", + "🚣🏿‍♂", + "🚣‍♀️", + "🚣‍♀", + "🚣🏻‍♀️", + "🚣🏻‍♀", + "🚣🏼‍♀️", + "🚣🏼‍♀", + "🚣🏽‍♀️", + "🚣🏽‍♀", + "🚣🏾‍♀️", + "🚣🏾‍♀", + "🚣🏿‍♀️", + "🚣🏿‍♀", + "🏊", + "🏊🏻", + "🏊🏼", + "🏊🏽", + "🏊🏾", + "🏊🏿", + "🏊‍♂️", + "🏊‍♂", + "🏊🏻‍♂️", + "🏊🏻‍♂", + "🏊🏼‍♂️", + "🏊🏼‍♂", + "🏊🏽‍♂️", + "🏊🏽‍♂", + "🏊🏾‍♂️", + "🏊🏾‍♂", + "🏊🏿‍♂️", + "🏊🏿‍♂", + "🏊‍♀️", + "🏊‍♀", + "🏊🏻‍♀️", + "🏊🏻‍♀", + "🏊🏼‍♀️", + "🏊🏼‍♀", + "🏊🏽‍♀️", + "🏊🏽‍♀", + "🏊🏾‍♀️", + "🏊🏾‍♀", + "🏊🏿‍♀️", + "🏊🏿‍♀", + "⛹️", + "⛹", + "⛹🏻", + "⛹🏼", + "⛹🏽", + "⛹🏾", + "⛹🏿", + "⛹️‍♂️", + "⛹‍♂️", + "⛹️‍♂", + "⛹‍♂", + "⛹🏻‍♂️", + "⛹🏻‍♂", + "⛹🏼‍♂️", + "⛹🏼‍♂", + "⛹🏽‍♂️", + "⛹🏽‍♂", + "⛹🏾‍♂️", + "⛹🏾‍♂", + "⛹🏿‍♂️", + "⛹🏿‍♂", + "⛹️‍♀️", + "⛹‍♀️", + "⛹️‍♀", + "⛹‍♀", + "⛹🏻‍♀️", + "⛹🏻‍♀", + "⛹🏼‍♀️", + "⛹🏼‍♀", + "⛹🏽‍♀️", + "⛹🏽‍♀", + "⛹🏾‍♀️", + "⛹🏾‍♀", + "⛹🏿‍♀️", + "⛹🏿‍♀", + "🏋️", + "🏋", + "🏋🏻", + "🏋🏼", + "🏋🏽", + "🏋🏾", + "🏋🏿", + "🏋️‍♂️", + "🏋‍♂️", + "🏋️‍♂", + "🏋‍♂", + "🏋🏻‍♂️", + "🏋🏻‍♂", + "🏋🏼‍♂️", + "🏋🏼‍♂", + "🏋🏽‍♂️", + "🏋🏽‍♂", + "🏋🏾‍♂️", + "🏋🏾‍♂", + "🏋🏿‍♂️", + "🏋🏿‍♂", + "🏋️‍♀️", + "🏋‍♀️", + "🏋️‍♀", + "🏋‍♀", + "🏋🏻‍♀️", + "🏋🏻‍♀", + "🏋🏼‍♀️", + "🏋🏼‍♀", + "🏋🏽‍♀️", + "🏋🏽‍♀", + "🏋🏾‍♀️", + "🏋🏾‍♀", + "🏋🏿‍♀️", + "🏋🏿‍♀", + "🚴", + "🚴🏻", + "🚴🏼", + "🚴🏽", + "🚴🏾", + "🚴🏿", + "🚴‍♂️", + "🚴‍♂", + "🚴🏻‍♂️", + "🚴🏻‍♂", + "🚴🏼‍♂️", + "🚴🏼‍♂", + "🚴🏽‍♂️", + "🚴🏽‍♂", + "🚴🏾‍♂️", + "🚴🏾‍♂", + "🚴🏿‍♂️", + "🚴🏿‍♂", + "🚴‍♀️", + "🚴‍♀", + "🚴🏻‍♀️", + "🚴🏻‍♀", + "🚴🏼‍♀️", + "🚴🏼‍♀", + "🚴🏽‍♀️", + "🚴🏽‍♀", + "🚴🏾‍♀️", + "🚴🏾‍♀", + "🚴🏿‍♀️", + "🚴🏿‍♀", + "🚵", + "🚵🏻", + "🚵🏼", + "🚵🏽", + "🚵🏾", + "🚵🏿", + "🚵‍♂️", + "🚵‍♂", + "🚵🏻‍♂️", + "🚵🏻‍♂", + "🚵🏼‍♂️", + "🚵🏼‍♂", + "🚵🏽‍♂️", + "🚵🏽‍♂", + "🚵🏾‍♂️", + "🚵🏾‍♂", + "🚵🏿‍♂️", + "🚵🏿‍♂", + "🚵‍♀️", + "🚵‍♀", + "🚵🏻‍♀️", + "🚵🏻‍♀", + "🚵🏼‍♀️", + "🚵🏼‍♀", + "🚵🏽‍♀️", + "🚵🏽‍♀", + "🚵🏾‍♀️", + "🚵🏾‍♀", + "🚵🏿‍♀️", + "🚵🏿‍♀", + "🤸", + "🤸🏻", + "🤸🏼", + "🤸🏽", + "🤸🏾", + "🤸🏿", + "🤸‍♂️", + "🤸‍♂", + "🤸🏻‍♂️", + "🤸🏻‍♂", + "🤸🏼‍♂️", + "🤸🏼‍♂", + "🤸🏽‍♂️", + "🤸🏽‍♂", + "🤸🏾‍♂️", + "🤸🏾‍♂", + "🤸🏿‍♂️", + "🤸🏿‍♂", + "🤸‍♀️", + "🤸‍♀", + "🤸🏻‍♀️", + "🤸🏻‍♀", + "🤸🏼‍♀️", + "🤸🏼‍♀", + "🤸🏽‍♀️", + "🤸🏽‍♀", + "🤸🏾‍♀️", + "🤸🏾‍♀", + "🤸🏿‍♀️", + "🤸🏿‍♀", + "🤼", + "🤼‍♂️", + "🤼‍♂", + "🤼‍♀️", + "🤼‍♀", + "🤽", + "🤽🏻", + "🤽🏼", + "🤽🏽", + "🤽🏾", + "🤽🏿", + "🤽‍♂️", + "🤽‍♂", + "🤽🏻‍♂️", + "🤽🏻‍♂", + "🤽🏼‍♂️", + "🤽🏼‍♂", + "🤽🏽‍♂️", + "🤽🏽‍♂", + "🤽🏾‍♂️", + "🤽🏾‍♂", + "🤽🏿‍♂️", + "🤽🏿‍♂", + "🤽‍♀️", + "🤽‍♀", + "🤽🏻‍♀️", + "🤽🏻‍♀", + "🤽🏼‍♀️", + "🤽🏼‍♀", + "🤽🏽‍♀️", + "🤽🏽‍♀", + "🤽🏾‍♀️", + "🤽🏾‍♀", + "🤽🏿‍♀️", + "🤽🏿‍♀", + "🤾", + "🤾🏻", + "🤾🏼", + "🤾🏽", + "🤾🏾", + "🤾🏿", + "🤾‍♂️", + "🤾‍♂", + "🤾🏻‍♂️", + "🤾🏻‍♂", + "🤾🏼‍♂️", + "🤾🏼‍♂", + "🤾🏽‍♂️", + "🤾🏽‍♂", + "🤾🏾‍♂️", + "🤾🏾‍♂", + "🤾🏿‍♂️", + "🤾🏿‍♂", + "🤾‍♀️", + "🤾‍♀", + "🤾🏻‍♀️", + "🤾🏻‍♀", + "🤾🏼‍♀️", + "🤾🏼‍♀", + "🤾🏽‍♀️", + "🤾🏽‍♀", + "🤾🏾‍♀️", + "🤾🏾‍♀", + "🤾🏿‍♀️", + "🤾🏿‍♀", + "🤹", + "🤹🏻", + "🤹🏼", + "🤹🏽", + "🤹🏾", + "🤹🏿", + "🤹‍♂️", + "🤹‍♂", + "🤹🏻‍♂️", + "🤹🏻‍♂", + "🤹🏼‍♂️", + "🤹🏼‍♂", + "🤹🏽‍♂️", + "🤹🏽‍♂", + "🤹🏾‍♂️", + "🤹🏾‍♂", + "🤹🏿‍♂️", + "🤹🏿‍♂", + "🤹‍♀️", + "🤹‍♀", + "🤹🏻‍♀️", + "🤹🏻‍♀", + "🤹🏼‍♀️", + "🤹🏼‍♀", + "🤹🏽‍♀️", + "🤹🏽‍♀", + "🤹🏾‍♀️", + "🤹🏾‍♀", + "🤹🏿‍♀️", + "🤹🏿‍♀" + ], + "People & Body (person-resting)": [ + "🧘", + "🧘🏻", + "🧘🏼", + "🧘🏽", + "🧘🏾", + "🧘🏿", + "🧘‍♂️", + "🧘‍♂", + "🧘🏻‍♂️", + "🧘🏻‍♂", + "🧘🏼‍♂️", + "🧘🏼‍♂", + "🧘🏽‍♂️", + "🧘🏽‍♂", + "🧘🏾‍♂️", + "🧘🏾‍♂", + "🧘🏿‍♂️", + "🧘🏿‍♂", + "🧘‍♀️", + "🧘‍♀", + "🧘🏻‍♀️", + "🧘🏻‍♀", + "🧘🏼‍♀️", + "🧘🏼‍♀", + "🧘🏽‍♀️", + "🧘🏽‍♀", + "🧘🏾‍♀️", + "🧘🏾‍♀", + "🧘🏿‍♀️", + "🧘🏿‍♀", + "🛀", + "🛀🏻", + "🛀🏼", + "🛀🏽", + "🛀🏾", + "🛀🏿", + "🛌", + "🛌🏻", + "🛌🏼", + "🛌🏽", + "🛌🏾", + "🛌🏿" + ], + "People & Body (family)": [ + "🧑‍🤝‍🧑", + "🧑🏻‍🤝‍🧑🏻", + "🧑🏻‍🤝‍🧑🏼", + "🧑🏻‍🤝‍🧑🏽", + "🧑🏻‍🤝‍🧑🏾", + "🧑🏻‍🤝‍🧑🏿", + "🧑🏼‍🤝‍🧑🏻", + "🧑🏼‍🤝‍🧑🏼", + "🧑🏼‍🤝‍🧑🏽", + "🧑🏼‍🤝‍🧑🏾", + "🧑🏼‍🤝‍🧑🏿", + "🧑🏽‍🤝‍🧑🏻", + "🧑🏽‍🤝‍🧑🏼", + "🧑🏽‍🤝‍🧑🏽", + "🧑🏽‍🤝‍🧑🏾", + "🧑🏽‍🤝‍🧑🏿", + "🧑🏾‍🤝‍🧑🏻", + "🧑🏾‍🤝‍🧑🏼", + "🧑🏾‍🤝‍🧑🏽", + "🧑🏾‍🤝‍🧑🏾", + "🧑🏾‍🤝‍🧑🏿", + "🧑🏿‍🤝‍🧑🏻", + "🧑🏿‍🤝‍🧑🏼", + "🧑🏿‍🤝‍🧑🏽", + "🧑🏿‍🤝‍🧑🏾", + "🧑🏿‍🤝‍🧑🏿", + "👭", + "👭🏻", + "👩🏻‍🤝‍👩🏼", + "👩🏻‍🤝‍👩🏽", + "👩🏻‍🤝‍👩🏾", + "👩🏻‍🤝‍👩🏿", + "👩🏼‍🤝‍👩🏻", + "👭🏼", + "👩🏼‍🤝‍👩🏽", + "👩🏼‍🤝‍👩🏾", + "👩🏼‍🤝‍👩🏿", + "👩🏽‍🤝‍👩🏻", + "👩🏽‍🤝‍👩🏼", + "👭🏽", + "👩🏽‍🤝‍👩🏾", + "👩🏽‍🤝‍👩🏿", + "👩🏾‍🤝‍👩🏻", + "👩🏾‍🤝‍👩🏼", + "👩🏾‍🤝‍👩🏽", + "👭🏾", + "👩🏾‍🤝‍👩🏿", + "👩🏿‍🤝‍👩🏻", + "👩🏿‍🤝‍👩🏼", + "👩🏿‍🤝‍👩🏽", + "👩🏿‍🤝‍👩🏾", + "👭🏿", + "👫", + "👫🏻", + "👩🏻‍🤝‍👨🏼", + "👩🏻‍🤝‍👨🏽", + "👩🏻‍🤝‍👨🏾", + "👩🏻‍🤝‍👨🏿", + "👩🏼‍🤝‍👨🏻", + "👫🏼", + "👩🏼‍🤝‍👨🏽", + "👩🏼‍🤝‍👨🏾", + "👩🏼‍🤝‍👨🏿", + "👩🏽‍🤝‍👨🏻", + "👩🏽‍🤝‍👨🏼", + "👫🏽", + "👩🏽‍🤝‍👨🏾", + "👩🏽‍🤝‍👨🏿", + "👩🏾‍🤝‍👨🏻", + "👩🏾‍🤝‍👨🏼", + "👩🏾‍🤝‍👨🏽", + "👫🏾", + "👩🏾‍🤝‍👨🏿", + "👩🏿‍🤝‍👨🏻", + "👩🏿‍🤝‍👨🏼", + "👩🏿‍🤝‍👨🏽", + "👩🏿‍🤝‍👨🏾", + "👫🏿", + "👬", + "👬🏻", + "👨🏻‍🤝‍👨🏼", + "👨🏻‍🤝‍👨🏽", + "👨🏻‍🤝‍👨🏾", + "👨🏻‍🤝‍👨🏿", + "👨🏼‍🤝‍👨🏻", + "👬🏼", + "👨🏼‍🤝‍👨🏽", + "👨🏼‍🤝‍👨🏾", + "👨🏼‍🤝‍👨🏿", + "👨🏽‍🤝‍👨🏻", + "👨🏽‍🤝‍👨🏼", + "👬🏽", + "👨🏽‍🤝‍👨🏾", + "👨🏽‍🤝‍👨🏿", + "👨🏾‍🤝‍👨🏻", + "👨🏾‍🤝‍👨🏼", + "👨🏾‍🤝‍👨🏽", + "👬🏾", + "👨🏾‍🤝‍👨🏿", + "👨🏿‍🤝‍👨🏻", + "👨🏿‍🤝‍👨🏼", + "👨🏿‍🤝‍👨🏽", + "👨🏿‍🤝‍👨🏾", + "👬🏿", + "💏", + "💏🏻", + "💏🏼", + "💏🏽", + "💏🏾", + "💏🏿", + "🧑🏻‍❤️‍💋‍🧑🏼", + "🧑🏻‍❤‍💋‍🧑🏼", + "🧑🏻‍❤️‍💋‍🧑🏽", + "🧑🏻‍❤‍💋‍🧑🏽", + "🧑🏻‍❤️‍💋‍🧑🏾", + "🧑🏻‍❤‍💋‍🧑🏾", + "🧑🏻‍❤️‍💋‍🧑🏿", + "🧑🏻‍❤‍💋‍🧑🏿", + "🧑🏼‍❤️‍💋‍🧑🏻", + "🧑🏼‍❤‍💋‍🧑🏻", + "🧑🏼‍❤️‍💋‍🧑🏽", + "🧑🏼‍❤‍💋‍🧑🏽", + "🧑🏼‍❤️‍💋‍🧑🏾", + "🧑🏼‍❤‍💋‍🧑🏾", + "🧑🏼‍❤️‍💋‍🧑🏿", + "🧑🏼‍❤‍💋‍🧑🏿", + "🧑🏽‍❤️‍💋‍🧑🏻", + "🧑🏽‍❤‍💋‍🧑🏻", + "🧑🏽‍❤️‍💋‍🧑🏼", + "🧑🏽‍❤‍💋‍🧑🏼", + "🧑🏽‍❤️‍💋‍🧑🏾", + "🧑🏽‍❤‍💋‍🧑🏾", + "🧑🏽‍❤️‍💋‍🧑🏿", + "🧑🏽‍❤‍💋‍🧑🏿", + "🧑🏾‍❤️‍💋‍🧑🏻", + "🧑🏾‍❤‍💋‍🧑🏻", + "🧑🏾‍❤️‍💋‍🧑🏼", + "🧑🏾‍❤‍💋‍🧑🏼", + "🧑🏾‍❤️‍💋‍🧑🏽", + "🧑🏾‍❤‍💋‍🧑🏽", + "🧑🏾‍❤️‍💋‍🧑🏿", + "🧑🏾‍❤‍💋‍🧑🏿", + "🧑🏿‍❤️‍💋‍🧑🏻", + "🧑🏿‍❤‍💋‍🧑🏻", + "🧑🏿‍❤️‍💋‍🧑🏼", + "🧑🏿‍❤‍💋‍🧑🏼", + "🧑🏿‍❤️‍💋‍🧑🏽", + "🧑🏿‍❤‍💋‍🧑🏽", + "🧑🏿‍❤️‍💋‍🧑🏾", + "🧑🏿‍❤‍💋‍🧑🏾", + "👩‍❤️‍💋‍👨", + "👩‍❤‍💋‍👨", + "👩🏻‍❤️‍💋‍👨🏻", + "👩🏻‍❤‍💋‍👨🏻", + "👩🏻‍❤️‍💋‍👨🏼", + "👩🏻‍❤‍💋‍👨🏼", + "👩🏻‍❤️‍💋‍👨🏽", + "👩🏻‍❤‍💋‍👨🏽", + "👩🏻‍❤️‍💋‍👨🏾", + "👩🏻‍❤‍💋‍👨🏾", + "👩🏻‍❤️‍💋‍👨🏿", + "👩🏻‍❤‍💋‍👨🏿", + "👩🏼‍❤️‍💋‍👨🏻", + "👩🏼‍❤‍💋‍👨🏻", + "👩🏼‍❤️‍💋‍👨🏼", + "👩🏼‍❤‍💋‍👨🏼", + "👩🏼‍❤️‍💋‍👨🏽", + "👩🏼‍❤‍💋‍👨🏽", + "👩🏼‍❤️‍💋‍👨🏾", + "👩🏼‍❤‍💋‍👨🏾", + "👩🏼‍❤️‍💋‍👨🏿", + "👩🏼‍❤‍💋‍👨🏿", + "👩🏽‍❤️‍💋‍👨🏻", + "👩🏽‍❤‍💋‍👨🏻", + "👩🏽‍❤️‍💋‍👨🏼", + "👩🏽‍❤‍💋‍👨🏼", + "👩🏽‍❤️‍💋‍👨🏽", + "👩🏽‍❤‍💋‍👨🏽", + "👩🏽‍❤️‍💋‍👨🏾", + "👩🏽‍❤‍💋‍👨🏾", + "👩🏽‍❤️‍💋‍👨🏿", + "👩🏽‍❤‍💋‍👨🏿", + "👩🏾‍❤️‍💋‍👨🏻", + "👩🏾‍❤‍💋‍👨🏻", + "👩🏾‍❤️‍💋‍👨🏼", + "👩🏾‍❤‍💋‍👨🏼", + "👩🏾‍❤️‍💋‍👨🏽", + "👩🏾‍❤‍💋‍👨🏽", + "👩🏾‍❤️‍💋‍👨🏾", + "👩🏾‍❤‍💋‍👨🏾", + "👩🏾‍❤️‍💋‍👨🏿", + "👩🏾‍❤‍💋‍👨🏿", + "👩🏿‍❤️‍💋‍👨🏻", + "👩🏿‍❤‍💋‍👨🏻", + "👩🏿‍❤️‍💋‍👨🏼", + "👩🏿‍❤‍💋‍👨🏼", + "👩🏿‍❤️‍💋‍👨🏽", + "👩🏿‍❤‍💋‍👨🏽", + "👩🏿‍❤️‍💋‍👨🏾", + "👩🏿‍❤‍💋‍👨🏾", + "👩🏿‍❤️‍💋‍👨🏿", + "👩🏿‍❤‍💋‍👨🏿", + "👨‍❤️‍💋‍👨", + "👨‍❤‍💋‍👨", + "👨🏻‍❤️‍💋‍👨🏻", + "👨🏻‍❤‍💋‍👨🏻", + "👨🏻‍❤️‍💋‍👨🏼", + "👨🏻‍❤‍💋‍👨🏼", + "👨🏻‍❤️‍💋‍👨🏽", + "👨🏻‍❤‍💋‍👨🏽", + "👨🏻‍❤️‍💋‍👨🏾", + "👨🏻‍❤‍💋‍👨🏾", + "👨🏻‍❤️‍💋‍👨🏿", + "👨🏻‍❤‍💋‍👨🏿", + "👨🏼‍❤️‍💋‍👨🏻", + "👨🏼‍❤‍💋‍👨🏻", + "👨🏼‍❤️‍💋‍👨🏼", + "👨🏼‍❤‍💋‍👨🏼", + "👨🏼‍❤️‍💋‍👨🏽", + "👨🏼‍❤‍💋‍👨🏽", + "👨🏼‍❤️‍💋‍👨🏾", + "👨🏼‍❤‍💋‍👨🏾", + "👨🏼‍❤️‍💋‍👨🏿", + "👨🏼‍❤‍💋‍👨🏿", + "👨🏽‍❤️‍💋‍👨🏻", + "👨🏽‍❤‍💋‍👨🏻", + "👨🏽‍❤️‍💋‍👨🏼", + "👨🏽‍❤‍💋‍👨🏼", + "👨🏽‍❤️‍💋‍👨🏽", + "👨🏽‍❤‍💋‍👨🏽", + "👨🏽‍❤️‍💋‍👨🏾", + "👨🏽‍❤‍💋‍👨🏾", + "👨🏽‍❤️‍💋‍👨🏿", + "👨🏽‍❤‍💋‍👨🏿", + "👨🏾‍❤️‍💋‍👨🏻", + "👨🏾‍❤‍💋‍👨🏻", + "👨🏾‍❤️‍💋‍👨🏼", + "👨🏾‍❤‍💋‍👨🏼", + "👨🏾‍❤️‍💋‍👨🏽", + "👨🏾‍❤‍💋‍👨🏽", + "👨🏾‍❤️‍💋‍👨🏾", + "👨🏾‍❤‍💋‍👨🏾", + "👨🏾‍❤️‍💋‍👨🏿", + "👨🏾‍❤‍💋‍👨🏿", + "👨🏿‍❤️‍💋‍👨🏻", + "👨🏿‍❤‍💋‍👨🏻", + "👨🏿‍❤️‍💋‍👨🏼", + "👨🏿‍❤‍💋‍👨🏼", + "👨🏿‍❤️‍💋‍👨🏽", + "👨🏿‍❤‍💋‍👨🏽", + "👨🏿‍❤️‍💋‍👨🏾", + "👨🏿‍❤‍💋‍👨🏾", + "👨🏿‍❤️‍💋‍👨🏿", + "👨🏿‍❤‍💋‍👨🏿", + "👩‍❤️‍💋‍👩", + "👩‍❤‍💋‍👩", + "👩🏻‍❤️‍💋‍👩🏻", + "👩🏻‍❤‍💋‍👩🏻", + "👩🏻‍❤️‍💋‍👩🏼", + "👩🏻‍❤‍💋‍👩🏼", + "👩🏻‍❤️‍💋‍👩🏽", + "👩🏻‍❤‍💋‍👩🏽", + "👩🏻‍❤️‍💋‍👩🏾", + "👩🏻‍❤‍💋‍👩🏾", + "👩🏻‍❤️‍💋‍👩🏿", + "👩🏻‍❤‍💋‍👩🏿", + "👩🏼‍❤️‍💋‍👩🏻", + "👩🏼‍❤‍💋‍👩🏻", + "👩🏼‍❤️‍💋‍👩🏼", + "👩🏼‍❤‍💋‍👩🏼", + "👩🏼‍❤️‍💋‍👩🏽", + "👩🏼‍❤‍💋‍👩🏽", + "👩🏼‍❤️‍💋‍👩🏾", + "👩🏼‍❤‍💋‍👩🏾", + "👩🏼‍❤️‍💋‍👩🏿", + "👩🏼‍❤‍💋‍👩🏿", + "👩🏽‍❤️‍💋‍👩🏻", + "👩🏽‍❤‍💋‍👩🏻", + "👩🏽‍❤️‍💋‍👩🏼", + "👩🏽‍❤‍💋‍👩🏼", + "👩🏽‍❤️‍💋‍👩🏽", + "👩🏽‍❤‍💋‍👩🏽", + "👩🏽‍❤️‍💋‍👩🏾", + "👩🏽‍❤‍💋‍👩🏾", + "👩🏽‍❤️‍💋‍👩🏿", + "👩🏽‍❤‍💋‍👩🏿", + "👩🏾‍❤️‍💋‍👩🏻", + "👩🏾‍❤‍💋‍👩🏻", + "👩🏾‍❤️‍💋‍👩🏼", + "👩🏾‍❤‍💋‍👩🏼", + "👩🏾‍❤️‍💋‍👩🏽", + "👩🏾‍❤‍💋‍👩🏽", + "👩🏾‍❤️‍💋‍👩🏾", + "👩🏾‍❤‍💋‍👩🏾", + "👩🏾‍❤️‍💋‍👩🏿", + "👩🏾‍❤‍💋‍👩🏿", + "👩🏿‍❤️‍💋‍👩🏻", + "👩🏿‍❤‍💋‍👩🏻", + "👩🏿‍❤️‍💋‍👩🏼", + "👩🏿‍❤‍💋‍👩🏼", + "👩🏿‍❤️‍💋‍👩🏽", + "👩🏿‍❤‍💋‍👩🏽", + "👩🏿‍❤️‍💋‍👩🏾", + "👩🏿‍❤‍💋‍👩🏾", + "👩🏿‍❤️‍💋‍👩🏿", + "👩🏿‍❤‍💋‍👩🏿", + "💑", + "💑🏻", + "💑🏼", + "💑🏽", + "💑🏾", + "💑🏿", + "🧑🏻‍❤️‍🧑🏼", + "🧑🏻‍❤‍🧑🏼", + "🧑🏻‍❤️‍🧑🏽", + "🧑🏻‍❤‍🧑🏽", + "🧑🏻‍❤️‍🧑🏾", + "🧑🏻‍❤‍🧑🏾", + "🧑🏻‍❤️‍🧑🏿", + "🧑🏻‍❤‍🧑🏿", + "🧑🏼‍❤️‍🧑🏻", + "🧑🏼‍❤‍🧑🏻", + "🧑🏼‍❤️‍🧑🏽", + "🧑🏼‍❤‍🧑🏽", + "🧑🏼‍❤️‍🧑🏾", + "🧑🏼‍❤‍🧑🏾", + "🧑🏼‍❤️‍🧑🏿", + "🧑🏼‍❤‍🧑🏿", + "🧑🏽‍❤️‍🧑🏻", + "🧑🏽‍❤‍🧑🏻", + "🧑🏽‍❤️‍🧑🏼", + "🧑🏽‍❤‍🧑🏼", + "🧑🏽‍❤️‍🧑🏾", + "🧑🏽‍❤‍🧑🏾", + "🧑🏽‍❤️‍🧑🏿", + "🧑🏽‍❤‍🧑🏿", + "🧑🏾‍❤️‍🧑🏻", + "🧑🏾‍❤‍🧑🏻", + "🧑🏾‍❤️‍🧑🏼", + "🧑🏾‍❤‍🧑🏼", + "🧑🏾‍❤️‍🧑🏽", + "🧑🏾‍❤‍🧑🏽", + "🧑🏾‍❤️‍🧑🏿", + "🧑🏾‍❤‍🧑🏿", + "🧑🏿‍❤️‍🧑🏻", + "🧑🏿‍❤‍🧑🏻", + "🧑🏿‍❤️‍🧑🏼", + "🧑🏿‍❤‍🧑🏼", + "🧑🏿‍❤️‍🧑🏽", + "🧑🏿‍❤‍🧑🏽", + "🧑🏿‍❤️‍🧑🏾", + "🧑🏿‍❤‍🧑🏾", + "👩‍❤️‍👨", + "👩‍❤‍👨", + "👩🏻‍❤️‍👨🏻", + "👩🏻‍❤‍👨🏻", + "👩🏻‍❤️‍👨🏼", + "👩🏻‍❤‍👨🏼", + "👩🏻‍❤️‍👨🏽", + "👩🏻‍❤‍👨🏽", + "👩🏻‍❤️‍👨🏾", + "👩🏻‍❤‍👨🏾", + "👩🏻‍❤️‍👨🏿", + "👩🏻‍❤‍👨🏿", + "👩🏼‍❤️‍👨🏻", + "👩🏼‍❤‍👨🏻", + "👩🏼‍❤️‍👨🏼", + "👩🏼‍❤‍👨🏼", + "👩🏼‍❤️‍👨🏽", + "👩🏼‍❤‍👨🏽", + "👩🏼‍❤️‍👨🏾", + "👩🏼‍❤‍👨🏾", + "👩🏼‍❤️‍👨🏿", + "👩🏼‍❤‍👨🏿", + "👩🏽‍❤️‍👨🏻", + "👩🏽‍❤‍👨🏻", + "👩🏽‍❤️‍👨🏼", + "👩🏽‍❤‍👨🏼", + "👩🏽‍❤️‍👨🏽", + "👩🏽‍❤‍👨🏽", + "👩🏽‍❤️‍👨🏾", + "👩🏽‍❤‍👨🏾", + "👩🏽‍❤️‍👨🏿", + "👩🏽‍❤‍👨🏿", + "👩🏾‍❤️‍👨🏻", + "👩🏾‍❤‍👨🏻", + "👩🏾‍❤️‍👨🏼", + "👩🏾‍❤‍👨🏼", + "👩🏾‍❤️‍👨🏽", + "👩🏾‍❤‍👨🏽", + "👩🏾‍❤️‍👨🏾", + "👩🏾‍❤‍👨🏾", + "👩🏾‍❤️‍👨🏿", + "👩🏾‍❤‍👨🏿", + "👩🏿‍❤️‍👨🏻", + "👩🏿‍❤‍👨🏻", + "👩🏿‍❤️‍👨🏼", + "👩🏿‍❤‍👨🏼", + "👩🏿‍❤️‍👨🏽", + "👩🏿‍❤‍👨🏽", + "👩🏿‍❤️‍👨🏾", + "👩🏿‍❤‍👨🏾", + "👩🏿‍❤️‍👨🏿", + "👩🏿‍❤‍👨🏿", + "👨‍❤️‍👨", + "👨‍❤‍👨", + "👨🏻‍❤️‍👨🏻", + "👨🏻‍❤‍👨🏻", + "👨🏻‍❤️‍👨🏼", + "👨🏻‍❤‍👨🏼", + "👨🏻‍❤️‍👨🏽", + "👨🏻‍❤‍👨🏽", + "👨🏻‍❤️‍👨🏾", + "👨🏻‍❤‍👨🏾", + "👨🏻‍❤️‍👨🏿", + "👨🏻‍❤‍👨🏿", + "👨🏼‍❤️‍👨🏻", + "👨🏼‍❤‍👨🏻", + "👨🏼‍❤️‍👨🏼", + "👨🏼‍❤‍👨🏼", + "👨🏼‍❤️‍👨🏽", + "👨🏼‍❤‍👨🏽", + "👨🏼‍❤️‍👨🏾", + "👨🏼‍❤‍👨🏾", + "👨🏼‍❤️‍👨🏿", + "👨🏼‍❤‍👨🏿", + "👨🏽‍❤️‍👨🏻", + "👨🏽‍❤‍👨🏻", + "👨🏽‍❤️‍👨🏼", + "👨🏽‍❤‍👨🏼", + "👨🏽‍❤️‍👨🏽", + "👨🏽‍❤‍👨🏽", + "👨🏽‍❤️‍👨🏾", + "👨🏽‍❤‍👨🏾", + "👨🏽‍❤️‍👨🏿", + "👨🏽‍❤‍👨🏿", + "👨🏾‍❤️‍👨🏻", + "👨🏾‍❤‍👨🏻", + "👨🏾‍❤️‍👨🏼", + "👨🏾‍❤‍👨🏼", + "👨🏾‍❤️‍👨🏽", + "👨🏾‍❤‍👨🏽", + "👨🏾‍❤️‍👨🏾", + "👨🏾‍❤‍👨🏾", + "👨🏾‍❤️‍👨🏿", + "👨🏾‍❤‍👨🏿", + "👨🏿‍❤️‍👨🏻", + "👨🏿‍❤‍👨🏻", + "👨🏿‍❤️‍👨🏼", + "👨🏿‍❤‍👨🏼", + "👨🏿‍❤️‍👨🏽", + "👨🏿‍❤‍👨🏽", + "👨🏿‍❤️‍👨🏾", + "👨🏿‍❤‍👨🏾", + "👨🏿‍❤️‍👨🏿", + "👨🏿‍❤‍👨🏿", + "👩‍❤️‍👩", + "👩‍❤‍👩", + "👩🏻‍❤️‍👩🏻", + "👩🏻‍❤‍👩🏻", + "👩🏻‍❤️‍👩🏼", + "👩🏻‍❤‍👩🏼", + "👩🏻‍❤️‍👩🏽", + "👩🏻‍❤‍👩🏽", + "👩🏻‍❤️‍👩🏾", + "👩🏻‍❤‍👩🏾", + "👩🏻‍❤️‍👩🏿", + "👩🏻‍❤‍👩🏿", + "👩🏼‍❤️‍👩🏻", + "👩🏼‍❤‍👩🏻", + "👩🏼‍❤️‍👩🏼", + "👩🏼‍❤‍👩🏼", + "👩🏼‍❤️‍👩🏽", + "👩🏼‍❤‍👩🏽", + "👩🏼‍❤️‍👩🏾", + "👩🏼‍❤‍👩🏾", + "👩🏼‍❤️‍👩🏿", + "👩🏼‍❤‍👩🏿", + "👩🏽‍❤️‍👩🏻", + "👩🏽‍❤‍👩🏻", + "👩🏽‍❤️‍👩🏼", + "👩🏽‍❤‍👩🏼", + "👩🏽‍❤️‍👩🏽", + "👩🏽‍❤‍👩🏽", + "👩🏽‍❤️‍👩🏾", + "👩🏽‍❤‍👩🏾", + "👩🏽‍❤️‍👩🏿", + "👩🏽‍❤‍👩🏿", + "👩🏾‍❤️‍👩🏻", + "👩🏾‍❤‍👩🏻", + "👩🏾‍❤️‍👩🏼", + "👩🏾‍❤‍👩🏼", + "👩🏾‍❤️‍👩🏽", + "👩🏾‍❤‍👩🏽", + "👩🏾‍❤️‍👩🏾", + "👩🏾‍❤‍👩🏾", + "👩🏾‍❤️‍👩🏿", + "👩🏾‍❤‍👩🏿", + "👩🏿‍❤️‍👩🏻", + "👩🏿‍❤‍👩🏻", + "👩🏿‍❤️‍👩🏼", + "👩🏿‍❤‍👩🏼", + "👩🏿‍❤️‍👩🏽", + "👩🏿‍❤‍👩🏽", + "👩🏿‍❤️‍👩🏾", + "👩🏿‍❤‍👩🏾", + "👩🏿‍❤️‍👩🏿", + "👩🏿‍❤‍👩🏿", + "👪", + "👨‍👩‍👦", + "👨‍👩‍👧", + "👨‍👩‍👧‍👦", + "👨‍👩‍👦‍👦", + "👨‍👩‍👧‍👧", + "👨‍👨‍👦", + "👨‍👨‍👧", + "👨‍👨‍👧‍👦", + "👨‍👨‍👦‍👦", + "👨‍👨‍👧‍👧", + "👩‍👩‍👦", + "👩‍👩‍👧", + "👩‍👩‍👧‍👦", + "👩‍👩‍👦‍👦", + "👩‍👩‍👧‍👧", + "👨‍👦", + "👨‍👦‍👦", + "👨‍👧", + "👨‍👧‍👦", + "👨‍👧‍👧", + "👩‍👦", + "👩‍👦‍👦", + "👩‍👧", + "👩‍👧‍👦", + "👩‍👧‍👧" + ], + "People & Body (person-symbol)": [ + "🗣️", + "🗣", + "👤", + "👥", + "🫂", + "👣" + ], + "Component (skin-tone)": [ + "🏻", + "🏼", + "🏽", + "🏾", + "🏿" + ], + "Component (hair-style)": [ + "🦰", + "🦱", + "🦳", + "🦲" + ], + "Animals & Nature (animal-mammal)": [ + "🐵", + "🐒", + "🦍", + "🦧", + "🐶", + "🐕", + "🦮", + "🐕‍🦺", + "🐩", + "🐺", + "🦊", + "🦝", + "🐱", + "🐈", + "🐈‍⬛", + "🦁", + "🐯", + "🐅", + "🐆", + "🐴", + "🐎", + "🦄", + "🦓", + "🦌", + "🦬", + "🐮", + "🐂", + "🐃", + "🐄", + "🐷", + "🐖", + "🐗", + "🐽", + "🐏", + "🐑", + "🐐", + "🐪", + "🐫", + "🦙", + "🦒", + "🐘", + "🦣", + "🦏", + "🦛", + "🐭", + "🐁", + "🐀", + "🐹", + "🐰", + "🐇", + "🐿️", + "🐿", + "🦫", + "🦔", + "🦇", + "🐻", + "🐻‍❄️", + "🐻‍❄", + "🐨", + "🐼", + "🦥", + "🦦", + "🦨", + "🦘", + "🦡", + "🐾" + ], + "Animals & Nature (animal-bird)": [ + "🦃", + "🐔", + "🐓", + "🐣", + "🐤", + "🐥", + "🐦", + "🐧", + "🕊️", + "🕊", + "🦅", + "🦆", + "🦢", + "🦉", + "🦤", + "🪶", + "🦩", + "🦚", + "🦜" + ], + "Animals & Nature (animal-amphibian)": [ + "🐸" + ], + "Animals & Nature (animal-reptile)": [ + "🐊", + "🐢", + "🦎", + "🐍", + "🐲", + "🐉", + "🦕", + "🦖" + ], + "Animals & Nature (animal-marine)": [ + "🐳", + "🐋", + "🐬", + "🦭", + "🐟", + "🐠", + "🐡", + "🦈", + "🐙", + "🐚" + ], + "Animals & Nature (animal-bug)": [ + "🐌", + "🦋", + "🐛", + "🐜", + "🐝", + "🪲", + "🐞", + "🦗", + "🪳", + "🕷️", + "🕷", + "🕸️", + "🕸", + "🦂", + "🦟", + "🪰", + "🪱", + "🦠" + ], + "Animals & Nature (plant-flower)": [ + "💐", + "🌸", + "💮", + "🏵️", + "🏵", + "🌹", + "🥀", + "🌺", + "🌻", + "🌼", + "🌷" + ], + "Animals & Nature (plant-other)": [ + "🌱", + "🪴", + "🌲", + "🌳", + "🌴", + "🌵", + "🌾", + "🌿", + "☘️", + "☘", + "🍀", + "🍁", + "🍂", + "🍃" + ], + "Food & Drink (food-fruit)": [ + "🍇", + "🍈", + "🍉", + "🍊", + "🍋", + "🍌", + "🍍", + "🥭", + "🍎", + "🍏", + "🍐", + "🍑", + "🍒", + "🍓", + "🫐", + "🥝", + "🍅", + "🫒", + "🥥" + ], + "Food & Drink (food-vegetable)": [ + "🥑", + "🍆", + "🥔", + "🥕", + "🌽", + "🌶️", + "🌶", + "🫑", + "🥒", + "🥬", + "🥦", + "🧄", + "🧅", + "🍄", + "🥜", + "🌰" + ], + "Food & Drink (food-prepared)": [ + "🍞", + "🥐", + "🥖", + "🫓", + "🥨", + "🥯", + "🥞", + "🧇", + "🧀", + "🍖", + "🍗", + "🥩", + "🥓", + "🍔", + "🍟", + "🍕", + "🌭", + "🥪", + "🌮", + "🌯", + "🫔", + "🥙", + "🧆", + "🥚", + "🍳", + "🥘", + "🍲", + "🫕", + "🥣", + "🥗", + "🍿", + "🧈", + "🧂", + "🥫" + ], + "Food & Drink (food-asian)": [ + "🍱", + "🍘", + "🍙", + "🍚", + "🍛", + "🍜", + "🍝", + "🍠", + "🍢", + "🍣", + "🍤", + "🍥", + "🥮", + "🍡", + "🥟", + "🥠", + "🥡" + ], + "Food & Drink (food-marine)": [ + "🦀", + "🦞", + "🦐", + "🦑", + "🦪" + ], + "Food & Drink (food-sweet)": [ + "🍦", + "🍧", + "🍨", + "🍩", + "🍪", + "🎂", + "🍰", + "🧁", + "🥧", + "🍫", + "🍬", + "🍭", + "🍮", + "🍯" + ], + "Food & Drink (drink)": [ + "🍼", + "🥛", + "☕", + "🫖", + "🍵", + "🍶", + "🍾", + "🍷", + "🍸", + "🍹", + "🍺", + "🍻", + "🥂", + "🥃", + "🥤", + "🧋", + "🧃", + "🧉", + "🧊" + ], + "Food & Drink (dishware)": [ + "🥢", + "🍽️", + "🍽", + "🍴", + "🥄", + "🔪", + "🏺" + ], + "Travel & Places (place-map)": [ + "🌍", + "🌎", + "🌏", + "🌐", + "🗺️", + "🗺", + "🗾", + "🧭" + ], + "Travel & Places (place-geographic)": [ + "🏔️", + "🏔", + "⛰️", + "⛰", + "🌋", + "🗻", + "🏕️", + "🏕", + "🏖️", + "🏖", + "🏜️", + "🏜", + "🏝️", + "🏝", + "🏞️", + "🏞" + ], + "Travel & Places (place-building)": [ + "🏟️", + "🏟", + "🏛️", + "🏛", + "🏗️", + "🏗", + "🧱", + "🪨", + "🪵", + "🛖", + "🏘️", + "🏘", + "🏚️", + "🏚", + "🏠", + "🏡", + "🏢", + "🏣", + "🏤", + "🏥", + "🏦", + "🏨", + "🏩", + "🏪", + "🏫", + "🏬", + "🏭", + "🏯", + "🏰", + "💒", + "🗼", + "🗽" + ], + "Travel & Places (place-religious)": [ + "⛪", + "🕌", + "🛕", + "🕍", + "⛩️", + "⛩", + "🕋" + ], + "Travel & Places (place-other)": [ + "⛲", + "⛺", + "🌁", + "🌃", + "🏙️", + "🏙", + "🌄", + "🌅", + "🌆", + "🌇", + "🌉", + "♨️", + "♨", + "🎠", + "🎡", + "🎢", + "💈", + "🎪" + ], + "Travel & Places (transport-ground)": [ + "🚂", + "🚃", + "🚄", + "🚅", + "🚆", + "🚇", + "🚈", + "🚉", + "🚊", + "🚝", + "🚞", + "🚋", + "🚌", + "🚍", + "🚎", + "🚐", + "🚑", + "🚒", + "🚓", + "🚔", + "🚕", + "🚖", + "🚗", + "🚘", + "🚙", + "🛻", + "🚚", + "🚛", + "🚜", + "🏎️", + "🏎", + "🏍️", + "🏍", + "🛵", + "🦽", + "🦼", + "🛺", + "🚲", + "🛴", + "🛹", + "🛼", + "🚏", + "🛣️", + "🛣", + "🛤️", + "🛤", + "🛢️", + "🛢", + "⛽", + "🚨", + "🚥", + "🚦", + "🛑", + "🚧" + ], + "Travel & Places (transport-water)": [ + "⚓", + "⛵", + "🛶", + "🚤", + "🛳️", + "🛳", + "⛴️", + "⛴", + "🛥️", + "🛥", + "🚢" + ], + "Travel & Places (transport-air)": [ + "✈️", + "✈", + "🛩️", + "🛩", + "🛫", + "🛬", + "🪂", + "💺", + "🚁", + "🚟", + "🚠", + "🚡", + "🛰️", + "🛰", + "🚀", + "🛸" + ], + "Travel & Places (hotel)": [ + "🛎️", + "🛎", + "🧳" + ], + "Travel & Places (time)": [ + "⌛", + "⏳", + "⌚", + "⏰", + "⏱️", + "⏱", + "⏲️", + "⏲", + "🕰️", + "🕰", + "🕛", + "🕧", + "🕐", + "🕜", + "🕑", + "🕝", + "🕒", + "🕞", + "🕓", + "🕟", + "🕔", + "🕠", + "🕕", + "🕡", + "🕖", + "🕢", + "🕗", + "🕣", + "🕘", + "🕤", + "🕙", + "🕥", + "🕚", + "🕦" + ], + "Travel & Places (sky & weather)": [ + "🌑", + "🌒", + "🌓", + "🌔", + "🌕", + "🌖", + "🌗", + "🌘", + "🌙", + "🌚", + "🌛", + "🌜", + "🌡️", + "🌡", + "☀️", + "☀", + "🌝", + "🌞", + "🪐", + "⭐", + "🌟", + "🌠", + "🌌", + "☁️", + "☁", + "⛅", + "⛈️", + "⛈", + "🌤️", + "🌤", + "🌥️", + "🌥", + "🌦️", + "🌦", + "🌧️", + "🌧", + "🌨️", + "🌨", + "🌩️", + "🌩", + "🌪️", + "🌪", + "🌫️", + "🌫", + "🌬️", + "🌬", + "🌀", + "🌈", + "🌂", + "☂️", + "☂", + "☔", + "⛱️", + "⛱", + "⚡", + "❄️", + "❄", + "☃️", + "☃", + "⛄", + "☄️", + "☄", + "🔥", + "💧", + "🌊" + ], + "Activities (event)": [ + "🎃", + "🎄", + "🎆", + "🎇", + "🧨", + "✨", + "🎈", + "🎉", + "🎊", + "🎋", + "🎍", + "🎎", + "🎏", + "🎐", + "🎑", + "🧧", + "🎀", + "🎁", + "🎗️", + "🎗", + "🎟️", + "🎟", + "🎫" + ], + "Activities (award-medal)": [ + "🎖️", + "🎖", + "🏆", + "🏅", + "🥇", + "🥈", + "🥉" + ], + "Activities (sport)": [ + "⚽", + "⚾", + "🥎", + "🏀", + "🏐", + "🏈", + "🏉", + "🎾", + "🥏", + "🎳", + "🏏", + "🏑", + "🏒", + "🥍", + "🏓", + "🏸", + "🥊", + "🥋", + "🥅", + "⛳", + "⛸️", + "⛸", + "🎣", + "🤿", + "🎽", + "🎿", + "🛷", + "🥌" + ], + "Activities (game)": [ + "🎯", + "🪀", + "🪁", + "🎱", + "🔮", + "🪄", + "🧿", + "🎮", + "🕹️", + "🕹", + "🎰", + "🎲", + "🧩", + "🧸", + "🪅", + "🪆", + "♠️", + "♠", + "♥️", + "♥", + "♦️", + "♦", + "♣️", + "♣", + "♟️", + "♟", + "🃏", + "🀄", + "🎴" + ], + "Activities (arts & crafts)": [ + "🎭", + "🖼️", + "🖼", + "🎨", + "🧵", + "🪡", + "🧶", + "🪢" + ], + "Objects (clothing)": [ + "👓", + "🕶️", + "🕶", + "🥽", + "🥼", + "🦺", + "👔", + "👕", + "👖", + "🧣", + "🧤", + "🧥", + "🧦", + "👗", + "👘", + "🥻", + "🩱", + "🩲", + "🩳", + "👙", + "👚", + "👛", + "👜", + "👝", + "🛍️", + "🛍", + "🎒", + "🩴", + "👞", + "👟", + "🥾", + "🥿", + "👠", + "👡", + "🩰", + "👢", + "👑", + "👒", + "🎩", + "🎓", + "🧢", + "🪖", + "⛑️", + "⛑", + "📿", + "💄", + "💍", + "💎" + ], + "Objects (sound)": [ + "🔇", + "🔈", + "🔉", + "🔊", + "📢", + "📣", + "📯", + "🔔", + "🔕" + ], + "Objects (music)": [ + "🎼", + "🎵", + "🎶", + "🎙️", + "🎙", + "🎚️", + "🎚", + "🎛️", + "🎛", + "🎤", + "🎧", + "📻" + ], + "Objects (musical-instrument)": [ + "🎷", + "🪗", + "🎸", + "🎹", + "🎺", + "🎻", + "🪕", + "🥁", + "🪘" + ], + "Objects (phone)": [ + "📱", + "📲", + "☎️", + "☎", + "📞", + "📟", + "📠" + ], + "Objects (computer)": [ + "🔋", + "🔌", + "💻", + "🖥️", + "🖥", + "🖨️", + "🖨", + "⌨️", + "⌨", + "🖱️", + "🖱", + "🖲️", + "🖲", + "💽", + "💾", + "💿", + "📀", + "🧮" + ], + "Objects (light & video)": [ + "🎥", + "🎞️", + "🎞", + "📽️", + "📽", + "🎬", + "📺", + "📷", + "📸", + "📹", + "📼", + "🔍", + "🔎", + "🕯️", + "🕯", + "💡", + "🔦", + "🏮", + "🪔" + ], + "Objects (book-paper)": [ + "📔", + "📕", + "📖", + "📗", + "📘", + "📙", + "📚", + "📓", + "📒", + "📃", + "📜", + "📄", + "📰", + "🗞️", + "🗞", + "📑", + "🔖", + "🏷️", + "🏷" + ], + "Objects (money)": [ + "💰", + "🪙", + "💴", + "💵", + "💶", + "💷", + "💸", + "💳", + "🧾", + "💹" + ], + "Objects (mail)": [ + "✉️", + "✉", + "📧", + "📨", + "📩", + "📤", + "📥", + "📦", + "📫", + "📪", + "📬", + "📭", + "📮", + "🗳️", + "🗳" + ], + "Objects (writing)": [ + "✏️", + "✏", + "✒️", + "✒", + "🖋️", + "🖋", + "🖊️", + "🖊", + "🖌️", + "🖌", + "🖍️", + "🖍", + "📝" + ], + "Objects (office)": [ + "💼", + "📁", + "📂", + "🗂️", + "🗂", + "📅", + "📆", + "🗒️", + "🗒", + "🗓️", + "🗓", + "📇", + "📈", + "📉", + "📊", + "📋", + "📌", + "📍", + "📎", + "🖇️", + "🖇", + "📏", + "📐", + "✂️", + "✂", + "🗃️", + "🗃", + "🗄️", + "🗄", + "🗑️", + "🗑" + ], + "Objects (lock)": [ + "🔒", + "🔓", + "🔏", + "🔐", + "🔑", + "🗝️", + "🗝" + ], + "Objects (tool)": [ + "🔨", + "🪓", + "⛏️", + "⛏", + "⚒️", + "⚒", + "🛠️", + "🛠", + "🗡️", + "🗡", + "⚔️", + "⚔", + "🔫", + "🪃", + "🏹", + "🛡️", + "🛡", + "🪚", + "🔧", + "🪛", + "🔩", + "⚙️", + "⚙", + "🗜️", + "🗜", + "⚖️", + "⚖", + "🦯", + "🔗", + "⛓️", + "⛓", + "🪝", + "🧰", + "🧲", + "🪜" + ], + "Objects (science)": [ + "⚗️", + "⚗", + "🧪", + "🧫", + "🧬", + "🔬", + "🔭", + "📡" + ], + "Objects (medical)": [ + "💉", + "🩸", + "💊", + "🩹", + "🩺" + ], + "Objects (household)": [ + "🚪", + "🛗", + "🪞", + "🪟", + "🛏️", + "🛏", + "🛋️", + "🛋", + "🪑", + "🚽", + "🪠", + "🚿", + "🛁", + "🪤", + "🪒", + "🧴", + "🧷", + "🧹", + "🧺", + "🧻", + "🪣", + "🧼", + "🪥", + "🧽", + "🧯", + "🛒" + ], + "Objects (other-object)": [ + "🚬", + "⚰️", + "⚰", + "🪦", + "⚱️", + "⚱", + "🗿", + "🪧" + ], + "Symbols (transport-sign)": [ + "🏧", + "🚮", + "🚰", + "♿", + "🚹", + "🚺", + "🚻", + "🚼", + "🚾", + "🛂", + "🛃", + "🛄", + "🛅" + ], + "Symbols (warning)": [ + "⚠️", + "⚠", + "🚸", + "⛔", + "🚫", + "🚳", + "🚭", + "🚯", + "🚱", + "🚷", + "📵", + "🔞", + "☢️", + "☢", + "☣️", + "☣" + ], + "Symbols (arrow)": [ + "⬆️", + "⬆", + "↗️", + "↗", + "➡️", + "➡", + "↘️", + "↘", + "⬇️", + "⬇", + "↙️", + "↙", + "⬅️", + "⬅", + "↖️", + "↖", + "↕️", + "↕", + "↔️", + "↔", + "↩️", + "↩", + "↪️", + "↪", + "⤴️", + "⤴", + "⤵️", + "⤵", + "🔃", + "🔄", + "🔙", + "🔚", + "🔛", + "🔜", + "🔝" + ], + "Symbols (religion)": [ + "🛐", + "⚛️", + "⚛", + "🕉️", + "🕉", + "✡️", + "✡", + "☸️", + "☸", + "☯️", + "☯", + "✝️", + "✝", + "☦️", + "☦", + "☪️", + "☪", + "☮️", + "☮", + "🕎", + "🔯" + ], + "Symbols (zodiac)": [ + "♈", + "♉", + "♊", + "♋", + "♌", + "♍", + "♎", + "♏", + "♐", + "♑", + "♒", + "♓", + "⛎" + ], + "Symbols (av-symbol)": [ + "🔀", + "🔁", + "🔂", + "▶️", + "▶", + "⏩", + "⏭️", + "⏭", + "⏯️", + "⏯", + "◀️", + "◀", + "⏪", + "⏮️", + "⏮", + "🔼", + "⏫", + "🔽", + "⏬", + "⏸️", + "⏸", + "⏹️", + "⏹", + "⏺️", + "⏺", + "⏏️", + "⏏", + "🎦", + "🔅", + "🔆", + "📶", + "📳", + "📴" + ], + "Symbols (gender)": [ + "♀️", + "♀", + "♂️", + "♂", + "⚧️", + "⚧" + ], + "Symbols (math)": [ + "✖️", + "✖", + "➕", + "➖", + "➗", + "♾️", + "♾" + ], + "Symbols (punctuation)": [ + "‼️", + "‼", + "⁉️", + "⁉", + "❓", + "❔", + "❕", + "❗", + "〰️", + "〰" + ], + "Symbols (currency)": [ + "💱", + "💲" + ], + "Symbols (other-symbol)": [ + "⚕️", + "⚕", + "♻️", + "♻", + "⚜️", + "⚜", + "🔱", + "📛", + "🔰", + "⭕", + "✅", + "☑️", + "☑", + "✔️", + "✔", + "❌", + "❎", + "➰", + "➿", + "〽️", + "〽", + "✳️", + "✳", + "✴️", + "✴", + "❇️", + "❇", + "©️", + "©", + "®️", + "®", + "™️", + "™" + ], + "Symbols (keycap)": [ + "#️⃣", + "#⃣", + "*️⃣", + "*⃣", + "0️⃣", + "0⃣", + "1️⃣", + "1⃣", + "2️⃣", + "2⃣", + "3️⃣", + "3⃣", + "4️⃣", + "4⃣", + "5️⃣", + "5⃣", + "6️⃣", + "6⃣", + "7️⃣", + "7⃣", + "8️⃣", + "8⃣", + "9️⃣", + "9⃣", + "🔟" + ], + "Symbols (alphanum)": [ + "🔠", + "🔡", + "🔢", + "🔣", + "🔤", + "🅰️", + "🅰", + "🆎", + "🅱️", + "🅱", + "🆑", + "🆒", + "🆓", + "ℹ️", + "ℹ", + "🆔", + "Ⓜ️", + "Ⓜ", + "🆕", + "🆖", + "🅾️", + "🅾", + "🆗", + "🅿️", + "🅿", + "🆘", + "🆙", + "🆚", + "🈁", + "🈂️", + "🈂", + "🈷️", + "🈷", + "🈶", + "🈯", + "🉐", + "🈹", + "🈚", + "🈲", + "🉑", + "🈸", + "🈴", + "🈳", + "㊗️", + "㊗", + "㊙️", + "㊙", + "🈺", + "🈵" + ], + "Symbols (geometric)": [ + "🔴", + "🟠", + "🟡", + "🟢", + "🔵", + "🟣", + "🟤", + "⚫", + "⚪", + "🟥", + "🟧", + "🟨", + "🟩", + "🟦", + "🟪", + "🟫", + "⬛", + "⬜", + "◼️", + "◼", + "◻️", + "◻", + "◾", + "◽", + "▪️", + "▪", + "▫️", + "▫", + "🔶", + "🔷", + "🔸", + "🔹", + "🔺", + "🔻", + "💠", + "🔘", + "🔳", + "🔲" + ], + "Flags (flag)": [ + "🏁", + "🚩", + "🎌", + "🏴", + "🏳️", + "🏳", + "🏳️‍🌈", + "🏳‍🌈", + "🏳️‍⚧️", + "🏳‍⚧️", + "🏳️‍⚧", + "🏳‍⚧", + "🏴‍☠️", + "🏴‍☠" + ], + "Flags (country-flag)": [ + "🇦🇨", + "🇦🇩", + "🇦🇪", + "🇦🇫", + "🇦🇬", + "🇦🇮", + "🇦🇱", + "🇦🇲", + "🇦🇴", + "🇦🇶", + "🇦🇷", + "🇦🇸", + "🇦🇹", + "🇦🇺", + "🇦🇼", + "🇦🇽", + "🇦🇿", + "🇧🇦", + "🇧🇧", + "🇧🇩", + "🇧🇪", + "🇧🇫", + "🇧🇬", + "🇧🇭", + "🇧🇮", + "🇧🇯", + "🇧🇱", + "🇧🇲", + "🇧🇳", + "🇧🇴", + "🇧🇶", + "🇧🇷", + "🇧🇸", + "🇧🇹", + "🇧🇻", + "🇧🇼", + "🇧🇾", + "🇧🇿", + "🇨🇦", + "🇨🇨", + "🇨🇩", + "🇨🇫", + "🇨🇬", + "🇨🇭", + "🇨🇮", + "🇨🇰", + "🇨🇱", + "🇨🇲", + "🇨🇳", + "🇨🇴", + "🇨🇵", + "🇨🇷", + "🇨🇺", + "🇨🇻", + "🇨🇼", + "🇨🇽", + "🇨🇾", + "🇨🇿", + "🇩🇪", + "🇩🇬", + "🇩🇯", + "🇩🇰", + "🇩🇲", + "🇩🇴", + "🇩🇿", + "🇪🇦", + "🇪🇨", + "🇪🇪", + "🇪🇬", + "🇪🇭", + "🇪🇷", + "🇪🇸", + "🇪🇹", + "🇪🇺", + "🇫🇮", + "🇫🇯", + "🇫🇰", + "🇫🇲", + "🇫🇴", + "🇫🇷", + "🇬🇦", + "🇬🇧", + "🇬🇩", + "🇬🇪", + "🇬🇫", + "🇬🇬", + "🇬🇭", + "🇬🇮", + "🇬🇱", + "🇬🇲", + "🇬🇳", + "🇬🇵", + "🇬🇶", + "🇬🇷", + "🇬🇸", + "🇬🇹", + "🇬🇺", + "🇬🇼", + "🇬🇾", + "🇭🇰", + "🇭🇲", + "🇭🇳", + "🇭🇷", + "🇭🇹", + "🇭🇺", + "🇮🇨", + "🇮🇩", + "🇮🇪", + "🇮🇱", + "🇮🇲", + "🇮🇳", + "🇮🇴", + "🇮🇶", + "🇮🇷", + "🇮🇸", + "🇮🇹", + "🇯🇪", + "🇯🇲", + "🇯🇴", + "🇯🇵", + "🇰🇪", + "🇰🇬", + "🇰🇭", + "🇰🇮", + "🇰🇲", + "🇰🇳", + "🇰🇵", + "🇰🇷", + "🇰🇼", + "🇰🇾", + "🇰🇿", + "🇱🇦", + "🇱🇧", + "🇱🇨", + "🇱🇮", + "🇱🇰", + "🇱🇷", + "🇱🇸", + "🇱🇹", + "🇱🇺", + "🇱🇻", + "🇱🇾", + "🇲🇦", + "🇲🇨", + "🇲🇩", + "🇲🇪", + "🇲🇫", + "🇲🇬", + "🇲🇭", + "🇲🇰", + "🇲🇱", + "🇲🇲", + "🇲🇳", + "🇲🇴", + "🇲🇵", + "🇲🇶", + "🇲🇷", + "🇲🇸", + "🇲🇹", + "🇲🇺", + "🇲🇻", + "🇲🇼", + "🇲🇽", + "🇲🇾", + "🇲🇿", + "🇳🇦", + "🇳🇨", + "🇳🇪", + "🇳🇫", + "🇳🇬", + "🇳🇮", + "🇳🇱", + "🇳🇴", + "🇳🇵", + "🇳🇷", + "🇳🇺", + "🇳🇿", + "🇴🇲", + "🇵🇦", + "🇵🇪", + "🇵🇫", + "🇵🇬", + "🇵🇭", + "🇵🇰", + "🇵🇱", + "🇵🇲", + "🇵🇳", + "🇵🇷", + "🇵🇸", + "🇵🇹", + "🇵🇼", + "🇵🇾", + "🇶🇦", + "🇷🇪", + "🇷🇴", + "🇷🇸", + "🇷🇺", + "🇷🇼", + "🇸🇦", + "🇸🇧", + "🇸🇨", + "🇸🇩", + "🇸🇪", + "🇸🇬", + "🇸🇭", + "🇸🇮", + "🇸🇯", + "🇸🇰", + "🇸🇱", + "🇸🇲", + "🇸🇳", + "🇸🇴", + "🇸🇷", + "🇸🇸", + "🇸🇹", + "🇸🇻", + "🇸🇽", + "🇸🇾", + "🇸🇿", + "🇹🇦", + "🇹🇨", + "🇹🇩", + "🇹🇫", + "🇹🇬", + "🇹🇭", + "🇹🇯", + "🇹🇰", + "🇹🇱", + "🇹🇲", + "🇹🇳", + "🇹🇴", + "🇹🇷", + "🇹🇹", + "🇹🇻", + "🇹🇼", + "🇹🇿", + "🇺🇦", + "🇺🇬", + "🇺🇲", + "🇺🇳", + "🇺🇸", + "🇺🇾", + "🇺🇿", + "🇻🇦", + "🇻🇨", + "🇻🇪", + "🇻🇬", + "🇻🇮", + "🇻🇳", + "🇻🇺", + "🇼🇫", + "🇼🇸", + "🇽🇰", + "🇾🇪", + "🇾🇹", + "🇿🇦", + "🇿🇲", + "🇿🇼" + ], + "Flags (subdivision-flag)": [ + "🏴󠁧󠁢󠁥󠁮󠁧󠁿", + "🏴󠁧󠁢󠁳󠁣󠁴󠁿", + "🏴󠁧󠁢󠁷󠁬󠁳󠁿" + ] +} \ No newline at end of file diff --git a/packages/client/src/components/emoji-picker/index.module.scss b/packages/client/src/components/emoji-picker/index.module.scss new file mode 100644 index 0000000..03791d8 --- /dev/null +++ b/packages/client/src/components/emoji-picker/index.module.scss @@ -0,0 +1,19 @@ +.listWrap { + display: flex; + padding: 0; + margin: 0; + overflow: auto; + list-style: none; + flex-wrap: wrap; + + > div { + display: flex; + justify-content: center; + align-items: center; + width: 32px; + height: 32px; + padding: 4px; + font-size: 24px; + cursor: pointer; + } +} diff --git a/packages/client/src/components/emoji-picker/index.tsx b/packages/client/src/components/emoji-picker/index.tsx new file mode 100644 index 0000000..473be36 --- /dev/null +++ b/packages/client/src/components/emoji-picker/index.tsx @@ -0,0 +1,148 @@ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; + +import { Button, Popover, SideSheet, TabPane, Tabs } from '@douyinfe/semi-ui'; + +import { createKeysLocalStorageLRUCache } from 'helpers/lru-cache'; +import { IsOnMobile } from 'hooks/use-on-mobile'; +import { useToggle } from 'hooks/use-toggle'; + +import { ACTIVITIES, EXPRESSIONES, GESTURES, OBJECTS, SKY_WEATHER, SYMBOLS } from './constants'; + +import styles from './index.module.scss'; + +const emojiLocalStorageLRUCache = createKeysLocalStorageLRUCache('EMOJI_PICKER', 20); + +const LIST = [ + { + title: '表情', + data: EXPRESSIONES, + }, + { + title: '天气', + data: SKY_WEATHER, + }, + { + title: '手势', + data: GESTURES, + }, + { + title: '符号', + data: SYMBOLS, + }, + { + title: '物体', + data: OBJECTS, + }, + { + title: '运动', + data: ACTIVITIES, + }, +]; + +interface IProps { + showClear?: boolean; + onSelectEmoji: (arg: string) => void; +} + +export const EmojiPicker: React.FC = ({ showClear = false, onSelectEmoji, children }) => { + const { isMobile } = IsOnMobile.useHook(); + const [recentUsed, setRecentUsed] = useState([]); + const [visible, toggleVisible] = useToggle(false); + const renderedList = useMemo( + () => (recentUsed.length ? [{ title: '最近使用', data: recentUsed }, ...LIST] : LIST), + [recentUsed] + ); + + const selectEmoji = useCallback( + (emoji) => { + emojiLocalStorageLRUCache.put(emoji); + setRecentUsed(emojiLocalStorageLRUCache.get() as string[]); + onSelectEmoji && onSelectEmoji(emoji); + }, + [onSelectEmoji] + ); + + const clear = useCallback(() => { + onSelectEmoji(''); + }, [onSelectEmoji]); + + const content = useMemo( + () => + !visible ? null : ( +
+ + 清除 + + ) : null + } + collapsible + > + {renderedList.map((list) => { + return ( + +
+ {(list.data || []).map((ex) => ( +
selectEmoji(ex)}> + {ex} +
+ ))} +
+
+ ); + })} +
+
+ ), + [visible, showClear, renderedList, selectEmoji, clear] + ); + + useEffect(() => { + if (!visible) return; + emojiLocalStorageLRUCache.syncFromStorage(); + setRecentUsed(emojiLocalStorageLRUCache.get() as string[]); + }, [visible]); + + return ( + + {isMobile ? ( + <> + + {content} + + toggleVisible(true)}>{children} + + ) : ( + {content}} + > + {children} + + )} + + ); +}; diff --git a/packages/client/src/components/empty.tsx b/packages/client/src/components/empty.tsx new file mode 100644 index 0000000..de3f0df --- /dev/null +++ b/packages/client/src/components/empty.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import { Typography } from '@douyinfe/semi-ui'; + +interface IProps { + illustration?: React.ReactNode; + message: React.ReactNode; +} + +const { Text } = Typography; + +export const Empty: React.FC = ({ illustration = null, message }) => { + return ( +
+ {illustration &&
{illustration}
} +
+ {message} +
+
+ ); +}; diff --git a/packages/client/src/components/grid-select/grid-cell.tsx b/packages/client/src/components/grid-select/grid-cell.tsx new file mode 100644 index 0000000..a472e2c --- /dev/null +++ b/packages/client/src/components/grid-select/grid-cell.tsx @@ -0,0 +1,61 @@ +import React, { MouseEventHandler } from 'react'; + +type CellProperties = { + hover: boolean; + disabled: boolean; + cellSize: number; + onMouseDown: MouseEventHandler; + onMouseEnter: MouseEventHandler; + styles: Record; + id: string; +}; + +const getBaseStyles = (cellSize) => ({ + cell: { + width: cellSize, + height: cellSize, + background: '#fff', + cursor: 'pointer', + borderRadius: 3, + border: '1px solid #bababa', + }, + active: { + border: '1px solid #4d6cdd', + background: '#4d6cdd', + }, + hover: { + border: '1px solid #fff', + background: '#4d6cdd', + }, + disabled: { + filter: 'brightness(0.7)', + }, +}); + +const getMergedStyle = (baseStyles, styles, styleClass) => ({ + ...baseStyles[styleClass], + ...(styles && styles[styleClass] ? styles[styleClass] : {}), +}); + +export const GridCell = ({ hover, disabled, onMouseDown, onMouseEnter, cellSize, styles, id }: CellProperties) => { + const baseStyles = getBaseStyles(cellSize); + const cellStyles = { + cell: getMergedStyle(baseStyles, styles, 'cell'), + active: getMergedStyle(baseStyles, styles, 'active'), + hover: getMergedStyle(baseStyles, styles, 'hover'), + disabled: getMergedStyle(baseStyles, styles, 'disabled'), + }; + + return ( +
+ ); +}; diff --git a/packages/client/src/components/grid-select/grid-select.tsx b/packages/client/src/components/grid-select/grid-select.tsx new file mode 100644 index 0000000..52105c2 --- /dev/null +++ b/packages/client/src/components/grid-select/grid-select.tsx @@ -0,0 +1,122 @@ +import React, { useCallback, useMemo, useState } from 'react'; + +import { Typography } from '@douyinfe/semi-ui'; + +import { GridCell } from './grid-cell'; + +const { Text } = Typography; + +export type RegionSelectionProps = { + rows?: number; + cols?: number; + onSelect: (arg: { rows: number; cols: number }) => void; + cellSize?: number; + disabled?: boolean; + styles?: { + active?: React.CSSProperties; + hover?: React.CSSProperties; + cell?: React.CSSProperties; + grid?: React.CSSProperties; + disabled?: React.CSSProperties; + }; +}; + +type CoordsType = { + x: number; + y: number; +}; + +const getBaseStyles = (cols, cellSize) => ({ + grid: { + position: 'relative', + display: 'grid', + color: '#444', + margin: '8px 0', + gridGap: '4px 6px', + gridTemplateColumns: Array(cols).fill(`${cellSize}px`).join(' '), + }, +}); + +export const GridSelect = ({ + onSelect, + rows = 10, + cols = 10, + disabled = false, + cellSize = 16, + styles, +}: RegionSelectionProps) => { + const [hoverCell, setHoverCell] = useState(null); + + const onClick = useCallback( + ({ x, y, isCellDisabled }) => { + onSelect({ + rows: y + 1, + cols: x + 1, + }); + }, + [onSelect] + ); + + const onClickPanel = useCallback(() => { + if (hoverCell.x + 1 > 0 && hoverCell.y + 1 > 0) { + onSelect({ + rows: hoverCell.y + 1, + cols: hoverCell.x + 1, + }); + } + }, [hoverCell, onSelect]); + + const onHover = useCallback(({ x, y, isCellDisabled }) => { + if (isCellDisabled) { + return setHoverCell(null); + } + setHoverCell({ x, y }); + }, []); + + const cells = useMemo(() => { + const cells = []; + for (let y = 0; y < rows; y++) { + for (let x = 0; x < cols; x++) { + const isHover = hoverCell && x <= hoverCell.x && y <= hoverCell.y; + const isCellDisabled = disabled; + cells.push( + { + e.stopPropagation(); + onClick({ x, y, isCellDisabled }); + }} + onMouseEnter={onHover.bind(null, { x, y, isCellDisabled })} + hover={isHover} + disabled={isCellDisabled} + styles={styles} + cellSize={cellSize} + /> + ); + } + } + return cells; + }, [rows, cols, disabled, cellSize, hoverCell, styles, onClick, onHover]); + + const baseStyles = useMemo(() => getBaseStyles(cols, cellSize), [cols, cellSize]); + + return ( +
+
setHoverCell(null)} + > + {cells} +
+
+ {hoverCell ? `${hoverCell.y + 1} x ${hoverCell.x + 1}` : null} +
+
+ ); +}; diff --git a/packages/client/src/components/grid-select/index.tsx b/packages/client/src/components/grid-select/index.tsx new file mode 100644 index 0000000..7ea5444 --- /dev/null +++ b/packages/client/src/components/grid-select/index.tsx @@ -0,0 +1 @@ +export * from './grid-select'; diff --git a/packages/client/src/components/icons/IconAddColumnAfter.tsx b/packages/client/src/components/icons/IconAddColumnAfter.tsx new file mode 100644 index 0000000..c4e53c7 --- /dev/null +++ b/packages/client/src/components/icons/IconAddColumnAfter.tsx @@ -0,0 +1,14 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconAddColumnAfter: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconAddColumnBefore.tsx b/packages/client/src/components/icons/IconAddColumnBefore.tsx new file mode 100644 index 0000000..571733f --- /dev/null +++ b/packages/client/src/components/icons/IconAddColumnBefore.tsx @@ -0,0 +1,14 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconAddColumnBefore: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconAddRowAfter.tsx b/packages/client/src/components/icons/IconAddRowAfter.tsx new file mode 100644 index 0000000..64e52d9 --- /dev/null +++ b/packages/client/src/components/icons/IconAddRowAfter.tsx @@ -0,0 +1,17 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconAddRowAfter: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconAddRowBefore.tsx b/packages/client/src/components/icons/IconAddRowBefore.tsx new file mode 100644 index 0000000..9a4c314 --- /dev/null +++ b/packages/client/src/components/icons/IconAddRowBefore.tsx @@ -0,0 +1,17 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconAddRowBefore: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconAttachment.tsx b/packages/client/src/components/icons/IconAttachment.tsx new file mode 100644 index 0000000..596f9f2 --- /dev/null +++ b/packages/client/src/components/icons/IconAttachment.tsx @@ -0,0 +1,18 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconAttachment: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconCallout.tsx b/packages/client/src/components/icons/IconCallout.tsx new file mode 100644 index 0000000..3191a66 --- /dev/null +++ b/packages/client/src/components/icons/IconCallout.tsx @@ -0,0 +1,14 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconCallout: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconCenter.tsx b/packages/client/src/components/icons/IconCenter.tsx new file mode 100644 index 0000000..1bd335b --- /dev/null +++ b/packages/client/src/components/icons/IconCenter.tsx @@ -0,0 +1,18 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconCenter: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconClear.tsx b/packages/client/src/components/icons/IconClear.tsx new file mode 100644 index 0000000..fedc988 --- /dev/null +++ b/packages/client/src/components/icons/IconClear.tsx @@ -0,0 +1,17 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconClear: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconCodeBlock.tsx b/packages/client/src/components/icons/IconCodeBlock.tsx new file mode 100644 index 0000000..4aa90dc --- /dev/null +++ b/packages/client/src/components/icons/IconCodeBlock.tsx @@ -0,0 +1,21 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconCodeBlock: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconColumns.tsx b/packages/client/src/components/icons/IconColumns.tsx new file mode 100644 index 0000000..1530419 --- /dev/null +++ b/packages/client/src/components/icons/IconColumns.tsx @@ -0,0 +1,43 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconAddColBefore: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + + } + /> + ); +}; + +export const IconAddColAfter: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + + } + /> + ); +}; + +export const IconDeleteCol: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconCountdown.tsx b/packages/client/src/components/icons/IconCountdown.tsx new file mode 100644 index 0000000..477e62b --- /dev/null +++ b/packages/client/src/components/icons/IconCountdown.tsx @@ -0,0 +1,16 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconCountdown: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconDeleteColumn.tsx b/packages/client/src/components/icons/IconDeleteColumn.tsx new file mode 100644 index 0000000..3b49076 --- /dev/null +++ b/packages/client/src/components/icons/IconDeleteColumn.tsx @@ -0,0 +1,14 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconDeleteColumn: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconDeleteRow.tsx b/packages/client/src/components/icons/IconDeleteRow.tsx new file mode 100644 index 0000000..9e526cf --- /dev/null +++ b/packages/client/src/components/icons/IconDeleteRow.tsx @@ -0,0 +1,14 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconDeleteRow: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconDeleteTable.tsx b/packages/client/src/components/icons/IconDeleteTable.tsx new file mode 100644 index 0000000..4c3c3ff --- /dev/null +++ b/packages/client/src/components/icons/IconDeleteTable.tsx @@ -0,0 +1,14 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconDeleteTable: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconDocument.tsx b/packages/client/src/components/icons/IconDocument.tsx new file mode 100644 index 0000000..7a50f24 --- /dev/null +++ b/packages/client/src/components/icons/IconDocument.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +import { Icon } from '@douyinfe/semi-ui'; + +export const IconDocument: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconDocumentFill.tsx b/packages/client/src/components/icons/IconDocumentFill.tsx new file mode 100644 index 0000000..f8e26c3 --- /dev/null +++ b/packages/client/src/components/icons/IconDocumentFill.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +import { Icon } from '@douyinfe/semi-ui'; + +export const IconDocumentFill: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconDrawBoard.tsx b/packages/client/src/components/icons/IconDrawBoard.tsx new file mode 100644 index 0000000..fd63167 --- /dev/null +++ b/packages/client/src/components/icons/IconDrawBoard.tsx @@ -0,0 +1,32 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconDrawBoard: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconEmoji.tsx b/packages/client/src/components/icons/IconEmoji.tsx new file mode 100644 index 0000000..61901eb --- /dev/null +++ b/packages/client/src/components/icons/IconEmoji.tsx @@ -0,0 +1,18 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconEmoji: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconFlow.tsx b/packages/client/src/components/icons/IconFlow.tsx new file mode 100644 index 0000000..b4d49c1 --- /dev/null +++ b/packages/client/src/components/icons/IconFlow.tsx @@ -0,0 +1,17 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconFlow: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconFont.tsx b/packages/client/src/components/icons/IconFont.tsx new file mode 100644 index 0000000..8b6a085 --- /dev/null +++ b/packages/client/src/components/icons/IconFont.tsx @@ -0,0 +1,18 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconFont: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconFull.tsx b/packages/client/src/components/icons/IconFull.tsx new file mode 100644 index 0000000..e7fb71d --- /dev/null +++ b/packages/client/src/components/icons/IconFull.tsx @@ -0,0 +1,17 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconFull: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconFullscreen.tsx b/packages/client/src/components/icons/IconFullscreen.tsx new file mode 100644 index 0000000..8337943 --- /dev/null +++ b/packages/client/src/components/icons/IconFullscreen.tsx @@ -0,0 +1,18 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconFullscreen: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/IconGlobe.tsx b/packages/client/src/components/icons/IconGlobe.tsx new file mode 100644 index 0000000..de90c67 --- /dev/null +++ b/packages/client/src/components/icons/IconGlobe.tsx @@ -0,0 +1,27 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconGlobe: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( +
+
+ } />} + onClick={setImage(url)} + /> +
+ + ); + })} + + ); + })} + + ); + }), + [images, setImage] + ); + + const content = useMemo( + () => ( +
+ + 清除 + + } + > + {imageTabs} + + selectImage(url)} /> + + +
+ ), + [imageTabs, selectImage, clear] + ); + + return ( + + {isMobile ? ( + <> + + {content} + + toggleVisible(true)}>{children} + + ) : ( + {content}} + > + {children} + + )} + + ); +}; diff --git a/packages/client/src/components/image-viewer.tsx b/packages/client/src/components/image-viewer.tsx new file mode 100644 index 0000000..721b69c --- /dev/null +++ b/packages/client/src/components/image-viewer.tsx @@ -0,0 +1,32 @@ +import { useEffect } from 'react'; + +import Viewer from 'viewerjs'; + +interface IProps { + containerSelector?: string; + container?: HTMLElement; +} + +export const ImageViewer: React.FC = ({ container, containerSelector }) => { + useEffect(() => { + const el = container || document.querySelector(containerSelector); + if (!el) { + return null; + } + const viewer = new Viewer(el, { inline: false }); + const io = new MutationObserver(() => { + viewer.update(); + }); + io.observe(el, { + childList: true, + subtree: true, + }); + + return () => { + io.disconnect(); + viewer.destroy(); + }; + }, [container, containerSelector]); + + return null; +}; diff --git a/packages/client/src/components/locale-time/index.tsx b/packages/client/src/components/locale-time/index.tsx new file mode 100644 index 0000000..372ea2f --- /dev/null +++ b/packages/client/src/components/locale-time/index.tsx @@ -0,0 +1,45 @@ +import React, { useEffect, useMemo, useRef, useState } from 'react'; + +import * as timeagojs from 'timeago.js'; + +type Props = { + date: string | number | Date; +}; + +let callbacks: Array<() => void> = []; + +setInterval(() => { + callbacks.forEach((cb) => cb()); +}, 1000 * 60); + +function eachMinute(fn: () => void) { + callbacks.push(fn); + + return () => { + callbacks = callbacks.filter((cb) => cb !== fn); + }; +} + +const getTimeago = (date: number | string | Date) => { + return timeagojs.format(date, 'zh_CN'); +}; + +export const LocaleTime: React.FC = ({ date }) => { + const [, setMinutesMounted] = useState(0); + const callback = useRef<() => void>(); + const formatDate = useMemo(() => new Date(date).toLocaleDateString(), [date]); + + useEffect(() => { + callback.current = eachMinute(() => { + setMinutesMounted((state) => ++state); + }); + + return () => { + if (callback.current) { + callback.current(); + } + }; + }, []); + + return ; +}; diff --git a/packages/client/src/components/logo/index.module.scss b/packages/client/src/components/logo/index.module.scss new file mode 100644 index 0000000..e720445 --- /dev/null +++ b/packages/client/src/components/logo/index.module.scss @@ -0,0 +1,16 @@ +.wrap { + display: inline-flex !important; + flex-wrap: nowrap; + align-items: center; + + > svg { + width: 32px; + height: 32px; + } + + > span { + margin-left: 4px; + font-size: 1.2rem; + font-weight: 500; + } +} diff --git a/packages/client/src/components/logo/index.tsx b/packages/client/src/components/logo/index.tsx new file mode 100644 index 0000000..2cc1d24 --- /dev/null +++ b/packages/client/src/components/logo/index.tsx @@ -0,0 +1,51 @@ +import { Typography } from '@douyinfe/semi-ui'; + +import { RuntimeConfig } from 'hooks/use-runtime-config'; +import Link from 'next/link'; + +import styles from './index.module.scss'; + +const { Text } = Typography; + +export const LogoImage = () => { + const config = RuntimeConfig.useHook(); + + return ( + + + {config.logo ? ( + + ) : ( + + + + + + )} + + + ); +}; + +export const LogoText = () => { + const config = RuntimeConfig.useHook(); + + return ( + + + {config?.appName} + + + ); +}; diff --git a/packages/client/src/components/members/add.tsx b/packages/client/src/components/members/add.tsx new file mode 100644 index 0000000..6712e27 --- /dev/null +++ b/packages/client/src/components/members/add.tsx @@ -0,0 +1,62 @@ +import React, { useCallback, useState } from 'react'; + +import { Banner, Input, Popconfirm, Select, Space } from '@douyinfe/semi-ui'; + +import { AuthEnum, AuthEnumArray } from '@think/domains'; + +interface IProps { + onOk: (arg) => any; +} + +export const AddUser: React.FC = ({ onOk, children }) => { + const [userAuth, setUserAuth] = useState(AuthEnum.noAccess); + const [userName, setUserName] = useState(''); + + const handleOk = useCallback(() => { + onOk({ userName, userAuth }).then(() => { + setUserAuth(AuthEnum.noAccess); + setUserName(''); + }); + }, [onOk, userName, userAuth]); + + return ( + + {[AuthEnum.creator, AuthEnum.admin].includes(userAuth) ? ( + + ) : null} + + + + + + } + > + {children} + + ); +}; diff --git a/packages/client/src/components/members/edit.tsx b/packages/client/src/components/members/edit.tsx new file mode 100644 index 0000000..34b702d --- /dev/null +++ b/packages/client/src/components/members/edit.tsx @@ -0,0 +1,49 @@ +import React, { useCallback, useState } from 'react'; + +import { Banner, Popconfirm, Select, Toast } from '@douyinfe/semi-ui'; + +import { AuthEnum, AuthEnumArray, IAuth, IUser } from '@think/domains'; + +interface IProps { + userWithAuth: { user: IUser; auth: IAuth }; + updateUser: (arg) => any; +} + +export const EditUser: React.FC = ({ userWithAuth, updateUser, children }) => { + const [userAuth, setUserAuth] = useState(AuthEnum.noAccess); + + const handleOk = useCallback(() => { + return updateUser({ userName: userWithAuth.user.name, userAuth }).then(() => { + Toast.success('操作成功'); + }); + }, [updateUser, userAuth, userWithAuth]); + + return ( + + {[AuthEnum.creator, AuthEnum.admin].includes(userAuth) ? ( + + ) : null} + {} + + + } + onConfirm={handleOk} + > + {children} + + ); +}; diff --git a/packages/client/src/components/members/index.module.scss b/packages/client/src/components/members/index.module.scss new file mode 100644 index 0000000..7eb36ff --- /dev/null +++ b/packages/client/src/components/members/index.module.scss @@ -0,0 +1,6 @@ +.wrap { + > header { + display: flex; + justify-content: flex-end; + } +} diff --git a/packages/client/src/components/members/index.tsx b/packages/client/src/components/members/index.tsx new file mode 100644 index 0000000..0cefa7b --- /dev/null +++ b/packages/client/src/components/members/index.tsx @@ -0,0 +1,117 @@ +import React from 'react'; + +import { IconDelete, IconEdit } from '@douyinfe/semi-icons'; +import { Banner, Button, Popconfirm, Table, Typography } from '@douyinfe/semi-ui'; + +import { AuthEnumTextMap } from '@think/domains'; + +import { DataRender } from 'components/data-render'; +import { LocaleTime } from 'components/locale-time'; + +import { AddUser } from './add'; +import { EditUser } from './edit'; + +import styles from './index.module.scss'; + +interface IProps { + id: string; + hook: any; + descriptions?: Array; +} + +const { Title, Paragraph } = Typography; +const { Column } = Table; + +export const Members: React.FC = ({ id, hook, descriptions }) => { + const { data, loading, error, page, pageSize, setPage, addUser, updateUser, deleteUser } = hook(id); + + return ( +
+ ( +
+ 权限说明} + description={ +
+ {descriptions && descriptions.length ? ( + descriptions.map((desc) => { + return {desc}; + }) + ) : ( + <> + 超级管理员:管理组织内所有知识库、文档,可删除组织,默认创建者 + 管理员:管理组织内所有知识库、文档,不可删除组织 + 成员:可访问组织内所有知识库、文档,不可删除组织 + + )} +
+ } + /> +
+ + + +
+
+ + AuthEnumTextMap[auth]} + /> + } + /> + ( + <> + +
+
+ )} + /> + + ); +}; diff --git a/packages/client/src/components/message/index.module.scss b/packages/client/src/components/message/index.module.scss new file mode 100644 index 0000000..34d9e96 --- /dev/null +++ b/packages/client/src/components/message/index.module.scss @@ -0,0 +1,54 @@ +.titleWrap { + padding: 8px 16px; +} + +.itemsWrap { + max-height: 240px; + overflow: auto; +} + +.itemWrap { + border-radius: var(--semi-border-radius-small); + + &:hover { + color: var(--semi-color-text-0); + background-color: var(--semi-color-fill-0); + } + + .item { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + height: 32px; + padding: 4px 16px; + + .leftWrap { + display: flex; + overflow: hidden; + color: var(--semi-color-primary); + text-overflow: ellipsis; + white-space: nowrap; + align-items: center; + + > span { + word-break: break-all; + } + + svg { + fill: var(--semi-color-primary); + color: var(--semi-color-primary); + } + + > div { + display: flex; + flex-direction: column; + } + } + } +} + +.paginationWrap { + display: flex; + justify-content: center; +} diff --git a/packages/client/src/components/message/index.tsx b/packages/client/src/components/message/index.tsx new file mode 100644 index 0000000..50ebd5c --- /dev/null +++ b/packages/client/src/components/message/index.tsx @@ -0,0 +1,247 @@ +import React, { useCallback, useMemo } from 'react'; + +import { Badge, Button, Dropdown, Modal, Pagination, TabPane, Tabs, Typography } from '@douyinfe/semi-ui'; + +import { DataRender } from 'components/data-render'; +import { Empty } from 'components/empty'; +import { IconMessage } from 'components/icons/IconMessage'; +import { useAllMessages, useReadMessages, useUnreadMessages } from 'data/message'; +import { useUser } from 'data/user'; +import { IsOnMobile } from 'hooks/use-on-mobile'; +import { useToggle } from 'hooks/use-toggle'; +import { EmptyBoxIllustration } from 'illustrations/empty-box'; +import Link from 'next/link'; + +import { Placeholder } from './placeholder'; + +import styles from './index.module.scss'; + +const { Text } = Typography; +const PAGE_SIZE = 6; + +const MessagesRender = ({ messageData, loading, error, onClick = null, page = 1, onPageChange = null }) => { + const [messages, total] = useMemo( + () => [(messageData && messageData.data) || [], (messageData && messageData.total) || 0], + [messageData] + ); + + const handleRead = useCallback( + (messageId) => { + onClick && onClick(messageId); + }, + [onClick] + ); + + const renderNormalContent = useCallback(() => { + return ( +
{ + e.preventDefault(); + e.stopPropagation(); + }} + > + {messages.length ? ( + <> + {messages.map((msg) => { + return ( +
handleRead(msg.id)}> + + +
+ + {msg.title} + +
+
+ +
+ ); + })} + {total > PAGE_SIZE && ( +
+ +
+ )} + + ) : ( + } message="暂无消息" /> + )} +
+ ); + }, [handleRead, messages, onPageChange, page, total]); + + return ( + } error={error} normalContent={renderNormalContent} /> + ); +}; + +const MessageBox = () => { + const { isMobile } = IsOnMobile.useHook(); + const [visible, toggleVisible] = useToggle(false); + const { data: allMsgs, loading: allLoading, error: allError, page: allPage, setPage: allSetPage } = useAllMessages(); + const { + data: readMsgs, + loading: readLoading, + error: readError, + page: readPage, + setPage: readSetPage, + } = useReadMessages(); + const { + data: unreadMsgs, + loading: unreadLoading, + error: unreadError, + readMessage, + page: unreadPage, + setPage: unreadSetPage, + } = useUnreadMessages(); + + const clearAll = useCallback(() => { + Promise.all( + (unreadMsgs.data || []).map((msg) => { + return readMessage(msg.id); + }) + ); + }, [readMessage, unreadMsgs]); + + const openModalOnMobile = useCallback(() => { + if (!isMobile) return; + toggleVisible(true); + }, [isMobile, toggleVisible]); + + const content = useMemo( + () => + visible ? ( + 0 ? ( + + 全部已读 + + ) : null + } + > + + + + + + + + + + + ) : null, + [ + allError, + allLoading, + allMsgs, + allPage, + allSetPage, + clearAll, + readError, + readLoading, + readMessage, + readMsgs, + readPage, + readSetPage, + unreadError, + unreadLoading, + unreadMsgs, + unreadPage, + unreadSetPage, + visible, + ] + ); + + const btn = ( + + + + + + + + + +
+ +
+ + )} + /> + ); +}; diff --git a/packages/client/src/components/organization/setting/index.tsx b/packages/client/src/components/organization/setting/index.tsx new file mode 100644 index 0000000..39b55b8 --- /dev/null +++ b/packages/client/src/components/organization/setting/index.tsx @@ -0,0 +1,44 @@ +import React from 'react'; + +import { TabPane, Tabs } from '@douyinfe/semi-ui'; + +import { IOrganization } from '@think/domains'; + +import { Seo } from 'components/seo'; + +import { Base } from './base'; +import { OrganizationMembers } from './members'; +import { More } from './more'; + +interface IProps { + organizationId: IOrganization['id']; + tab?: string; + onNavigate: (arg: string) => void; +} + +const TitleMap = { + base: '基础信息', + members: '成员管理', + more: '更多', +}; + +export const OrganizationSetting: React.FC = ({ organizationId, tab, onNavigate }) => { + return ( + <> + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/client/src/components/organization/setting/members/index.tsx b/packages/client/src/components/organization/setting/members/index.tsx new file mode 100644 index 0000000..121cabf --- /dev/null +++ b/packages/client/src/components/organization/setting/members/index.tsx @@ -0,0 +1,14 @@ +import React from 'react'; + +import { IOrganization } from '@think/domains'; + +import { Members } from 'components/members'; +import { useOrganizationMembers } from 'data/organization'; + +interface IProps { + organizationId: IOrganization['id']; +} + +export const OrganizationMembers: React.FC = ({ organizationId }) => { + return ; +}; diff --git a/packages/client/src/components/organization/setting/more/index.tsx b/packages/client/src/components/organization/setting/more/index.tsx new file mode 100644 index 0000000..339a515 --- /dev/null +++ b/packages/client/src/components/organization/setting/more/index.tsx @@ -0,0 +1,24 @@ +import { Banner, Button, Typography } from '@douyinfe/semi-ui'; + +import { OrganizationDeletor } from 'components/organization/delete'; + +const { Paragraph } = Typography; + +export const More = ({ organizationId }) => { + return ( +
+ 删除组织及内部所有知识库以及文档,不可恢复!} + style={{ marginBottom: 16 }} + /> + + + +
+ ); +}; diff --git a/packages/client/src/components/organization/switcher/index.module.scss b/packages/client/src/components/organization/switcher/index.module.scss new file mode 100644 index 0000000..5458e72 --- /dev/null +++ b/packages/client/src/components/organization/switcher/index.module.scss @@ -0,0 +1,4 @@ +.nameWrap { + display: flex; + align-items: center; +} diff --git a/packages/client/src/components/organization/switcher/index.tsx b/packages/client/src/components/organization/switcher/index.tsx new file mode 100644 index 0000000..7ce7e1c --- /dev/null +++ b/packages/client/src/components/organization/switcher/index.tsx @@ -0,0 +1,163 @@ +import { useMemo } from 'react'; + +import { IconAppCenter, IconApps, IconSmallTriangleDown } from '@douyinfe/semi-icons'; +import { Button, Dropdown, Space, Typography } from '@douyinfe/semi-ui'; +import { Avatar } from '@douyinfe/semi-ui'; + +import { DataRender } from 'components/data-render'; +import { useOrganizationDetail, useUserOrganizations } from 'data/organization'; +import { useRouterQuery } from 'hooks/use-router-query'; +import Link from 'next/link'; + +import styles from './index.module.scss'; + +const { Text, Paragraph } = Typography; + +export const UserOrganizationsSwitcher = () => { + const { organizationId } = useRouterQuery<{ organizationId: string }>(); + const { + data: userOrganizations, + loading: userOrganizationsLoading, + error: userOrganizationsError, + } = useUserOrganizations(); + const filterUserOrganizations = useMemo(() => { + return userOrganizations && userOrganizations.length + ? userOrganizations.filter((org) => org.id !== organizationId) + : []; + }, [userOrganizations, organizationId]); + + return ( + { + return ( + + {filterUserOrganizations.length ? ( + <> + {filterUserOrganizations.map((org) => { + return ( + + + + + + {org.name} + + + + + ); + })} + + + ) : null} + + + + + + + + + + 前往广场 + + + + + + + + + + + + + + + 新建组织 + + + + + + + ); + }} + /> + } + > + + + } + > + {children} + + ); +}; diff --git a/packages/client/src/components/template/card/index.module.scss b/packages/client/src/components/template/card/index.module.scss new file mode 100644 index 0000000..1cc5e7d --- /dev/null +++ b/packages/client/src/components/template/card/index.module.scss @@ -0,0 +1,64 @@ +.cardWrap { + position: relative; + display: flex; + width: 100%; + height: 161px; + padding: 12px 16px 16px; + margin: 8px 0; + overflow: hidden; + cursor: pointer; + border: 1px solid var(--semi-color-border); + border-radius: var(--border-radius); + transform: translateZ(0); + flex-direction: column; + + header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12px; + color: var(--semi-color-primary); + + .rightWrap { + opacity: 0; + } + } + + .actions { + position: absolute; + bottom: -1px; + left: 0; + z-index: 10; + display: flex; + width: 100%; + padding: 8px; + background-color: var(--semi-color-fill-2); + border-radius: 0 0 var(--border-radius) var(--border-radius); + opacity: 0; + justify-content: space-around; + transition: all ease-in-out 0.2s; + + button { + width: 40%; + } + } + + &:hover { + box-shadow: var(--semi-color-shadow); + + header .rightWrap { + opacity: 1; + } + + .actions { + opacity: 1; + } + } + + footer { + margin-top: 12px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} diff --git a/packages/client/src/components/template/card/index.tsx b/packages/client/src/components/template/card/index.tsx new file mode 100644 index 0000000..e194aac --- /dev/null +++ b/packages/client/src/components/template/card/index.tsx @@ -0,0 +1,196 @@ +import { useCallback } from 'react'; + +import { IconEdit, IconPlus, IconUser } from '@douyinfe/semi-icons'; +import { Avatar, Button, Modal, Skeleton, Space, Tooltip, Typography } from '@douyinfe/semi-ui'; + +import type { ITemplate } from '@think/domains'; + +import cls from 'classnames'; +import { IconDocument } from 'components/icons/IconDocument'; +import { TemplateReader } from 'components/template/reader'; +import { useUser } from 'data/user'; +import { useToggle } from 'hooks/use-toggle'; +import Router from 'next/router'; + +import styles from './index.module.scss'; + +const { Text } = Typography; + +export interface IProps { + template: ITemplate; + onClick?: (id: string) => void; + getClassNames?: (id: string) => string; + onOpenPreview?: () => void; + onClosePreview?: () => void; +} + +const bodyStyle = { + overflow: 'auto', +}; +const titleContainerStyle = { + marginBottom: 12, + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', +} as React.CSSProperties; +const flexStyle = { display: 'flex' }; + +export const TemplateCard: React.FC = ({ + template, + onClick, + getClassNames = (id) => '', + onOpenPreview, + onClosePreview, +}) => { + const { user } = useUser(); + const [visible, toggleVisible] = useToggle(false); + + const gotoEdit = useCallback(() => { + Router.push(`/template/${template.id}/`); + }, [template]); + + const cancel = useCallback(() => { + toggleVisible(false); + onClosePreview && onClosePreview(); + }, [toggleVisible, onClosePreview]); + + const preview = useCallback(() => { + toggleVisible(true); + onOpenPreview && onOpenPreview(); + }, [toggleVisible, onOpenPreview]); + + const useTemplate = useCallback(() => { + onClick && onClick(template.id); + }, [onClick, template.id]); + + return ( + <> + + + +
+
+ +
+ {template.createUser && user && template.createUser.id === user.id && ( + + +
+
+
+
+ {template.title} +
+
+ + + + + + 创建者: + {template.createUser && template.createUser.name} + + +
+
+
+ +
+ 已使用 + {template.usageAmount}次 +
+
+
+
+ +
+
+ + ); +}; + +export const TemplateCardPlaceholder = () => { + return ( +
+
+ +
+
+
+ +
+
+ + + + + + 创建者: + + + +
+
+
+ +
+ 更新时间: + +
+
+
+
+ ); +}; + +export const TemplateCardEmpty = ({ getClassNames = () => '', onClick = () => {} }) => { + return ( +
+
+
+ + + + 空白文档 +
+
+
+ ); +}; diff --git a/packages/client/src/components/template/editor/index.module.scss b/packages/client/src/components/template/editor/index.module.scss new file mode 100644 index 0000000..f8eee49 --- /dev/null +++ b/packages/client/src/components/template/editor/index.module.scss @@ -0,0 +1,26 @@ +/* stylelint-disable no-descending-specificity */ +.wrap { + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; + + > header { + position: relative; + z-index: 110; + height: 60px; + background-color: var(--semi-color-nav-bg); + user-select: none; + + > div { + overflow: auto; + } + } + + > main { + height: calc(100% - 60px); + overflow: hidden; + background-color: var(--semi-color-nav-bg); + flex: 1; + } +} diff --git a/packages/client/src/components/template/editor/index.tsx b/packages/client/src/components/template/editor/index.tsx new file mode 100644 index 0000000..f0a6e13 --- /dev/null +++ b/packages/client/src/components/template/editor/index.tsx @@ -0,0 +1,101 @@ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; + +import { IconChevronLeft } from '@douyinfe/semi-icons'; +import { Button, Nav, Popconfirm, Space, Switch, Tooltip, Typography } from '@douyinfe/semi-ui'; + +import { CollaborationEditor } from 'tiptap/editor'; + +import { DocumentStyle } from 'components/document/style'; +import { Seo } from 'components/seo'; +import { Theme } from 'components/theme'; +import { User } from 'components/user'; +import { useTemplate } from 'data/template'; +import { useUser } from 'data/user'; +import { useDocumentStyle } from 'hooks/use-document-style'; +import { useMount } from 'hooks/use-mount'; +import { useWindowSize } from 'hooks/use-window-size'; +import Router from 'next/router'; + +import styles from './index.module.scss'; + +interface IProps { + templateId: string; +} + +const { Text } = Typography; + +export const TemplateEditor: React.FC = ({ templateId }) => { + const { user } = useUser(); + const mounted = useMount(); + const { data, loading, error, updateTemplate, deleteTemplate } = useTemplate(templateId); + const { width: windowWidth } = useWindowSize(); + const [title, setTitle] = useState(data && data.title); + const [isPublic, setPublic] = useState(false); + const { width, fontSize } = useDocumentStyle(); + const editorWrapClassNames = useMemo(() => { + return width === 'standardWidth' ? styles.isStandardWidth : styles.isFullWidth; + }, [width]); + + const goback = useCallback(() => { + Router.back(); + }, []); + + const handleDelte = useCallback(() => { + deleteTemplate().then(() => { + goback(); + }); + }, [deleteTemplate, goback]); + + useEffect(() => { + if (!data) return; + setPublic(data.isPublic); + setTitle(data.title); + }, [data]); + + return ( + <> + {data && } +
+
+ +
+
+ {mounted && data && ( + + )} +
+
+ + ); +}; diff --git a/packages/client/src/components/template/list/index.tsx b/packages/client/src/components/template/list/index.tsx new file mode 100644 index 0000000..122bc0c --- /dev/null +++ b/packages/client/src/components/template/list/index.tsx @@ -0,0 +1,99 @@ +import React, { useEffect } from 'react'; + +import { List, Pagination } from '@douyinfe/semi-ui'; + +import { DataRender } from 'components/data-render'; +import { Empty } from 'components/empty'; +import { IProps as ITemplateCardProps, TemplateCard, TemplateCardPlaceholder } from 'components/template/card'; + +const grid = { + gutter: 16, + xs: 24, + sm: 12, + md: 12, + lg: 8, + xl: 8, +}; + +interface IProps extends Omit { + // TODO: 修复类型 + hook: any; + firstListItem?: React.ReactNode; + pageSize?: number; +} + +export const TemplateList: React.FC = ({ + hook, + onClick, + getClassNames, + firstListItem, + onOpenPreview, + onClosePreview, + pageSize = 5, +}) => { + const { data, loading, error, page, setPage, refresh } = hook(pageSize); + const list = (data && data.data) || []; + const total = (data && data.total) || 0; + + useEffect(() => { + refresh(); + }, [refresh]); + + return ( + ( + ( + + + + )} + /> + )} + error={error} + normalContent={() => ( + <> + { + if (idx === 0 && firstListItem) { + return {firstListItem}; + } + + return ( + + + + ); + }} + emptyContent={} + > + {total > pageSize ? ( + setPage(cPage)} + /> + ) : null} + + )} + /> + ); +}; diff --git a/packages/client/src/components/template/reader/index.tsx b/packages/client/src/components/template/reader/index.tsx new file mode 100644 index 0000000..8266ff3 --- /dev/null +++ b/packages/client/src/components/template/reader/index.tsx @@ -0,0 +1,37 @@ +import React from 'react'; + +import { Spin } from '@douyinfe/semi-ui'; + +import { ReaderEditor } from 'tiptap/editor'; + +import { DataRender } from 'components/data-render'; +import { Seo } from 'components/seo'; +import { useTemplate } from 'data/template'; + +interface IProps { + templateId: string; +} + +export const TemplateReader: React.FC = ({ templateId }) => { + const { data, loading, error } = useTemplate(templateId); + + return ( + + + + } + error={error} + normalContent={() => { + return ( +
+ + +
+ ); + }} + /> + ); +}; diff --git a/packages/client/src/components/theme/index.tsx b/packages/client/src/components/theme/index.tsx new file mode 100644 index 0000000..0e568f9 --- /dev/null +++ b/packages/client/src/components/theme/index.tsx @@ -0,0 +1,49 @@ +import React, { useCallback } from 'react'; + +import { IconDesktop, IconMoon, IconSun } from '@douyinfe/semi-icons'; +import { Button, Dropdown } from '@douyinfe/semi-ui'; + +import { Theme as ThemeState, ThemeEnum } from 'hooks/use-theme'; + +export const Theme = () => { + const { userPrefer, theme, toggle } = ThemeState.useHook(); + const Icon = theme === 'dark' ? IconMoon : IconSun; + + const setLight = useCallback(() => { + toggle(ThemeEnum.light); + }, [toggle]); + + const setDark = useCallback(() => { + toggle(ThemeEnum.dark); + }, [toggle]); + + const setSystem = useCallback(() => { + toggle(ThemeEnum.system); + }, [toggle]); + + return ( + + + + 亮色 + + + + 夜色 + + + + 系统 + + + } + > + + + ); +}; diff --git a/packages/client/src/components/tooltip/index.tsx b/packages/client/src/components/tooltip/index.tsx new file mode 100644 index 0000000..2cc80eb --- /dev/null +++ b/packages/client/src/components/tooltip/index.tsx @@ -0,0 +1,34 @@ +import React from 'react'; + +import { Tooltip as SemiTooltip } from '@douyinfe/semi-ui'; +import { Position } from '@douyinfe/semi-ui/tooltip'; + +import { useToggle } from 'hooks/use-toggle'; + +interface IProps { + content: React.ReactNode; + hideOnClick?: boolean; + position?: Position; +} + +export const Tooltip: React.FC = ({ content, hideOnClick = false, position = 'top', children }) => { + const [visible, toggleVisible] = useToggle(false); + + return ( + + { + toggleVisible(true); + }} + onMouseLeave={() => { + toggleVisible(false); + }} + onMouseDown={() => { + hideOnClick && toggleVisible(false); + }} + > + {children} + + + ); +}; diff --git a/packages/client/src/components/upload/index.tsx b/packages/client/src/components/upload/index.tsx new file mode 100644 index 0000000..98cbb07 --- /dev/null +++ b/packages/client/src/components/upload/index.tsx @@ -0,0 +1,47 @@ +import React from 'react'; + +import { IconUpload } from '@douyinfe/semi-icons'; +import { Button, Toast, Upload as SemiUpload } from '@douyinfe/semi-ui'; + +import { useAsyncLoading } from 'hooks/use-async-loading'; +import { uploadFile } from 'services/file'; + +interface IProps { + onOK: (arg: string, fileName: string, fileSize: number) => void; + style?: React.CSSProperties; + accept?: string; + children?: (loading: boolean) => React.ReactNode; +} + +export const Upload: React.FC = ({ onOK, accept, style = {}, children }) => { + const [uploadFileWithLoading, loading] = useAsyncLoading(uploadFile); + + const beforeUpload = ({ file }) => { + uploadFileWithLoading(file.fileInstance).then((res: string) => { + Toast.success('上传成功'); + onOK && onOK(res, file.name, file.size); + }); + return false; + }; + + return ( + null} + fileList={[]} + style={{ + display: 'flex', + justifyContent: 'center', + ...style, + }} + action={''} + accept={accept} + > + {(children && children(loading)) || ( + + )} + + ); +}; diff --git a/packages/client/src/components/user/index.tsx b/packages/client/src/components/user/index.tsx new file mode 100644 index 0000000..1c943e8 --- /dev/null +++ b/packages/client/src/components/user/index.tsx @@ -0,0 +1,84 @@ +import React, { useCallback } from 'react'; + +import { IconSpin } from '@douyinfe/semi-icons'; +import { Avatar, Button, Dropdown, Modal, Toast, Typography } from '@douyinfe/semi-ui'; + +import { useUser } from 'data/user'; +import { useToggle } from 'hooks/use-toggle'; +import Router from 'next/router'; + +import { ResetPassword } from './reset-password'; +import { UserSetting } from './setting'; + +const { Text } = Typography; + +export const User: React.FC = () => { + const { user, loading, error, toLogin, logout } = useUser(); + const [visible, toggleVisible] = useToggle(false); + const [resetVisible, toggleResetVisible] = useToggle(false); + + const toAdmin = useCallback(() => { + Router.push('/admin'); + }, []); + + const onResetSuccess = useCallback(() => { + Toast.success('请重新登录'); + Router.replace(`/login?redirect=${Router.asPath}`); + }, []); + + if (loading) return + ); + } + + return ( + <> + + toggleVisible(true)}> + 账户设置 + + + 重置密码 + + {user.isSystemAdmin ? ( + + 管理后台 + + ) : null} + + + 退出登录 + + + } + > + + + + ) : null} + + + + + + + + ); +}; diff --git a/packages/client/src/components/user/setting/index.tsx b/packages/client/src/components/user/setting/index.tsx new file mode 100644 index 0000000..17912b6 --- /dev/null +++ b/packages/client/src/components/user/setting/index.tsx @@ -0,0 +1,142 @@ +import { Dispatch, SetStateAction, useCallback, useEffect, useRef, useState } from 'react'; + +import { Avatar, Button, Col, Form, Modal, Row, Space, Toast } from '@douyinfe/semi-ui'; +import { FormApi } from '@douyinfe/semi-ui/lib/es/form'; + +import { Upload } from 'components/upload'; +import { useSystemPublicConfig, useUser, useVerifyCode } from 'data/user'; +import { useInterval } from 'hooks/use-interval'; +import { useToggle } from 'hooks/use-toggle'; + +interface IProps { + visible: boolean; + toggleVisible: Dispatch>; +} + +export const UserSetting: React.FC = ({ visible, toggleVisible }) => { + const $form = useRef(); + const { user, loading, updateUser } = useUser(); + const [currentAvatar, setCurrentAvatar] = useState(''); + const [email, setEmail] = useState(''); + const { data: systemConfig } = useSystemPublicConfig(); + const { sendVerifyCode, loading: sendVerifyCodeLoading } = useVerifyCode(); + const [hasSendVerifyCode, toggleHasSendVerifyCode] = useToggle(false); + const [countDown, setCountDown] = useState(0); + + const setAvatar = useCallback((url) => { + $form.current.setValue('avatar', url); + setCurrentAvatar(url); + }, []); + + const handleOk = useCallback(() => { + $form.current.validate().then((values) => { + if (!values.email) { + delete values.email; + } + updateUser(values).then(() => { + Toast.success('账户信息已更新'); + toggleVisible(false); + }); + }); + }, [toggleVisible, updateUser]); + + const handleCancel = useCallback(() => { + toggleVisible(false); + }, [toggleVisible]); + + const onFormChange = useCallback((formState) => { + setEmail(formState.values.email); + }, []); + + const { start, stop } = useInterval(() => { + setCountDown((v) => { + if (v - 1 <= 0) { + stop(); + toggleHasSendVerifyCode(false); + return 0; + } + return v - 1; + }); + }, 1000); + + const getVerifyCode = useCallback(() => { + stop(); + sendVerifyCode({ email }) + .then(() => { + Toast.success('请前往邮箱查收验证码'); + setCountDown(60); + start(); + toggleHasSendVerifyCode(true); + }) + .catch(() => { + toggleHasSendVerifyCode(false); + }); + }, [email, toggleHasSendVerifyCode, sendVerifyCode, start, stop]); + + useEffect(() => { + if (!user || !$form.current) return; + $form.current.setValues(user); + setCurrentAvatar(user.avatar); + }, [user]); + + return ( + +
($form.current = formApi)} + labelPosition="left" + onChange={onFormChange} + > + + + + + + + + + + + + {systemConfig && systemConfig.enableEmailVerify && email && email !== user.email ? ( + + + + + + + + + + + ) : null} +
+
+ ); +}; diff --git a/packages/client/src/components/wiki-creator/index.tsx b/packages/client/src/components/wiki-creator/index.tsx new file mode 100644 index 0000000..b616458 --- /dev/null +++ b/packages/client/src/components/wiki-creator/index.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +import { Button } from '@douyinfe/semi-ui'; + +import { WikiCreator as WikiCreatorForm } from 'components/wiki/create'; +import { useToggle } from 'hooks/use-toggle'; + +export const WikiCreator: React.FC = ({ children }) => { + const [visible, toggleVisible] = useToggle(false); + + return ( + <> + {children || ( + + )} + + + ); +}; diff --git a/packages/client/src/components/wiki-or-document-creator/index.tsx b/packages/client/src/components/wiki-or-document-creator/index.tsx new file mode 100644 index 0000000..92d38af --- /dev/null +++ b/packages/client/src/components/wiki-or-document-creator/index.tsx @@ -0,0 +1,55 @@ +import React from 'react'; + +import { IconPlus } from '@douyinfe/semi-icons'; +import { Button, Dropdown } from '@douyinfe/semi-ui'; + +import { DocumentCreator } from 'components/document/create'; +import { WikiCreator } from 'components/wiki/create'; +import { useRouterQuery } from 'hooks/use-router-query'; +import { useToggle } from 'hooks/use-toggle'; + +interface IProps { + onCreateDocument?: () => void; +} + +export const WikiOrDocumentCreator: React.FC = ({ onCreateDocument, children }) => { + const { wikiId, documentId } = useRouterQuery<{ wikiId?: string; documentId?: string }>(); + const [dropdownVisible, toggleDropdownVisible] = useToggle(false); + const [visible, toggleVisible] = useToggle(false); + const [createDocumentModalVisible, toggleCreateDocumentModalVisible] = useToggle(false); + + return ( + <> + + 知识库 + {wikiId && 文档} + + } + > + + {children || ( + + )} + + + + {wikiId && ( + + )} + + ); +}; diff --git a/packages/client/src/components/wiki/card/index.module.scss b/packages/client/src/components/wiki/card/index.module.scss new file mode 100644 index 0000000..69d25f4 --- /dev/null +++ b/packages/client/src/components/wiki/card/index.module.scss @@ -0,0 +1,39 @@ +.cardWrap { + width: 100%; + + > a { + display: flex; + width: 100%; + max-height: 260px; + padding: 12px 16px 16px; + margin: 8px 0; + cursor: pointer; + border: 1px solid var(--semi-color-border); + border-radius: 5px; + flex-direction: column; + + > header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12px; + color: var(--semi-color-primary); + + .rightWrap { + opacity: 0; + } + } + + &:hover { + box-shadow: var(--box-shadow); + + > header .rightWrap { + opacity: 1; + } + } + + > footer { + margin-top: 12px; + } + } +} diff --git a/packages/client/src/components/wiki/card/index.tsx b/packages/client/src/components/wiki/card/index.tsx new file mode 100644 index 0000000..9b5ff66 --- /dev/null +++ b/packages/client/src/components/wiki/card/index.tsx @@ -0,0 +1,111 @@ +import { IconUser } from '@douyinfe/semi-icons'; +import { Avatar, Skeleton, Space, Typography } from '@douyinfe/semi-ui'; + +import { IconDocument } from 'components/icons/IconDocument'; +import { LocaleTime } from 'components/locale-time'; +import { WikiStar } from 'components/wiki/star'; +import { IWikiWithIsMember } from 'data/star'; +import Link from 'next/link'; + +import styles from './index.module.scss'; + +const { Text, Paragraph } = Typography; + +export const WikiCard: React.FC<{ wiki: IWikiWithIsMember; shareMode?: boolean }> = ({ wiki, shareMode = false }) => { + return ( + + ); +}; + +export const WikiCardPlaceholder = () => { + return ( + + ); +}; diff --git a/packages/client/src/components/wiki/create/index.tsx b/packages/client/src/components/wiki/create/index.tsx new file mode 100644 index 0000000..02d8d50 --- /dev/null +++ b/packages/client/src/components/wiki/create/index.tsx @@ -0,0 +1,61 @@ +import { Dispatch, SetStateAction, useRef } from 'react'; + +import { Form, Modal } from '@douyinfe/semi-ui'; +import { FormApi } from '@douyinfe/semi-ui/lib/es/form'; + +import type { IWiki } from '@think/domains'; + +import { ICreateWiki, useOwnWikis } from 'data/wiki'; +import { useRouterQuery } from 'hooks/use-router-query'; +import Router from 'next/router'; + +interface IProps { + visible: boolean; + toggleVisible: Dispatch>; +} + +export const WikiCreator: React.FC = ({ visible, toggleVisible }) => { + const $form = useRef(); + const { organizationId } = useRouterQuery<{ organizationId: string }>(); + const { createWiki } = useOwnWikis(organizationId); + + const handleOk = () => { + $form.current.validate().then((values) => { + createWiki(values as ICreateWiki).then((res) => { + toggleVisible(false); + Router.push({ + pathname: `/app/org/[organizationId]/wiki/[wikiId]`, + query: { organizationId: res.organizationId, wikiId: res.id }, + }); + }); + }); + }; + + const handleCancel = () => { + toggleVisible(false); + }; + + return ( + +
($form.current = formApi)}> + + +
+
+ ); +}; diff --git a/packages/client/src/components/wiki/delete/index.tsx b/packages/client/src/components/wiki/delete/index.tsx new file mode 100644 index 0000000..4ba29f8 --- /dev/null +++ b/packages/client/src/components/wiki/delete/index.tsx @@ -0,0 +1,52 @@ +import React, { useCallback } from 'react'; + +import { IconDelete } from '@douyinfe/semi-icons'; +import { Modal, Space, Typography } from '@douyinfe/semi-ui'; + +import { useOwnWikis } from 'data/wiki'; +import { useRouterQuery } from 'hooks/use-router-query'; +import Router from 'next/router'; + +interface IProps { + wikiId: string; + onDelete?: () => void; +} + +const { Text } = Typography; + +export const WikiDeletor: React.FC = ({ wikiId, onDelete, children }) => { + const { organizationId } = useRouterQuery<{ organizationId: string }>(); + const { deletWiki } = useOwnWikis(organizationId); + + const deleteAction = useCallback(() => { + Modal.error({ + title: '确定删除吗?', + content: 删除后不可恢复!, + onOk: () => { + deletWiki(wikiId).then(() => { + onDelete + ? onDelete() + : Router.push({ + pathname: `/app/org/[organizationId]`, + query: { organizationId }, + }); + }); + }, + okButtonProps: { + type: 'danger', + }, + style: { maxWidth: '96vw' }, + }); + }, [organizationId, wikiId, deletWiki, onDelete]); + + return ( + + {children || ( + + + 删除 + + )} + + ); +}; diff --git a/packages/client/src/components/wiki/documents-share/index.module.scss b/packages/client/src/components/wiki/documents-share/index.module.scss new file mode 100644 index 0000000..84d7972 --- /dev/null +++ b/packages/client/src/components/wiki/documents-share/index.module.scss @@ -0,0 +1,58 @@ +/* stylelint-disable */ +.wrap { + margin-top: 5px; +} + +.selectedItem, +.sourceItem { + display: flex; + justify-content: space-between; + align-items: center; + box-sizing: border-box; + height: 36px; + padding: 10px 12px; + + &:hover { + background-color: var(--semi-color-fill-0); + } + + .info { + flex-grow: 1; + margin-left: 8px; + } + + .name { + font-size: 14px; + line-height: 20px; + } + + .email { + font-size: 12px; + line-height: 16px; + color: var(--semi-color-text-2); + } +} + +.selectedItem { + :global { + .semi-icon-close { + color: var(--semi-color-tertiary); + visibility: hidden; + } + } + + &:hover { + :global { + .semi-icon-close { + visibility: visible; + } + } + } +} + +.transferWrap { + margin-top: 16px; + width: 100%; + height: calc(100vh - 268px); + overflow: auto; +} diff --git a/packages/client/src/components/wiki/documents-share/index.tsx b/packages/client/src/components/wiki/documents-share/index.tsx new file mode 100644 index 0000000..388c3c5 --- /dev/null +++ b/packages/client/src/components/wiki/documents-share/index.tsx @@ -0,0 +1,107 @@ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; + +import { IconClose } from '@douyinfe/semi-icons'; +import { Banner, Button, Checkbox, Toast, Transfer, Typography } from '@douyinfe/semi-ui'; + +import { isPublicDocument } from '@think/domains'; + +import { flattenTree2Array } from 'components/wiki/tocs/utils'; +import { useWikiDetail, useWikiTocs } from 'data/wiki'; + +import styles from './index.module.scss'; + +const { Title, Text } = Typography; + +interface IProps { + wikiId: string; +} + +export const WikiDocumentsShare: React.FC = ({ wikiId }) => { + const { toggleStatus: toggleWorkspaceStatus } = useWikiDetail(wikiId); + const { data: tocs } = useWikiTocs(wikiId); + const documents = useMemo( + () => + flattenTree2Array(tocs).map((d) => { + d.label = d.title; + d.value = d.id; + return d; + }), + [tocs] + ); + const [publicDocumentIds, setPublicDocumentIds] = useState([]); // 公开的 + const privateDocumentIds = useMemo(() => { + return documents.filter((doc) => !publicDocumentIds.includes(doc.id)).map((doc) => doc.id); + }, [documents, publicDocumentIds]); + + const submit = () => { + const data = { publicDocumentIds, privateDocumentIds }; + toggleWorkspaceStatus(data).then((res) => { + const ret = res as unknown as any & { + documentOperateMessage?: string; + }; + Toast.success(ret.documentOperateMessage || '操作成功'); + }); + }; + + const renderSourceItem = useCallback((item) => { + return ( +
+ { + item.onChange(); + }} + key={item.label} + checked={item.checked} + > + {item.title} + +
+ ); + }, []); + + const renderSelectedItem = useCallback((item) => { + return ( +
+ {item.title} + +
+ ); + }, []); + + const customFilter = useCallback((sugInput, item) => { + return item.title.includes(sugInput); + }, []); + + useEffect(() => { + if (!documents.length) return; + const activeIds = documents.filter((doc) => isPublicDocument(doc.status)).map((doc) => doc.id); + setPublicDocumentIds(activeIds); + }, [documents]); + + return ( +
+ 在下方进行选择以公开(或取消)文档} + /> +
+ setPublicDocumentIds(values.map((v) => v.id))} + /> +
+ +
+ ); +}; diff --git a/packages/client/src/components/wiki/pin-card/index.module.scss b/packages/client/src/components/wiki/pin-card/index.module.scss new file mode 100644 index 0000000..69d25f4 --- /dev/null +++ b/packages/client/src/components/wiki/pin-card/index.module.scss @@ -0,0 +1,39 @@ +.cardWrap { + width: 100%; + + > a { + display: flex; + width: 100%; + max-height: 260px; + padding: 12px 16px 16px; + margin: 8px 0; + cursor: pointer; + border: 1px solid var(--semi-color-border); + border-radius: 5px; + flex-direction: column; + + > header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12px; + color: var(--semi-color-primary); + + .rightWrap { + opacity: 0; + } + } + + &:hover { + box-shadow: var(--box-shadow); + + > header .rightWrap { + opacity: 1; + } + } + + > footer { + margin-top: 12px; + } + } +} diff --git a/packages/client/src/components/wiki/pin-card/index.tsx b/packages/client/src/components/wiki/pin-card/index.tsx new file mode 100644 index 0000000..6497466 --- /dev/null +++ b/packages/client/src/components/wiki/pin-card/index.tsx @@ -0,0 +1,82 @@ +import { Avatar, Skeleton, Space, Typography } from '@douyinfe/semi-ui'; + +import { IWiki } from '@think/domains'; + +import { IconDocument } from 'components/icons/IconDocument'; +import { LocaleTime } from 'components/locale-time'; +import { WikiStar } from 'components/wiki/star'; +import Link from 'next/link'; + +import styles from './index.module.scss'; + +const { Text, Paragraph } = Typography; + +export const WikiPinCard: React.FC<{ wiki: IWiki }> = ({ wiki }) => { + return ( + + ); +}; + +export const WikiPinCardPlaceholder = () => { + return ( + + ); +}; diff --git a/packages/client/src/components/wiki/placeholder/index.tsx b/packages/client/src/components/wiki/placeholder/index.tsx new file mode 100644 index 0000000..4a107c3 --- /dev/null +++ b/packages/client/src/components/wiki/placeholder/index.tsx @@ -0,0 +1,22 @@ +import React from 'react'; + +import { Skeleton } from '@douyinfe/semi-ui'; + +export const WorkspacePlaceholder = () => { + const placeholder = ( +
+ + +
+ ); + + return ; +}; diff --git a/packages/client/src/components/wiki/setting/base/index.module.scss b/packages/client/src/components/wiki/setting/base/index.module.scss new file mode 100644 index 0000000..28866ae --- /dev/null +++ b/packages/client/src/components/wiki/setting/base/index.module.scss @@ -0,0 +1,15 @@ +.cover { + margin-bottom: 12px; + + img { + width: 104px; + height: 96px; + border-radius: 4px; + } +} + +@media (max-width: 768px) { + .cover { + width: 100%; + } +} diff --git a/packages/client/src/components/wiki/setting/base/index.tsx b/packages/client/src/components/wiki/setting/base/index.tsx new file mode 100644 index 0000000..42d7f11 --- /dev/null +++ b/packages/client/src/components/wiki/setting/base/index.tsx @@ -0,0 +1,109 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; + +import { Avatar, Button, Form, Toast } from '@douyinfe/semi-ui'; +import { FormApi } from '@douyinfe/semi-ui/lib/es/form'; + +import { WIKI_AVATARS } from '@think/constants'; +import type { IWiki } from '@think/domains'; + +import { ImageUploader } from 'components/image-uploader'; +import { pick } from 'helpers/pick'; + +import styles from './index.module.scss'; + +const images = [ + { + key: 'placeholers', + title: '图库', + images: WIKI_AVATARS, + }, +]; + +type IUpdateWIKI = Partial; + +interface IProps { + wiki: IWiki; + update: (arg: IUpdateWIKI) => Promise; +} + +const getFormValueFromWiki = (wiki) => { + return pick(wiki, ['name', 'description', 'avatar']); +}; + +export const Base: React.FC = ({ wiki, update }) => { + const $form = useRef(); + const [currentCover, setCurrentCover] = useState(''); + + const onSubmit = useCallback(() => { + $form.current.validate().then((values) => { + update(values).then(() => { + Toast.success('操作成功'); + }); + }); + }, [update]); + + const setCover = useCallback((url) => { + $form.current.setValue('avatar', url); + setCurrentCover(url); + }, []); + + useEffect(() => { + if (!wiki) return; + $form.current.setValues(getFormValueFromWiki(wiki)); + setCurrentCover(wiki.avatar); + }, [wiki]); + + return ( +
($form.current = formApi)} + onSubmit={onSubmit} + > + + + +
+ + {wiki && wiki.name.charAt(0)} + +
+ + + +
+
+ +
+
+ ); +}; diff --git a/packages/client/src/components/wiki/setting/import/index.tsx b/packages/client/src/components/wiki/setting/import/index.tsx new file mode 100644 index 0000000..f74b0ee --- /dev/null +++ b/packages/client/src/components/wiki/setting/import/index.tsx @@ -0,0 +1,121 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; + +import { Button, Toast, Typography, Upload } from '@douyinfe/semi-ui'; + +import type { IWiki } from '@think/domains'; + +import { useCreateDocument } from 'data/document'; +import { useRouterQuery } from 'hooks/use-router-query'; +import { useToggle } from 'hooks/use-toggle'; + +import { createMarkdownParser, MarkdownParse } from './parser'; + +interface IProps { + wikiId: IWiki['id']; +} + +const { Text } = Typography; + +export const Import: React.FC = ({ wikiId }) => { + const { create } = useCreateDocument(); + const { organizationId } = useRouterQuery<{ organizationId: string }>(); + const $upload = useRef(); + const [loading, toggleLoading] = useToggle(false); + const [markdownParser, setMarkdownParser] = useState(); + const [fileList, setFileList] = useState([]); + + const handleFile = useCallback(({ fileList: files }) => { + if (!files.length) return; + + files.forEach((file) => { + const fileName = file.fileInstance.name; + + const fileReader = new FileReader(); + fileReader.onload = function () { + setFileList((fileList) => { + if (fileList.find((file) => file.name === fileName)) return fileList; + return fileList.concat({ ...file, text: fileReader.result }); + }); + }; + + fileReader.readAsText(file.fileInstance); + }); + + return false; + }, []); + + const removeFile = useCallback((currentFile) => { + setFileList((fileList) => { + return fileList.filter((file) => file.name !== currentFile.name); + }); + }, []); + + const importFile = useCallback(() => { + if (!markdownParser) return; + + const total = fileList.length; + let success = 0; + let failed = 0; + + toggleLoading(true); + + for (const file of fileList) { + const payload = markdownParser.parse(file.name, file.text); + create({ ...payload, organizationId, wikiId }) + .then(() => { + success += 1; + }) + .catch(() => { + failed += 1; + }) + .finally(() => { + if (success + failed === total) { + $upload.current.clear(); + toggleLoading(false); + setFileList([]); + + if (failed > 0) { + Toast.error('部分文件导入失败,请重新尝试导入!'); + } else { + Toast.success('导入成功'); + } + } + }); + } + }, [markdownParser, fileList, toggleLoading, create, organizationId, wikiId]); + + useEffect(() => { + const markdownParser = createMarkdownParser(); + setMarkdownParser(markdownParser); + + return () => { + markdownParser.destroy(); + }; + }, []); + + return ( +
+ 点击上传文件或拖拽文件到这里} + dragSubText={仅支持 Markdown 文件导入} + onRemove={removeFile} + /> + + +
+ ); +}; diff --git a/packages/client/src/components/wiki/setting/import/parser.tsx b/packages/client/src/components/wiki/setting/import/parser.tsx new file mode 100644 index 0000000..324a795 --- /dev/null +++ b/packages/client/src/components/wiki/setting/import/parser.tsx @@ -0,0 +1,58 @@ +import { Toast } from '@douyinfe/semi-ui'; + +import { createEditor } from 'tiptap/core'; +import { AllExtensions } from 'tiptap/core/all-kit'; +import { Collaboration } from 'tiptap/core/extensions/collaboration'; +import { prosemirrorJSONToYDoc } from 'tiptap/core/thritypart/y-prosemirror/y-prosemirror'; +import { markdownToProsemirror } from 'tiptap/markdown/markdown-to-prosemirror'; + +import { safeJSONStringify } from 'helpers/json'; +import * as Y from 'yjs'; + +export interface MarkdownParse { + parse: (filename: string, markdown: string) => { title: string; content: string; state: Buffer }; + destroy: () => void; +} + +export const createMarkdownParser = () => { + const ydoc = new Y.Doc(); + const editor = createEditor({ + editable: false, + extensions: AllExtensions.concat(Collaboration.configure({ document: ydoc })), + content: '', + }); + + const parse = (filename: string, markdown: string) => { + try { + const prosemirrorNode = markdownToProsemirror({ + editor, + schema: editor.schema, + content: markdown, + needTitle: true, + defaultTitle: filename.replace(/\.md$/gi, ''), + }); + + const title = prosemirrorNode.content[0].content[0].text; + editor.commands.setContent(prosemirrorNode); + Y.applyUpdate(ydoc, Y.encodeStateAsUpdate(prosemirrorJSONToYDoc(editor.schema, prosemirrorNode))); + const state = Y.encodeStateAsUpdate(ydoc); + + return { + title, + content: safeJSONStringify({ default: prosemirrorNode }), + state: Buffer.from(state), + }; + } catch (e) { + console.error(e.message, e.stack); + Toast.error('文件内容解析失败,请打开控制台,截图错误信息,请到 Github 提 issue 寻求解决!'); + throw e; + } + }; + + const destroy = () => { + ydoc.destroy(); + editor.destroy(); + }; + + return { parse, destroy } as MarkdownParse; +}; diff --git a/packages/client/src/components/wiki/setting/index.tsx b/packages/client/src/components/wiki/setting/index.tsx new file mode 100644 index 0000000..ba86e6a --- /dev/null +++ b/packages/client/src/components/wiki/setting/index.tsx @@ -0,0 +1,67 @@ +import React from 'react'; + +import { TabPane, Tabs } from '@douyinfe/semi-ui'; + +import { IWiki } from '@think/domains'; + +import { Seo } from 'components/seo'; +import { WikiTocsManager } from 'components/wiki/tocs/manager'; +import { useWikiDetail } from 'data/wiki'; + +import { Base } from './base'; +import { Import } from './import'; +import { More } from './more'; +import { Privacy } from './privacy'; +import { Users } from './users'; + +interface IProps { + wikiId: IWiki['id']; + tab?: string; + onNavigate: (arg: string) => void; +} + +const TitleMap = { + base: '基础信息', + privacy: '隐私管理', + tocs: '目录管理', + share: '隐私管理', + documents: '全部文档', + users: '成员管理', + import: '导入文档', + more: '更多', +}; + +export const WikiSetting: React.FC = ({ wikiId, tab, onNavigate }) => { + const { data, update } = useWikiDetail(wikiId); + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/client/src/components/wiki/setting/more/index.tsx b/packages/client/src/components/wiki/setting/more/index.tsx new file mode 100644 index 0000000..3d15480 --- /dev/null +++ b/packages/client/src/components/wiki/setting/more/index.tsx @@ -0,0 +1,28 @@ +import { Banner, Button, Typography } from '@douyinfe/semi-ui'; + +import { WikiDeletor } from 'components/wiki/delete'; + +interface IProps { + wikiId: string; +} + +const { Paragraph } = Typography; + +export const More: React.FC = ({ wikiId }) => { + return ( +
+ 删除知识库及内部所有文档,不可恢复!} + style={{ marginBottom: 16 }} + /> + + + +
+ ); +}; diff --git a/packages/client/src/components/wiki/setting/privacy/index.module.scss b/packages/client/src/components/wiki/setting/privacy/index.module.scss new file mode 100644 index 0000000..7e0411e --- /dev/null +++ b/packages/client/src/components/wiki/setting/privacy/index.module.scss @@ -0,0 +1,64 @@ +/* stylelint-disable */ +.statusWrap { + padding: 10px 12px; + margin-top: 16px; + border: 1px solid var(--semi-color-border); + border-radius: 4px; + + .title { + margin-bottom: 16px; + } +} + +.selectedItem { + :global { + .semi-icon-close { + color: var(--semi-color-tertiary); + visibility: hidden; + } + } + + &:hover { + :global { + .semi-icon-close { + visibility: visible; + } + } + } +} + +.selectedItem, +.sourceItem { + display: flex; + height: 36px; + padding: 10px 12px; + box-sizing: border-box; + align-items: center; + justify-content: space-between; + + &:hover { + background-color: var(--semi-color-fill-0); + } + + .info { + margin-left: 8px; + flex-grow: 1; + } + + .name { + font-size: 14px; + line-height: 20px; + } + + .email { + font-size: 12px; + line-height: 16px; + color: var(--semi-color-text-2); + } +} + +.transferWrap { + width: 100%; + margin-top: 16px; + overflow: auto; +} diff --git a/packages/client/src/components/wiki/setting/privacy/index.tsx b/packages/client/src/components/wiki/setting/privacy/index.tsx new file mode 100644 index 0000000..aa523b5 --- /dev/null +++ b/packages/client/src/components/wiki/setting/privacy/index.tsx @@ -0,0 +1,163 @@ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; + +import { IconClose } from '@douyinfe/semi-icons'; +import { Banner, Button, Checkbox, Radio, RadioGroup, Toast, Transfer, Typography } from '@douyinfe/semi-ui'; + +import { isPublicDocument, isPublicWiki, WIKI_STATUS_LIST } from '@think/domains'; + +import { flattenTree2Array } from 'components/wiki/tocs/utils'; +import { useWikiDetail, useWikiTocs } from 'data/wiki'; +import { buildUrl } from 'helpers/url'; + +import styles from './index.module.scss'; + +const { Text, Title } = Typography; + +interface IProps { + wikiId: string; +} + +export const Privacy: React.FC = ({ wikiId }) => { + const { data: wiki, toggleStatus: toggleWorkspaceStatus } = useWikiDetail(wikiId); + const { data: tocs } = useWikiTocs(wikiId); + + const [nextStatus, setNextStatus] = useState(''); + const isPublic = useMemo(() => wiki && isPublicWiki(wiki.status), [wiki]); + + const documents = useMemo( + () => + flattenTree2Array(tocs) + .sort((a, b) => a.index - b.index) + .map((d) => { + d.label = d.title; + d.value = d.id; + return d; + }), + [tocs] + ); + const [publicDocumentIds, setPublicDocumentIds] = useState([]); // 公开的 + const privateDocumentIds = useMemo(() => { + return documents.filter((doc) => !publicDocumentIds.includes(doc.id)).map((doc) => doc.id); + }, [documents, publicDocumentIds]); + + const renderSourceItem = useCallback((item) => { + return ( +
+ { + item.onChange(); + }} + key={item.label} + checked={item.checked} + > + {item.title} + +
+ ); + }, []); + + const renderSelectedItem = useCallback((item) => { + return ( +
+ {item.title} + +
+ ); + }, []); + + const customFilter = useCallback((sugInput, item) => { + return item.title.includes(sugInput); + }, []); + + useEffect(() => { + if (!documents.length) return; + const activeIds = documents.filter((doc) => isPublicDocument(doc.status)).map((doc) => doc.id); + setPublicDocumentIds(activeIds); + }, [documents]); + + const submit = () => { + const data = { nextStatus, publicDocumentIds, privateDocumentIds }; + + toggleWorkspaceStatus(data).then((res) => { + const ret = res as unknown as any & { + documentOperateMessage?: string; + }; + Toast.success(ret.documentOperateMessage || '操作成功'); + }); + }; + + useEffect(() => { + if (!wiki) return; + setNextStatus(wiki.status); + }, [wiki]); + + return ( +
+ {isPublic && ( + 当前知识库已经公开
} + description={ + isPublic && ( +
+ 您可以点击该链接进行查看: + + 知识库 + +
+ ) + } + /> + )} + +
+ + 是否公开知识库? + + setNextStatus(e.target.value)}> + {WIKI_STATUS_LIST.map((status) => { + return ( + + {status.label} + + ); + })} + +
+ +
+ setPublicDocumentIds(values.map((v) => v.id))} + /> +
+ + + + ); +}; diff --git a/packages/client/src/components/wiki/setting/users/index.tsx b/packages/client/src/components/wiki/setting/users/index.tsx new file mode 100644 index 0000000..71f0219 --- /dev/null +++ b/packages/client/src/components/wiki/setting/users/index.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +import { Members } from 'components/members'; +import { useWikiMembers } from 'data/wiki'; + +interface IProps { + wikiId: string; +} + +export const Users: React.FC = ({ wikiId }) => { + return ( + + ); +}; diff --git a/packages/client/src/components/wiki/star/index.tsx b/packages/client/src/components/wiki/star/index.tsx new file mode 100644 index 0000000..286a201 --- /dev/null +++ b/packages/client/src/components/wiki/star/index.tsx @@ -0,0 +1,43 @@ +import React from 'react'; + +import { IconStar } from '@douyinfe/semi-icons'; +import { Button, Tooltip } from '@douyinfe/semi-ui'; + +import { IOrganization, IWiki } from '@think/domains'; + +import { useWikiStarToggle } from 'data/star'; + +interface IProps { + organizationId: IOrganization['id']; + wikiId: IWiki['id']; + render?: (arg: { star: boolean; text: string; toggleStar: () => Promise }) => React.ReactNode; + onChange?: () => void; +} + +export const WikiStar: React.FC = ({ organizationId, wikiId, render, onChange }) => { + const { data, toggle } = useWikiStarToggle(organizationId, wikiId); + const text = data ? '取消收藏' : '收藏知识库'; + + return ( + <> + {render ? ( + render({ star: data, toggleStar: toggle, text }) + ) : ( + + + + + ); +}; diff --git a/packages/client/src/components/wiki/tocs/nav-item.tsx b/packages/client/src/components/wiki/tocs/nav-item.tsx new file mode 100644 index 0000000..ba5d2c8 --- /dev/null +++ b/packages/client/src/components/wiki/tocs/nav-item.tsx @@ -0,0 +1,58 @@ +import React from 'react'; + +import cls from 'classnames'; +import Link from 'next/link'; +import type { UrlObject } from 'url'; + +import styles from './index.module.scss'; + +interface IProps { + icon: React.ReactNode; + text: React.ReactNode; + rightNode?: React.ReactNode; + href?: { + pathname: string; + query: Record; + }; + isActive?: boolean; + hoverable?: boolean; + openNewTab?: boolean; +} + +const marginTopStyle = { marginTop: 4 }; + +export const NavItem: React.FC = ({ + icon, + text, + rightNode, + href, + isActive = false, + hoverable = true, + openNewTab = false, +}) => { + const right = rightNode ? {rightNode} : null; + const content = ( + <> + {icon} + {text} + + ); + + return ( +
+ {href ? ( + + + {content} + + + ) : ( +
{content}
+ )} + {right} +
+ ); +}; diff --git a/packages/client/src/components/wiki/tocs/public.tsx b/packages/client/src/components/wiki/tocs/public.tsx new file mode 100644 index 0000000..9094cb0 --- /dev/null +++ b/packages/client/src/components/wiki/tocs/public.tsx @@ -0,0 +1,136 @@ +import React from 'react'; + +import { IconPlus } from '@douyinfe/semi-icons'; +import { Avatar, Skeleton, Space, Typography } from '@douyinfe/semi-ui'; + +import { IDocument } from '@think/domains'; + +import { DataRender } from 'components/data-render'; +import { IconOverview } from 'components/icons'; +import { LogoImage, LogoText } from 'components/logo'; +import { Seo } from 'components/seo'; +import { usePublicWikiDetail, usePublicWikiTocs } from 'data/wiki'; +import { useRouter } from 'next/router'; + +import { NavItem } from './nav-item'; +import { Tree } from './tree'; + +import styles from './index.module.scss'; + +interface IProps { + wikiId: string; + docAsLink?: string; + getDocLink?: (arg: IDocument) => string; + pageTitle: string; +} + +const { Text } = Typography; + +const defaultGetDocLink = (document) => `/share/wiki/${document.wikiId}/document/${document.id}`; + +export const WikiPublicTocs: React.FC = ({ + pageTitle, + wikiId, + docAsLink = '/share/wiki/[wikiId]/document/[documentId]', + getDocLink = defaultGetDocLink, +}) => { + const { pathname } = useRouter(); + const { data: wiki, loading: wikiLoading, error: wikiError } = usePublicWikiDetail(wikiId); + const { data: tocs, loading: tocsLoading, error: tocsError } = usePublicWikiTocs(wikiId); + + return ( +
+
+
+
+ + + +
+
+ + + } + text={} + /> + } + error={wikiError} + normalContent={() => ( + <> + + + {wiki.name.charAt(0)} + + } + text={{wiki.name}} + hoverable={false} + /> + + )} + /> + + } + text={'概述'} + href={{ + pathname: `/share/wiki/[wikiId]`, + query: { wikiId }, + }} + isActive={pathname === '/share/wiki/[wikiId]'} + /> +
+ +
+
+ + } + text={} + rightNode={} + /> + } + error={tocsError} + normalContent={() => } + /> +
+
+
+ ); +}; diff --git a/packages/client/src/components/wiki/tocs/tree.tsx b/packages/client/src/components/wiki/tocs/tree.tsx new file mode 100644 index 0000000..32d936a --- /dev/null +++ b/packages/client/src/components/wiki/tocs/tree.tsx @@ -0,0 +1,160 @@ +import React, { useCallback, useEffect, useRef, useState } from 'react'; + +import { IconPlus } from '@douyinfe/semi-icons'; +import { Button, Tree as SemiTree, Typography } from '@douyinfe/semi-ui'; + +import { DocumentActions } from 'components/document/actions'; +import { DocumentCreator as DocumentCreatorForm } from 'components/document/create'; +import deepEqual from 'deep-equal'; +import { CREATE_DOCUMENT, event, triggerCreateDocument } from 'event'; +import { useToggle } from 'hooks/use-toggle'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import scrollIntoView from 'scroll-into-view-if-needed'; + +import { findParents } from './utils'; + +import styles from './index.module.scss'; + +const Actions = ({ node }) => { + const createDocument = useCallback( + (e) => { + e.stopPropagation(); + triggerCreateDocument({ wikiId: node.wikiId, documentId: node.id }); + }, + [node.wikiId, node.id] + ); + + return ( + + + + )} + + + + } + > + ) : ( + + )} + + ); +}; diff --git a/packages/client/src/layouts/single-column/index.module.scss b/packages/client/src/layouts/single-column/index.module.scss new file mode 100644 index 0000000..b6baeac --- /dev/null +++ b/packages/client/src/layouts/single-column/index.module.scss @@ -0,0 +1,11 @@ +.wrap { + display: flex; + flex-direction: column; + height: 100%; + background-color: var(--semi-color-nav-bg); + + .contentWrap { + flex: 1; + overflow: auto; + } +} diff --git a/packages/client/src/layouts/single-column/index.tsx b/packages/client/src/layouts/single-column/index.tsx new file mode 100644 index 0000000..4ec319e --- /dev/null +++ b/packages/client/src/layouts/single-column/index.tsx @@ -0,0 +1,27 @@ +import React from 'react'; + +import { Layout as SemiLayout } from '@douyinfe/semi-ui'; + +import { RouterHeader } from '../router-header'; + +import styles from './index.module.scss'; + +const { Content } = SemiLayout; + +const style = { + padding: '16px 24px', + backgroundColor: 'var(--semi-color-bg-0)', +}; + +export const SingleColumnLayout: React.FC = ({ children }) => { + return ( + + + + +
{children}
+
+
+
+ ); +}; diff --git a/packages/client/src/pages/_app.tsx b/packages/client/src/pages/_app.tsx new file mode 100644 index 0000000..444df2e --- /dev/null +++ b/packages/client/src/pages/_app.tsx @@ -0,0 +1,119 @@ +import '@react-pdf-viewer/core/lib/styles/index.css'; +import '@react-pdf-viewer/default-layout/lib/styles/index.css'; +import { Worker } from '@react-pdf-viewer/core'; +import React from 'react'; +import { Hydrate, QueryClient, QueryClientProvider } from 'react-query'; + +import 'tiptap/fix-match-nodes'; +import 'tiptap/core/styles/index.scss'; +import { preloadTiptapResources } from 'tiptap/preload'; + +import { isMobile } from 'helpers/env'; +import { DocumentVersionControl } from 'hooks/use-document-version'; +import { IsOnMobile } from 'hooks/use-on-mobile'; +import { IRuntimeConfig, RuntimeConfig } from 'hooks/use-runtime-config'; +import { Theme } from 'hooks/use-theme'; +import App from 'next/app'; +import Head from 'next/head'; + +import 'viewerjs/dist/viewer.css'; +import 'styles/globals.scss'; +import 'thirtypart/array-prototype-at'; + +class MyApp extends App<{ isMobile: boolean; runtimeConfig: IRuntimeConfig }> { + state = { + queryClient: new QueryClient({ + defaultOptions: { + queries: { + refetchOnMount: true, + refetchOnWindowFocus: true, + retry: false, + staleTime: 10 * 1000, // 默认 10s 数据过期 + }, + }, + }), + }; + + static getInitialProps = async ({ Component, ctx }) => { + const request = ctx?.req; + const getPagePropsPromise = Component.getInitialProps ? Component.getInitialProps(ctx) : Promise.resolve({}); + const [pageProps, runtimeConfig] = await Promise.all([ + getPagePropsPromise, + fetch(`${process.env.SITE_URL}/api/config`).then((res) => { + return res.json(); + }), + ]).catch((err) => { + return [{}, {}]; + }); + + return { + pageProps, + isMobile: isMobile(request?.headers['user-agent']), + runtimeConfig, + }; + }; + + componentDidMount() { + Promise.all([ + import('resize-observer-polyfill'), + // @ts-ignore + import('requestidlecallback-polyfill'), + ]).then(() => { + preloadTiptapResources(); + }); + } + + render() { + const { Component, pageProps, isMobile, runtimeConfig } = this.props; + const { queryClient } = this.state; + + return ( + <> + + + + + + + + + + + + + + + + + + + + + {((process.env.DNS_PREFETCH || []) as string[]).map((url) => ( + + ))} + + + + + + + + + + + + + + + + + + ); + } +} + +export default MyApp; diff --git a/packages/client/src/pages/admin/index.module.scss b/packages/client/src/pages/admin/index.module.scss new file mode 100644 index 0000000..4708e1b --- /dev/null +++ b/packages/client/src/pages/admin/index.module.scss @@ -0,0 +1,12 @@ +.wikiItemWrap { + padding: 12px 16px !important; + margin: 8px 2px; + cursor: pointer; + background-color: var(--semi-color-bg-2); + border: 1px solid var(--semi-color-border) !important; +} + +.titleWrap { + display: flex; + justify-content: space-between; +} diff --git a/packages/client/src/pages/admin/index.tsx b/packages/client/src/pages/admin/index.tsx new file mode 100644 index 0000000..da72ebf --- /dev/null +++ b/packages/client/src/pages/admin/index.tsx @@ -0,0 +1,58 @@ +import React, { useCallback } from 'react'; + +import { Banner, Typography } from '@douyinfe/semi-ui'; + +import { SystemConfig } from 'components/admin/system-config'; +import { Seo } from 'components/seo'; +import { useUser } from 'data/user'; +import { Forbidden } from 'illustrations/forbidden'; +import { SingleColumnLayout } from 'layouts/single-column'; +import type { NextPage } from 'next'; +import Router, { useRouter } from 'next/router'; + +import styles from './index.module.scss'; + +const { Title, Text } = Typography; + +const Page: NextPage = () => { + const { user } = useUser(); + const { query = {} } = useRouter(); + const { tab = 'base' } = query as { + tab?: string; + }; + + const navigate = useCallback((tab = 'base') => { + Router.push({ + pathname: `/admin`, + query: { tab }, + }); + }, []); + + return ( + + +
+ {user && user.isSystemAdmin ? ( + <> +
+ + 管理后台 + +
+ + + + ) : ( +
+ + + 无权限查看 + +
+ )} +
+
+ ); +}; + +export default Page; diff --git a/packages/client/src/pages/api/config.ts b/packages/client/src/pages/api/config.ts new file mode 100644 index 0000000..a281daa --- /dev/null +++ b/packages/client/src/pages/api/config.ts @@ -0,0 +1,7 @@ +import { getRuntimeConfig } from '@think/config'; + +import type { NextApiRequest, NextApiResponse } from 'next'; + +export default function handler(req: NextApiRequest, res: NextApiResponse>) { + res.status(200).json(getRuntimeConfig() as Record); +} diff --git a/packages/client/src/pages/app/index.tsx b/packages/client/src/pages/app/index.tsx new file mode 100644 index 0000000..fd4f5ea --- /dev/null +++ b/packages/client/src/pages/app/index.tsx @@ -0,0 +1,109 @@ +import { useCallback, useEffect } from 'react'; + +import { Avatar, Button, Table, Typography } from '@douyinfe/semi-ui'; + +import { IOrganization } from '@think/domains'; + +import { DataRender } from 'components/data-render'; +import { LocaleTime } from 'components/locale-time'; +import { Seo } from 'components/seo'; +import { usePeronalOrganization, useUserOrganizations } from 'data/organization'; +import { SingleColumnLayout } from 'layouts/single-column'; +import Link from 'next/link'; +import Router from 'next/router'; + +const { Title, Paragraph } = Typography; +const { Column } = Table; + +const Page = () => { + const { data: organization } = usePeronalOrganization(); + const { + data: userOrganizations, + loading: userOrganizationsLoading, + error: userOrganizationsError, + } = useUserOrganizations(); + + const gotoCreate = useCallback(() => { + Router.push({ + pathname: '/app/org/create', + }); + }, []); + + useEffect(() => { + if (userOrganizations && userOrganizations.length) return; + if (!organization) return; + + Router.replace({ + pathname: `/app/org/[organizationId]`, + query: { organizationId: organization.id }, + }); + }, [organization, userOrganizations]); + + return ( + + +
+
+ + 组织列表 + + +
+ ( + <> + + { + return ( + + + + + + {org.name} + + + + + ); + }} + /> + } + /> +
+ + )} + /> +
+
+ ); +}; + +export default Page; diff --git a/packages/client/src/pages/app/org/[organizationId]/index.module.scss b/packages/client/src/pages/app/org/[organizationId]/index.module.scss new file mode 100644 index 0000000..4708e1b --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/index.module.scss @@ -0,0 +1,12 @@ +.wikiItemWrap { + padding: 12px 16px !important; + margin: 8px 2px; + cursor: pointer; + background-color: var(--semi-color-bg-2); + border: 1px solid var(--semi-color-border) !important; +} + +.titleWrap { + display: flex; + justify-content: space-between; +} diff --git a/packages/client/src/pages/app/org/[organizationId]/index.tsx b/packages/client/src/pages/app/org/[organizationId]/index.tsx new file mode 100644 index 0000000..b047ceb --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/index.tsx @@ -0,0 +1,203 @@ +import React, { useEffect, useMemo } from 'react'; + +import { Avatar, Button, List, Table, Typography } from '@douyinfe/semi-ui'; + +import { DocumentApiDefinition, IDocument, IOrganization, StarApiDefinition } from '@think/domains'; + +import { DataRender } from 'components/data-render'; +import { DocumentActions } from 'components/document/actions'; +import { Empty } from 'components/empty'; +import { LocaleTime } from 'components/locale-time'; +import { Seo } from 'components/seo'; +import { WikiCreator } from 'components/wiki/create'; +import { WikiPinCard, WikiPinCardPlaceholder } from 'components/wiki/pin-card'; +import { getRecentVisitedDocuments, useRecentDocuments } from 'data/document'; +import { getStarWikisInOrganization, useStarWikisInOrganization } from 'data/star'; +import { useRouterQuery } from 'hooks/use-router-query'; +import { useToggle } from 'hooks/use-toggle'; +import { AppSingleColumnLayout } from 'layouts/app-single-column'; +import type { NextPage } from 'next'; +import Link from 'next/link'; +import { serverPrefetcher } from 'services/server-prefetcher'; + +import styles from './index.module.scss'; + +const { Title } = Typography; +const { Column } = Table; + +const grid = { + gutter: 16, + xs: 24, + sm: 12, + md: 12, + lg: 8, + xl: 8, +}; + +const RecentDocs = () => { + const { organizationId } = useRouterQuery<{ organizationId: string }>(); + const { data, error, loading, refresh } = useRecentDocuments(organizationId); + + const columns = useMemo( + () => [ + { + return ( + + {document.title} + + ); + }} + />, + , + { + return ( + + + {createUser.name.slice(0, 1)} + + {createUser.name} + + ); + }} + />, + } + />, + ( + + )} + />, + ], + [refresh] + ); + + useEffect(() => { + refresh(); + }, [refresh]); + + return ( + <> + + 最近访问 + + + {columns} + + } + error={error} + normalContent={() => + data && data.length ? ( + + {columns} +
+ ) : ( + + ) + } + /> + + ); +}; + +const Page: NextPage<{ organizationId: IOrganization['id'] }> = ({ organizationId }) => { + const [visible, toggleVisible] = useToggle(false); + const { data: staredWikis, loading, error, refresh } = useStarWikisInOrganization(organizationId); + + return ( + + +
+
+ + 快捷访问 + + <> + + + +
+ ( + ( + + + + )} + /> + )} + error={error} + normalContent={() => ( + ( + + + + )} + emptyContent={} + /> + )} + /> + +
+
+ ); +}; + +Page.getInitialProps = async (ctx) => { + const { organizationId } = ctx.query; + + const props = await serverPrefetcher(ctx, [ + { + url: StarApiDefinition.getStarWikisInOrganization.client(organizationId), + action: (cookie) => getStarWikisInOrganization(organizationId, cookie), + }, + { + url: DocumentApiDefinition.recent.client(organizationId), + action: (cookie) => getRecentVisitedDocuments(organizationId, cookie), + }, + ]); + return { ...props, organizationId } as any; +}; + +export default Page; diff --git a/packages/client/src/pages/app/org/[organizationId]/setting/index.tsx b/packages/client/src/pages/app/org/[organizationId]/setting/index.tsx new file mode 100644 index 0000000..29813dd --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/setting/index.tsx @@ -0,0 +1,53 @@ +import React, { useCallback } from 'react'; + +import { Typography } from '@douyinfe/semi-ui'; + +import { IOrganization } from '@think/domains'; + +import { OrganizationSetting } from 'components/organization/setting'; +import { AppSingleColumnLayout } from 'layouts/app-single-column'; +import { NextPage } from 'next'; +import Router, { useRouter } from 'next/router'; + +interface IProps { + organizationId: IOrganization['id']; +} + +const { Title } = Typography; + +const Page: NextPage = ({ organizationId }) => { + const { query = {} } = useRouter(); + const { tab = 'base' } = query as { + tab?: string; + }; + + const navigate = useCallback( + (tab = 'base') => { + Router.push({ + pathname: `/app/org/[organizationId]/setting`, + query: { organizationId, tab }, + }); + }, + [organizationId] + ); + + return ( + +
+
+ + 组织设置 + +
+ +
+
+ ); +}; + +Page.getInitialProps = async (ctx) => { + const { organizationId } = ctx.query; + return { organizationId } as IProps; +}; + +export default Page; diff --git a/packages/client/src/pages/app/org/[organizationId]/star/index.module.scss b/packages/client/src/pages/app/org/[organizationId]/star/index.module.scss new file mode 100644 index 0000000..4708e1b --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/star/index.module.scss @@ -0,0 +1,12 @@ +.wikiItemWrap { + padding: 12px 16px !important; + margin: 8px 2px; + cursor: pointer; + background-color: var(--semi-color-bg-2); + border: 1px solid var(--semi-color-border) !important; +} + +.titleWrap { + display: flex; + justify-content: space-between; +} diff --git a/packages/client/src/pages/app/org/[organizationId]/star/index.tsx b/packages/client/src/pages/app/org/[organizationId]/star/index.tsx new file mode 100644 index 0000000..ab4df03 --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/star/index.tsx @@ -0,0 +1,145 @@ +import React from 'react'; + +import { List, Typography } from '@douyinfe/semi-ui'; + +import { StarApiDefinition } from '@think/domains'; + +import { DataRender } from 'components/data-render'; +import { DocumentCard, DocumentCardPlaceholder } from 'components/document/card'; +import { Empty } from 'components/empty'; +import { Seo } from 'components/seo'; +import { WikiCard, WikiCardPlaceholder } from 'components/wiki/card'; +import { + getStarDocumentsInOrganization, + getStarWikisInOrganization, + useStarDocumentsInOrganization, + useStarWikisInOrganization, +} from 'data/star'; +import { useRouterQuery } from 'hooks/use-router-query'; +import { AppSingleColumnLayout } from 'layouts/app-single-column'; +import type { NextPage } from 'next'; +import { serverPrefetcher } from 'services/server-prefetcher'; + +import styles from './index.module.scss'; + +const { Title } = Typography; + +const grid = { + gutter: 16, + xs: 24, + sm: 12, + md: 12, + lg: 8, + xl: 8, +}; + +const StarDocs = () => { + const { organizationId } = useRouterQuery<{ organizationId: string }>(); + const { data: docs, loading, error } = useStarDocumentsInOrganization(organizationId); + + return ( + ( + ( + + + + )} + /> + )} + error={error} + normalContent={() => ( + ( + + + + )} + emptyContent={} + /> + )} + /> + ); +}; + +const StarWikis = () => { + const { organizationId } = useRouterQuery<{ organizationId: string }>(); + const { data, loading, error } = useStarWikisInOrganization(organizationId); + + return ( + ( + ( + + + + )} + /> + )} + error={error} + normalContent={() => ( + ( + + + + )} + emptyContent={} + /> + )} + /> + ); +}; + +const Page: NextPage = () => { + return ( + + +
+
+ + 知识库 + +
+ + +
+ + 文档 + +
+ +
+
+ ); +}; + +Page.getInitialProps = async (ctx) => { + const { organizationId } = ctx.query; + + const props = await serverPrefetcher(ctx, [ + { + url: StarApiDefinition.getStarWikisInOrganization.client(organizationId), + action: (cookie) => getStarWikisInOrganization(organizationId, cookie), + }, + { + url: StarApiDefinition.getStarDocumentsInOrganization.client(organizationId), + action: (cookie) => getStarDocumentsInOrganization(organizationId, cookie), + }, + ]); + return props; +}; + +export default Page; diff --git a/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]/edit/index.tsx b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]/edit/index.tsx new file mode 100644 index 0000000..846159c --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]/edit/index.tsx @@ -0,0 +1,31 @@ +import React from 'react'; + +import { DocumentApiDefinition, IDocument } from '@think/domains'; + +import { DocumentEditor } from 'components/document/editor'; +import { getDocumentDetail } from 'data/document'; +import { NextPage } from 'next'; +import { serverPrefetcher } from 'services/server-prefetcher'; + +interface IProps { + wikiId: string; + documentId: string; +} + +const Page: NextPage = ({ wikiId, documentId }) => { + return ; +}; + +Page.getInitialProps = async (ctx) => { + const { wikiId, documentId } = ctx.query; + + const res = await serverPrefetcher(ctx, [ + { + url: DocumentApiDefinition.getDetailById.client(documentId as IDocument['id']), + action: (cookie) => getDocumentDetail(documentId, cookie), + }, + ]); + return { ...res, wikiId, documentId } as IProps; +}; + +export default Page; diff --git a/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]/index.tsx b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]/index.tsx new file mode 100644 index 0000000..083746b --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/doc/[documentId]/index.tsx @@ -0,0 +1,43 @@ +import React from 'react'; + +import { DocumentApiDefinition, IDocument, IWiki, WikiApiDefinition } from '@think/domains'; + +import { DocumentReader } from 'components/document/reader'; +import { WikiTocs } from 'components/wiki/tocs'; +import { getDocumentDetail } from 'data/document'; +import { getWikiTocs } from 'data/wiki'; +import { AppDoubleColumnLayout } from 'layouts/app-double-column'; +import { NextPage } from 'next'; +import { serverPrefetcher } from 'services/server-prefetcher'; + +interface IProps { + wikiId: string; + documentId: string; +} + +const Page: NextPage = ({ wikiId, documentId }) => { + return ( + } + rightNode={} + /> + ); +}; + +Page.getInitialProps = async (ctx) => { + const { wikiId, documentId } = ctx.query; + + const res = await serverPrefetcher(ctx, [ + { + url: WikiApiDefinition.getTocsById.client(wikiId as IWiki['id']), + action: (cookie) => getWikiTocs(wikiId, cookie), + }, + { + url: DocumentApiDefinition.getDetailById.client(documentId as IDocument['id']), + action: (cookie) => getDocumentDetail(documentId, cookie), + }, + ]); + return { ...res, wikiId, documentId } as IProps; +}; + +export default Page; diff --git a/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/index.module.scss b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/index.module.scss new file mode 100644 index 0000000..e619ac7 --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/index.module.scss @@ -0,0 +1,41 @@ +.navItemWrap { + padding: 0 0.5rem; + + .navItem { + display: flex; + width: 100%; + height: 36px; + font-size: 14px; + color: var(--semi-color-text-0); + cursor: pointer; + border-radius: var(--semi-border-radius-small); + align-items: center; + + &:hover { + color: var(--semi-color-text-0); + background-color: var(--semi-color-fill-0); + } + + &.isActive { + color: var(--semi-color-text-0); + background-color: var(--semi-color-primary-light-default); + } + + > span { + display: flex; + align-items: center; + } + + .icon { + margin: 0 6px 0 4px; + } + + .title { + overflow: hidden; + color: var(--semi-color-text-0); + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + } + } +} diff --git a/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/index.tsx b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/index.tsx new file mode 100644 index 0000000..a89b129 --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/index.tsx @@ -0,0 +1,64 @@ +import React from 'react'; + +import { Spin } from '@douyinfe/semi-ui'; + +import { IWiki, WikiApiDefinition } from '@think/domains'; + +import { DataRender } from 'components/data-render'; +import { DocumentReader } from 'components/document/reader'; +import { WikiTocs } from 'components/wiki/tocs'; +import { getWikiDetail, getWikiTocs, useWikiDetail } from 'data/wiki'; +import { AppDoubleColumnLayout } from 'layouts/app-double-column'; +import { NextPage } from 'next'; +import { serverPrefetcher } from 'services/server-prefetcher'; + +interface IProps { + wikiId: string; +} + +const Page: NextPage = ({ wikiId }) => { + const { data: wiki, loading, error } = useWikiDetail(wikiId); + + return ( + } + rightNode={ + + + + } + error={error} + normalContent={() => } + /> + } + /> + ); +}; + +Page.getInitialProps = async (ctx) => { + const { wikiId } = ctx.query; + const res = await serverPrefetcher(ctx, [ + { + url: WikiApiDefinition.getDetailById.client(wikiId as IWiki['id']), + action: (cookie) => getWikiDetail(wikiId, cookie), + }, + { + url: WikiApiDefinition.getTocsById.client(wikiId as IWiki['id']), + action: (cookie) => getWikiTocs(wikiId, cookie), + }, + ]); + return { ...res, wikiId } as IProps; +}; + +export default Page; diff --git a/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/setting/index.tsx b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/setting/index.tsx new file mode 100644 index 0000000..f7da019 --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/wiki/[wikiId]/setting/index.tsx @@ -0,0 +1,62 @@ +import React, { useCallback } from 'react'; + +import { IWiki, WikiApiDefinition } from '@think/domains'; + +import { WikiSetting } from 'components/wiki/setting'; +import { WikiTocs } from 'components/wiki/tocs'; +import { getWikiMembers, getWikiTocs } from 'data/wiki'; +import { AppDoubleColumnLayout } from 'layouts/app-double-column'; +import { NextPage } from 'next'; +import Router, { useRouter } from 'next/router'; +import { serverPrefetcher } from 'services/server-prefetcher'; + +interface IProps { + wikiId: string; +} + +const Page: NextPage = ({ wikiId }) => { + const { query = {} } = useRouter(); + const { tab = 'recent' } = query as { + tab?: string; + }; + + const navigate = useCallback( + (tab = 'base') => { + return () => { + Router.push({ + pathname: `/app/org/[organizationId]/wiki/[wikiId]/setting`, + query: { organizationId: query.organizationId, wikiId, tab }, + }); + }; + }, + [query, wikiId] + ); + + return ( + } + rightNode={ +
+ navigate(tab)()} /> +
+ } + /> + ); +}; + +Page.getInitialProps = async (ctx) => { + const { wikiId } = ctx.query; + const res = await serverPrefetcher(ctx, [ + { + url: WikiApiDefinition.getTocsById.client(wikiId as IWiki['id']), + action: (cookie) => getWikiTocs(wikiId, cookie), + }, + { + url: WikiApiDefinition.getMemberById.client(wikiId as IWiki['id']), + action: (cookie) => getWikiMembers(wikiId, cookie), + }, + ]); + return { ...res, wikiId } as IProps; +}; + +export default Page; diff --git a/packages/client/src/pages/app/org/[organizationId]/wiki/index.module.scss b/packages/client/src/pages/app/org/[organizationId]/wiki/index.module.scss new file mode 100644 index 0000000..4708e1b --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/wiki/index.module.scss @@ -0,0 +1,12 @@ +.wikiItemWrap { + padding: 12px 16px !important; + margin: 8px 2px; + cursor: pointer; + background-color: var(--semi-color-bg-2); + border: 1px solid var(--semi-color-border) !important; +} + +.titleWrap { + display: flex; + justify-content: space-between; +} diff --git a/packages/client/src/pages/app/org/[organizationId]/wiki/index.tsx b/packages/client/src/pages/app/org/[organizationId]/wiki/index.tsx new file mode 100644 index 0000000..88fb217 --- /dev/null +++ b/packages/client/src/pages/app/org/[organizationId]/wiki/index.tsx @@ -0,0 +1,100 @@ +import React from 'react'; + +import { List, TabPane, Tabs, Typography } from '@douyinfe/semi-ui'; + +import { WikiApiDefinition } from '@think/domains'; + +import { DataRender } from 'components/data-render'; +import { Empty } from 'components/empty'; +import { Seo } from 'components/seo'; +import { WikiCard, WikiCardPlaceholder } from 'components/wiki/card'; +import { WikiCreator } from 'components/wiki-creator'; +import { getAllWikis, getJoinWikis, getOwnWikis, useAllWikis, useJoinWikis, useOwnWikis } from 'data/wiki'; +import { useRouterQuery } from 'hooks/use-router-query'; +import { CreateWikiIllustration } from 'illustrations/create-wiki'; +import { AppSingleColumnLayout } from 'layouts/app-single-column'; +import type { NextPage } from 'next'; +import { serverPrefetcher } from 'services/server-prefetcher'; + +const grid = { + gutter: 16, + xs: 24, + sm: 12, + md: 12, + lg: 8, + xl: 8, +}; + +const { Title } = Typography; + +const Wikis = ({ hook }) => { + const { organizationId } = useRouterQuery<{ organizationId: string }>(); + const { data, loading, error } = hook(organizationId); + + return ( + ( + ( + + + + )} + /> + )} + error={error} + normalContent={() => ( + ( + + + + )} + emptyContent={} message={} />} + /> + )} + /> + ); +}; + +const Page: NextPage = () => { + return ( + + +
+ + 知识库 + + + + + + + + + + + + +
+
+ ); +}; + +Page.getInitialProps = async (ctx) => { + const { orgId: organizationId } = ctx.query; + + const props = await serverPrefetcher(ctx, [ + { url: WikiApiDefinition.getAllWikis.client(organizationId), action: (cookie) => getAllWikis(cookie) }, + { url: WikiApiDefinition.getJoinWikis.client(organizationId), action: (cookie) => getJoinWikis(cookie) }, + { url: WikiApiDefinition.getOwnWikis.client(organizationId), action: (cookie) => getOwnWikis(cookie) }, + ]); + return props; +}; + +export default Page; diff --git a/packages/client/src/pages/app/org/create/index.module.scss b/packages/client/src/pages/app/org/create/index.module.scss new file mode 100644 index 0000000..c58f36b --- /dev/null +++ b/packages/client/src/pages/app/org/create/index.module.scss @@ -0,0 +1,9 @@ +.cover { + margin-right: 12px; +} + +@media (max-width: 768px) { + .cover { + width: 100%; + } +} diff --git a/packages/client/src/pages/app/org/create/index.tsx b/packages/client/src/pages/app/org/create/index.tsx new file mode 100644 index 0000000..9cd66b7 --- /dev/null +++ b/packages/client/src/pages/app/org/create/index.tsx @@ -0,0 +1,124 @@ +import { useCallback, useRef, useState } from 'react'; + +import { Avatar, Button, Form, Typography } from '@douyinfe/semi-ui'; +import { FormApi } from '@douyinfe/semi-ui/lib/es/form'; + +import { ORGANIZATION_LOGOS } from '@think/constants'; + +import { ImageUploader } from 'components/image-uploader'; +import { Seo } from 'components/seo'; +import { useCreateOrganization } from 'data/organization'; +import { useToggle } from 'hooks/use-toggle'; +import { SingleColumnLayout } from 'layouts/single-column'; +import Router from 'next/router'; + +import styles from './index.module.scss'; + +const images = [ + { + key: 'placeholers', + title: '图库', + images: ORGANIZATION_LOGOS, + }, +]; + +const { Title } = Typography; + +const Page: React.FC = () => { + const $form = useRef(); + const [changed, toggleChanged] = useToggle(false); + const [currentCover, setCurrentCover] = useState(''); + const { create, loading } = useCreateOrganization(); + + const setCover = useCallback((url) => { + $form.current.setValue('logo', url); + setCurrentCover(url); + }, []); + + const onFormChange = useCallback(() => { + toggleChanged(true); + }, [toggleChanged]); + + const onSubmit = useCallback(() => { + $form.current.validate().then((values) => { + create(values).then((res) => { + Router.push({ + pathname: `/app/org/[organizationId]`, + query: { organizationId: res.id }, + }); + }); + }); + }, [create]); + + return ( + + +
+
+ + 新建组织 + +
+
($form.current = formApi)} + onChange={onFormChange} + onSubmit={onSubmit} + > + +
+
+ +
+ + + +
+
+ + + + + +
+ +
+ +
+
+ ); +}; + +export default Page; diff --git a/packages/client/src/pages/feature/csrf/index.tsx b/packages/client/src/pages/feature/csrf/index.tsx new file mode 100644 index 0000000..d6b4edf --- /dev/null +++ b/packages/client/src/pages/feature/csrf/index.tsx @@ -0,0 +1,22 @@ +import React, { useRef, useState } from 'react'; + +import { SingleColumnLayout } from 'layouts/single-column'; +import { useRouter } from 'next/router'; + +const Page = () => { + const $container = useRef(); + const { query } = useRouter(); + const { id } = query as { id: string }; + const [v, setV] = useState(false); + + return ( + +
+ {id ? : null} + {id && v ? +
+ ) : ( +
+ 请设置外链地址 +
+ )} + + + + ); +}; diff --git a/packages/client/src/tiptap/core/wrappers/image/index.module.scss b/packages/client/src/tiptap/core/wrappers/image/index.module.scss new file mode 100644 index 0000000..5f062ec --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/image/index.module.scss @@ -0,0 +1,23 @@ +.wrap { + position: relative; + display: flex; + height: 100%; + padding: 8px 16px; + cursor: pointer; + border: 1px solid var(--node-border-color); + border-radius: var(--border-radius); + justify-content: space-between; + align-items: center; + + .handlerWrap { + position: absolute; + right: 10px; + bottom: 10px; + z-index: 2; + padding: 2px 4px; + background-color: var(--semi-color-bg-2); + border: 1px solid var(--node-border-color); + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + } +} diff --git a/packages/client/src/tiptap/core/wrappers/image/index.tsx b/packages/client/src/tiptap/core/wrappers/image/index.tsx new file mode 100644 index 0000000..98cc90b --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/image/index.tsx @@ -0,0 +1,148 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; +import { LazyLoadImage } from 'react-lazy-load-image-component'; + +import { Button, Spin, Typography } from '@douyinfe/semi-ui'; + +import { NodeViewWrapper } from '@tiptap/react'; +import { MAX_ZOOM, MIN_ZOOM, ZOOM_STEP } from 'tiptap/core/menus/mind/constant'; +import { + clamp, + extractFileExtension, + extractFilename, + getEditorContainerDOMSize, + getImageWidthHeight, +} from 'tiptap/prose-utils'; + +import { IconZoomIn, IconZoomOut } from 'components/icons'; +import { Resizeable } from 'components/resizeable'; +import { Tooltip } from 'components/tooltip'; +import { useToggle } from 'hooks/use-toggle'; +import { uploadFile } from 'services/file'; + +import styles from './index.module.scss'; + +const { Text } = Typography; + +export const ImageWrapper = ({ editor, node, updateAttributes }) => { + const isEditable = editor.isEditable; + const { hasTrigger, error, src, alt, title, width, height, textAlign } = node.attrs; + const { width: maxWidth } = getEditorContainerDOMSize(editor); + const $upload = useRef(); + const [loading, toggleLoading] = useToggle(false); + const [zoom, setZoomState] = useState(100); + + const onResize = useCallback( + (size) => { + updateAttributes({ height: size.height, width: size.width }); + }, + [updateAttributes] + ); + + const selectFile = useCallback(() => { + if (!isEditable || error || src) return; + isEditable && $upload.current.click(); + }, [isEditable, error, src]); + + const handleFile = useCallback( + async (e) => { + const file = e.target.files && e.target.files[0]; + + const fileInfo = { + fileName: extractFilename(file.name), + fileSize: file.size, + fileType: file.type, + fileExt: extractFileExtension(file.name), + }; + + toggleLoading(true); + + try { + const src = await uploadFile(file); + const size = await getImageWidthHeight(src); + updateAttributes({ ...fileInfo, ...size, src }); + toggleLoading(false); + } catch (error) { + updateAttributes({ error: '图片上传失败:' + (error && error.message) || '未知错误' }); + toggleLoading(false); + } + }, + [updateAttributes, toggleLoading] + ); + + const setZoom = useCallback((type: 'minus' | 'plus') => { + return () => { + setZoomState((currentZoom) => + clamp(type === 'minus' ? currentZoom - ZOOM_STEP : currentZoom + ZOOM_STEP, MIN_ZOOM, MAX_ZOOM) + ); + }; + }, []); + + useEffect(() => { + if (!src && !hasTrigger) { + selectFile(); + updateAttributes({ hasTrigger: true }); + } + }, [src, hasTrigger, selectFile, updateAttributes]); + + return ( + + + {error ? ( +
+ {error} +
+ ) : !src ? ( +
+ + {loading ? '正在上传中' : '请选择图片'} + + +
+ ) : ( +
+
+ +
+ +
+ +
+
+ )} +
+
+ ); +}; diff --git a/packages/client/src/tiptap/core/wrappers/katex/index.module.scss b/packages/client/src/tiptap/core/wrappers/katex/index.module.scss new file mode 100644 index 0000000..2519453 --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/katex/index.module.scss @@ -0,0 +1,8 @@ +.wrap { + display: flex; + padding: 1rem 4px; + font-size: 1em; + color: #000; + cursor: pointer; + justify-content: center; +} diff --git a/packages/client/src/tiptap/core/wrappers/katex/index.tsx b/packages/client/src/tiptap/core/wrappers/katex/index.tsx new file mode 100644 index 0000000..9dd782e --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/katex/index.tsx @@ -0,0 +1,48 @@ +import { useMemo } from 'react'; + +import { NodeViewWrapper } from '@tiptap/react'; + +import { convertColorToRGBA } from 'helpers/color'; +import { Theme, ThemeEnum } from 'hooks/use-theme'; +import katex from 'katex'; + +import styles from './index.module.scss'; + +export const KatexWrapper = ({ node, editor }) => { + const { text } = node.attrs; + const { theme } = Theme.useHook(); + const backgroundColor = useMemo(() => { + const color = `rgb(254, 242, 237)`; + if (theme === ThemeEnum.dark) return convertColorToRGBA(color, 0.75); + return color; + }, [theme]); + + const formatText = useMemo(() => { + try { + return katex.renderToString(`${text}`); + } catch (e) { + return text; + } + }, [text]); + + const content = useMemo( + () => + text.trim() ? ( + + ) : ( + 用户未输入公式 + ), + [text, formatText] + ); + + return ( + +
{content}
+
+ ); +}; diff --git a/packages/client/src/tiptap/core/wrappers/loading.tsx b/packages/client/src/tiptap/core/wrappers/loading.tsx new file mode 100644 index 0000000..22428d7 --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/loading.tsx @@ -0,0 +1,27 @@ +import { Spin } from '@douyinfe/semi-ui'; + +import { NodeViewWrapper } from '@tiptap/react'; + +export const LoadingWrapper = ({ editor, node }) => { + const isEditable = editor.isEditable; + const { text } = node.attrs; + + if (!isEditable) return ; + + return ( + +
+ +
+
+ ); +}; diff --git a/packages/client/src/tiptap/core/wrappers/mention-list/index.module.scss b/packages/client/src/tiptap/core/wrappers/mention-list/index.module.scss new file mode 100644 index 0000000..31c57c1 --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/mention-list/index.module.scss @@ -0,0 +1,38 @@ +.items { + width: 160px; + max-height: 320px; + overflow-x: hidden; + overflow-y: auto; + border-radius: var(--border-radius); + box-shadow: rgb(9 30 66 / 31%) 0 0 1px, rgb(9 30 66 / 25%) 0 4px 8px -2px; +} + +.item { + display: flex; + width: 100%; + padding: 12px 12px 11px; + color: rgb(9 30 66); + text-decoration: none; + cursor: pointer; + background-color: rgb(255 255 255); + border: 0; + border-radius: 0; + flex: 0 0 auto; + align-items: center; + + &:hover { + background-color: #f4f5f7; + } + + &.is-selected { + color: rgb(0 82 204); + text-decoration: none; + background-color: rgb(222 235 255); + fill: rgb(222 235 255); + } + + img { + width: 1em; + height: 1em; + } +} diff --git a/packages/client/src/tiptap/core/wrappers/mention-list/index.tsx b/packages/client/src/tiptap/core/wrappers/mention-list/index.tsx new file mode 100644 index 0000000..4e156b7 --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/mention-list/index.tsx @@ -0,0 +1,88 @@ +import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'; + +import { Editor } from '@tiptap/core'; + +import cls from 'classnames'; +import scrollIntoView from 'scroll-into-view-if-needed'; + +import styles from './index.module.scss'; + +interface IProps { + editor: Editor; + items: Array; + command: any; +} + +export const MentionList: React.FC = forwardRef((props, ref) => { + const $container = useRef(); + const [selectedIndex, setSelectedIndex] = useState(0); + + const selectItem = (index) => { + const userName = props.items[index]; + if (!userName) return; + props.command({ id: userName, label: userName }); + }; + + const upHandler = () => { + setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length); + }; + + const downHandler = () => { + setSelectedIndex((selectedIndex + 1) % props.items.length); + }; + + const enterHandler = () => { + selectItem(selectedIndex); + }; + + useEffect(() => setSelectedIndex(0), [props.items]); + + useEffect(() => { + if (Number.isNaN(selectedIndex + 1)) return; + const el = $container.current.querySelector(`span:nth-of-type(${selectedIndex + 1})`); + el && scrollIntoView(el, { behavior: 'smooth', scrollMode: 'if-needed' }); + }, [selectedIndex]); + + useImperativeHandle(ref, () => ({ + onKeyDown: ({ event }) => { + if (event.key === 'ArrowUp') { + upHandler(); + return true; + } + + if (event.key === 'ArrowDown') { + downHandler(); + return true; + } + + if (event.key === 'Enter') { + enterHandler(); + return true; + } + + return false; + }, + })); + + return ( +
+
+ {props.items.length ? ( + props.items.map((item, index) => ( + selectItem(index)} + > + {item} + + )) + ) : ( +
没有找到结果
+ )} +
+
+ ); +}); + +MentionList.displayName = 'MentionList'; diff --git a/packages/client/src/tiptap/core/wrappers/menu-list/index.module.scss b/packages/client/src/tiptap/core/wrappers/menu-list/index.module.scss new file mode 100644 index 0000000..88c3fd8 --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/menu-list/index.module.scss @@ -0,0 +1,38 @@ +.items { + width: 200px; + max-height: 320px; + overflow-x: hidden; + overflow-y: auto; + border-radius: var(--border-radius); + box-shadow: rgb(9 30 66 / 31%) 0 0 1px, rgb(9 30 66 / 25%) 0 4px 8px -2px; +} + +.item { + display: flex; + width: 100%; + padding: 12px 12px 11px; + color: rgb(9 30 66); + text-decoration: none; + cursor: pointer; + background-color: rgb(255 255 255); + border: 0; + border-radius: 0; + flex: 0 0 auto; + align-items: center; + + &:hover { + background-color: #f4f5f7; + } + + &.is-selected { + color: rgb(0 82 204); + text-decoration: none; + background-color: rgb(222 235 255); + fill: rgb(222 235 255); + } + + img { + width: 1em; + height: 1em; + } +} diff --git a/packages/client/src/tiptap/core/wrappers/menu-list/index.tsx b/packages/client/src/tiptap/core/wrappers/menu-list/index.tsx new file mode 100644 index 0000000..9b2f3b7 --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/menu-list/index.tsx @@ -0,0 +1,102 @@ +import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'; + +import { Space } from '@douyinfe/semi-ui'; + +import { Editor } from '@tiptap/core'; +import { ILabelRenderCommand } from 'tiptap/core/menus/commands'; + +import cls from 'classnames'; +import { useUser } from 'data/user'; +import scrollIntoView from 'scroll-into-view-if-needed'; + +import styles from './index.module.scss'; + +interface IProps { + editor: Editor; + items: ILabelRenderCommand[]; + command: (command: ILabelRenderCommand) => void; +} + +export const MenuList: React.FC = forwardRef((props, ref) => { + const { user } = useUser(); + const $container = useRef(); + const [selectedIndex, setSelectedIndex] = useState(0); + + const selectItem = (index) => { + const command = props.items[index]; + + if (command) { + // 注入用户信息 + command.user = user; + props.command(command); + } + }; + + const upHandler = () => { + setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length); + }; + + const downHandler = () => { + setSelectedIndex((selectedIndex + 1) % props.items.length); + }; + + const enterHandler = () => { + selectItem(selectedIndex); + }; + + useEffect(() => setSelectedIndex(0), [props.items]); + + useEffect(() => { + if (Number.isNaN(selectedIndex + 1)) return; + const el = $container.current.querySelector(`span:nth-of-type(${selectedIndex + 1})`); + el && scrollIntoView(el, { behavior: 'smooth', scrollMode: 'if-needed' }); + }, [selectedIndex]); + + useImperativeHandle(ref, () => ({ + onKeyDown: ({ event }) => { + if (event.key === 'ArrowUp') { + upHandler(); + return true; + } + + if (event.key === 'ArrowDown') { + downHandler(); + return true; + } + + if (event.key === 'Enter') { + enterHandler(); + return true; + } + + return false; + }, + })); + + return ( +
+
+ {props.items.length ? ( + props.items.map((item, index) => { + return ( + selectItem(index)} + > + + {item.icon} + {item.label} + + + ); + }) + ) : ( +
没有找到结果
+ )} +
+
+ ); +}); + +MenuList.displayName = 'MenuList'; diff --git a/packages/client/src/tiptap/core/wrappers/mind/index.module.scss b/packages/client/src/tiptap/core/wrappers/mind/index.module.scss new file mode 100644 index 0000000..a94678c --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/mind/index.module.scss @@ -0,0 +1,45 @@ +.wrap { + position: relative; + max-width: 100%; + overflow: visible; + line-height: 0; + + .renderWrap { + border: 1px solid var(--node-border-color); + border-radius: var(--border-radius); + + &::after { + background-color: transparent !important; + } + } + + .title { + position: absolute; + top: 10px; + left: 10px; + z-index: 2; + + .icon { + display: flex; + width: 18px; + height: 18px; + color: #fff; + background-color: #f80; + border-radius: 2px; + justify-content: center; + align-items: center; + } + } + + .mindHandlerWrap { + position: absolute; + right: 10px; + bottom: 10px; + z-index: 2; + padding: 2px 4px; + background-color: var(--semi-color-bg-2); + border: 1px solid var(--node-border-color); + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + } +} diff --git a/packages/client/src/tiptap/core/wrappers/mind/index.tsx b/packages/client/src/tiptap/core/wrappers/mind/index.tsx new file mode 100644 index 0000000..641ff5e --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/mind/index.tsx @@ -0,0 +1,189 @@ +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import VisibilitySensor from 'react-visibility-sensor'; + +import { Button, Space, Spin, Typography } from '@douyinfe/semi-ui'; + +import { NodeViewWrapper } from '@tiptap/react'; +import { MAX_ZOOM, MIN_ZOOM, ZOOM_STEP } from 'tiptap/core/menus/mind/constant'; +import { clamp, getEditorContainerDOMSize } from 'tiptap/prose-utils'; + +import cls from 'classnames'; +import { IconMind, IconMindCenter, IconZoomIn, IconZoomOut } from 'components/icons'; +import { Resizeable } from 'components/resizeable'; +import { Tooltip } from 'components/tooltip'; +import deepEqual from 'deep-equal'; +import { useToggle } from 'hooks/use-toggle'; +import { load, renderMind } from 'thirtypart/kityminder'; + +import styles from './index.module.scss'; + +const { Text } = Typography; + +const INHERIT_SIZE_STYLE = { width: '100%', height: '100%', maxWidth: '100%' }; + +export const _MindWrapper = ({ editor, node, updateAttributes }) => { + const $mind = useRef(null); + const $centerTimer = useRef>(null); + const isEditable = editor.isEditable; + const { width: maxWidth } = getEditorContainerDOMSize(editor); + const { data, width, height } = node.attrs; + const [visible, toggleVisible] = useToggle(false); + const [loading, toggleLoading] = useToggle(true); + const [error, setError] = useState(null); + + const setCenter = useCallback(() => { + const mind = $mind.current; + if (!mind) return; + mind.execCommand('camera'); + }, []); + + const setZoom = useCallback((type: 'minus' | 'plus') => { + return () => { + const mind = $mind.current; + if (!mind) return; + const currentZoom = mind.getZoomValue(); + const nextZoom = clamp(type === 'minus' ? currentZoom - ZOOM_STEP : currentZoom + ZOOM_STEP, MIN_ZOOM, MAX_ZOOM); + mind.execCommand('zoom', nextZoom); + }; + }, []); + + const onResize = useCallback( + (size) => { + updateAttributes({ width: size.width, height: size.height }); + $centerTimer.current = setTimeout(() => { + setCenter(); + }); + }, + [updateAttributes, setCenter] + ); + + const render = useCallback( + (div) => { + if (!div) return; + + if (!$mind.current) { + const graph = renderMind({ + container: div, + data, + isEditable: false, + }); + $mind.current = graph; + } + }, + [data] + ); + + const setMind = useCallback( + (div) => { + render(div); + }, + [render] + ); + + const onViewportChange = useCallback( + (visible) => { + if (visible && !$mind.current) { + toggleVisible(true); + } + }, + [toggleVisible] + ); + + useEffect(() => { + let isUnmount = false; + + load() + .catch((err) => !isUnmount && setError(err)) + .finally(() => !isUnmount && toggleLoading(false)); + + return () => { + isUnmount = true; + }; + }, [toggleLoading]); + + // 数据同步渲染 + useEffect(() => { + const mind = $mind.current; + if (!mind) return; + const currentData = mind.exportJson(); + const isEqual = deepEqual(currentData, data); + if (isEqual) return; + mind.importJson(data); + }, [data]); + + useEffect(() => { + setCenter(); + }, [width, height, setCenter]); + + useEffect(() => { + return () => { + clearTimeout($centerTimer.current); + }; + }, []); + + return ( + + + +
+ {error && ( +
+ {error.message || error} +
+ )} + + {loading && } + + {!loading && !error && ( +
+ )} + +
+ + + + + 思维导图 + +
+ +
+ +
+
+
+
+
+ ); +}; + +export const MindWrapper = React.memo(_MindWrapper, (prevProps, nextProps) => { + if (deepEqual(prevProps.node.attrs, nextProps.node.attrs)) { + return true; + } + + return false; +}); diff --git a/packages/client/src/tiptap/core/wrappers/status/index.module.scss b/packages/client/src/tiptap/core/wrappers/status/index.module.scss new file mode 100644 index 0000000..9fdbfae --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/status/index.module.scss @@ -0,0 +1,6 @@ +.wrap { + display: inline-block; + font-size: 0; + vertical-align: middle; + cursor: pointer; +} diff --git a/packages/client/src/tiptap/core/wrappers/status/index.tsx b/packages/client/src/tiptap/core/wrappers/status/index.tsx new file mode 100644 index 0000000..f0978a5 --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/status/index.tsx @@ -0,0 +1,134 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; + +import { IconTick } from '@douyinfe/semi-icons'; +import { Input, Popover, Space, Tag } from '@douyinfe/semi-ui'; + +import { NodeViewWrapper } from '@tiptap/react'; + +import cls from 'classnames'; +import { useUser } from 'data/user'; +import { useToggle } from 'hooks/use-toggle'; + +import styles from './index.module.scss'; + +export const STATUS_COLORS = [ + // 按钮背景 文字颜色 背景颜色 边框颜色 + ['rgb(223, 225, 230)', '#42526E', '#DFE1E6', 'rgb(80, 95, 121)'], + ['rgb(234, 230, 255)', '#403294', '#EAE6FF', 'rgb(82, 67, 170)'], + ['rgb(222, 235, 255)', '#0747A6', '#DEEBFF', 'rgb(0, 82, 204)'], + ['rgb(255, 235, 230)', '#BF2600', '#FFECE6', 'rgb(222, 53, 11)'], + ['rgb(255, 240, 179)', '#172B4D', '#FFF0B3', 'rgb(255, 153, 31)'], + ['rgb(227, 252, 239)', '#006644', '#E3FCEF', 'rgb(0, 135, 90)'], +]; + +export const StatusWrapper = ({ editor, node, updateAttributes }) => { + const isEditable = editor.isEditable; + const { color: currentTextColor, bgcolor, borderColor, text, defaultShowPicker, createUser } = node.attrs; + const { user } = useUser(); + const ref = useRef(); + const [visible, toggleVisible] = useToggle(false); + const [currentText, setCurrentText] = useState(text); + + const content = useMemo( + () => ( + + {currentText || '点击设置状态'} + + ), + [bgcolor, borderColor, currentTextColor, currentText] + ); + + const onVisibleChange = useCallback( + (value) => { + toggleVisible(value); + if (defaultShowPicker && user && user.id === createUser) { + updateAttributes({ defaultShowPicker: false }); + } + }, + [defaultShowPicker, toggleVisible, updateAttributes, createUser, user] + ); + + const setColor = useCallback( + (color) => () => { + updateAttributes({ + color: color[1], + bgcolor: color[2], + }); + }, + [updateAttributes] + ); + + useEffect(() => { + let timer: ReturnType = null; + + if (defaultShowPicker && user && user.id === createUser) { + toggleVisible(true); + timer = setTimeout(() => ref.current?.focus(), 200); + } + + return () => { + clearTimeout(timer); + }; + }, [defaultShowPicker, toggleVisible, createUser, user]); + + useEffect(() => { + let timer: ReturnType = null; + + if (visible) { + timer = setTimeout(() => { + ref.current?.focus(); + }, 200); + } else { + updateAttributes({ text: currentText }); + } + + return () => { + clearTimeout(timer); + }; + }, [visible, updateAttributes, currentText]); + + return ( + + {isEditable ? ( + +
+ +
+ + {STATUS_COLORS.map((color) => { + return ( + + {currentTextColor === color[1] ? : null} + + ); + })} + + + } + trigger="click" + > + {content} +
+ ) : ( + content + )} +
+ ); +}; diff --git a/packages/client/src/tiptap/core/wrappers/table-of-contents/index.module.scss b/packages/client/src/tiptap/core/wrappers/table-of-contents/index.module.scss new file mode 100644 index 0000000..77569bf --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/table-of-contents/index.module.scss @@ -0,0 +1,50 @@ +.toc { + width: max-content; + max-width: 100%; + background: var(--semi-color-fill-1); + border-radius: 0.5rem; + opacity: 0.75; + + &.visible { + padding: 0.75rem; + margin: 0.75em 0; + } + + .list { + padding: 0; + margin: 0 0 12px; + list-style: none; + + &::before { + display: block; + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.025rem; + text-transform: uppercase; + content: '目录'; + opacity: 0.5; + } + } + + .item { + a:hover { + opacity: 0.5; + } + + &--3 { + padding-left: 1rem; + } + + &--4 { + padding-left: 2rem; + } + + &--5 { + padding-left: 3rem; + } + + &--6 { + padding-left: 4rem; + } + } +} diff --git a/packages/client/src/tiptap/core/wrappers/table-of-contents/index.tsx b/packages/client/src/tiptap/core/wrappers/table-of-contents/index.tsx new file mode 100644 index 0000000..be2f63d --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/table-of-contents/index.tsx @@ -0,0 +1,100 @@ +import { useCallback, useEffect, useState } from 'react'; + +import { NodeViewWrapper } from '@tiptap/react'; + +import cls from 'classnames'; + +import styles from './index.module.scss'; + +const arrToTree = (tocs) => { + const result = []; + const levels = [result]; + + tocs.forEach((o) => { + let offset = -1; + let parent = levels[o.level + offset]; + + while (!parent) { + offset -= 1; + parent = levels[o.level + offset]; + } + + parent.push({ ...o, children: (levels[o.level] = []) }); + }); + + return result; +}; + +export const TableOfContentsWrapper = ({ editor }) => { + const isEditable = editor.isEditable; + const [items, setItems] = useState([]); + + const handleUpdate = useCallback(() => { + const headings = []; + const transaction = editor.state.tr; + + editor.state.doc.descendants((node, pos) => { + if (node.type.name === 'heading') { + const id = `heading-${headings.length + 1}`; + + if (node.attrs.id !== id) { + transaction.setNodeMarkup(pos, undefined, { + ...node.attrs, + id, + }); + } + + headings.push({ + level: node.attrs.level, + text: node.textContent, + id, + }); + } + }); + + transaction.setMeta('addToHistory', false); + transaction.setMeta('preventUpdate', true); + editor.view.dispatch(transaction); + + setItems(headings); + editor.eventEmitter && editor.eventEmitter.emit('TableOfContents', arrToTree(headings)); + }, [editor]); + + useEffect(() => { + if (!editor) { + return; + } + + if (!editor.options.editable) { + handleUpdate(); + return; + } + + editor.on('update', handleUpdate); + + return () => { + editor.off('update', handleUpdate); + }; + }, [editor, handleUpdate]); + + useEffect(() => { + handleUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + {isEditable ? ( +
+
    + {items.map((item, index) => ( +
  • + {item.text} +
  • + ))} +
+
+ ) : null} +
+ ); +}; diff --git a/packages/client/src/tiptap/core/wrappers/task-item/index.module.scss b/packages/client/src/tiptap/core/wrappers/task-item/index.module.scss new file mode 100644 index 0000000..f797c8d --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/task-item/index.module.scss @@ -0,0 +1,5 @@ +.wrap { + display: inline-flex; + justify-content: center; + margin: 8px 0; +} diff --git a/packages/client/src/tiptap/core/wrappers/task-item/index.tsx b/packages/client/src/tiptap/core/wrappers/task-item/index.tsx new file mode 100644 index 0000000..512147b --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/task-item/index.tsx @@ -0,0 +1,16 @@ +import { Checkbox } from '@douyinfe/semi-ui'; + +import { NodeViewContent, NodeViewWrapper } from '@tiptap/react'; + +import styles from './index.module.scss'; + +export const TaskItemWrapper = ({ editor, node, updateAttributes }) => { + const { checked } = node.attrs; + + return ( + + updateAttributes({ checked: e.target.checked })} /> + + + ); +}; diff --git a/packages/client/src/tiptap/core/wrappers/title/index.module.scss b/packages/client/src/tiptap/core/wrappers/title/index.module.scss new file mode 100644 index 0000000..4d117c3 --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/title/index.module.scss @@ -0,0 +1,38 @@ +.wrap { + position: relative; + margin-top: 24px; + + .coverWrap { + position: relative; + height: 280px; + margin-top: 14px; + margin-bottom: 12px; + overflow: hidden; + + img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-position: center 50%; + object-fit: cover; + } + + .toolbar { + position: absolute; + right: 12px; + bottom: 12px; + z-index: 2; + font-size: 1rem; + } + } + + .emptyToolbarWrap { + position: absolute; + top: 0; + left: 0; + height: 0; + pointer-events: none; + } +} diff --git a/packages/client/src/tiptap/core/wrappers/title/index.tsx b/packages/client/src/tiptap/core/wrappers/title/index.tsx new file mode 100644 index 0000000..d19eb3e --- /dev/null +++ b/packages/client/src/tiptap/core/wrappers/title/index.tsx @@ -0,0 +1,105 @@ +import { useCallback, useEffect, useRef } from 'react'; +import { createPortal } from 'react-dom'; + +import { Button } from '@douyinfe/semi-ui'; + +import { DOCUMENT_COVERS } from '@think/constants'; + +import { NodeViewContent, NodeViewWrapper } from '@tiptap/react'; + +import cls from 'classnames'; +import { ImageUploader } from 'components/image-uploader'; + +import styles from './index.module.scss'; + +const images = [ + { + key: 'placeholers', + title: '图库', + images: DOCUMENT_COVERS, + }, +]; + +export const TitleWrapper = ({ editor, node }) => { + const toolbarRef = useRef(null); + const isEditable = editor.isEditable; + const { cover } = node.attrs; + + const setCover = useCallback( + (cover) => { + editor.commands.command(({ tr }) => { + const pos = 0; + tr.setNodeMarkup(pos, undefined, { + ...node.attrs, + cover, + }); + tr.setMeta('scrollIntoView', false); + return true; + }); + }, + [editor, node] + ); + + const addRandomCover = useCallback(() => { + setCover(DOCUMENT_COVERS[~~(Math.random() * DOCUMENT_COVERS.length)]); + }, [setCover]); + + const createAddCoverUIControl = useCallback(() => { + if (!editor.isEditable) return null; + + if (!toolbarRef.current) { + const editorDOM = editor.view.dom as HTMLDivElement; + const parent = editorDOM.parentElement; + const el = window.document.createElement('div'); + + parent.style.position = 'relative'; + editorDOM.parentNode.insertBefore(el, editorDOM); + toolbarRef.current = el; + } + + return createPortal( +
+ +
, + toolbarRef.current + ); + }, [editor, addRandomCover]); + + useEffect(() => { + const remove = () => { + if (cover && toolbarRef.current) { + toolbarRef.current?.remove(); + toolbarRef.current = null; + } + }; + + remove(); + + return () => { + remove(); + }; + }, [cover, createAddCoverUIControl]); + + return ( + + {cover ? ( +
+ 请选择或移除封面 + {isEditable ? ( +
+ + + +
+ ) : null} +
+ ) : null} + {isEditable ? createAddCoverUIControl() : null} + +
+ ); +}; diff --git a/packages/client/src/tiptap/editor/collaboration/collaboration/editor.tsx b/packages/client/src/tiptap/editor/collaboration/collaboration/editor.tsx new file mode 100644 index 0000000..903fd70 --- /dev/null +++ b/packages/client/src/tiptap/editor/collaboration/collaboration/editor.tsx @@ -0,0 +1,228 @@ +import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; + +import { BackTop, Toast } from '@douyinfe/semi-ui'; + +import { EditorContent, useEditor } from 'tiptap/core'; +import { Collaboration } from 'tiptap/core/extensions/collaboration'; +import { CollaborationCursor } from 'tiptap/core/extensions/collaboration-cursor'; +import { Tocs } from 'tiptap/editor/tocs'; + +import { HocuspocusProvider } from '@hocuspocus/provider'; +import cls from 'classnames'; +import { Banner } from 'components/banner'; +import { CommentEditor } from 'components/document/comments'; +import { ImageViewer } from 'components/image-viewer'; +import { getRandomColor } from 'helpers/color'; +import { isAndroid, isIOS } from 'helpers/env'; +import { useDocumentStyle } from 'hooks/use-document-style'; +import { useNetwork } from 'hooks/use-network'; +import { IsOnMobile } from 'hooks/use-on-mobile'; +import { RuntimeConfig } from 'hooks/use-runtime-config'; +import { useToggle } from 'hooks/use-toggle'; + +import { CollaborationKit } from '../kit'; +import { MenuBar } from './menubar'; +import { ICollaborationEditorProps, ProviderStatus } from './type'; + +import styles from './index.module.scss'; + +type IProps = Pick< + ICollaborationEditorProps, + 'editable' | 'user' | 'onTitleUpdate' | 'menubar' | 'renderInEditorPortal' | 'hideComment' +> & { + hocuspocusProvider: HocuspocusProvider; + status: ProviderStatus; + documentId: string; +}; + +export const EditorInstance = forwardRef((props: IProps, ref) => { + const { + hocuspocusProvider, + documentId, + editable, + user, + hideComment, + status, + menubar, + renderInEditorPortal, + onTitleUpdate, + } = props; + const config = RuntimeConfig.useHook(); + const $headerContainer = useRef(); + const $mainContainer = useRef(); + const { isMobile } = IsOnMobile.useHook(); + const { online } = useNetwork(); + const [created, toggleCreated] = useToggle(false); + const editor = useEditor( + { + editable, + editorProps: { + // @ts-ignore + taskItemClickable: true, + attributes: { + class: 'is-withauthor', + }, + }, + extensions: [ + ...CollaborationKit, + Collaboration.configure({ + document: hocuspocusProvider.document, + }), + CollaborationCursor.configure({ + provider: hocuspocusProvider, + user: { + ...(user || { + name: '访客', + }), + color: getRandomColor(), + }, + }), + ].filter(Boolean), + onUpdate({ transaction }) { + try { + const title = transaction.doc.content.firstChild.content.firstChild?.textContent; + onTitleUpdate(title || '未命名文档'); + } catch (e) { + // + } + }, + onCreate() { + toggleCreated(true); + }, + onDestroy() {}, + }, + [editable, user, onTitleUpdate, hocuspocusProvider] + ); + const { width, fontSize } = useDocumentStyle(); + const editorWrapClassNames = useMemo(() => { + return width === 'standardWidth' ? styles.isStandardWidth : styles.isFullWidth; + }, [width]); + const getTocsContainer = useCallback(() => $mainContainer.current, []); + + useImperativeHandle(ref, () => editor); + + const protals = useMemo(() => { + if (!created || !renderInEditorPortal) return; + return renderInEditorPortal($mainContainer.current); + }, [created, renderInEditorPortal]); + + // 监听 ctrl+s + useEffect(() => { + const listener = (event: KeyboardEvent) => { + if ((event.ctrlKey || event.metaKey) && event.keyCode == 83) { + event.preventDefault(); + Toast.info(`${config.appName}会实时保存你的数据,无需手动保存。`); + return false; + } + }; + + window.document.addEventListener('keydown', listener); + + return () => { + window.document.removeEventListener('keydown', listener); + }; + }, [config.appName]); + + // 监听键盘收起、打开 + useEffect(() => { + if (!isMobile) return; + + let cleanUp = () => {}; + const focusIn = () => { + setTimeout(() => { + if (!$headerContainer.current) return; + $headerContainer.current.classList.add(styles.keyUp); + $headerContainer.current.scrollIntoView(); + }, 200); + }; + const focusOut = () => { + if (!$headerContainer.current) return; + $headerContainer.current.classList.remove(styles.iOSKeyUp); + }; + + if (isIOS()) { + document.body.addEventListener('focusin', focusIn); + document.body.addEventListener('focusout', focusOut); + cleanUp = () => { + document.body.removeEventListener('focusin', focusIn); + document.body.removeEventListener('focusout', focusOut); + }; + } else if (isAndroid) { + const originalHeight = document.documentElement.clientHeight || document.body.clientHeight; + window.onresize = function () { + //键盘弹起与隐藏都会引起窗口的高度发生变化 + const resizeHeight = document.documentElement.clientHeight || document.body.clientHeight; + if (resizeHeight < originalHeight) { + focusIn(); + } else { + focusOut(); + } + }; + } + + return () => { + cleanUp(); + }; + }, [isMobile]); + + return ( + <> + {(!online || status === 'disconnected') && ( + + )} + + {/* FIXME:需要菜单栏但是无法编辑,则认为进入了编辑模式但是没有编辑权限,也许有更好的判断 */} + {!editable && menubar && ( + // @ts-ignore + + )} + + {menubar && ( +
+ +
+ )} + +
+
+
+ +
+ {!editable && !hideComment && ( +
+ +
+ )} +
+ {!isMobile && ( +
+ +
+ )} + {protals} + {!editable && } +
+ $mainContainer.current} + style={{ right: isMobile ? 16 : 36, bottom: 65 }} + visibilityHeight={200} + /> + + ); +}); + +EditorInstance.displayName = 'EditorInstance'; diff --git a/packages/client/src/tiptap/editor/collaboration/collaboration/index.module.scss b/packages/client/src/tiptap/editor/collaboration/collaboration/index.module.scss new file mode 100644 index 0000000..1da0c86 --- /dev/null +++ b/packages/client/src/tiptap/editor/collaboration/collaboration/index.module.scss @@ -0,0 +1,76 @@ +.wrap { + display: flex; + width: 100%; + height: 100%; + min-height: 240px; + overflow: hidden; + flex-direction: column; + + > header { + z-index: 110; + display: flex; + justify-content: center; + height: 50px; + padding: 0 24px; + overflow: hidden; + background-color: var(--semi-color-nav-bg); + align-items: center; + border-bottom: 1px solid var(--semi-color-border); + user-select: none; + + &.mobileToolbar { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 999; + display: flex; + height: 49px; + padding-right: env(safe-area-inset-right); + padding-bottom: env(safe-area-inset-bottom); + padding-left: env(safe-area-inset-left); + background: var(--semi-color-bg-1); + box-sizing: content-box; + justify-content: space-around; + align-items: center; + border-top: 1px solid var(--semi-color-border); + + &.keyUp { + position: absolute; + } + } + } + + > main { + position: relative; + display: flex; + overflow: auto; + /* stylelint-disable-next-line */ + overflow: overlay; + flex: 1; + justify-content: center; + flex-wrap: nowrap; + scroll-behavior: smooth; + + .contentWrap { + width: 100%; + + &.isStandardWidth { + max-width: 750px; + } + + &.isFullWidth { + max-width: 100%; + } + + .commentWrap { + padding: 16px 0 64px; + border-top: 1px solid var(--semi-color-border); + } + } + + .tocsWrap { + position: relative; + } + } +} diff --git a/packages/client/src/tiptap/editor/collaboration/collaboration/index.tsx b/packages/client/src/tiptap/editor/collaboration/collaboration/index.tsx new file mode 100644 index 0000000..5f0b404 --- /dev/null +++ b/packages/client/src/tiptap/editor/collaboration/collaboration/index.tsx @@ -0,0 +1,150 @@ +import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; + +import { Spin, Typography } from '@douyinfe/semi-ui'; + +import { Editor } from 'tiptap/core'; +import { IndexeddbPersistence } from 'tiptap/core/thritypart/y-indexeddb'; + +import { HocuspocusProvider } from '@hocuspocus/provider'; +import { DataRender } from 'components/data-render'; +import deepEqual from 'deep-equal'; +import { useToggle } from 'hooks/use-toggle'; +import { SecureDocumentIllustration } from 'illustrations/secure-document'; + +import { EditorInstance } from './editor'; +import { ICollaborationEditorProps, ProviderStatus } from './type'; + +import styles from './index.module.scss'; + +const { Text } = Typography; + +export type ICollaborationRefProps = { + getEditor: () => Editor; +}; + +const errorContainerStyle = { + margin: '10%', + display: 'flex', + justifyContent: 'center', + flexDirection: 'column', + alignItems: 'center', +} as React.CSSProperties; + +export const CollaborationEditor = forwardRef((props: ICollaborationEditorProps, ref) => { + const { + id: documentId, + type, + editable, + onTitleUpdate, + user, + menubar, + hideComment, + renderInEditorPortal, + onAwarenessUpdate, + } = props; + const $editor = useRef(); + const [loading, toggleLoading] = useToggle(true); + const [error, setError] = useState(null); + const [status, setStatus] = useState('connecting'); + const lastAwarenessRef = useRef([]); + + const hocuspocusProvider = useMemo(() => { + return new HocuspocusProvider({ + url: process.env.COLLABORATION_API_URL, + name: documentId, + token: (user && user.token) || 'read-public', + parameters: { + targetId: documentId, + userId: user && user.id, + docType: type, + editable, + }, + maxAttempts: 1, + onAwarenessUpdate: ({ states }) => { + const users = states.map((state) => ({ clientId: state.clientId, user: state.user })); + if (deepEqual(user, lastAwarenessRef.current)) { + return; + } + onAwarenessUpdate && onAwarenessUpdate(users); + lastAwarenessRef.current = users; + }, + onAuthenticationFailed(e) { + toggleLoading(false); + setError(e || new Error('鉴权失败!暂时无法提供服务')); + }, + onSynced() { + toggleLoading(false); + }, + onStatus({ status }) { + setStatus(status); + }, + } as any); + }, [documentId, user, type, editable, onAwarenessUpdate, toggleLoading]); + + const renderEditor = useCallback( + () => ( + + ), + [documentId, editable, hideComment, hocuspocusProvider, menubar, onTitleUpdate, renderInEditorPortal, status, user] + ); + + const renderError = useCallback( + (error) => ( +
+ + {(error && error.message) || '未知错误'} +
+ ), + [] + ); + + useImperativeHandle( + ref, + () => + ({ + getEditor: () => $editor.current, + } as ICollaborationRefProps) + ); + + // 离线缓存 + useEffect(() => { + if (!editable) return; + const indexdbProvider = new IndexeddbPersistence(documentId, hocuspocusProvider.document); + indexdbProvider.on('synced', () => { + setStatus('loadCacheSuccess'); + }); + + return () => { + if (indexdbProvider) { + indexdbProvider.destroy(); + } + }; + }, [editable, documentId, hocuspocusProvider]); + + useEffect(() => { + return () => { + if (hocuspocusProvider) { + hocuspocusProvider.destroy(); + } + }; + }, [hocuspocusProvider]); + + return ( +
+ +
+ ); +}); + +CollaborationEditor.displayName = 'CollaborationEditor'; diff --git a/packages/client/src/tiptap/editor/collaboration/collaboration/menubar.tsx b/packages/client/src/tiptap/editor/collaboration/collaboration/menubar.tsx new file mode 100644 index 0000000..7844e56 --- /dev/null +++ b/packages/client/src/tiptap/editor/collaboration/collaboration/menubar.tsx @@ -0,0 +1,131 @@ +import React, { useMemo } from 'react'; + +import { Space } from '@douyinfe/semi-ui'; + +import { Editor } from 'tiptap/core'; +import { Align } from 'tiptap/core/menus/align'; +import { Attachment } from 'tiptap/core/menus/attachment'; +import { BackgroundColor } from 'tiptap/core/menus/background-color'; +import { Blockquote } from 'tiptap/core/menus/blockquote'; +import { Bold } from 'tiptap/core/menus/bold'; +import { BulletList } from 'tiptap/core/menus/bullet-list'; +import { Callout } from 'tiptap/core/menus/callout'; +import { CleadrNodeAndMarks } from 'tiptap/core/menus/clear-node-and-marks'; +import { Code } from 'tiptap/core/menus/code'; +import { CodeBlock } from 'tiptap/core/menus/code-block'; +import { Columns } from 'tiptap/core/menus/columns'; +import { Countdonw } from 'tiptap/core/menus/countdown'; +import { DocumentChildren } from 'tiptap/core/menus/document-children'; +import { DocumentReference } from 'tiptap/core/menus/document-reference'; +import { Emoji } from 'tiptap/core/menus/emoji'; +import { Excalidraw } from 'tiptap/core/menus/excalidraw'; +import { Flow } from 'tiptap/core/menus/flow'; +import { FontFamily } from 'tiptap/core/menus/fontfamily'; +import { FontSize } from 'tiptap/core/menus/fontsize'; +import { Heading } from 'tiptap/core/menus/heading'; +import { HorizontalRule } from 'tiptap/core/menus/horizontal-rule'; +import { Ident } from 'tiptap/core/menus/ident'; +import { Iframe } from 'tiptap/core/menus/iframe'; +import { Image } from 'tiptap/core/menus/image'; +import { Insert } from 'tiptap/core/menus/insert'; +import { Italic } from 'tiptap/core/menus/italic'; +import { Katex } from 'tiptap/core/menus/katex'; +import { LineHeight } from 'tiptap/core/menus/lineheight'; +import { Link } from 'tiptap/core/menus/link'; +import { Mind } from 'tiptap/core/menus/mind'; +import { OrderedList } from 'tiptap/core/menus/ordered-list'; +import { Redo } from 'tiptap/core/menus/redo'; +import { Search } from 'tiptap/core/menus/search'; +import { Strike } from 'tiptap/core/menus/strike'; +import { Subscript } from 'tiptap/core/menus/subscript'; +import { Superscript } from 'tiptap/core/menus/superscript'; +import { Table } from 'tiptap/core/menus/table'; +import { TaskList } from 'tiptap/core/menus/task-list'; +import { Text } from 'tiptap/core/menus/text'; +import { TextColor } from 'tiptap/core/menus/text-color'; +import { Underline } from 'tiptap/core/menus/underline'; +import { Undo } from 'tiptap/core/menus/undo'; + +import { Divider } from 'components/divider'; + +const _MenuBar: React.FC<{ editor: Editor }> = ({ editor }) => { + const isEditable = useMemo(() => editor && editor.isEditable, [editor]); + + if (!editor) return null; + + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +