Full Code of phpk/godoos for AI

master 3d0b4b7ca1d2 cached
1871 files
78.1 MB
20.6M tokens
82331 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (83,020K chars total). Download the full file to get everything.
Repository: phpk/godoos
Branch: master
Commit: 3d0b4b7ca1d2
Files: 1871
Total size: 78.1 MB

Directory structure:
gitextract_n9qlzxsf/

├── .gitignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.en.md
├── README.md
├── app/
│   └── app.go
├── build/
│   ├── README.md
│   ├── darwin/
│   │   ├── Info.dev.plist
│   │   └── Info.plist
│   └── windows/
│       ├── info.json
│       ├── installer/
│       │   ├── project.nsi
│       │   └── wails_tools.nsh
│       └── wails.exe.manifest
├── build.linux.sh
├── build.win.sh
├── cloud/
│   ├── .gitignore
│   ├── README.md
│   ├── build.sh
│   ├── cmd/
│   │   ├── main.go
│   │   ├── msg.go
│   │   └── serve.go
│   ├── deps/
│   │   └── frontend.go
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── compose-dev.yaml
├── docker/
│   ├── Dockerfile-dev
│   └── nginx.conf
├── docker-compose.yml
├── docs/
│   ├── Api.md
│   ├── Faq.md
│   ├── Markdown.md
│   ├── Store.en.md
│   ├── Store.md
│   ├── ai.md
│   └── demo/
│       ├── mysql5.7/
│       │   ├── install.json
│       │   ├── my.ini
│       │   ├── my.ini.tpl
│       │   ├── password.txt
│       │   ├── password.txt.tpl
│       │   ├── static/
│       │   │   └── index.html
│       │   └── store.json
│       ├── mysql8.0/
│       │   ├── install.json
│       │   └── my.ini.tpl
│       ├── nginx/
│       │   └── store.json
│       └── redis5.0/
│           └── store.json
├── frontend/
│   ├── .gitignore
│   ├── .vscode/
│   │   └── extensions.json
│   ├── README.md
│   ├── auto-imports.d.ts
│   ├── components.d.ts
│   ├── env.d.ts
│   ├── index.html
│   ├── package.json
│   ├── package.json.md5
│   ├── public/
│   │   ├── baiban/
│   │   │   ├── assets/
│   │   │   │   ├── index-BBuZupZQ.js
│   │   │   │   ├── index-C7Nv1nqD.js
│   │   │   │   ├── index-CB2-j8Sp.js
│   │   │   │   ├── index-CbiYJP60.css
│   │   │   │   ├── index-CdI7WPm4.js
│   │   │   │   ├── index-D7I3m8ha.js
│   │   │   │   ├── index-DQ-zJgK-.js
│   │   │   │   ├── index-DQ5iesJJ.css
│   │   │   │   ├── index-e9sqCFI7.css
│   │   │   │   └── index-kFFNEmpN.js
│   │   │   ├── index.html
│   │   │   └── static/
│   │   │       └── translations/
│   │   │           ├── ar.json
│   │   │           ├── ca.json
│   │   │           ├── cs.json
│   │   │           ├── da.json
│   │   │           ├── de.json
│   │   │           ├── en.json
│   │   │           ├── es.json
│   │   │           ├── fa.json
│   │   │           ├── fi.json
│   │   │           ├── fr.json
│   │   │           ├── gl.json
│   │   │           ├── he.json
│   │   │           ├── hi-in.json
│   │   │           ├── hr.json
│   │   │           ├── hu.json
│   │   │           ├── id.json
│   │   │           ├── it.json
│   │   │           ├── ja.json
│   │   │           ├── ko-kr.json
│   │   │           ├── ku.json
│   │   │           ├── languages.json
│   │   │           ├── main.json
│   │   │           ├── my.json
│   │   │           ├── ne.json
│   │   │           ├── no.json
│   │   │           ├── pl.json
│   │   │           ├── pt-br.json
│   │   │           ├── pt-pt.json
│   │   │           ├── ro.json
│   │   │           ├── ru.json
│   │   │           ├── sl.json
│   │   │           ├── sv.json
│   │   │           ├── te.json
│   │   │           ├── th.json
│   │   │           ├── tr.json
│   │   │           ├── uk.json
│   │   │           ├── vi.json
│   │   │           ├── zh-cn.json
│   │   │           └── zh-tw.json
│   │   ├── bot/
│   │   │   ├── chat.json
│   │   │   └── search.json
│   │   ├── calculator/
│   │   │   ├── css/
│   │   │   │   └── cal.css
│   │   │   ├── index.html
│   │   │   └── js/
│   │   │       └── cal.js
│   │   ├── docx/
│   │   │   ├── assets/
│   │   │   │   ├── index.03fab396.css
│   │   │   │   ├── index.15480821.css
│   │   │   │   ├── index.2535d7f3.css
│   │   │   │   ├── index.2a68c9e8.js
│   │   │   │   ├── index.30955838.js
│   │   │   │   ├── index.3842052e.js
│   │   │   │   ├── index.461a1f59.js
│   │   │   │   ├── index.4e9c2fed.js
│   │   │   │   ├── index.572c8ee8.js
│   │   │   │   ├── index.5f048ec4.js
│   │   │   │   ├── index.6dcf988b.css
│   │   │   │   ├── index.77c27592.js
│   │   │   │   ├── index.82ba8f6a.js
│   │   │   │   ├── index.8fae8eed.js
│   │   │   │   ├── index.97977da0.js
│   │   │   │   ├── index.9cb6c062.js
│   │   │   │   ├── index.af10cfdc.css
│   │   │   │   ├── index.bae472f7.js
│   │   │   │   ├── index.da267adb.js
│   │   │   │   ├── index.de73f97d.js
│   │   │   │   ├── index.ea630926.css
│   │   │   │   ├── index.ec407d42.css
│   │   │   │   ├── index.eff96d1a.css
│   │   │   │   ├── index.f6f10f0f.js
│   │   │   │   ├── vendor.68ee6001.js
│   │   │   │   └── vendor.d13e5cc9.js
│   │   │   └── index.html
│   │   ├── excel/
│   │   │   ├── assets/
│   │   │   │   └── iconfont/
│   │   │   │       ├── demo.css
│   │   │   │       ├── demo_index.html
│   │   │   │       ├── iconfont.css
│   │   │   │       ├── iconfont.js
│   │   │   │       └── iconfont.json
│   │   │   ├── css/
│   │   │   │   └── luckysheet.css
│   │   │   ├── demo.html
│   │   │   ├── demoData/
│   │   │   │   ├── chat.js
│   │   │   │   ├── demoFeature.js
│   │   │   │   ├── getTargetData.js
│   │   │   │   ├── sheetCell.js
│   │   │   │   ├── sheetChart.js
│   │   │   │   ├── sheetComment.js
│   │   │   │   ├── sheetConditionFormat.js
│   │   │   │   ├── sheetDataVerification.js
│   │   │   │   ├── sheetFormula.js
│   │   │   │   ├── sheetPicture.js
│   │   │   │   ├── sheetPivotTable.js
│   │   │   │   ├── sheetPivotTableData.js
│   │   │   │   ├── sheetSparkline.js
│   │   │   │   └── sheetTable.js
│   │   │   ├── expendPlugins/
│   │   │   │   ├── chart/
│   │   │   │   │   └── chartmix.css
│   │   │   │   ├── exceljs.js
│   │   │   │   ├── export.js
│   │   │   │   ├── filesaver.js
│   │   │   │   ├── luckyexcel.js
│   │   │   │   └── print/
│   │   │   │       ├── print.css
│   │   │   │       └── print.js
│   │   │   ├── fonts/
│   │   │   │   └── FontAwesome.otf
│   │   │   ├── index.html
│   │   │   ├── luckysheet.umd.js
│   │   │   └── plugins/
│   │   │       ├── css/
│   │   │       │   └── pluginsCss.css
│   │   │       ├── js/
│   │   │       │   └── plugin.js
│   │   │       └── plugins.css
│   │   ├── font/
│   │   │   ├── demo.css
│   │   │   ├── demo_index.html
│   │   │   ├── iconfont.css
│   │   │   ├── iconfont.js
│   │   │   └── iconfont.json
│   │   ├── gantt/
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   ├── gantt.css
│   │   │   ├── ganttDrawerSVG.js
│   │   │   ├── ganttGridEditor.js
│   │   │   ├── ganttMaster.js
│   │   │   ├── ganttPrint.css
│   │   │   ├── ganttTask.js
│   │   │   ├── ganttTestSuite.js
│   │   │   ├── ganttUtilities.js
│   │   │   ├── ganttZoom.js
│   │   │   ├── index.html
│   │   │   ├── libs/
│   │   │   │   ├── date.js
│   │   │   │   ├── dialogs.js
│   │   │   │   ├── forms.js
│   │   │   │   ├── i18nJs.js
│   │   │   │   ├── jquery/
│   │   │   │   │   ├── JST/
│   │   │   │   │   │   └── jquery.JST.js
│   │   │   │   │   ├── dateField/
│   │   │   │   │   │   ├── jquery.dateField.css
│   │   │   │   │   │   └── jquery.dateField.js
│   │   │   │   │   ├── jquery.timers.js
│   │   │   │   │   ├── svg/
│   │   │   │   │   │   ├── jquery.svgdom.1.8.js
│   │   │   │   │   │   └── jquery.svgdom.pack.js
│   │   │   │   │   └── valueSlider/
│   │   │   │   │       ├── jquery.mb.slider.js
│   │   │   │   │       └── mb.slider.css
│   │   │   │   ├── layout.js
│   │   │   │   └── utilities.js
│   │   │   ├── license.txt
│   │   │   └── platform.css
│   │   ├── kanban/
│   │   │   ├── CNAME
│   │   │   ├── asset-manifest.json
│   │   │   ├── index.html
│   │   │   ├── manifest.json
│   │   │   ├── service-worker.js
│   │   │   └── static/
│   │   │       ├── css/
│   │   │       │   └── main.5a0187ba.chunk.css
│   │   │       └── js/
│   │   │           ├── 2.929441b1.chunk.js
│   │   │           ├── 2.929441b1.chunk.js.LICENSE.txt
│   │   │           ├── main.3373143f.chunk.js
│   │   │           └── runtime-main.04a7ba0b.js
│   │   ├── markdown/
│   │   │   ├── dist/
│   │   │   │   └── addons/
│   │   │   │       ├── advance/
│   │   │   │       │   └── cherry-table-echarts-plugin.js
│   │   │   │       ├── cherry-code-block-mermaid-plugin.js
│   │   │   │       └── cherry-code-block-plantuml-plugin.js
│   │   │   ├── drawio/
│   │   │   │   ├── Actions.js
│   │   │   │   ├── Dialogs.js
│   │   │   │   ├── Editor.js
│   │   │   │   ├── EditorUi.js
│   │   │   │   ├── Format.js
│   │   │   │   ├── Graph.js
│   │   │   │   ├── Init.js
│   │   │   │   ├── Menus.js
│   │   │   │   ├── Shapes.js
│   │   │   │   ├── Sidebar.js
│   │   │   │   ├── Toolbar.js
│   │   │   │   ├── atlas.css
│   │   │   │   ├── dark-default.xml
│   │   │   │   ├── dark.css
│   │   │   │   ├── default-old.xml
│   │   │   │   ├── default.xml
│   │   │   │   ├── drawio-demo.js
│   │   │   │   ├── font/
│   │   │   │   │   └── graph.iconfont.less
│   │   │   │   ├── grapheditor.css
│   │   │   │   ├── image/
│   │   │   │   │   └── stencils/
│   │   │   │   │       ├── arrows.xml
│   │   │   │   │       ├── basic.xml
│   │   │   │   │       ├── bpmn.xml
│   │   │   │   │       └── flowchart.xml
│   │   │   │   ├── jscolor/
│   │   │   │   │   └── jscolor.js
│   │   │   │   ├── lib/
│   │   │   │   │   └── base64.js
│   │   │   │   ├── resources/
│   │   │   │   │   ├── en.txt
│   │   │   │   │   └── zh.txt
│   │   │   │   ├── src/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   ├── common.css
│   │   │   │   │   │   └── explorer.css
│   │   │   │   │   ├── grapheditor.less
│   │   │   │   │   ├── js/
│   │   │   │   │   │   ├── editor/
│   │   │   │   │   │   │   ├── mxDefaultKeyHandler.js
│   │   │   │   │   │   │   ├── mxDefaultPopupMenu.js
│   │   │   │   │   │   │   ├── mxDefaultToolbar.js
│   │   │   │   │   │   │   └── mxEditor.js
│   │   │   │   │   │   ├── handler/
│   │   │   │   │   │   │   ├── mxCellHighlight.js
│   │   │   │   │   │   │   ├── mxCellMarker.js
│   │   │   │   │   │   │   ├── mxCellTracker.js
│   │   │   │   │   │   │   ├── mxConnectionHandler.js
│   │   │   │   │   │   │   ├── mxConstraintHandler.js
│   │   │   │   │   │   │   ├── mxEdgeHandler.js
│   │   │   │   │   │   │   ├── mxEdgeSegmentHandler.js
│   │   │   │   │   │   │   ├── mxElbowEdgeHandler.js
│   │   │   │   │   │   │   ├── mxGraphHandler.js
│   │   │   │   │   │   │   ├── mxHandle.js
│   │   │   │   │   │   │   ├── mxKeyHandler.js
│   │   │   │   │   │   │   ├── mxPanningHandler.js
│   │   │   │   │   │   │   ├── mxPopupMenuHandler.js
│   │   │   │   │   │   │   ├── mxRubberband.js
│   │   │   │   │   │   │   ├── mxSelectionCellsHandler.js
│   │   │   │   │   │   │   ├── mxTooltipHandler.js
│   │   │   │   │   │   │   └── mxVertexHandler.js
│   │   │   │   │   │   ├── index.txt
│   │   │   │   │   │   ├── io/
│   │   │   │   │   │   │   ├── mxCellCodec.js
│   │   │   │   │   │   │   ├── mxChildChangeCodec.js
│   │   │   │   │   │   │   ├── mxCodec.js
│   │   │   │   │   │   │   ├── mxCodecRegistry.js
│   │   │   │   │   │   │   ├── mxDefaultKeyHandlerCodec.js
│   │   │   │   │   │   │   ├── mxDefaultPopupMenuCodec.js
│   │   │   │   │   │   │   ├── mxDefaultToolbarCodec.js
│   │   │   │   │   │   │   ├── mxEditorCodec.js
│   │   │   │   │   │   │   ├── mxGenericChangeCodec.js
│   │   │   │   │   │   │   ├── mxGraphCodec.js
│   │   │   │   │   │   │   ├── mxGraphViewCodec.js
│   │   │   │   │   │   │   ├── mxModelCodec.js
│   │   │   │   │   │   │   ├── mxObjectCodec.js
│   │   │   │   │   │   │   ├── mxRootChangeCodec.js
│   │   │   │   │   │   │   ├── mxStylesheetCodec.js
│   │   │   │   │   │   │   └── mxTerminalChangeCodec.js
│   │   │   │   │   │   ├── layout/
│   │   │   │   │   │   │   ├── hierarchical/
│   │   │   │   │   │   │   │   ├── model/
│   │   │   │   │   │   │   │   │   ├── mxGraphAbstractHierarchyCell.js
│   │   │   │   │   │   │   │   │   ├── mxGraphHierarchyEdge.js
│   │   │   │   │   │   │   │   │   ├── mxGraphHierarchyModel.js
│   │   │   │   │   │   │   │   │   ├── mxGraphHierarchyNode.js
│   │   │   │   │   │   │   │   │   └── mxSwimlaneModel.js
│   │   │   │   │   │   │   │   ├── mxHierarchicalLayout.js
│   │   │   │   │   │   │   │   ├── mxSwimlaneLayout.js
│   │   │   │   │   │   │   │   └── stage/
│   │   │   │   │   │   │   │       ├── mxCoordinateAssignment.js
│   │   │   │   │   │   │   │       ├── mxHierarchicalLayoutStage.js
│   │   │   │   │   │   │   │       ├── mxMedianHybridCrossingReduction.js
│   │   │   │   │   │   │   │       ├── mxMinimumCycleRemover.js
│   │   │   │   │   │   │   │       └── mxSwimlaneOrdering.js
│   │   │   │   │   │   │   ├── mxCircleLayout.js
│   │   │   │   │   │   │   ├── mxCompactTreeLayout.js
│   │   │   │   │   │   │   ├── mxCompositeLayout.js
│   │   │   │   │   │   │   ├── mxEdgeLabelLayout.js
│   │   │   │   │   │   │   ├── mxFastOrganicLayout.js
│   │   │   │   │   │   │   ├── mxGraphLayout.js
│   │   │   │   │   │   │   ├── mxParallelEdgeLayout.js
│   │   │   │   │   │   │   ├── mxPartitionLayout.js
│   │   │   │   │   │   │   ├── mxRadialTreeLayout.js
│   │   │   │   │   │   │   └── mxStackLayout.js
│   │   │   │   │   │   ├── model/
│   │   │   │   │   │   │   ├── mxCell.js
│   │   │   │   │   │   │   ├── mxCellPath.js
│   │   │   │   │   │   │   ├── mxGeometry.js
│   │   │   │   │   │   │   └── mxGraphModel.js
│   │   │   │   │   │   ├── mxClient.js
│   │   │   │   │   │   ├── shape/
│   │   │   │   │   │   │   ├── mxActor.js
│   │   │   │   │   │   │   ├── mxArrow.js
│   │   │   │   │   │   │   ├── mxArrowConnector.js
│   │   │   │   │   │   │   ├── mxCloud.js
│   │   │   │   │   │   │   ├── mxConnector.js
│   │   │   │   │   │   │   ├── mxCylinder.js
│   │   │   │   │   │   │   ├── mxDoubleEllipse.js
│   │   │   │   │   │   │   ├── mxEllipse.js
│   │   │   │   │   │   │   ├── mxHexagon.js
│   │   │   │   │   │   │   ├── mxImageShape.js
│   │   │   │   │   │   │   ├── mxLabel.js
│   │   │   │   │   │   │   ├── mxLine.js
│   │   │   │   │   │   │   ├── mxMarker.js
│   │   │   │   │   │   │   ├── mxPolyline.js
│   │   │   │   │   │   │   ├── mxRectangleShape.js
│   │   │   │   │   │   │   ├── mxRhombus.js
│   │   │   │   │   │   │   ├── mxShape.js
│   │   │   │   │   │   │   ├── mxStencil.js
│   │   │   │   │   │   │   ├── mxStencilRegistry.js
│   │   │   │   │   │   │   ├── mxSwimlane.js
│   │   │   │   │   │   │   ├── mxText.js
│   │   │   │   │   │   │   └── mxTriangle.js
│   │   │   │   │   │   ├── util/
│   │   │   │   │   │   │   ├── mxAbstractCanvas2D.js
│   │   │   │   │   │   │   ├── mxAnimation.js
│   │   │   │   │   │   │   ├── mxAutoSaveManager.js
│   │   │   │   │   │   │   ├── mxClipboard.js
│   │   │   │   │   │   │   ├── mxConstants.js
│   │   │   │   │   │   │   ├── mxDictionary.js
│   │   │   │   │   │   │   ├── mxDivResizer.js
│   │   │   │   │   │   │   ├── mxDragSource.js
│   │   │   │   │   │   │   ├── mxEffects.js
│   │   │   │   │   │   │   ├── mxEvent.js
│   │   │   │   │   │   │   ├── mxEventObject.js
│   │   │   │   │   │   │   ├── mxEventSource.js
│   │   │   │   │   │   │   ├── mxForm.js
│   │   │   │   │   │   │   ├── mxGuide.js
│   │   │   │   │   │   │   ├── mxImage.js
│   │   │   │   │   │   │   ├── mxImageBundle.js
│   │   │   │   │   │   │   ├── mxImageExport.js
│   │   │   │   │   │   │   ├── mxLog.js
│   │   │   │   │   │   │   ├── mxMorphing.js
│   │   │   │   │   │   │   ├── mxMouseEvent.js
│   │   │   │   │   │   │   ├── mxObjectIdentity.js
│   │   │   │   │   │   │   ├── mxPanningManager.js
│   │   │   │   │   │   │   ├── mxPoint.js
│   │   │   │   │   │   │   ├── mxPopupMenu.js
│   │   │   │   │   │   │   ├── mxRectangle.js
│   │   │   │   │   │   │   ├── mxResources.js
│   │   │   │   │   │   │   ├── mxSvgCanvas2D.js
│   │   │   │   │   │   │   ├── mxToolbar.js
│   │   │   │   │   │   │   ├── mxUndoManager.js
│   │   │   │   │   │   │   ├── mxUndoableEdit.js
│   │   │   │   │   │   │   ├── mxUrlConverter.js
│   │   │   │   │   │   │   ├── mxUtils.js
│   │   │   │   │   │   │   ├── mxVmlCanvas2D.js
│   │   │   │   │   │   │   ├── mxWindow.js
│   │   │   │   │   │   │   ├── mxXmlCanvas2D.js
│   │   │   │   │   │   │   └── mxXmlRequest.js
│   │   │   │   │   │   └── view/
│   │   │   │   │   │       ├── mxCellEditor.js
│   │   │   │   │   │       ├── mxCellOverlay.js
│   │   │   │   │   │       ├── mxCellRenderer.js
│   │   │   │   │   │       ├── mxCellState.js
│   │   │   │   │   │       ├── mxCellStatePreview.js
│   │   │   │   │   │       ├── mxConnectionConstraint.js
│   │   │   │   │   │       ├── mxEdgeStyle.js
│   │   │   │   │   │       ├── mxGraph.js
│   │   │   │   │   │       ├── mxGraphSelectionModel.js
│   │   │   │   │   │       ├── mxGraphView.js
│   │   │   │   │   │       ├── mxLayoutManager.js
│   │   │   │   │   │       ├── mxMultiplicity.js
│   │   │   │   │   │       ├── mxOutline.js
│   │   │   │   │   │       ├── mxPerimeter.js
│   │   │   │   │   │       ├── mxPrintPreview.js
│   │   │   │   │   │       ├── mxStyleRegistry.js
│   │   │   │   │   │       ├── mxStylesheet.js
│   │   │   │   │   │       ├── mxSwimlaneManager.js
│   │   │   │   │   │       └── mxTemporaryCellStates.js
│   │   │   │   │   └── resources/
│   │   │   │   │       ├── editor.txt
│   │   │   │   │       ├── editor_de.txt
│   │   │   │   │       ├── editor_zh.txt
│   │   │   │   │       ├── graph.txt
│   │   │   │   │       ├── graph_de.txt
│   │   │   │   │       └── graph_zh.txt
│   │   │   │   └── theme/
│   │   │   │       └── default.xml
│   │   │   ├── drawio.html
│   │   │   ├── index.html
│   │   │   ├── katex/
│   │   │   │   ├── README.md
│   │   │   │   ├── contrib/
│   │   │   │   │   ├── auto-render.js
│   │   │   │   │   ├── auto-render.mjs
│   │   │   │   │   ├── copy-tex.js
│   │   │   │   │   ├── copy-tex.mjs
│   │   │   │   │   ├── mathtex-script-type.js
│   │   │   │   │   ├── mathtex-script-type.mjs
│   │   │   │   │   ├── mhchem.js
│   │   │   │   │   ├── mhchem.mjs
│   │   │   │   │   ├── render-a11y-string.js
│   │   │   │   │   └── render-a11y-string.mjs
│   │   │   │   ├── katex.css
│   │   │   │   ├── katex.js
│   │   │   │   └── katex.mjs
│   │   │   ├── mxgraph/
│   │   │   │   ├── css/
│   │   │   │   │   ├── common.css
│   │   │   │   │   └── explorer.css
│   │   │   │   └── mxClient.js
│   │   │   └── scripts/
│   │   │       ├── ai-chat-demo.js
│   │   │       ├── api-demo.js
│   │   │       ├── chatgpt-demo.js
│   │   │       ├── dialog.css
│   │   │       ├── drawio.js
│   │   │       ├── h5-demo.js
│   │   │       ├── html-docx.js
│   │   │       ├── index.js
│   │   │       ├── modal.js
│   │   │       ├── multiple-demo.js
│   │   │       ├── notoolbar-demo.js
│   │   │       ├── pinyin/
│   │   │       │   ├── README.md
│   │   │       │   ├── hanziPinyin.js
│   │   │       │   ├── hanziPinyinWithoutYin.js
│   │   │       │   ├── pinyin.js
│   │   │       │   └── pinyin_dist.js
│   │   │       ├── pptx-dialog.css
│   │   │       ├── preview-demo.js
│   │   │       ├── suggester-demo.js
│   │   │       ├── tex-svg.js
│   │   │       └── xss-demo.js
│   │   ├── mind/
│   │   │   ├── css/
│   │   │   │   ├── app.css
│   │   │   │   ├── chunk-3222d6ee.css
│   │   │   │   ├── chunk-b15d02c4.css
│   │   │   │   └── chunk-vendors.css
│   │   │   ├── index.html
│   │   │   └── js/
│   │   │       ├── app.js
│   │   │       ├── chunk-3222d6ee.js
│   │   │       ├── chunk-b15d02c4.js
│   │   │       └── chunk-vendors.js
│   │   ├── picedit/
│   │   │   ├── dist/
│   │   │   │   ├── bundle.js
│   │   │   │   └── bundle.js.LICENSE.txt
│   │   │   ├── images/
│   │   │   │   └── test-collection.json
│   │   │   └── index.html
│   │   ├── ppt/
│   │   │   ├── assets/
│   │   │   │   ├── index-FEB_hL87.css
│   │   │   │   ├── index-NZ0pT4uX.js
│   │   │   │   ├── index-O-Ts9bLA.js
│   │   │   │   └── index-eVh7c3Gk.css
│   │   │   └── index.html
│   │   └── text/
│   │       ├── css/
│   │       │   ├── css2.css
│   │       │   ├── index.css
│   │       │   ├── styles.css
│   │       │   ├── tab.css
│   │       │   ├── vanilla-appearance.css
│   │       │   ├── vanilla-highlighting.css
│   │       │   └── vanilla-layout.css
│   │       ├── index.html
│   │       ├── js/
│   │       │   ├── base.js
│   │       │   ├── init.js
│   │       │   ├── script.js
│   │       │   └── script2.js
│   │       ├── manifest.webmanifest
│   │       └── service-worker.js
│   ├── src/
│   │   ├── App.vue
│   │   ├── assets/
│   │   │   ├── chat.scss
│   │   │   ├── emoji.json
│   │   │   ├── imglist.scss
│   │   │   ├── left.scss
│   │   │   ├── list.scss
│   │   │   ├── main.scss
│   │   │   ├── root.scss
│   │   │   ├── store.json
│   │   │   ├── store.scss
│   │   │   └── windows10.scss
│   │   ├── auto-imports.d.ts
│   │   ├── components/
│   │   │   ├── ai/
│   │   │   │   ├── AiSettingApi.vue
│   │   │   │   ├── AiSettingConf.vue
│   │   │   │   ├── AiSettingDef.vue
│   │   │   │   ├── AssistantAdd.vue
│   │   │   │   ├── DownAddbox.vue
│   │   │   │   ├── DownLabeleditor.vue
│   │   │   │   ├── DownModelInfo.vue
│   │   │   │   ├── aimodel.vue
│   │   │   │   ├── aisetting.vue
│   │   │   │   └── assistant.vue
│   │   │   ├── builtin/
│   │   │   │   ├── Browser.vue
│   │   │   │   ├── Calendar.vue
│   │   │   │   ├── ContextMenu.vue
│   │   │   │   ├── CreateUrl.vue
│   │   │   │   ├── DateNote.vue
│   │   │   │   ├── EditFileName.vue
│   │   │   │   ├── EditType.vue
│   │   │   │   ├── FileIcon.vue
│   │   │   │   ├── FileIconImg.vue
│   │   │   │   ├── FileIconIs.vue
│   │   │   │   ├── FileList.vue
│   │   │   │   ├── FileProps.vue
│   │   │   │   ├── FileTree.vue
│   │   │   │   ├── FileViewer.vue
│   │   │   │   ├── ImageViewer.vue
│   │   │   │   ├── MusicStore.vue
│   │   │   │   ├── MusicViewer.vue
│   │   │   │   ├── NotifyGroup.vue
│   │   │   │   ├── OpenWiteDialog.vue
│   │   │   │   ├── OsImage.vue
│   │   │   │   ├── PdfViewer.vue
│   │   │   │   ├── PictureStore.vue
│   │   │   │   ├── RectChosen.vue
│   │   │   │   ├── UrlBrowser.vue
│   │   │   │   ├── Version.vue
│   │   │   │   └── VideoViewer.vue
│   │   │   ├── chat/
│   │   │   │   ├── Chat.vue
│   │   │   │   ├── ChatBox.vue
│   │   │   │   ├── ChatMenu.vue
│   │   │   │   ├── ChatMessage.vue
│   │   │   │   ├── ChatMsgList.vue
│   │   │   │   ├── ChatUserList.vue
│   │   │   │   ├── ChatUserSetting.vue
│   │   │   │   ├── ChatWorkList.vue
│   │   │   │   ├── chatGroupMember.vue
│   │   │   │   └── chatUserInfo.vue
│   │   │   ├── computer/
│   │   │   │   ├── Computer.vue
│   │   │   │   ├── ComputerNavBar.vue
│   │   │   │   ├── QuickLink.vue
│   │   │   │   └── UpPopover.vue
│   │   │   ├── desktop/
│   │   │   │   ├── Ad.vue
│   │   │   │   ├── CloseDesktop.vue
│   │   │   │   ├── DeskItem.vue
│   │   │   │   ├── Desktop.vue
│   │   │   │   ├── DesktopBackground.vue
│   │   │   │   ├── LockDesktop.vue
│   │   │   │   ├── Notice.vue
│   │   │   │   ├── OpeningDesktop.vue
│   │   │   │   ├── Screen.vue
│   │   │   │   ├── ScreenContent.vue
│   │   │   │   ├── Upgrade.vue
│   │   │   │   └── mobile/
│   │   │   │       ├── BottomBar.vue
│   │   │   │       ├── Mobile.vue
│   │   │   │       ├── MobileApp.vue
│   │   │   │       └── util.scss
│   │   │   ├── install/
│   │   │   │   ├── Install.vue
│   │   │   │   ├── InstallCompony.vue
│   │   │   │   ├── InstallMember.vue
│   │   │   │   └── InstallPerson.vue
│   │   │   ├── localchat/
│   │   │   │   ├── AiChatInfo.vue
│   │   │   │   ├── AiChatLeft.vue
│   │   │   │   ├── AiChatMain.vue
│   │   │   │   ├── AiChatMessage.vue
│   │   │   │   ├── ChatContent.vue
│   │   │   │   ├── ChatDomain.vue
│   │   │   │   ├── ChatEditor.vue
│   │   │   │   ├── ChatFoot.vue
│   │   │   │   ├── ChatNav.vue
│   │   │   │   ├── KnowledgeChat.vue
│   │   │   │   └── LocalChat.vue
│   │   │   ├── oa/
│   │   │   │   ├── FilePwd.vue
│   │   │   │   ├── PlanTasks.vue
│   │   │   │   └── ShareFiles.vue
│   │   │   ├── setting/
│   │   │   │   ├── ColorPicker.vue
│   │   │   │   ├── FrpcConfig.vue
│   │   │   │   ├── FrpcEdit.vue
│   │   │   │   ├── LocalNas.vue
│   │   │   │   ├── LocalProxy.vue
│   │   │   │   ├── NasClient.vue
│   │   │   │   ├── NetProxy.vue
│   │   │   │   ├── ProcessManager.vue
│   │   │   │   ├── SetAccount.vue
│   │   │   │   ├── SetCustom.vue
│   │   │   │   ├── SetFilePwd.vue
│   │   │   │   ├── SetLang.vue
│   │   │   │   ├── SetNas.vue
│   │   │   │   ├── SetSystem.vue
│   │   │   │   ├── SetUpdate.vue
│   │   │   │   ├── Setting.vue
│   │   │   │   ├── WebDavClient.vue
│   │   │   │   └── setStyle.css
│   │   │   ├── store/
│   │   │   │   ├── AddApp.vue
│   │   │   │   ├── AppItem.vue
│   │   │   │   └── Store.vue
│   │   │   ├── taskbar/
│   │   │   │   ├── AppIcon.vue
│   │   │   │   ├── AppIconGroup.vue
│   │   │   │   ├── Battery.vue
│   │   │   │   ├── BatteryPop.vue
│   │   │   │   ├── CustomIcon.vue
│   │   │   │   ├── DateTime.vue
│   │   │   │   ├── DateTimeShow.vue
│   │   │   │   ├── Error.vue
│   │   │   │   ├── Magnet.vue
│   │   │   │   ├── MenuList.vue
│   │   │   │   ├── MessageCenterPop.vue
│   │   │   │   ├── MessageIcon.vue
│   │   │   │   ├── NetWork.vue
│   │   │   │   ├── NetworkPop.vue
│   │   │   │   ├── ScreenRecorder.vue
│   │   │   │   ├── Screenshort.vue
│   │   │   │   ├── ShowNews.vue
│   │   │   │   ├── StartMenu.vue
│   │   │   │   ├── StartOption.vue
│   │   │   │   ├── StateIcon.vue
│   │   │   │   └── Taskbar.vue
│   │   │   ├── ui/
│   │   │   │   ├── CloseButton.vue
│   │   │   │   ├── WinButton.vue
│   │   │   │   ├── WinCheckBox.vue
│   │   │   │   ├── WinInput.vue
│   │   │   │   ├── WinLoading.vue
│   │   │   │   ├── WinLogo.vue
│   │   │   │   ├── WinProcess.vue
│   │   │   │   ├── WinSelect.vue
│   │   │   │   └── WinUpButtonGroup.vue
│   │   │   └── window/
│   │   │       ├── DialogProcess.vue
│   │   │       ├── DialogTemp.vue
│   │   │       ├── IframeFile.vue
│   │   │       ├── MenuBar.vue
│   │   │       ├── MenuFooter.vue
│   │   │       ├── MobileTemplate.vue
│   │   │       ├── NotFound.vue
│   │   │       ├── OnlyOffice.vue
│   │   │       ├── WindowGroup.vue
│   │   │       ├── WindowInner.vue
│   │   │       ├── WindowNode.vue
│   │   │       └── WindowTemplate.vue
│   │   ├── components.d.ts
│   │   ├── hook/
│   │   │   ├── useAi.ts
│   │   │   ├── useAppMenu.ts
│   │   │   ├── useAppOpen.ts
│   │   │   ├── useComputer.ts
│   │   │   ├── useContextMenu.ts
│   │   │   ├── useFileDrag.ts
│   │   │   ├── usePlugin.ts
│   │   │   ├── useRectChosen.ts
│   │   │   └── useWebdav.ts
│   │   ├── i18n/
│   │   │   ├── index.ts
│   │   │   └── lang/
│   │   │       ├── en.json
│   │   │       └── zh.json
│   │   ├── main.ts
│   │   ├── stores/
│   │   │   ├── aichat.ts
│   │   │   ├── assistant.ts
│   │   │   ├── chat.ts
│   │   │   ├── choose.ts
│   │   │   ├── db.ts
│   │   │   ├── file.ts
│   │   │   ├── filePwd.ts
│   │   │   ├── history.ts
│   │   │   ├── index.ts
│   │   │   ├── labels/
│   │   │   │   ├── aya.ts
│   │   │   │   ├── bakllava.ts
│   │   │   │   ├── bge.ts
│   │   │   │   ├── bgereranker.ts
│   │   │   │   ├── bilibili.ts
│   │   │   │   ├── chatglm.ts
│   │   │   │   ├── codegemma.ts
│   │   │   │   ├── codellama.ts
│   │   │   │   ├── codeqwen.ts
│   │   │   │   ├── deepseek.ts
│   │   │   │   ├── deepseekcoder.ts
│   │   │   │   ├── dmeta.ts
│   │   │   │   ├── duckdbnsql.ts
│   │   │   │   ├── gemma.ts
│   │   │   │   ├── h2o.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── internlm.ts
│   │   │   │   ├── llama.ts
│   │   │   │   ├── llamavision.ts
│   │   │   │   ├── llava.ts
│   │   │   │   ├── mindchat.ts
│   │   │   │   ├── mingyi.ts
│   │   │   │   ├── minicpm.ts
│   │   │   │   ├── mistral.ts
│   │   │   │   ├── mixtral.ts
│   │   │   │   ├── moondream.ts
│   │   │   │   ├── mxbai.ts
│   │   │   │   ├── nemo.ts
│   │   │   │   ├── neuralchat.ts
│   │   │   │   ├── nomic.ts
│   │   │   │   ├── openchat.ts
│   │   │   │   ├── paraformer.ts
│   │   │   │   ├── phi.ts
│   │   │   │   ├── qwen.ts
│   │   │   │   ├── sd.ts
│   │   │   │   ├── snowflake.ts
│   │   │   │   ├── solar.ts
│   │   │   │   ├── starcoder2.ts
│   │   │   │   ├── starlinglm.ts
│   │   │   │   ├── telespeech.ts
│   │   │   │   ├── vits.ts
│   │   │   │   ├── whisper.ts
│   │   │   │   ├── wizardlm2.ts
│   │   │   │   ├── yi.ts
│   │   │   │   ├── zephyr.ts
│   │   │   │   └── zipformer.ts
│   │   │   ├── localchat.ts
│   │   │   ├── login.ts
│   │   │   ├── message.ts
│   │   │   ├── model.ts
│   │   │   ├── modelconfig.ts
│   │   │   ├── notify.ts
│   │   │   ├── prompt/
│   │   │   │   ├── index.ts
│   │   │   │   ├── prompts-en.json
│   │   │   │   └── prompts-zh.json
│   │   │   ├── proxy.ts
│   │   │   ├── store.ts
│   │   │   └── upgrade.ts
│   │   ├── system/
│   │   │   ├── aiconfig.ts
│   │   │   ├── applist.ts
│   │   │   ├── config.ts
│   │   │   ├── core/
│   │   │   │   ├── FIleInterface.ts
│   │   │   │   ├── FileLocal.ts
│   │   │   │   ├── FileMode.ts
│   │   │   │   ├── FileOs.ts
│   │   │   │   ├── FileSystem.ts
│   │   │   │   ├── Path.ts
│   │   │   │   ├── SystemFileConfig.ts
│   │   │   │   └── createInitFile.ts
│   │   │   ├── dinglogin.ts
│   │   │   ├── event/
│   │   │   │   ├── EventHook.ts
│   │   │   │   ├── EventListener.ts
│   │   │   │   ├── Eventer.ts
│   │   │   │   ├── eventBus.ts
│   │   │   │   └── index.ts
│   │   │   ├── index.ts
│   │   │   ├── initBuiltin.ts
│   │   │   ├── initConfig.ts
│   │   │   ├── member.ts
│   │   │   ├── menu/
│   │   │   │   ├── Menu.ts
│   │   │   │   ├── MenuItem.ts
│   │   │   │   └── Tary.ts
│   │   │   ├── notification/
│   │   │   │   └── Notification.ts
│   │   │   ├── qiyeweixinlogin.ts
│   │   │   ├── root.ts
│   │   │   ├── router.ts
│   │   │   ├── third_login.ts
│   │   │   ├── type/
│   │   │   │   ├── enum.ts
│   │   │   │   ├── file.ts
│   │   │   │   ├── mod.d.ts
│   │   │   │   └── type.ts
│   │   │   └── window/
│   │   │       ├── BrowserWindow.ts
│   │   │       ├── Dialog.ts
│   │   │       ├── MakeDragable.ts
│   │   │       └── dom/
│   │   │           ├── DragElement.ts
│   │   │           └── ScaleElement.ts
│   │   ├── util/
│   │   │   ├── Icon.ts
│   │   │   ├── Tree.ts
│   │   │   ├── clientid.ts
│   │   │   ├── common.ts
│   │   │   ├── debounce.ts
│   │   │   ├── device.ts
│   │   │   ├── file.ts
│   │   │   ├── glowingBorder.ts
│   │   │   ├── goutil.ts
│   │   │   ├── markdown.ts
│   │   │   ├── modash.ts
│   │   │   ├── msg.ts
│   │   │   ├── screenRecorder.ts
│   │   │   ├── sharePath.ts
│   │   │   ├── stepComponent.ts
│   │   │   ├── thirdlogin.ts
│   │   │   └── unzip.ts
│   │   └── vite-env.d.ts
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   ├── vite.config.ts
│   └── wailsjs/
│       ├── go/
│       │   └── app/
│       │       ├── App.d.ts
│       │       └── App.js
│       └── runtime/
│           ├── package.json
│           ├── runtime.d.ts
│           └── runtime.js
├── go.mod
├── go.sum
├── main.go
├── packages/
│   ├── baiban/
│   │   ├── .eslintrc.cjs
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── postcss.config.js
│   │   ├── public/
│   │   │   └── static/
│   │   │       └── translations/
│   │   │           ├── ar.json
│   │   │           ├── ca.json
│   │   │           ├── cs.json
│   │   │           ├── da.json
│   │   │           ├── de.json
│   │   │           ├── en.json
│   │   │           ├── es.json
│   │   │           ├── fa.json
│   │   │           ├── fi.json
│   │   │           ├── fr.json
│   │   │           ├── gl.json
│   │   │           ├── he.json
│   │   │           ├── hi-in.json
│   │   │           ├── hr.json
│   │   │           ├── hu.json
│   │   │           ├── id.json
│   │   │           ├── it.json
│   │   │           ├── ja.json
│   │   │           ├── ko-kr.json
│   │   │           ├── ku.json
│   │   │           ├── languages.json
│   │   │           ├── main.json
│   │   │           ├── my.json
│   │   │           ├── ne.json
│   │   │           ├── no.json
│   │   │           ├── pl.json
│   │   │           ├── pt-br.json
│   │   │           ├── pt-pt.json
│   │   │           ├── ro.json
│   │   │           ├── ru.json
│   │   │           ├── sl.json
│   │   │           ├── sv.json
│   │   │           ├── te.json
│   │   │           ├── th.json
│   │   │           ├── tr.json
│   │   │           ├── uk.json
│   │   │           ├── vi.json
│   │   │           ├── zh-cn.json
│   │   │           └── zh-tw.json
│   │   ├── src/
│   │   │   ├── App.css
│   │   │   ├── App.jsx
│   │   │   ├── assets/
│   │   │   │   └── font/
│   │   │   │       └── font.css
│   │   │   ├── components/
│   │   │   │   ├── SaveButton.tsx
│   │   │   │   └── SaveWithInput.tsx
│   │   │   ├── index.css
│   │   │   └── main.jsx
│   │   ├── tailwind.config.js
│   │   └── vite.config.js
│   ├── kanban/
│   │   ├── .gitignore
│   │   ├── CNAME
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── public/
│   │   │   ├── CNAME
│   │   │   ├── index.html
│   │   │   └── manifest.json
│   │   ├── src/
│   │   │   ├── PersonalKanban/
│   │   │   │   ├── Introduction.stories.mdx
│   │   │   │   ├── assets/
│   │   │   │   │   └── locales/
│   │   │   │   │       ├── cn/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── de/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── en/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── es/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── fr/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── in/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── jp/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       └── ru/
│   │   │   │   │           └── translations.json
│   │   │   │   ├── components/
│   │   │   │   │   ├── Board/
│   │   │   │   │   │   ├── Board.stories.tsx
│   │   │   │   │   │   ├── Board.tsx
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── Card/
│   │   │   │   │   │   ├── Card.stories.tsx
│   │   │   │   │   │   ├── Card.tsx
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── Column/
│   │   │   │   │   │   ├── Column.stories.tsx
│   │   │   │   │   │   ├── Column.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── ColumnForm/
│   │   │   │   │   │   ├── ColumnForm.stories.tsx
│   │   │   │   │   │   ├── ColumnForm.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── IconButton/
│   │   │   │   │   │   ├── IconButton.stories.tsx
│   │   │   │   │   │   ├── IconButton.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── KanbanBoard/
│   │   │   │   │   │   ├── KanbanBoard.stories.tsx
│   │   │   │   │   │   ├── KanbanBoard.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── KanbanCard/
│   │   │   │   │   │   ├── KanbanCard.stories.tsx
│   │   │   │   │   │   ├── KanbanCard.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── KanbanColumn/
│   │   │   │   │   │   ├── KanbanColumn.stories.tsx
│   │   │   │   │   │   ├── KanbanColumn.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Radio/
│   │   │   │   │   │   ├── Radio.stories.tsx
│   │   │   │   │   │   ├── Radio.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── RecordForm/
│   │   │   │   │       ├── RecordForm.stories.tsx
│   │   │   │   │       ├── RecordForm.tsx
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── constants/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── containers/
│   │   │   │   │   ├── KanbanBoard/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── title.tsx
│   │   │   │   │   └── Toolbar/
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── enums/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   ├── providers/
│   │   │   │   │   ├── ThemeProvider.tsx
│   │   │   │   │   └── TranslationProvider.tsx
│   │   │   │   ├── services/
│   │   │   │   │   ├── StorageService.ts
│   │   │   │   │   └── Utils.ts
│   │   │   │   └── types/
│   │   │   │       └── index.tsx
│   │   │   ├── index.css
│   │   │   ├── index.tsx
│   │   │   ├── react-app-env.d.ts
│   │   │   ├── reportWebVitals.ts
│   │   │   ├── service-worker.ts
│   │   │   ├── serviceWorkerRegistration.ts
│   │   │   └── setupTests.ts
│   │   └── tsconfig.json
│   ├── mind/
│   │   ├── .prettierignore
│   │   ├── .prettierrc
│   │   ├── babel.config.js
│   │   ├── package.json
│   │   ├── public/
│   │   │   └── index.html
│   │   ├── scripts/
│   │   │   ├── createNodeImageList.js
│   │   │   └── updateVersion.js
│   │   ├── src/
│   │   │   ├── App.vue
│   │   │   ├── api/
│   │   │   │   └── index.js
│   │   │   ├── assets/
│   │   │   │   ├── icon-font/
│   │   │   │   │   └── iconfont.css
│   │   │   │   └── svg/
│   │   │   │       ├── business/
│   │   │   │       │   └── 商务
│   │   │   │       ├── education/
│   │   │   │       │   └── 教育
│   │   │   │       ├── festival/
│   │   │   │       │   └── 节日
│   │   │   │       ├── food/
│   │   │   │       │   └── 食物
│   │   │   │       ├── medicine/
│   │   │   │       │   └── 医疗
│   │   │   │       ├── tools/
│   │   │   │       │   └── 工具
│   │   │   │       └── travel/
│   │   │   │           └── 旅行
│   │   │   ├── components/
│   │   │   │   └── ImgUpload/
│   │   │   │       ├── index.vue
│   │   │   │       └── style.less
│   │   │   ├── config/
│   │   │   │   ├── constant.js
│   │   │   │   ├── en.js
│   │   │   │   ├── icon.js
│   │   │   │   ├── image.js
│   │   │   │   ├── index.js
│   │   │   │   ├── zh.js
│   │   │   │   └── zhtw.js
│   │   │   ├── i18n.js
│   │   │   ├── lang/
│   │   │   │   ├── en_us.js
│   │   │   │   ├── index.js
│   │   │   │   ├── zh_cn.js
│   │   │   │   └── zh_tw.js
│   │   │   ├── main.js
│   │   │   ├── pages/
│   │   │   │   ├── Doc.vue
│   │   │   │   └── Edit/
│   │   │   │       ├── Index.vue
│   │   │   │       └── components/
│   │   │   │           ├── BaseStyle.vue
│   │   │   │           ├── Color.vue
│   │   │   │           ├── Contextmenu.vue
│   │   │   │           ├── Count.vue
│   │   │   │           ├── CustomNodeContent.vue
│   │   │   │           ├── Demonstrate.vue
│   │   │   │           ├── Edit.vue
│   │   │   │           ├── Export.vue
│   │   │   │           ├── FormulaSidebar.vue
│   │   │   │           ├── Fullscreen.vue
│   │   │   │           ├── Import.vue
│   │   │   │           ├── MouseAction.vue
│   │   │   │           ├── Navigator.vue
│   │   │   │           ├── NavigatorToolbar.vue
│   │   │   │           ├── NodeAnnotationBtn.vue
│   │   │   │           ├── NodeAttachment.vue
│   │   │   │           ├── NodeHyperlink.vue
│   │   │   │           ├── NodeIcon.vue
│   │   │   │           ├── NodeIconSidebar.vue
│   │   │   │           ├── NodeIconToolbar.vue
│   │   │   │           ├── NodeImage.vue
│   │   │   │           ├── NodeImgPreview.vue
│   │   │   │           ├── NodeNote.vue
│   │   │   │           ├── NodeNoteContentShow.vue
│   │   │   │           ├── NodeOuterFrame.vue
│   │   │   │           ├── NodeTag.vue
│   │   │   │           ├── NodeTagStyle.vue
│   │   │   │           ├── Outline.vue
│   │   │   │           ├── OutlineEdit.vue
│   │   │   │           ├── OutlineSidebar.vue
│   │   │   │           ├── RichTextToolbar.vue
│   │   │   │           ├── Scale.vue
│   │   │   │           ├── Scrollbar.vue
│   │   │   │           ├── Search.vue
│   │   │   │           ├── Setting.vue
│   │   │   │           ├── ShortcutKey.vue
│   │   │   │           ├── Sidebar.vue
│   │   │   │           ├── SidebarTrigger.vue
│   │   │   │           ├── SourceCodeEdit.vue
│   │   │   │           ├── Structure.vue
│   │   │   │           ├── Style.vue
│   │   │   │           ├── Theme.vue
│   │   │   │           ├── Toolbar.vue
│   │   │   │           └── ToolbarNodeBtnList.vue
│   │   │   ├── router.js
│   │   │   ├── store.js
│   │   │   └── utils/
│   │   │       ├── handleClipboardText.js
│   │   │       ├── index.js
│   │   │       └── loading.js
│   │   └── vue.config.js
│   ├── photoshop/
│   │   ├── .babelrc
│   │   ├── .gitignore
│   │   ├── MIT-LICENSE.txt
│   │   ├── README.md
│   │   ├── SECURITY.md
│   │   ├── examples/
│   │   │   ├── add-edit-imgData.html
│   │   │   ├── open-edit-save.html
│   │   │   └── zoom.html
│   │   ├── images/
│   │   │   └── test-collection.json
│   │   ├── index.html
│   │   ├── manifest-disabled.json
│   │   ├── package.json
│   │   ├── service-worker.js
│   │   ├── src/
│   │   │   ├── css/
│   │   │   │   ├── component.css
│   │   │   │   ├── layout.css
│   │   │   │   ├── menu.css
│   │   │   │   ├── popup.css
│   │   │   │   ├── print.css
│   │   │   │   ├── reset.css
│   │   │   │   └── utility.css
│   │   │   └── js/
│   │   │       ├── actions/
│   │   │       │   ├── _README.md
│   │   │       │   ├── activate-tool.js
│   │   │       │   ├── add-layer-filter.js
│   │   │       │   ├── autoresize-canvas.js
│   │   │       │   ├── base.js
│   │   │       │   ├── bundle.js
│   │   │       │   ├── clear-layer.js
│   │   │       │   ├── delete-layer-filter.js
│   │   │       │   ├── delete-layer-settings.js
│   │   │       │   ├── delete-layer.js
│   │   │       │   ├── index.js
│   │   │       │   ├── init-canvas-zoom.js
│   │   │       │   ├── insert-layer.js
│   │   │       │   ├── prepare-canvas.js
│   │   │       │   ├── refresh-action-attributes.js
│   │   │       │   ├── refresh-layers-gui.js
│   │   │       │   ├── reorder-layer.js
│   │   │       │   ├── reset-layers.js
│   │   │       │   ├── reset-selection.js
│   │   │       │   ├── select-layer.js
│   │   │       │   ├── select-next-layer.js
│   │   │       │   ├── select-previous-layer.js
│   │   │       │   ├── set-object-property.js
│   │   │       │   ├── set-selection.js
│   │   │       │   ├── stop-animation.js
│   │   │       │   ├── store/
│   │   │       │   │   └── image-store.js
│   │   │       │   ├── toggle-layer-visibility.js
│   │   │       │   ├── update-config.js
│   │   │       │   ├── update-layer-image.js
│   │   │       │   └── update-layer.js
│   │   │       ├── app.js
│   │   │       ├── config-menu.js
│   │   │       ├── config.js
│   │   │       ├── core/
│   │   │       │   ├── base-gui.js
│   │   │       │   ├── base-layers.js
│   │   │       │   ├── base-search.js
│   │   │       │   ├── base-selection.js
│   │   │       │   ├── base-state.js
│   │   │       │   ├── base-tools.js
│   │   │       │   ├── components/
│   │   │       │   │   ├── color-input.js
│   │   │       │   │   ├── color-picker-gradient.js
│   │   │       │   │   ├── index.js
│   │   │       │   │   ├── number-input.js
│   │   │       │   │   ├── range.js
│   │   │       │   │   └── swatches.js
│   │   │       │   └── gui/
│   │   │       │       ├── gui-colors.js
│   │   │       │       ├── gui-details.js
│   │   │       │       ├── gui-information.js
│   │   │       │       ├── gui-layers.js
│   │   │       │       ├── gui-menu.js
│   │   │       │       ├── gui-preview.js
│   │   │       │       └── gui-tools.js
│   │   │       ├── languages/
│   │   │       │   ├── ar.json
│   │   │       │   ├── credits.js
│   │   │       │   ├── de.json
│   │   │       │   ├── el.json
│   │   │       │   ├── empty.json
│   │   │       │   ├── es.json
│   │   │       │   ├── fr.json
│   │   │       │   ├── it.json
│   │   │       │   ├── ja.json
│   │   │       │   ├── ko.json
│   │   │       │   ├── lt.json
│   │   │       │   ├── nl.json
│   │   │       │   ├── pt.json
│   │   │       │   ├── ru.json
│   │   │       │   ├── tr.json
│   │   │       │   ├── uk.json
│   │   │       │   └── zh.json
│   │   │       ├── libs/
│   │   │       │   ├── canvastotiff.js
│   │   │       │   ├── clipboard.js
│   │   │       │   ├── color-matrix.js
│   │   │       │   ├── color-thief.js
│   │   │       │   ├── gifjs/
│   │   │       │   │   ├── gif.js
│   │   │       │   │   └── gif.worker.js
│   │   │       │   ├── glfx.js
│   │   │       │   ├── helpers.js
│   │   │       │   ├── imagefilters.js
│   │   │       │   ├── jquery.translate.js
│   │   │       │   ├── popup.js
│   │   │       │   ├── vintage.js
│   │   │       │   └── zoomView.js
│   │   │       ├── main.js
│   │   │       ├── modules/
│   │   │       │   ├── edit/
│   │   │       │   │   ├── copy.js
│   │   │       │   │   ├── paste.js
│   │   │       │   │   ├── redo.js
│   │   │       │   │   ├── selection.js
│   │   │       │   │   └── undo.js
│   │   │       │   ├── effects/
│   │   │       │   │   ├── abstract/
│   │   │       │   │   │   └── css.js
│   │   │       │   │   ├── black_and_white.js
│   │   │       │   │   ├── blueprint.js
│   │   │       │   │   ├── borders.js
│   │   │       │   │   ├── box_blur.js
│   │   │       │   │   ├── browser.js
│   │   │       │   │   ├── common/
│   │   │       │   │   │   ├── blur.js
│   │   │       │   │   │   ├── brightness.js
│   │   │       │   │   │   ├── contrast.js
│   │   │       │   │   │   ├── grayscale.js
│   │   │       │   │   │   ├── hue-rotate.js
│   │   │       │   │   │   ├── invert.js
│   │   │       │   │   │   ├── saturate.js
│   │   │       │   │   │   ├── sepia.js
│   │   │       │   │   │   └── shadow.js
│   │   │       │   │   ├── denoise.js
│   │   │       │   │   ├── dither.js
│   │   │       │   │   ├── dot_screen.js
│   │   │       │   │   ├── edge.js
│   │   │       │   │   ├── emboss.js
│   │   │       │   │   ├── enrich.js
│   │   │       │   │   ├── grains.js
│   │   │       │   │   ├── heatmap.js
│   │   │       │   │   ├── instagram/
│   │   │       │   │   │   ├── 1977.js
│   │   │       │   │   │   ├── aden.js
│   │   │       │   │   │   ├── clarendon.js
│   │   │       │   │   │   ├── gingham.js
│   │   │       │   │   │   ├── inkwell.js
│   │   │       │   │   │   ├── lofi.js
│   │   │       │   │   │   ├── toaster.js
│   │   │       │   │   │   ├── valencia.js
│   │   │       │   │   │   └── xpro2.js
│   │   │       │   │   ├── mosaic.js
│   │   │       │   │   ├── night_vision.js
│   │   │       │   │   ├── oil.js
│   │   │       │   │   ├── pencil.js
│   │   │       │   │   ├── sharpen.js
│   │   │       │   │   ├── solarize.js
│   │   │       │   │   ├── tilt_shift.js
│   │   │       │   │   ├── vibrance.js
│   │   │       │   │   ├── vignette.js
│   │   │       │   │   ├── vintage.js
│   │   │       │   │   └── zoom_blur.js
│   │   │       │   ├── file/
│   │   │       │   │   ├── new.js
│   │   │       │   │   ├── open.js
│   │   │       │   │   ├── print.js
│   │   │       │   │   ├── quickload.js
│   │   │       │   │   ├── quicksave.js
│   │   │       │   │   └── save.js
│   │   │       │   ├── help/
│   │   │       │   │   ├── about.js
│   │   │       │   │   └── shortcuts.js
│   │   │       │   ├── image/
│   │   │       │   │   ├── auto_adjust.js
│   │   │       │   │   ├── color_corrections.js
│   │   │       │   │   ├── decrease_colors.js
│   │   │       │   │   ├── flip.js
│   │   │       │   │   ├── histogram.js
│   │   │       │   │   ├── information.js
│   │   │       │   │   ├── opacity.js
│   │   │       │   │   ├── palette.js
│   │   │       │   │   ├── resize.js
│   │   │       │   │   ├── rotate.js
│   │   │       │   │   ├── size.js
│   │   │       │   │   ├── translate.js
│   │   │       │   │   └── trim.js
│   │   │       │   ├── layer/
│   │   │       │   │   ├── clear.js
│   │   │       │   │   ├── composition.js
│   │   │       │   │   ├── delete.js
│   │   │       │   │   ├── differences.js
│   │   │       │   │   ├── duplicate.js
│   │   │       │   │   ├── flatten.js
│   │   │       │   │   ├── merge.js
│   │   │       │   │   ├── move.js
│   │   │       │   │   ├── new.js
│   │   │       │   │   ├── raster.js
│   │   │       │   │   ├── rename.js
│   │   │       │   │   └── visibility.js
│   │   │       │   ├── tools/
│   │   │       │   │   ├── color_to_alpha.js
│   │   │       │   │   ├── color_zoom.js
│   │   │       │   │   ├── content_fill.js
│   │   │       │   │   ├── keypoints.js
│   │   │       │   │   ├── replace_color.js
│   │   │       │   │   ├── restore_alpha.js
│   │   │       │   │   ├── search.js
│   │   │       │   │   ├── settings.js
│   │   │       │   │   ├── sprites.js
│   │   │       │   │   └── translate.js
│   │   │       │   └── view/
│   │   │       │       ├── full_screen.js
│   │   │       │       ├── grid.js
│   │   │       │       ├── guides.js
│   │   │       │       ├── ruler.js
│   │   │       │       └── zoom.js
│   │   │       └── tools/
│   │   │           ├── animation.js
│   │   │           ├── blur.js
│   │   │           ├── brush.js
│   │   │           ├── bulge_pinch.js
│   │   │           ├── clone.js
│   │   │           ├── crop.js
│   │   │           ├── desaturate.js
│   │   │           ├── erase.js
│   │   │           ├── fill.js
│   │   │           ├── gradient.js
│   │   │           ├── magic_erase.js
│   │   │           ├── media.js
│   │   │           ├── pencil.js
│   │   │           ├── pick_color.js
│   │   │           ├── select.js
│   │   │           ├── selection.js
│   │   │           ├── shape.js
│   │   │           ├── shapes/
│   │   │           │   ├── arrow.js
│   │   │           │   ├── bezier_curve.js
│   │   │           │   ├── callout.js
│   │   │           │   ├── cog.js
│   │   │           │   ├── cylinder.js
│   │   │           │   ├── ellipse.js
│   │   │           │   ├── heart.js
│   │   │           │   ├── hexagon.js
│   │   │           │   ├── human.js
│   │   │           │   ├── line.js
│   │   │           │   ├── moon.js
│   │   │           │   ├── parallelogram.js
│   │   │           │   ├── pentagon.js
│   │   │           │   ├── plus.js
│   │   │           │   ├── polygon.js
│   │   │           │   ├── rectangle.js
│   │   │           │   ├── right_triangle.js
│   │   │           │   ├── romb.js
│   │   │           │   ├── star.js
│   │   │           │   ├── tear.js
│   │   │           │   ├── trapezoid.js
│   │   │           │   └── triangle.js
│   │   │           ├── sharpen.js
│   │   │           └── text.js
│   │   ├── tools/
│   │   │   └── translator/
│   │   │       ├── config.php
│   │   │       ├── index.php
│   │   │       └── libs/
│   │   │           ├── GoogleTranslate.php
│   │   │           └── translator.php
│   │   └── webpack.config.js
│   ├── pptx/
│   │   ├── .eslintrc.cjs
│   │   ├── .github/
│   │   │   ├── ISSUE_TEMPLATE/
│   │   │   │   ├── bug_report.md
│   │   │   │   └── feature_request.md
│   │   │   └── workflows/
│   │   │       └── deploy.yml
│   │   ├── .gitignore
│   │   ├── .husky/
│   │   │   └── commit-msg
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── commitlint.config.cjs
│   │   ├── doc/
│   │   │   ├── Canvas.md
│   │   │   ├── CustomElement.md
│   │   │   ├── DirectoryAndData.md
│   │   │   └── Q&A.md
│   │   ├── env.d.ts
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── App.vue
│   │   │   ├── assets/
│   │   │   │   └── styles/
│   │   │   │       ├── font.scss
│   │   │   │       ├── global.scss
│   │   │   │       ├── mixin.scss
│   │   │   │       ├── prosemirror.scss
│   │   │   │       └── variable.scss
│   │   │   ├── components/
│   │   │   │   ├── Button.vue
│   │   │   │   ├── ButtonGroup.vue
│   │   │   │   ├── Checkbox.vue
│   │   │   │   ├── CheckboxButton.vue
│   │   │   │   ├── ColorPicker/
│   │   │   │   │   ├── Alpha.vue
│   │   │   │   │   ├── Checkboard.vue
│   │   │   │   │   ├── EditableInput.vue
│   │   │   │   │   ├── Hue.vue
│   │   │   │   │   ├── Saturation.vue
│   │   │   │   │   └── index.vue
│   │   │   │   ├── Contextmenu/
│   │   │   │   │   ├── MenuContent.vue
│   │   │   │   │   ├── index.vue
│   │   │   │   │   └── types.ts
│   │   │   │   ├── Divider.vue
│   │   │   │   ├── Drawer.vue
│   │   │   │   ├── FileInput.vue
│   │   │   │   ├── FullscreenSpin.vue
│   │   │   │   ├── Input.vue
│   │   │   │   ├── LaTeXEditor/
│   │   │   │   │   ├── FormulaContent.vue
│   │   │   │   │   ├── SymbolContent.vue
│   │   │   │   │   ├── hfmath.ts
│   │   │   │   │   └── index.vue
│   │   │   │   ├── Message.vue
│   │   │   │   ├── Modal.vue
│   │   │   │   ├── MoveablePanel.vue
│   │   │   │   ├── NumberInput.vue
│   │   │   │   ├── Popover.vue
│   │   │   │   ├── PopoverMenuItem.vue
│   │   │   │   ├── RadioButton.vue
│   │   │   │   ├── RadioGroup.vue
│   │   │   │   ├── Select.vue
│   │   │   │   ├── SelectGroup.vue
│   │   │   │   ├── Slider.vue
│   │   │   │   ├── Switch.vue
│   │   │   │   ├── Tabs.vue
│   │   │   │   ├── TextArea.vue
│   │   │   │   └── WritingBoard.vue
│   │   │   ├── components.d.ts
│   │   │   ├── configs/
│   │   │   │   ├── animation.ts
│   │   │   │   ├── canvas.ts
│   │   │   │   ├── chartTypes.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── font.ts
│   │   │   │   ├── hotkey.ts
│   │   │   │   ├── imageClip.ts
│   │   │   │   ├── latex.ts
│   │   │   │   ├── lines.ts
│   │   │   │   ├── shapes.ts
│   │   │   │   ├── storage.ts
│   │   │   │   ├── symbol.ts
│   │   │   │   └── theme.ts
│   │   │   ├── global.d.ts
│   │   │   ├── hooks/
│   │   │   │   ├── useAddSlidesOrElements.ts
│   │   │   │   ├── useAlignActiveElement.ts
│   │   │   │   ├── useAlignElementToCanvas.ts
│   │   │   │   ├── useCombineElement.ts
│   │   │   │   ├── useCopyAndPasteElement.ts
│   │   │   │   ├── useCreateElement.ts
│   │   │   │   ├── useDeleteElement.ts
│   │   │   │   ├── useExport.ts
│   │   │   │   ├── useGlobalHotkey.ts
│   │   │   │   ├── useHideElement.ts
│   │   │   │   ├── useHistorySnapshot.ts
│   │   │   │   ├── useImport.ts
│   │   │   │   ├── useLink.ts
│   │   │   │   ├── useLoadSlides.ts
│   │   │   │   ├── useLockElement.ts
│   │   │   │   ├── useMoveElement.ts
│   │   │   │   ├── useOrderElement.ts
│   │   │   │   ├── usePasteEvent.ts
│   │   │   │   ├── usePasteTextClipboardData.ts
│   │   │   │   ├── useScaleCanvas.ts
│   │   │   │   ├── useScreening.ts
│   │   │   │   ├── useSearch.ts
│   │   │   │   ├── useSelectElement.ts
│   │   │   │   ├── useShapeFormatPainter.ts
│   │   │   │   ├── useSlideBackgroundStyle.ts
│   │   │   │   ├── useSlideHandler.ts
│   │   │   │   ├── useSlideTheme.ts
│   │   │   │   ├── useTextFormatPainter.ts
│   │   │   │   └── useUniformDisplayElement.ts
│   │   │   ├── main.ts
│   │   │   ├── mocks/
│   │   │   │   ├── layout.ts
│   │   │   │   ├── slides.ts
│   │   │   │   ├── theme.ts
│   │   │   │   ├── tpl/
│   │   │   │   │   ├── dangjian.json
│   │   │   │   │   ├── jianyuezi.json
│   │   │   │   │   ├── product.json
│   │   │   │   │   ├── science.json
│   │   │   │   │   ├── summary.json
│   │   │   │   │   └── taikongren.json
│   │   │   │   └── tpl.ts
│   │   │   ├── plugins/
│   │   │   │   ├── directive/
│   │   │   │   │   ├── clickOutside.ts
│   │   │   │   │   ├── contextmenu.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── tooltip.scss
│   │   │   │   │   └── tooltip.ts
│   │   │   │   └── icon.ts
│   │   │   ├── store/
│   │   │   │   ├── index.ts
│   │   │   │   ├── keyboard.ts
│   │   │   │   ├── main.ts
│   │   │   │   ├── screen.ts
│   │   │   │   ├── slides.ts
│   │   │   │   └── snapshot.ts
│   │   │   ├── types/
│   │   │   │   ├── edit.ts
│   │   │   │   ├── export.ts
│   │   │   │   ├── injectKey.ts
│   │   │   │   ├── mobile.ts
│   │   │   │   ├── slides.ts
│   │   │   │   └── toolbar.ts
│   │   │   ├── utils/
│   │   │   │   ├── clipboard.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── crypto.ts
│   │   │   │   ├── database.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── emitter.ts
│   │   │   │   ├── font.ts
│   │   │   │   ├── fullscreen.ts
│   │   │   │   ├── htmlParser/
│   │   │   │   │   ├── format.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lexer.ts
│   │   │   │   │   ├── parser.ts
│   │   │   │   │   ├── stringify.ts
│   │   │   │   │   ├── tags.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── image.ts
│   │   │   │   ├── message.ts
│   │   │   │   ├── print.ts
│   │   │   │   ├── prosemirror/
│   │   │   │   │   ├── commands/
│   │   │   │   │   │   ├── setListStyle.ts
│   │   │   │   │   │   ├── setTextAlign.ts
│   │   │   │   │   │   ├── setTextIndent.ts
│   │   │   │   │   │   └── toggleList.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── plugins/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── inputrules.ts
│   │   │   │   │   │   ├── keymap.ts
│   │   │   │   │   │   └── placeholder.ts
│   │   │   │   │   ├── schema/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── marks.ts
│   │   │   │   │   │   └── nodes.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── selection.ts
│   │   │   │   ├── svg2Base64.ts
│   │   │   │   ├── svgPathParser.ts
│   │   │   │   └── textParser.ts
│   │   │   └── views/
│   │   │       ├── Editor/
│   │   │       │   ├── Canvas/
│   │   │       │   │   ├── AlignmentLine.vue
│   │   │       │   │   ├── EditableElement.vue
│   │   │       │   │   ├── ElementCreateSelection.vue
│   │   │       │   │   ├── GridLines.vue
│   │   │       │   │   ├── LinkDialog.vue
│   │   │       │   │   ├── MouseSelection.vue
│   │   │       │   │   ├── Operate/
│   │   │       │   │   │   ├── BorderLine.vue
│   │   │       │   │   │   ├── CommonElementOperate.vue
│   │   │       │   │   │   ├── ImageElementOperate.vue
│   │   │       │   │   │   ├── LineElementOperate.vue
│   │   │       │   │   │   ├── LinkHandler.vue
│   │   │       │   │   │   ├── MultiSelectOperate.vue
│   │   │       │   │   │   ├── ResizeHandler.vue
│   │   │       │   │   │   ├── RotateHandler.vue
│   │   │       │   │   │   ├── ShapeElementOperate.vue
│   │   │       │   │   │   ├── TableElementOperate.vue
│   │   │       │   │   │   ├── TextElementOperate.vue
│   │   │       │   │   │   └── index.vue
│   │   │       │   │   ├── Ruler.vue
│   │   │       │   │   ├── ShapeCreateCanvas.vue
│   │   │       │   │   ├── ViewportBackground.vue
│   │   │       │   │   ├── hooks/
│   │   │       │   │   │   ├── useCommonOperate.ts
│   │   │       │   │   │   ├── useDragElement.ts
│   │   │       │   │   │   ├── useDragLineElement.ts
│   │   │       │   │   │   ├── useDropImageOrText.ts
│   │   │       │   │   │   ├── useInsertFromCreateSelection.ts
│   │   │       │   │   │   ├── useMouseSelection.ts
│   │   │       │   │   │   ├── useMoveShapeKeypoint.ts
│   │   │       │   │   │   ├── useRotateElement.ts
│   │   │       │   │   │   ├── useScaleElement.ts
│   │   │       │   │   │   ├── useSelectElement.ts
│   │   │       │   │   │   └── useViewportSize.ts
│   │   │       │   │   └── index.vue
│   │   │       │   ├── CanvasTool/
│   │   │       │   │   ├── ChartPool.vue
│   │   │       │   │   ├── LinePool.vue
│   │   │       │   │   ├── MediaInput.vue
│   │   │       │   │   ├── ShapeItemThumbnail.vue
│   │   │       │   │   ├── ShapePool.vue
│   │   │       │   │   ├── TableGenerator.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── EditorHeader/
│   │   │       │   │   ├── HotkeyDoc.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── ExportDialog/
│   │   │       │   │   ├── ExportImage.vue
│   │   │       │   │   ├── ExportJSON.vue
│   │   │       │   │   ├── ExportPDF.vue
│   │   │       │   │   ├── ExportPPTX.vue
│   │   │       │   │   ├── ExportSpecificFile.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── NotesPanel.vue
│   │   │       │   ├── Remark/
│   │   │       │   │   ├── Editor.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── SearchPanel.vue
│   │   │       │   ├── SelectPanel.vue
│   │   │       │   ├── Thumbnails/
│   │   │       │   │   ├── LayoutPool.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── Toolbar/
│   │   │       │   │   ├── ElementAnimationPanel.vue
│   │   │       │   │   ├── ElementPositionPanel.vue
│   │   │       │   │   ├── ElementStylePanel/
│   │   │       │   │   │   ├── AudioStylePanel.vue
│   │   │       │   │   │   ├── ChartStylePanel/
│   │   │       │   │   │   │   ├── ChartDataEditor.vue
│   │   │       │   │   │   │   └── index.vue
│   │   │       │   │   │   ├── ImageStylePanel.vue
│   │   │       │   │   │   ├── LatexStylePanel.vue
│   │   │       │   │   │   ├── LineStylePanel.vue
│   │   │       │   │   │   ├── MultiStylePanel.vue
│   │   │       │   │   │   ├── ShapeStylePanel.vue
│   │   │       │   │   │   ├── TableStylePanel.vue
│   │   │       │   │   │   ├── TextStylePanel.vue
│   │   │       │   │   │   ├── VideoStylePanel.vue
│   │   │       │   │   │   └── index.vue
│   │   │       │   │   ├── MultiPositionPanel.vue
│   │   │       │   │   ├── SlideAnimationPanel.vue
│   │   │       │   │   ├── SlideDesignPanel.vue
│   │   │       │   │   ├── SymbolPanel.vue
│   │   │       │   │   ├── ThemeStylesExtract.vue
│   │   │       │   │   ├── common/
│   │   │       │   │   │   ├── ColorButton.vue
│   │   │       │   │   │   ├── ElementColorMask.vue
│   │   │       │   │   │   ├── ElementFilter.vue
│   │   │       │   │   │   ├── ElementFlip.vue
│   │   │       │   │   │   ├── ElementOpacity.vue
│   │   │       │   │   │   ├── ElementOutline.vue
│   │   │       │   │   │   ├── ElementShadow.vue
│   │   │       │   │   │   ├── RichTextBase.vue
│   │   │       │   │   │   └── TextColorButton.vue
│   │   │       │   │   └── index.vue
│   │   │       │   └── index.vue
│   │   │       ├── Mobile/
│   │   │       │   ├── MobileEditor/
│   │   │       │   │   ├── ElementToolbar.vue
│   │   │       │   │   ├── Header.vue
│   │   │       │   │   ├── MobileEditableElement.vue
│   │   │       │   │   ├── MobileOperate.vue
│   │   │       │   │   ├── SlideToolbar.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── MobilePlayer.vue
│   │   │       │   ├── MobilePreview.vue
│   │   │       │   ├── MobileThumbnails.vue
│   │   │       │   └── index.vue
│   │   │       ├── Screen/
│   │   │       │   ├── BaseView.vue
│   │   │       │   ├── CountdownTimer.vue
│   │   │       │   ├── PresenterView.vue
│   │   │       │   ├── ScreenElement.vue
│   │   │       │   ├── ScreenSlide.vue
│   │   │       │   ├── ScreenSlideList.vue
│   │   │       │   ├── SlideThumbnails.vue
│   │   │       │   ├── WritingBoardTool.vue
│   │   │       │   ├── hooks/
│   │   │       │   │   ├── useExecPlay.ts
│   │   │       │   │   ├── useFullscreen.ts
│   │   │       │   │   └── useSlideSize.ts
│   │   │       │   └── index.vue
│   │   │       └── components/
│   │   │           ├── ThumbnailSlide/
│   │   │           │   ├── ThumbnailElement.vue
│   │   │           │   └── index.vue
│   │   │           └── element/
│   │   │               ├── AudioElement/
│   │   │               │   ├── AudioPlayer.vue
│   │   │               │   ├── BaseAudioElement.vue
│   │   │               │   ├── ScreenAudioElement.vue
│   │   │               │   └── index.vue
│   │   │               ├── ChartElement/
│   │   │               │   ├── BaseChartElement.vue
│   │   │               │   ├── Chart.vue
│   │   │               │   └── index.vue
│   │   │               ├── ElementOutline.vue
│   │   │               ├── ImageElement/
│   │   │               │   ├── BaseImageElement.vue
│   │   │               │   ├── ImageClipHandler.vue
│   │   │               │   ├── ImageOutline/
│   │   │               │   │   ├── ImageEllipseOutline.vue
│   │   │               │   │   ├── ImagePolygonOutline.vue
│   │   │               │   │   ├── ImageRectOutline.vue
│   │   │               │   │   └── index.vue
│   │   │               │   ├── index.vue
│   │   │               │   ├── useClipImage.ts
│   │   │               │   └── useFilter.ts
│   │   │               ├── LatexElement/
│   │   │               │   ├── BaseLatexElement.vue
│   │   │               │   └── index.vue
│   │   │               ├── LineElement/
│   │   │               │   ├── BaseLineElement.vue
│   │   │               │   ├── LinePointMarker.vue
│   │   │               │   └── index.vue
│   │   │               ├── ProsemirrorEditor.vue
│   │   │               ├── ShapeElement/
│   │   │               │   ├── BaseShapeElement.vue
│   │   │               │   ├── GradientDefs.vue
│   │   │               │   └── index.vue
│   │   │               ├── TableElement/
│   │   │               │   ├── BaseTableElement.vue
│   │   │               │   ├── CustomTextarea.vue
│   │   │               │   ├── EditableTable.vue
│   │   │               │   ├── StaticTable.vue
│   │   │               │   ├── index.vue
│   │   │               │   ├── useHideCells.ts
│   │   │               │   ├── useSubThemeColor.ts
│   │   │               │   └── utils.ts
│   │   │               ├── TextElement/
│   │   │               │   ├── BaseTextElement.vue
│   │   │               │   └── index.vue
│   │   │               ├── VideoElement/
│   │   │               │   ├── BaseVideoElement.vue
│   │   │               │   ├── ScreenVideoElement.vue
│   │   │               │   ├── VideoPlayer/
│   │   │               │   │   ├── index.vue
│   │   │               │   │   └── useMSE.ts
│   │   │               │   └── index.vue
│   │   │               └── hooks/
│   │   │                   ├── useElementFlip.ts
│   │   │                   ├── useElementOutline.ts
│   │   │                   └── useElementShadow.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   └── vite.config.ts
│   └── word/
│       ├── .editorconfig
│       ├── .eslintrc
│       ├── .gitignore
│       ├── .prettierrc
│       ├── .vscode/
│       │   └── settings.json
│       ├── LICENSE
│       ├── README.md
│       ├── cypress/
│       │   ├── e2e/
│       │   │   ├── control/
│       │   │   │   ├── checkbox.cy.ts
│       │   │   │   ├── select.cy.ts
│       │   │   │   └── text.cy.ts
│       │   │   ├── editor.cy.ts
│       │   │   └── menus/
│       │   │       ├── block.cy.ts
│       │   │       ├── checkbox.cy.ts
│       │   │       ├── codeblock.cy.ts
│       │   │       ├── date.cy.ts
│       │   │       ├── format.cy.ts
│       │   │       ├── hyperlink.cy.ts
│       │   │       ├── image.cy.ts
│       │   │       ├── latex.cy.ts
│       │   │       ├── pagebreak.cy.ts
│       │   │       ├── painter.cy.ts
│       │   │       ├── print.cy.ts
│       │   │       ├── row.cy.ts
│       │   │       ├── search.cy.ts
│       │   │       ├── separator.cy.ts
│       │   │       ├── table.cy.ts
│       │   │       ├── text.cy.ts
│       │   │       ├── title.cy.ts
│       │   │       ├── undoRedo.cy.ts
│       │   │       └── watermark.cy.ts
│       │   ├── fixtures/
│       │   │   └── example.json
│       │   ├── global.d.ts
│       │   ├── support/
│       │   │   ├── commands.ts
│       │   │   └── e2e.ts
│       │   └── tsconfig.json
│       ├── cypress.config.ts
│       ├── docs/
│       │   ├── .vitepress/
│       │   │   └── config.ts
│       │   ├── en/
│       │   │   ├── guide/
│       │   │   │   ├── api-common.md
│       │   │   │   ├── api-instance.md
│       │   │   │   ├── command-execute.md
│       │   │   │   ├── command-get.md
│       │   │   │   ├── contextmenu-custom.md
│       │   │   │   ├── contextmenu-internal.md
│       │   │   │   ├── eventbus.md
│       │   │   │   ├── i18n.md
│       │   │   │   ├── listener.md
│       │   │   │   ├── option.md
│       │   │   │   ├── override.md
│       │   │   │   ├── plugin-custom.md
│       │   │   │   ├── plugin-internal.md
│       │   │   │   ├── schema.md
│       │   │   │   ├── shortcut-custom.md
│       │   │   │   ├── shortcut-internal.md
│       │   │   │   └── start.md
│       │   │   └── index.md
│       │   ├── guide/
│       │   │   ├── api-common.md
│       │   │   ├── api-instance.md
│       │   │   ├── command-execute.md
│       │   │   ├── command-get.md
│       │   │   ├── contextmenu-custom.md
│       │   │   ├── contextmenu-internal.md
│       │   │   ├── eventbus.md
│       │   │   ├── i18n.md
│       │   │   ├── listener.md
│       │   │   ├── option.md
│       │   │   ├── override.md
│       │   │   ├── plugin-custom.md
│       │   │   ├── plugin-internal.md
│       │   │   ├── schema.md
│       │   │   ├── shortcut-custom.md
│       │   │   ├── shortcut-internal.md
│       │   │   └── start.md
│       │   └── index.md
│       ├── index.html
│       ├── package.json
│       ├── scripts/
│       │   ├── release.js
│       │   └── verifyCommit.js
│       ├── src/
│       │   ├── components/
│       │   │   ├── dialog/
│       │   │   │   ├── Dialog.ts
│       │   │   │   └── dialog.css
│       │   │   └── signature/
│       │   │       ├── Signature.ts
│       │   │       └── signature.css
│       │   ├── editor/
│       │   │   ├── assets/
│       │   │   │   └── css/
│       │   │   │       ├── block/
│       │   │   │       │   └── block.css
│       │   │   │       ├── contextmenu/
│       │   │   │       │   └── contextmenu.css
│       │   │   │       ├── control/
│       │   │   │       │   └── select.css
│       │   │   │       ├── date/
│       │   │   │       │   └── datePicker.css
│       │   │   │       ├── hyperlink/
│       │   │   │       │   └── hyperlink.css
│       │   │   │       ├── index.css
│       │   │   │       ├── previewer/
│       │   │   │       │   └── previewer.css
│       │   │   │       ├── resizer/
│       │   │   │       │   └── resizer.css
│       │   │   │       ├── table/
│       │   │   │       │   └── table.css
│       │   │   │       └── zone/
│       │   │   │           └── zone.css
│       │   │   ├── core/
│       │   │   │   ├── actuator/
│       │   │   │   │   ├── Actuator.ts
│       │   │   │   │   └── handlers/
│       │   │   │   │       └── positionContextChange.ts
│       │   │   │   ├── command/
│       │   │   │   │   ├── Command.ts
│       │   │   │   │   └── CommandAdapt.ts
│       │   │   │   ├── contextmenu/
│       │   │   │   │   ├── ContextMenu.ts
│       │   │   │   │   └── menus/
│       │   │   │   │       ├── controlMenus.ts
│       │   │   │   │       ├── globalMenus.ts
│       │   │   │   │       ├── hyperlinkMenus.ts
│       │   │   │   │       ├── imageMenus.ts
│       │   │   │   │       └── tableMenus.ts
│       │   │   │   ├── cursor/
│       │   │   │   │   ├── Cursor.ts
│       │   │   │   │   └── CursorAgent.ts
│       │   │   │   ├── draw/
│       │   │   │   │   ├── Draw.ts
│       │   │   │   │   ├── control/
│       │   │   │   │   │   ├── Control.ts
│       │   │   │   │   │   ├── checkbox/
│       │   │   │   │   │   │   └── CheckboxControl.ts
│       │   │   │   │   │   ├── date/
│       │   │   │   │   │   │   └── DateControl.ts
│       │   │   │   │   │   ├── interactive/
│       │   │   │   │   │   │   └── ControlSearch.ts
│       │   │   │   │   │   ├── radio/
│       │   │   │   │   │   │   └── RadioControl.ts
│       │   │   │   │   │   ├── richtext/
│       │   │   │   │   │   │   └── Border.ts
│       │   │   │   │   │   ├── select/
│       │   │   │   │   │   │   └── SelectControl.ts
│       │   │   │   │   │   └── text/
│       │   │   │   │   │       └── TextControl.ts
│       │   │   │   │   ├── frame/
│       │   │   │   │   │   ├── Background.ts
│       │   │   │   │   │   ├── Footer.ts
│       │   │   │   │   │   ├── Header.ts
│       │   │   │   │   │   ├── LineNumber.ts
│       │   │   │   │   │   ├── Margin.ts
│       │   │   │   │   │   ├── PageBorder.ts
│       │   │   │   │   │   ├── PageNumber.ts
│       │   │   │   │   │   ├── Placeholder.ts
│       │   │   │   │   │   └── Watermark.ts
│       │   │   │   │   ├── interactive/
│       │   │   │   │   │   ├── Group.ts
│       │   │   │   │   │   └── Search.ts
│       │   │   │   │   ├── particle/
│       │   │   │   │   │   ├── CheckboxParticle.ts
│       │   │   │   │   │   ├── HyperlinkParticle.ts
│       │   │   │   │   │   ├── ImageParticle.ts
│       │   │   │   │   │   ├── LineBreakParticle.ts
│       │   │   │   │   │   ├── ListParticle.ts
│       │   │   │   │   │   ├── PageBreak.ts
│       │   │   │   │   │   ├── RadioParticle.ts
│       │   │   │   │   │   ├── Separator.ts
│       │   │   │   │   │   ├── Subscript.ts
│       │   │   │   │   │   ├── Superscript.ts
│       │   │   │   │   │   ├── TextParticle.ts
│       │   │   │   │   │   ├── block/
│       │   │   │   │   │   │   ├── BlockParticle.ts
│       │   │   │   │   │   │   └── modules/
│       │   │   │   │   │   │       ├── BaseBlock.ts
│       │   │   │   │   │   │       ├── IFrameBlock.ts
│       │   │   │   │   │   │       └── VideoBlock.ts
│       │   │   │   │   │   ├── date/
│       │   │   │   │   │   │   ├── DateParticle.ts
│       │   │   │   │   │   │   └── DatePicker.ts
│       │   │   │   │   │   ├── latex/
│       │   │   │   │   │   │   ├── LaTexParticle.ts
│       │   │   │   │   │   │   └── utils/
│       │   │   │   │   │   │       ├── LaTexUtils.ts
│       │   │   │   │   │   │       ├── hershey.ts
│       │   │   │   │   │   │       └── symbols.ts
│       │   │   │   │   │   ├── previewer/
│       │   │   │   │   │   │   └── Previewer.ts
│       │   │   │   │   │   └── table/
│       │   │   │   │   │       ├── TableOperate.ts
│       │   │   │   │   │       ├── TableParticle.ts
│       │   │   │   │   │       └── TableTool.ts
│       │   │   │   │   └── richtext/
│       │   │   │   │       ├── AbstractRichText.ts
│       │   │   │   │       ├── Highlight.ts
│       │   │   │   │       ├── Strikeout.ts
│       │   │   │   │       └── Underline.ts
│       │   │   │   ├── event/
│       │   │   │   │   ├── CanvasEvent.ts
│       │   │   │   │   ├── GlobalEvent.ts
│       │   │   │   │   ├── eventbus/
│       │   │   │   │   │   └── EventBus.ts
│       │   │   │   │   └── handlers/
│       │   │   │   │       ├── click.ts
│       │   │   │   │       ├── composition.ts
│       │   │   │   │       ├── copy.ts
│       │   │   │   │       ├── cut.ts
│       │   │   │   │       ├── drag.ts
│       │   │   │   │       ├── drop.ts
│       │   │   │   │       ├── input.ts
│       │   │   │   │       ├── keydown/
│       │   │   │   │       │   ├── backspace.ts
│       │   │   │   │       │   ├── delete.ts
│       │   │   │   │       │   ├── enter.ts
│       │   │   │   │       │   ├── index.ts
│       │   │   │   │       │   ├── left.ts
│       │   │   │   │       │   ├── right.ts
│       │   │   │   │       │   ├── tab.ts
│       │   │   │   │       │   └── updown.ts
│       │   │   │   │       ├── mousedown.ts
│       │   │   │   │       ├── mouseleave.ts
│       │   │   │   │       ├── mousemove.ts
│       │   │   │   │       ├── mouseup.ts
│       │   │   │   │       └── paste.ts
│       │   │   │   ├── history/
│       │   │   │   │   └── HistoryManager.ts
│       │   │   │   ├── i18n/
│       │   │   │   │   ├── I18n.ts
│       │   │   │   │   └── lang/
│       │   │   │   │       ├── en.json
│       │   │   │   │       └── zh-CN.json
│       │   │   │   ├── listener/
│       │   │   │   │   └── Listener.ts
│       │   │   │   ├── observer/
│       │   │   │   │   ├── ImageObserver.ts
│       │   │   │   │   ├── MouseObserver.ts
│       │   │   │   │   ├── ScrollObserver.ts
│       │   │   │   │   └── SelectionObserver.ts
│       │   │   │   ├── override/
│       │   │   │   │   └── Override.ts
│       │   │   │   ├── plugin/
│       │   │   │   │   └── Plugin.ts
│       │   │   │   ├── position/
│       │   │   │   │   └── Position.ts
│       │   │   │   ├── range/
│       │   │   │   │   └── RangeManager.ts
│       │   │   │   ├── register/
│       │   │   │   │   └── Register.ts
│       │   │   │   ├── shortcut/
│       │   │   │   │   ├── Shortcut.ts
│       │   │   │   │   └── keys/
│       │   │   │   │       ├── listKeys.ts
│       │   │   │   │       ├── richtextKeys.ts
│       │   │   │   │       └── titleKeys.ts
│       │   │   │   ├── worker/
│       │   │   │   │   ├── WorkerManager.ts
│       │   │   │   │   └── works/
│       │   │   │   │       ├── catalog.ts
│       │   │   │   │       ├── group.ts
│       │   │   │   │       └── wordCount.ts
│       │   │   │   └── zone/
│       │   │   │       ├── Zone.ts
│       │   │   │       └── ZoneTip.ts
│       │   │   ├── dataset/
│       │   │   │   ├── constant/
│       │   │   │   │   ├── Background.ts
│       │   │   │   │   ├── Checkbox.ts
│       │   │   │   │   ├── Common.ts
│       │   │   │   │   ├── ContextMenu.ts
│       │   │   │   │   ├── Control.ts
│       │   │   │   │   ├── Cursor.ts
│       │   │   │   │   ├── Editor.ts
│       │   │   │   │   ├── Element.ts
│       │   │   │   │   ├── Footer.ts
│       │   │   │   │   ├── Group.ts
│       │   │   │   │   ├── Header.ts
│       │   │   │   │   ├── LineBreak.ts
│       │   │   │   │   ├── LineNumber.ts
│       │   │   │   │   ├── List.ts
│       │   │   │   │   ├── PageBorder.ts
│       │   │   │   │   ├── PageBreak.ts
│       │   │   │   │   ├── PageNumber.ts
│       │   │   │   │   ├── Placeholder.ts
│       │   │   │   │   ├── Radio.ts
│       │   │   │   │   ├── Regular.ts
│       │   │   │   │   ├── Separator.ts
│       │   │   │   │   ├── Table.ts
│       │   │   │   │   ├── Title.ts
│       │   │   │   │   ├── Watermark.ts
│       │   │   │   │   └── Zone.ts
│       │   │   │   └── enum/
│       │   │   │       ├── Background.ts
│       │   │   │       ├── Block.ts
│       │   │   │       ├── Common.ts
│       │   │   │       ├── Control.ts
│       │   │   │       ├── Editor.ts
│       │   │   │       ├── Element.ts
│       │   │   │       ├── ElementStyle.ts
│       │   │   │       ├── Event.ts
│       │   │   │       ├── KeyMap.ts
│       │   │   │       ├── LineNumber.ts
│       │   │   │       ├── List.ts
│       │   │   │       ├── Observer.ts
│       │   │   │       ├── Row.ts
│       │   │   │       ├── Text.ts
│       │   │   │       ├── Title.ts
│       │   │   │       ├── VerticalAlign.ts
│       │   │   │       └── table/
│       │   │   │           ├── Table.ts
│       │   │   │           └── TableTool.ts
│       │   │   ├── index.ts
│       │   │   ├── interface/
│       │   │   │   ├── Background.ts
│       │   │   │   ├── Block.ts
│       │   │   │   ├── Catalog.ts
│       │   │   │   ├── Checkbox.ts
│       │   │   │   ├── Common.ts
│       │   │   │   ├── Control.ts
│       │   │   │   ├── Cursor.ts
│       │   │   │   ├── Draw.ts
│       │   │   │   ├── Editor.ts
│       │   │   │   ├── Element.ts
│       │   │   │   ├── Event.ts
│       │   │   │   ├── EventBus.ts
│       │   │   │   ├── Footer.ts
│       │   │   │   ├── Group.ts
│       │   │   │   ├── Header.ts
│       │   │   │   ├── LineBreak.ts
│       │   │   │   ├── LineNumber.ts
│       │   │   │   ├── Listener.ts
│       │   │   │   ├── Margin.ts
│       │   │   │   ├── PageBorder.ts
│       │   │   │   ├── PageBreak.ts
│       │   │   │   ├── PageNumber.ts
│       │   │   │   ├── Placeholder.ts
│       │   │   │   ├── Plugin.ts
│       │   │   │   ├── Position.ts
│       │   │   │   ├── Previewer.ts
│       │   │   │   ├── Radio.ts
│       │   │   │   ├── Range.ts
│       │   │   │   ├── Row.ts
│       │   │   │   ├── Search.ts
│       │   │   │   ├── Separator.ts
│       │   │   │   ├── Text.ts
│       │   │   │   ├── Title.ts
│       │   │   │   ├── Watermark.ts
│       │   │   │   ├── Zone.ts
│       │   │   │   ├── contextmenu/
│       │   │   │   │   └── ContextMenu.ts
│       │   │   │   ├── i18n/
│       │   │   │   │   └── I18n.ts
│       │   │   │   ├── shortcut/
│       │   │   │   │   └── Shortcut.ts
│       │   │   │   └── table/
│       │   │   │       ├── Colgroup.ts
│       │   │   │       ├── Table.ts
│       │   │   │       ├── Td.ts
│       │   │   │       └── Tr.ts
│       │   │   ├── types/
│       │   │   │   └── index.d.ts
│       │   │   └── utils/
│       │   │       ├── clipboard.ts
│       │   │       ├── element.ts
│       │   │       ├── hotkey.ts
│       │   │       ├── index.ts
│       │   │       ├── option.ts
│       │   │       ├── print.ts
│       │   │       └── ua.ts
│       │   ├── main.ts
│       │   ├── mock.ts
│       │   ├── plugins/
│       │   │   ├── barcode1d/
│       │   │   │   └── index.ts
│       │   │   ├── barcode2d/
│       │   │   │   └── index.ts
│       │   │   ├── copy/
│       │   │   │   └── index.ts
│       │   │   ├── docx/
│       │   │   │   ├── exportDocx.ts
│       │   │   │   ├── importDocx.ts
│       │   │   │   ├── index.ts
│       │   │   │   └── utils.ts
│       │   │   ├── excel/
│       │   │   │   ├── importExcel.ts
│       │   │   │   └── index.ts
│       │   │   ├── floatingToolbar/
│       │   │   │   ├── constant/
│       │   │   │   │   └── index.ts
│       │   │   │   ├── enum/
│       │   │   │   │   └── index.ts
│       │   │   │   ├── icons/
│       │   │   │   │   └── Svgs.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── interface/
│       │   │   │   │   └── index.ts
│       │   │   │   └── style/
│       │   │   │       └── index.scss
│       │   │   └── markdown/
│       │   │       └── index.ts
│       │   ├── style.css
│       │   ├── utils/
│       │   │   ├── index.ts
│       │   │   └── prism.ts
│       │   └── vite-env.d.ts
│       ├── tsconfig.json
│       └── vite.config.ts
├── test/
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── wails.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
build/bin
node_modules
frontend/dist
dist/*
.VSCodeCounter



================================================
FILE: CHANGELOG.md
================================================
## 变更记录

- 2024-09-10
1. 重构本地聊天,修改发现机制(基于ip扫描和arp过滤)
2. 本地聊天可批量发送图片/文件夹,修改发送机制,消息基于udp发送,文件基于tcp发送

-2024-09-04
1. 修复word导入格式丢失问题
-2024-09-03
1. 修复文件重命名错误的bug
2. 修复拖拽上传中断的bug
3. 新增可手动关闭广告
- 2024-08-27
1. 优化初始化系统,初始化系统时只请求读写一次
2. 去除浏览器存储
- 2024-08-21
1. 内网聊天增加手工添加ip,跨网段通信在ping通的前提下如果发现不了对方可手工添加对方ip
2. 修复思维导图保存的文件每次打开主题又会变成默认主题
3. 新增webdav客户端
4. 新增远程存储
5. 修改选择文件夹会删除文件夹内的文件

- 2024-08-07
1. 新增web端安装
- 2024-08-06
1. 新增docker安装
- 2024-08-04
1. 修复进程管理在windows环境下不停闪窗
- 2024-08-02 
1. 修复桌面更换背景文字颜色问题
2. 修复安装插件没有配置binPath的问题
3. 新增linux环境下获取安装命令的方法

bug梳理:
1. 思维导图保存的文件每次打开主题又会变成默认主题
2. 公网版部署udp转发和文件上传存储等
3. 内网聊天功能,如果是装了虚拟机的电脑,会出现多个虚拟网卡,内网可以看到用户但是IP不对着,发消息收不到的
4. 建议开启webDav
5. web 的甘特图保存不了
6. 场景适用性:系统默认连接gitee远程软件安装包,缺少默认读取本地安装包路径的json配置文件的打包设置选项(比如在安装时自动读取安装U盘当前目录中/或已直接打包进安装包中的mysql/nginx/php/python本地离线安装包、以及企业自用OA WebApp的本地离线安装包,无需联网,直接同步离线安装)
7. 功能完整性:安装的服务型应用(如mysql/nginx/php/python)没有跟随软件环境启动后自动启动的设置选项,依赖于服务型应用的AI Web UI、php /python应用没有创建桌面快捷方式/菜单快捷方式的入口(即:AI Web UI、php /python应用无法安装和自动开箱即用)。
8. excel读取原始文件兼容性问题
9. word读取原始文件兼容性

### 后续开发:
1. 优化内网聊天
2. 新增 权限管理 文件加密 以及远程存储服务端(企业版本)
3. 应用商店重构 陆续会新增php/node/go/java
4. 文档可上传图片

5. 文件搜索功能
6. 应用商店添加我的世界https://mc.163.com/exp/
7. 文件点存储按钮,需选择存储目录
8. 开发文档增加docker部署
9. word格式问题以及导出名字不对
10. 美化日程提醒弹窗


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
We are greating for all improvements, bug fixes and new features if it not break exists behaviour.

## Code style
Code style described in stylecop ruleset file, checks perform on compile time. All violations of rules breaks project build.
Principal moments:
* use tabs
* private fields named with prefix "_"

## PR
For PR need:
* Issue described what problem you solve
* Code passed travis build (starts automatically)
* Code is covered by tests


================================================
FILE: Dockerfile
================================================
# docker build --no-cache -t godoos/godoos:latest .
# docker run -it --rm -p 56780:56780 godoos/godoos:latest
# docker push godoos/godoos:latest
# 使用 golang:alpine 作为基础镜像
FROM golang:alpine AS builder

# 在容器内部设置环境变量
ENV GO111MODULE=on \
    GOPROXY=https://goproxy.cn,direct \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GODOTOPTYPE=docker

# 设置后续指令的工作目录
WORKDIR /build

# 将代码复制到容器中
COPY . .

# 将代码编译成二进制可执行文件
RUN go build -o godoos ./godo/main.go

# 创建最终镜像
FROM alpine

# 设置工作目录
WORKDIR /

# 从builder镜像中把 /build/godoos 拷贝到当前目录
COPY --from=builder /build/godoos /godoos

# 添加执行权限
RUN chmod +x /godoos

# 暴露端口
EXPOSE 56780

# 需要运行的命令
USER root

# 直接启动 Go 应用程序
CMD ["/godoos"]

================================================
FILE: LICENSE
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published
    by the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.

================================================
FILE: README.en.md
================================================
<p align="center">
    <img src="./build/appicon.png" width="120" height="120">
</p>

<h1 align="center">GodoOS</h1>
An efficient intranet office platform that includes various tools such as Word, Excel, PPT, PDF, intranet chat, whiteboard, and mind mapping, and supports native file storage. The platform interface closely resembles the Windows style, featuring easy operation while maintaining low resource consumption and high performance. Automatically connects to intranet users without registration, enabling instant messaging and file sharing.

<div align="center">

English | [简体中文](README.md)

[FAQ](./docs/Faq.md) | [API](./docs/Api.md) | [AppStore](./docs/Store.en.md)

</div>

### 👇 Desktop Download and Install


1. 💻 **Windows User**:
   
- Windows (AMD64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos-amd64-installer.exe) | [**github Download**](https://github.com/phpk/godoos/releases/download/v1.0.0/godoos-amd64-installer.exe)

- Windows (ARM64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos-arm64-installer.exe) | [**github Download**](https://github.com/phpk/godoos/releases/download/v1.0.0/godoos-arm64-installer.exe)


2. 💼 **MacOS User**:

- MacOS (AMD64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos-macos-amd64.zip) | [**github Download**](https://github.com/phpk/godoos/releases/download/v1.0.0/godoos-macos-amd64.zip)

- MacOS (ARM64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos-macos-arm64.zip) | [**github Download**](https://github.com/phpk/godoos/releases/download/v1.0.0/godoos-macos-arm64.zip)

3. 💽 **Linux User**:

- Linux (AMD64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos-linux-amd64.zip) | [**github Download**](https://github.com/phpk/godoos/releases/download/v1.0.0/godoos-macos-arm64.zip)


### 📥 Download and install the web version
- **First, download** [**The dist**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/dist.zip) Extract to the program installation directory/ dist。
- Next, download the corresponding system's server. Put it in the program installation directory./.
- Finally, start the server. The access address is: http://localhost:8215/
1. 💻 **Windows User**:
   
- Windows (AMD64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos_windows_amd64.exe)
- Windows (ARM64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos_windows_arm64.exe)


2. 💼 **MacOS User**:

- MacOS (AMD64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos_darwin_amd64)
- MacOS (ARM64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos_darwin_arm64)

3. 💽 **Linux User**:

- Linux (AMD64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos_linux_amd64)
- Linux (ARM64) [**gitee Download**](https://gitee.com/ruitao_admin/godoos/releases/download/v1.0.0/godoos_linux_arm64)

### 🚢 **Docker installation**
```
docker run -d -p 56780:56780 -p 8185:80 --name godoos godoos/godoos:latest
```
-Access address: http://localhost:8185/
-If local storage is set, the storage address is/root/. odoos/os. After successful setting, save it by clicking the win icon in the bottom left corner ->shutdown icon ->restore ->restore to factory settings


<!-- 图标和链接 -->
[license-image]: ./docs/img/license_%20MIT.svg
[license-url]: https://spdx.org/licenses/MIT.html

## Highlights
- ***No need for internet connection, fully open source***
- ***Zero configuration, no registration required, download and use immediately***
- ***Zero pollution, no plugin dependency***
- ***Small in size, packaged for only 61M, it does include all the office suites***
- ***Unlimited scalability, supports custom applications***
- ***Golang develops backend with low resource consumption and high performance***
- ***Supports multiple platforms, Windows、Linux、MacOS***
- ***A complete app store system, simply learn [App Store Configuration](./docs/Store.en.md) to develop complex applications***

## Function Description

### 1、 System Desktop
- Exquisite imitation of Windows style
- Desktop file management
- Support native file drag and drop upload
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/home.png" width="600" />

### 2、 File management
- Drag and drop file upload
- File Search
- Native file storage
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/file.png" width="600" />

### 3、 Internal chat
- No need for complicated registration process, simply discover and list all available chat partners within the same local area network, and start instant messaging immediately. Support LAN based instant messaging, file transfer, and other functions to facilitate seamless communication and collaboration within the team.
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/localchat.png" width="600" />

### 4、 Documents
- Simple Word editor, native storage, supports QR codes, handwritten signatures, import and export
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/doc.png" width="600" />

### 5、 Table
- Native storage, Excel editor, supports import and export, supports images and formulas
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/excel.png" width="600" />

### 6、 Markdown
- Native storage, using VDitors, supporting import and export, outline and real-time preview
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/markdown.png" width="600" />

### 7、 Mind map
- Built in multiple themes; Support shortcut keys; Node content supports images, icons, hyperlinks, notes, and tags.
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/mind.png" width="600" />

### 8、 Presentation Presentation
- Native storage, using pptist, supporting text, images, shapes, lines, charts, tables, videos, formulas, etc.
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/ppt.png" width="600" />

### 9、 File Editor
- Native storage, supports opening text/html/css/js/svg/xml/md, etc., can be used as a simple online editplus.
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/fileeditor.png" width="600" />

### 10、 Whiteboard
- Integrating various creative expression abilities such as free layout, paintbrushes, and notes, it inspires team creativity and enables communication around a whiteboard anytime, anywhere.
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/baiban.png" width="600" />

### 11、 Image editing
- A small Photoshop with native storage, supporting image search, cropping, rotation, scaling, filtering, and other functions
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/pic.png" width="600" />

### 12、 Gantt Chart
- A must-have tool for project management, supporting custom project personnel and roles, and supporting drag and drop/management allocation (resources, roles, work), etc.
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/gant.png" width="600" />

### 13、 Browser
- A simple built-in browser
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/ie.png" width="600" />


### 14、 System settings
- You can switch storage methods and system backgrounds here.
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/setting-store.png" width="600" />

### 15、 App Store
- App store management allows for the addition of external applications.
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/store.png" width="600" />

### 16、 Screenshot
- A simple screenshot tool. Save the screenshot file locally.

### 17、 Screen recording
- A simple screen recording tool. After recording the screen, save the recorded file locally.

### 18、 Calculator
- A calculator that mimics Windows 10 and supports historical records.
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/cal.png" width="600" />

### 19、 Music Library
- A simple sound storage library that supports playing music.

### 20、 Picture Library
- A simple image repository that supports viewing images

### 21、 Kanban board
- Support standard kanban, a must-have tool for project management, which can quickly create kanban and place it in different folders
<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/kanban.png" width="600" />

### 22、 Process management
- Support process management, can view process list, kill processes

## Development
### Build
- Front end construction
```bash
cd frontend
pnpm i
pnpm build
```
- Backend construction
```bash
# go install github.com/wailsapp/wails/v2/cmd/wails@latest
wails build
# wails build -nsis -upx //you need install nsis and upx
```
## thank
- [element-plus](http://element-plus.org/)
- [vue3](https://v3.cn.vuejs.org/)
- [wails](https://wails.io/)
- [pptist](https://github.com/pipipi-pikachu/PPTist)
- [vditor](https://github.com/Vanessa219/vditor)
- [mind-map](https://github.com/wanglin2/mind-map)
- [canvas-editor](https://github.com/Hufe921/canvas-editor)

### Contributing

See [Contributing guide](CONTRIBUTING.md)

### Contributors

<a href="https://github.com/phpk/godoos/graphs/contributors">
  <img src="https://contributors-img.web.app/image?repo=phpk/godoos" />
</a>

Made with [contributors-img](https://contributors-img.web.app).

================================================
FILE: README.md
================================================
<p align="center">
    <img src="./build/appicon.png" width="120" height="120">
</p>

<h1 align="center">GodoOS</h1>
一款高效的内网办公操作系统,内含word/excel/ppt/pdf/内网聊天/白板/思维导图等多个办公系统工具,支持原生文件存储。平台界面精仿windows风格,操作简便,同时保持低资源消耗和高性能运行。无需注册即可自动连接内网用户,实现即时通讯和文件共享。灵活高配置的应用商店,可无限扩展。
<div align="center">


[English](README.en.md) | 简体中文

[使用文档](https://docs.godoos.com/zh/godoos.html) | [AI](./docs/ai.md) | [FAQ](./docs/Faq.md) | [应用开发](./docs/Store.md)

</div>



### 📥 下载安装(v1.0.5)

1. 💻 **Windows 用户**:
   
- Windows (AMD64) [**Web版**](https://godoos.com/upload/godoos/1.0.5/web/godoos_web_windows_amd64.exe) [**桌面版**](https://godoos.com/upload/godoos/1.0.5/desktop/godoos-amd64-installer.exe)
- Windows (ARM64) [**Web版**](https://godoos.com/upload/godoos/1.0.5/web/godoos_web_windows_arm64.exe) [**桌面版**](https://godoos.com/upload/godoos/1.0.5/desktop/godoos-arm64-installer.exe)


2. 💼 **MacOS 用户**:

- MacOS (AMD64) [**Web版**](https://godoos.com/upload/godoos/1.0.5/web/godoos_web_darwin_amd64)
- MacOS (ARM64) [**Web版**](https://godoos.com/upload/godoos/1.0.5/web/godoos_web_darwin_arm64)

提示:下载后以godoos_web_darwin_amd64为例,命令行:
```
sudo chmod +x godoos_web_darwin_amd64
sudo ./godoos_web_darwin_amd64
```

3. 💽 **Linux 用户**:

- Linux (AMD64) [**Web版**](https://godoos.com/upload/godoos/1.0.5/web/godoos_web_linux_amd64)
- Linux (ARM64) [**Web版**](https://godoos.com/upload/godoos/1.0.5/web/godoos_web_linux_arm64)
提示:下载后以godoos_web_darwin_amd64为例,root账号登录,命令行:
```
chmod +x godoos_web_darwin_amd64
./godoos_web_darwin_amd64
```

- 备注:web版下载后启动服务端。访问地址为:http://localhost:56780/。

### 🚢 **Docker安装1.0.4**

#### 下载docker包

```
wget https://godoos.com/upload/godoos/1.0.4/docker/godoos_latest.tar.gz
gzip -d godoos_latest.tar.gz
docker load -i godoos_latest.tar
docker run -d -p 56780:56780 --name godoos godoos/godoos:latest
```

- 如果设置本地存储,存储地址为 /root/.godoos/os,设置成功后保存



## 💝 亮点
- ***无需联网使用,全开源***
- ***零配置,无需注册,下载即用***
- ***零污染,无插件依赖***
- ***精小,打包后仅70M,却包含了所有的办公套件***
- ***可无限扩展,支持自定义应用***
- ***golang开发后端,低资源消耗和高性能***
- ***支持多平台,Windows、Linux、MacOS***
- ***完善的应用商店体系,简单学习一下[应用商店配置](./docs/Store.md)即可开发出复杂的应用***

## 💖 开源地址
- [Gitee](https://gitee.com/godoos/godoos)
- [Gitcode](https://gitcode.com/aiok/godoos)
- [Github](https://github.com/phpk/godoos)


## 🚀 演示视频
- [全程操作](https://www.bilibili.com/video/BV1NdvaeEEz3/?vd_source=739e0e59aeefdb2e9f760e5037d00245)

## 🎉 V1.0.6更新
- 重构前端,使开发难度降低
- 新增手机端,支持手机端文件管理


## 🎉 V1.0.5更新日志

- 新增配置本地代理和远程代理,本地代理可实现本机ip映射外部域名,远程代理内嵌frpc设置后可实现内网用户外网域名访问。
- 修改锁屏机制,确保外网访问安全。
- 支持本地聊天ai对话文件和联网搜索。
- 新增知识库,支持知识库根据文件夹智能生成,一键添加知识库索引,一键搜索知识库。
- 新增复制/粘贴快捷键
- 新增文件检索,支持分词查询文档内容
- 新增frpc客户端管理,无需下载,支持一键启动和停止frpc客户端,实现内网穿透。
- 新增本地代理管理,支持http/静态文件/udp转发代理,支持一键启动和停止本地代理服务。
- 新增后台锁屏管理,可设定管理员和密码

## 🎉 V1.0.4更新日志

- 新增配置远程存储状态下是否支持跨域
- 修复系统重启错误
- 支持配置onlyOffice地址,onlyOffice编辑word/ppt/excel文件
- 修复1.0.3闪屏问题
- 修复默认不打开广告
- 修复设置ollama地址无效的问题
- 修复内网聊天初始化问题
- 修复本地ai聊天编辑未更改引擎的错误


## 🎉 V1.0.3更新日志

- 新增ai模型管理,可下载管理ollama模型(需要先安装ollama)
- 新增ai助手,可控制整个系统的prompt
- word新增ai优化/续写/纠错/翻译/总结,生成大纲,根据大纲一键创建文章
- markdown更换为更实用的cherry-markdown,支持draw.io绘图,支持导出为思维导图/pdf/长图/docx/md/html格式
- 修复截图/截屏路径
- 修复更换存储将路径后系统不重置的问题
- 新增文件密码箱(系统设置里),可根据不同文件进行加密存储
- 美化日程提醒弹窗
- 修复word格式问题以及导出名字不对
- markdown新增ai优化/续写/纠错/翻译/总结,生成大纲,根据大纲一键创建文章
- 更改文档存储方式,支持选择文件夹
- 内网聊天新增ai对话,可保存对话历史,可更换模型和prompt
- 新增可定义端口和访问路径,支持web端系统重启
- 新增每个文件可独立设置密码,支持不可逆加密文件(加密文件后不可更改密码)

###  🎉 v1.0.2更新日志
- 新增本地文件加密存储
- 新增企业端接口(聊天/工作流/文件分享/文件加密)
- 重构本地聊天,修改发现机制(基于ip扫描和arp过滤)
- 本地聊天可批量发送图片/文件夹,修改发送机制,消息基于udp发送,文件基于tcp发送
- 修复word导入格式丢失问题
- 修复文件重命名错误的bug
- 修复拖拽上传中断的bug
- 新增可手动关闭广告
- 优化初始化系统,初始化系统时只请求读写一次
- 去除浏览器存储
- 开源核心底层源码
- 优化思维导图和文件读取

###  🎉 v1.0.1更新日志

- 优化初始化系统,初始化系统时只请求读写一次,确保1秒内打开
- 去除浏览器存储
- 内网聊天增加手工添加ip,跨网段通信在ping通的前提下如果发现不了对方可手工添加对方ip
- 修复思维导图保存的文件每次打开主题又会变成默认主题
- 新增webdav客户端
- 新增远程存储
- 修改选择文件夹会删除文件夹内的文件



## ⚡ 功能说明和预览

### 一、系统桌面
- 精仿windows风格
- 桌面文件管理
- 支持原生文件拖拽上传

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/home.png" width="600" />

### 二、文件管理
- 文件拖拽上传
- 文件搜索
- 原生文件存储
- 直接压缩/解压文件夹(本地存储支持zip/tar/gz/bz2)

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/file.png" width="600" />

### 三、内网聊天
- 无需注册流程,只需在同一内网,即可自动发现并列出所有可用的聊天对象,支持基于局域网的即时消息传输、文件传输等功能。

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/localchat.png" width="600" />

### 四、文档
- 简便的word编辑器,原生存储,支持二维码、手写签名,导入导出

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/doc.png" width="600" />

### 五、表格
- 原生存储,Excel编辑器,支持导入、导出,支持图片、公式

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/excel.png" width="600" />

### 六、markdown
- 原生存储,采用vditor,支持导入、导出,支持大纲、实时预览

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/markdown.png" width="600" />

### 七、思维导图
- 内置多种主题;支持快捷键;节点内容支持图片、图标、超链接、备注、标签。

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/mind.png" width="600" />

### 八、演示文稿
- 原生存储,采用pptist,支持文字、图片、形状、线条、图表、表格、视频、公式等。

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/ppt.png" width="600" />

### 九、文件编辑器
- 原生存储,支持打开text/html/css/js/svg/xml/md等,可以当作一个简单的在线editplus。

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/fileeditor.png" width="600" />

### 十、白板
- 集自由布局、画笔、便签多种创意表达能力于一体,激发团队创造力,随时随地,围绕一块白板沟通。

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/baiban.png" width="600" />

### 十一、图片编辑
- 一个小型的photoshop,原生存储,支持搜索图片,支持图片裁剪、旋转、缩放、滤镜等功能

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/pic.png" width="600" />

### 十二、甘特图
- 项目管理必备工具,支持自定义项目人员和角色,支持拖拽/管理分配(资源、角色、工作)等。

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/gant.png" width="600" />

### 十三、浏览器
- 一款简单的内置浏览器

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/ie.png" width="600" />


### 十四、系统设置
- 可在这里切换存储方式,可切换系统背景。

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/setting-store.png" width="600" />

### 十五、应用商店
- 应用商店管理,丰富的外部接口,可导入/添加/下载外部应用。支持依赖库安装/卸载。

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/store.png" width="600" />

### 十六、截图
- 一个简单的截图工具。截图后文件存到本地。

### 十七、录屏
- 一个简单的录屏工具。录屏后录后文件存到本地。

### 十八、计算器
- 一个仿windows10的计算器,支持历史记录。

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/cal.png" width="600" />

### 十九、音乐库
- 一个简单的声音存储库,支持播放音乐。

### 二十、图片库
- 一个简单的图片存储库,支持查看图片

### 二十一、看板
- 支持标准看板,项目管理必备工具,可快速创建看板并放置到不同的文件夹

<img src="https://gitee.com/ruitao_admin/godoos-image/raw/master/img/kanban.png" width="600" />

### 二十二、进程管理
- 支持进程管理,可以查看进程列表,杀死进程

## 🏆 开发
### 1.进入godo/deps/找到对应系统的文件夹,直接手工打zip压缩包
### 2.构建
- 前端构建(必须)
```bash
cd frontend
pnpm i
pnpm build
```
- 桌面端构建
```bash
# go install github.com/wailsapp/wails/v2/cmd/wails@latest
wails build
# wails build -nsis -upx //you need install nsis and upx
```
- web端构建
```bash
cd godo
chmod +x quick_build.sh //linux or mac必须有执行权限,windows不需要
./quick_build.sh
```

## 📊 帮助

1. 是否支持切换存储目录?
- 支持。进入系统设置页面,修改存储目录即可。修改后程序会重启一次。

2. 如何上传文件?
- 支持拖拽上传。

## 📆 使用场景:
1. 对办公安全要求严苛的企业,比如不许连外网。
2. 对办公存储有特殊需求的企业,比如要求员工的数据必须存储到对应的地方。
3. 对办公office有极客思维的企业,office太过庞大,而godoos仅60多M。

## GodoOS企业版介绍

[使用文档](https://docs.godoos.com/zh/godoos/enterprise/)

### 一、分客户端和服务端

- 客户端为开源版,用户所有数据存储到服务端
- 服务端支持windows/linux和docker安装,安装端支持web端
- 客户端支持全平台(windows/macos/linux),安装端支持桌面端和web端

### 二、完善的用户权限管理

- 可指定用户组存储目录
- 可设定用户组存储空间大小
- 可设定用户组角色权限,细分到每一个接口
- 可以根据部门设定工作流
- 用户文件可同部门分享

### 三、可配置的工作流引擎
- 可视化的自定义工作流引擎
- 先定义表单数据,再定义工作流,表单和工作流业务逻辑隔离
- 支持任务流和审计流
- 任务流支持考试/签到/工作日志/周报/季报等
- 任务流支持自动提醒/迟到提交/自定义周期
- 任务流根据表单字段支持分数/答案自定义,阅卷支持手工打分和自动打分
- 审计流支持审批/驳回等
- 审计支持部门和用户自定义权限
- 支持会签(通过需全员否决只需一人)/或签(一人通过或否决)/民主签(少数服从多数,平票自动打回)
- 支持站内消息和邮件通知
- 支持条件分支判断和自定义抄送人
- 支持手工确认/阅读即审批/手写签名
- 支持驳回到上一个节点或发起人
- 条件判断支持和表单联动,支持发起人过滤,分数判断(任务流)

后续开发:
- 支持表单数据导入/导出,支持自定义导出字段
- 支持工作流数据统计
- 支持自定义横向/纵向数据分析
- 支持表单数据和审计数据同步到其他接口
- 审计流支持打分和评论

### 四、完善的表单管理体系
- 支持表单设计器,可自定义表单字段,支持表单联动,支持表单校验
- 支持表单数据归档,支持自定义时间范围
- 支持数据查看/编辑,搜索定义,自动类型定义(数字和字符串)

### 五、完善的企业聊天沟通工具

- 和本地聊天完全隔离
- 支持群聊/单聊
- 支持文件发送和图片发送
- 在线聊天消息不存储服务端(离线消息加密存储)
- 支持消息提醒

后续开发:
- 支持视频聊天/视频会议
- 支持远程协助
- 支持远程文档协作

### 六、支持对接钉钉和企业微信
- 支持钉钉和企微H5应用对接
- 支持钉钉和企微自动登录
- 支持钉钉和企微用户数据同步(第一次登录同步)

### 六、强大的消息通知
- 支持邮件发送
- 支持站内消息
- 支持弹窗提醒

### 七、强大的数据统计功能
- 支持统计在线人数/应用数
- 支持统计存储空间/运行时长/内存使用情况

### 八、强大的加密功能
- 所有系统配置均加密存储
- 所有用户数据一旦后台加密,仅用户可查看,每个文件可设置二级密码

### 九、强大的本地化AI支持(后续版本)
后续开发:
- 支持文档创作/翻译/润色/总结
- 支持语音识别/合成
- 支持图片识别/生成/训练

### 十、支持本地更新客户端
- 可设置版本号,上传版本,自动提示更新
- 可管理不同操作系统版本的更新策略

### 十一、支持本地化应用商店
- 支持应用商店,用户可下载应用,后台可上传应用
- 支持不同操作系统对应不同的应用版本
- 支持应用版本依赖

## 💻 **企业版下载试用**:
   
- Windows (AMD64) [**Web版**](https://godoos.com/upload/godoos-server/1.0.0/close-pro/osadmin_windows_amd64.exe)
- Windows (ARM64) [**Web版**](https://godoos.com/upload/godoos-server/1.0.0/close-pro/osadmin_windows_arm64.exe)
- MacOS (AMD64) [**Web版**](https://godoos.com/upload/godoos-server/1.0.0/close-pro/osadmin_darwin_amd64)
- MacOS (ARM64) [**Web版**](https://godoos.com/upload/godoos-server/1.0.0/close-pro/osadmin_darwin_arm64)
- Linux (AMD64) [**Web版**](https://godoos.com/upload/godoos-server/1.0.0/close-pro/osadmin_linux_amd64)
- Linux (ARM64) [**Web版**](https://godoos.com/upload/godoos-server/1.0.0/close-pro/osadmin_linux_arm64)

提示:下载后以osadmin_linux_amd64为例,root账号登录,命令行:
```
chmod +x osadmin_linux_amd64
./osadmin_linux_amd64
```

- 备注:企业版为server端,需要配合开源版(客户端)一起使用。需先安装mysql,测试版试用期为一个月。访问地址为:http://localhost:8816/。

## ❤️ 感谢
- [element-plus](http://element-plus.org/)
- [vue3](https://v3.cn.vuejs.org/)
- [wails](https://wails.io/)
- [pptist](https://github.com/pipipi-pikachu/PPTist)
- [cherry-markdown](https://github.com/Tencent/cherry-markdown)
- [mind-map](https://github.com/wanglin2/mind-map)
- [canvas-editor](https://github.com/Hufe921/canvas-editor)
- [Luckysheet](https://gitee.com/mengshukeji/Luckysheet/)

## 💕 关联项目
- [godoai](https://gitee.com/ruitao_admin/godoai)
- [godooa](https://gitee.com/ruitao_admin/gdoa)
- [gododb](https://gitee.com/ruitao_admin/gododb)

## 微信群
<img src="https://gitee.com/ruitao_admin/gdoa/raw/master/docs/wx.png" width="150" />

## 开源

- 承诺永久开源
- 允许企业/个人单独使用,但需保留版权信息
- 如用于商业活动或二次开发后发售,请购买相关版权
- 不提供私下维护工作,如有bug请 [issures](https://gitee.com/godoos/godoos/issues) 提交
- 请尊重作者的劳动成果

## 💌 支持作者

如果觉得不错,或者已经在使用了,希望你可以去 
<a target="_blank" href="https://gitee.com/godoos/godoos">Gitee</a> <a target="_blank" href="https://gitcode.com/aiok/godoos">GitCode</a> <a target="_blank" href="https://github.com/phpk/godoos">Github</a> 帮我点个 ⭐ Star,这将是对我极大的鼓励与支持。

================================================
FILE: app/app.go
================================================
package app

import (
	"context"
	"errors"
	cmd "godo/cmd"
	"os"
	"os/exec"
	"runtime"

	wruntime "github.com/wailsapp/wails/v2/pkg/runtime"
)

// App struct
type App struct {
	ctx context.Context
}

// NewApp creates a new App application struct
func NewApp() *App {
	return &App{}
}

// startup is called when the app starts. The context is saved
// so we can call the runtime methods
func (a *App) Startup(ctx context.Context) {
	a.ctx = ctx
	cmd.OsStart()
}
func (a *App) Shutdown(ctx context.Context) {
	a.ctx = ctx
	cmd.OsStop()
}
func (a *App) OpenDirDialog() string {
	path, err := wruntime.OpenDirectoryDialog(a.ctx, wruntime.OpenDialogOptions{
		Title: "Select Folder",
	})
	if err != nil {
		wruntime.LogErrorf(a.ctx, "Error: %+v\n", err)
	}
	return path
}
func (a *App) ChooseFileDialog() string {
	path, err := wruntime.OpenFileDialog(a.ctx, wruntime.OpenDialogOptions{
		Title: "Select File",
	})
	if err != nil {
		wruntime.LogErrorf(a.ctx, "Error: %+v\n", err)
	}
	return path
}
func (a *App) RestartApp() error {
	name, err := os.Executable()
	if err != nil {
		return err
	}

	var cmd *exec.Cmd
	switch runtime.GOOS {
	case "windows":
		cmd = exec.Command(name, os.Args[1:]...)
	case "darwin": // macOS
		cmd = exec.Command("/usr/bin/open", name)
	case "linux":
		cmd = exec.Command(name, os.Args[1:]...)
		// Optionally, you could use 'xdg-open' or 'gnome-open' etc.
		// cmd = exec.Command("/usr/bin/gnome-open", name)
	default:
		return errors.New("unsupported OS")
	}

	if cmd != nil {
		cmd.Start()
		wruntime.Quit(a.ctx)
		return nil
	}

	return errors.New("failed to restart application")
}


================================================
FILE: build/README.md
================================================
# Build Directory

The build directory is used to house all the build files and assets for your application. 

The structure is:

* bin - Output directory
* darwin - macOS specific files
* windows - Windows specific files

## Mac

The `darwin` directory holds files specific to Mac builds.
These may be customised and used as part of the build. To return these files to the default state, simply delete them
and
build with `wails build`.

The directory contains the following files:

- `Info.plist` - the main plist file used for Mac builds. It is used when building using `wails build`.
- `Info.dev.plist` - same as the main plist file but used when building using `wails dev`.

## Windows

The `windows` directory contains the manifest and rc files used when building with `wails build`.
These may be customised for your application. To return these files to the default state, simply delete them and
build with `wails build`.

- `icon.ico` - The icon used for the application. This is used when building using `wails build`. If you wish to
  use a different icon, simply replace this file with your own. If it is missing, a new `icon.ico` file
  will be created using the `appicon.png` file in the build directory.
- `installer/*` - The files used to create the Windows installer. These are used when building using `wails build`.
- `info.json` - Application details used for Windows builds. The data here will be used by the Windows installer,
  as well as the application itself (right click the exe -> properties -> details)
- `wails.exe.manifest` - The main application manifest file.

================================================
FILE: build/darwin/Info.dev.plist
================================================
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleName</key>
        <string>{{.Info.ProductName}}</string>
        <key>CFBundleExecutable</key>
        <string>{{.Name}}</string>
        <key>CFBundleIdentifier</key>
        <string>com.wails.{{.Name}}</string>
        <key>CFBundleVersion</key>
        <string>{{.Info.ProductVersion}}</string>
        <key>CFBundleGetInfoString</key>
        <string>{{.Info.Comments}}</string>
        <key>CFBundleShortVersionString</key>
        <string>{{.Info.ProductVersion}}</string>
        <key>CFBundleIconFile</key>
        <string>iconfile</string>
        <key>LSMinimumSystemVersion</key>
        <string>10.13.0</string>
        <key>NSHighResolutionCapable</key>
        <string>true</string>
        <key>NSHumanReadableCopyright</key>
        <string>{{.Info.Copyright}}</string>
        {{if .Info.FileAssociations}}
        <key>CFBundleDocumentTypes</key>
        <array>
          {{range .Info.FileAssociations}}
          <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
              <string>{{.Ext}}</string>
            </array>
            <key>CFBundleTypeName</key>
            <string>{{.Name}}</string>
            <key>CFBundleTypeRole</key>
            <string>{{.Role}}</string>
            <key>CFBundleTypeIconFile</key>
            <string>{{.IconName}}</string>
          </dict>
          {{end}}
        </array>
        {{end}}
        {{if .Info.Protocols}}
        <key>CFBundleURLTypes</key>
        <array>
          {{range .Info.Protocols}}
            <dict>
                <key>CFBundleURLName</key>
                <string>com.wails.{{.Scheme}}</string>
                <key>CFBundleURLSchemes</key>
                <array>
                    <string>{{.Scheme}}</string>
                </array>
                <key>CFBundleTypeRole</key>
                <string>{{.Role}}</string>
            </dict>
          {{end}}
        </array>
        {{end}}
        <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSAllowsLocalNetworking</key>
            <true/>
        </dict>
    </dict>
</plist>


================================================
FILE: build/darwin/Info.plist
================================================
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleName</key>
        <string>{{.Info.ProductName}}</string>
        <key>CFBundleExecutable</key>
        <string>{{.Name}}</string>
        <key>CFBundleIdentifier</key>
        <string>com.wails.{{.Name}}</string>
        <key>CFBundleVersion</key>
        <string>{{.Info.ProductVersion}}</string>
        <key>CFBundleGetInfoString</key>
        <string>{{.Info.Comments}}</string>
        <key>CFBundleShortVersionString</key>
        <string>{{.Info.ProductVersion}}</string>
        <key>CFBundleIconFile</key>
        <string>iconfile</string>
        <key>LSMinimumSystemVersion</key>
        <string>10.13.0</string>
        <key>NSHighResolutionCapable</key>
        <string>true</string>
        <key>NSHumanReadableCopyright</key>
        <string>{{.Info.Copyright}}</string>
        {{if .Info.FileAssociations}}
        <key>CFBundleDocumentTypes</key>
        <array>
          {{range .Info.FileAssociations}}
          <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
              <string>{{.Ext}}</string>
            </array>
            <key>CFBundleTypeName</key>
            <string>{{.Name}}</string>
            <key>CFBundleTypeRole</key>
            <string>{{.Role}}</string>
            <key>CFBundleTypeIconFile</key>
            <string>{{.IconName}}</string>
          </dict>
          {{end}}
        </array>
        {{end}}
        {{if .Info.Protocols}}
        <key>CFBundleURLTypes</key>
        <array>
          {{range .Info.Protocols}}
            <dict>
                <key>CFBundleURLName</key>
                <string>com.wails.{{.Scheme}}</string>
                <key>CFBundleURLSchemes</key>
                <array>
                    <string>{{.Scheme}}</string>
                </array>
                <key>CFBundleTypeRole</key>
                <string>{{.Role}}</string>
            </dict>
          {{end}}
        </array>
        {{end}}
    </dict>
</plist>


================================================
FILE: build/windows/info.json
================================================
{
	"fixed": {
		"file_version": "{{.Info.ProductVersion}}"
	},
	"info": {
		"0000": {
			"ProductVersion": "{{.Info.ProductVersion}}",
			"CompanyName": "{{.Info.CompanyName}}",
			"FileDescription": "{{.Info.ProductName}}",
			"LegalCopyright": "{{.Info.Copyright}}",
			"ProductName": "{{.Info.ProductName}}",
			"Comments": "{{.Info.Comments}}"
		}
	}
}

================================================
FILE: build/windows/installer/project.nsi
================================================
Unicode true

####
## Please note: Template replacements don't work in this file. They are provided with default defines like
## mentioned underneath.
## If the keyword is not defined, "wails_tools.nsh" will populate them with the values from ProjectInfo.
## If they are defined here, "wails_tools.nsh" will not touch them. This allows to use this project.nsi manually
## from outside of Wails for debugging and development of the installer.
##
## For development first make a wails nsis build to populate the "wails_tools.nsh":
## > wails build --target windows/amd64 --nsis
## Then you can call makensis on this file with specifying the path to your binary:
## For a AMD64 only installer:
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe
## For a ARM64 only installer:
## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe
## For a installer with both architectures:
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe
####
## The following information is taken from the ProjectInfo file, but they can be overwritten here.
####
## !define INFO_PROJECTNAME    "MyProject" # Default "{{.Name}}"
## !define INFO_COMPANYNAME    "MyCompany" # Default "{{.Info.CompanyName}}"
## !define INFO_PRODUCTNAME    "MyProduct" # Default "{{.Info.ProductName}}"
## !define INFO_PRODUCTVERSION "1.0.0"     # Default "{{.Info.ProductVersion}}"
## !define INFO_COPYRIGHT      "Copyright" # Default "{{.Info.Copyright}}"
###
## !define PRODUCT_EXECUTABLE  "Application.exe"      # Default "${INFO_PROJECTNAME}.exe"
## !define UNINST_KEY_NAME     "UninstKeyInRegistry"  # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
####
## !define REQUEST_EXECUTION_LEVEL "admin"            # Default "admin"  see also https://nsis.sourceforge.io/Docs/Chapter4.html
####
## Include the wails tools
####
!include "wails_tools.nsh"

# The version information for this two must consist of 4 parts
VIProductVersion "${INFO_PRODUCTVERSION}.0"
VIFileVersion    "${INFO_PRODUCTVERSION}.0"

VIAddVersionKey "CompanyName"     "${INFO_COMPANYNAME}"
VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer"
VIAddVersionKey "ProductVersion"  "${INFO_PRODUCTVERSION}"
VIAddVersionKey "FileVersion"     "${INFO_PRODUCTVERSION}"
VIAddVersionKey "LegalCopyright"  "${INFO_COPYRIGHT}"
VIAddVersionKey "ProductName"     "${INFO_PRODUCTNAME}"

# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware
ManifestDPIAware true

!include "MUI.nsh"

!define MUI_ICON "..\icon.ico"
!define MUI_UNICON "..\icon.ico"
# !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314
!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps
!define MUI_ABORTWARNING # This will warn the user if they exit from the installer.

!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page.
# !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer
!insertmacro MUI_PAGE_DIRECTORY # In which folder install page.
!insertmacro MUI_PAGE_INSTFILES # Installing page.
!insertmacro MUI_PAGE_FINISH # Finished installation page.

!insertmacro MUI_UNPAGE_INSTFILES # Uinstalling page

!insertmacro MUI_LANGUAGE "English" # Set the Language of the installer

## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1
#!uninstfinalize 'signtool --file "%1"'
#!finalize 'signtool --file "%1"'

Name "${INFO_PRODUCTNAME}"
OutFile "..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file.
InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder).
ShowInstDetails show # This will always show the installation details.

Function .onInit
   !insertmacro wails.checkArchitecture
FunctionEnd

Section
    !insertmacro wails.setShellContext

    !insertmacro wails.webview2runtime

    SetOutPath $INSTDIR

    !insertmacro wails.files

    CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
    CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"

    !insertmacro wails.associateFiles
    !insertmacro wails.associateCustomProtocols

    !insertmacro wails.writeUninstaller
SectionEnd

Section "uninstall"
    !insertmacro wails.setShellContext

    RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath

    RMDir /r $INSTDIR

    Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk"
    Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk"

    !insertmacro wails.unassociateFiles
    !insertmacro wails.unassociateCustomProtocols

    !insertmacro wails.deleteUninstaller
SectionEnd


================================================
FILE: build/windows/installer/wails_tools.nsh
================================================
# DO NOT EDIT - Generated automatically by `wails build`

!include "x64.nsh"
!include "WinVer.nsh"
!include "FileFunc.nsh"

!ifndef INFO_PROJECTNAME
    !define INFO_PROJECTNAME "godoos"
!endif
!ifndef INFO_COMPANYNAME
    !define INFO_COMPANYNAME "godoos"
!endif
!ifndef INFO_PRODUCTNAME
    !define INFO_PRODUCTNAME "godoos"
!endif
!ifndef INFO_PRODUCTVERSION
    !define INFO_PRODUCTVERSION "1.0.0"
!endif
!ifndef INFO_COPYRIGHT
    !define INFO_COPYRIGHT "Copyright........."
!endif
!ifndef PRODUCT_EXECUTABLE
    !define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe"
!endif
!ifndef UNINST_KEY_NAME
    !define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
!endif
!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}"

!ifndef REQUEST_EXECUTION_LEVEL
    !define REQUEST_EXECUTION_LEVEL "admin"
!endif

RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"

!ifdef ARG_WAILS_AMD64_BINARY
    !define SUPPORTS_AMD64
!endif

!ifdef ARG_WAILS_ARM64_BINARY
    !define SUPPORTS_ARM64
!endif

!ifdef SUPPORTS_AMD64
    !ifdef SUPPORTS_ARM64
        !define ARCH "amd64_arm64"
    !else
        !define ARCH "amd64"
    !endif
!else
    !ifdef SUPPORTS_ARM64
        !define ARCH "arm64"
    !else
        !error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY"
    !endif
!endif

!macro wails.checkArchitecture
    !ifndef WAILS_WIN10_REQUIRED
        !define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later."
    !endif

    !ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED
        !define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}"
    !endif

    ${If} ${AtLeastWin10}
        !ifdef SUPPORTS_AMD64
            ${if} ${IsNativeAMD64}
                Goto ok
            ${EndIf}
        !endif

        !ifdef SUPPORTS_ARM64
            ${if} ${IsNativeARM64}
                Goto ok
            ${EndIf}
        !endif

        IfSilent silentArch notSilentArch
        silentArch:
            SetErrorLevel 65
            Abort
        notSilentArch:
            MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}"
            Quit
    ${else}
        IfSilent silentWin notSilentWin
        silentWin:
            SetErrorLevel 64
            Abort
        notSilentWin:
            MessageBox MB_OK "${WAILS_WIN10_REQUIRED}"
            Quit
    ${EndIf}

    ok:
!macroend

!macro wails.files
    !ifdef SUPPORTS_AMD64
        ${if} ${IsNativeAMD64}
            File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}"
        ${EndIf}
    !endif

    !ifdef SUPPORTS_ARM64
        ${if} ${IsNativeARM64}
            File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}"
        ${EndIf}
    !endif
!macroend

!macro wails.writeUninstaller
    WriteUninstaller "$INSTDIR\uninstall.exe"

    SetRegView 64
    WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}"
    WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}"
    WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}"
    WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}"
    WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
    WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"

    ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
    IntFmt $0 "0x%08X" $0
    WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0"
!macroend

!macro wails.deleteUninstaller
    Delete "$INSTDIR\uninstall.exe"

    SetRegView 64
    DeleteRegKey HKLM "${UNINST_KEY}"
!macroend

!macro wails.setShellContext
    ${If} ${REQUEST_EXECUTION_LEVEL} == "admin"
        SetShellVarContext all
    ${else}
        SetShellVarContext current
    ${EndIf}
!macroend

# Install webview2 by launching the bootstrapper
# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment
!macro wails.webview2runtime
    !ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT
        !define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime"
    !endif

    SetRegView 64
	# If the admin key exists and is not empty then webview2 is already installed
	ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
    ${If} $0 != ""
        Goto ok
    ${EndIf}

    ${If} ${REQUEST_EXECUTION_LEVEL} == "user"
        # If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed
	    ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
        ${If} $0 != ""
            Goto ok
        ${EndIf}
     ${EndIf}

	SetDetailsPrint both
    DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}"
    SetDetailsPrint listonly

    InitPluginsDir
    CreateDirectory "$pluginsdir\webview2bootstrapper"
    SetOutPath "$pluginsdir\webview2bootstrapper"
    File "tmp\MicrosoftEdgeWebview2Setup.exe"
    ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install'

    SetDetailsPrint both
    ok:
!macroend

# Copy of APP_ASSOCIATE and APP_UNASSOCIATE macros from here https://gist.github.com/nikku/281d0ef126dbc215dd58bfd5b3a5cd5b
!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
  ; Backup the previously associated file class
  ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"

  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"

  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
  WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
!macroend

!macro APP_UNASSOCIATE EXT FILECLASS
  ; Backup the previously associated file class
  ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
  WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"

  DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
!macroend

!macro wails.associateFiles
    ; Create file associations
    
!macroend

!macro wails.unassociateFiles
    ; Delete app associations
    
!macroend

!macro CUSTOM_PROTOCOL_ASSOCIATE PROTOCOL DESCRIPTION ICON COMMAND
  DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
  WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "" "${DESCRIPTION}"
  WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "URL Protocol" ""
  WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\DefaultIcon" "" "${ICON}"
  WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell" "" ""
  WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open" "" ""
  WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open\command" "" "${COMMAND}"
!macroend

!macro CUSTOM_PROTOCOL_UNASSOCIATE PROTOCOL
  DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
!macroend

!macro wails.associateCustomProtocols
    ; Create custom protocols associations
    
!macroend

!macro wails.unassociateCustomProtocols
    ; Delete app custom protocol associations
    
!macroend


================================================
FILE: build/windows/wails.exe.manifest
================================================
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <assemblyIdentity type="win32" name="com.wails.{{.Name}}" version="{{.Info.ProductVersion}}.0" processorArchitecture="*"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
    <asmv3:application>
        <asmv3:windowsSettings>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 -->
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to per-monitor if per-monitor v2 is not supported -->
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>

================================================
FILE: build.linux.sh
================================================
#!/bin/bash

# 构建和压缩
wails build -platform linux/amd64 -s -ldflags="-s -w"
wails build -platform linux/arm64 -s -ldflags="-s -w"
wails build -platform darwin/amd64 -s -ldflags="-s -w"
wails build -platform darwin/arm64 -s  -ldflags="-s -w"

================================================
FILE: build.win.sh
================================================
wails build -ldflags="-s -w" -platform windows/amd64 -nsis -s
wails build -ldflags="-s -w" -platform windows/arm64 -nsis -s


================================================
FILE: cloud/.gitignore
================================================
tmp
deps/dist
deps/*.zip
dist/


================================================
FILE: cloud/README.md
================================================
## godocloud客户端安装帮助

- cloud目录为企业版打包客户端而设定,可以自由定制客户端,根据以下步骤打包

### 第一步:安装nodejs

```
cd ../frontend
npm i
npm run build
```
- 打包成功后复制/godo/deps/dist目录下所有文件到cloud/deps/dist目录

### 第二步:安装golang环境打包

#### linux/mac环境下打包

```
sudo chmod +x build.sh
./build.sh
```
#### windows环境下打包

- 首先安装mingw-w32,进入命令行界面

```
./build.sh
```

- 打包成功后每个系统的版本在dist目录下

### 第三步:部署

- 启动文件
```
sudo chmod +x ./godocloud_linux_amd64
./godocloud_linux_amd64
```
- 访问地址:http://localhost:56781

- 备注:如需更改端口地址,修改cloud/cmd/main.go中,改完之后要重新打包部署

```
const serverAddress = ":56781"
```



================================================
FILE: cloud/build.sh
================================================
#!/bin/bash

# 定义要构建的平台
PLATFORMS=("linux/amd64" "windows/amd64" "darwin/amd64" "linux/arm64" "windows/arm64" "darwin/arm64")

# 定义版本号
SCRIPT_VERSION="1.0.0"
# 获取当前脚本的绝对路径
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
for PLATFORM in "${PLATFORMS[@]}"; do
    # 分割平台字符串
    OS=$(echo $PLATFORM | cut -d '/' -f 1)
    ARCH=$(echo $PLATFORM | cut -d '/' -f 2)

    # 设置后缀
    case $OS in
        "windows") SUFFIX=".exe" ;;
        *) SUFFIX="" ;;
    esac
    OUT_PATH="./dist/"
    if [ ! -d "$OUT_PATH" ]; then
        mkdir "$OUT_PATH"
    fi
    # 输出文件名
    OUTPUT_FILE="${OUT_PATH}godocloud_${OS}_${ARCH}${SUFFIX}"

    # 设置GOOS和GOARCH环境变量
    export GOOS=$OS
    export GOARCH=$ARCH
    export GODOTOPTYPE="web"

    # 执行编译命令,并处理可能的错误
    go build  -ldflags="-s -w" -o "$OUTPUT_FILE" ./main.go || { echo "编译 $OS/$ARCH 失败,请检查错误并尝试解决。"; continue; }

    echo "编译 $OS/$ARCH 成功,生成文件: $OUTPUT_FILE"
done


================================================
FILE: cloud/cmd/main.go
================================================
/*
 * GodoOS - A lightweight cloud desktop
 * Copyright (C) 2024 https://godoos.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package cmd

import (
	"context"
	"godocloud/deps"
	"io/fs"
	"log"
	"net/http"
	"time"

	"github.com/gorilla/mux"
)

const serverAddress = ":56781"

var srv *http.Server

func OsStart() {
	//InitServer()
	router := mux.NewRouter()
	router.Use(recoverMiddleware)
	router.Use(corsMiddleware())
	// 使用带有日志装饰的处理器注册路由
	router.Use(loggingMiddleware{}.Middleware)

	// 注册根路径的处理函数
	distFS, _ := fs.Sub(deps.Frontendassets, "dist")
	fileServer := http.FileServer(http.FS(distFS))

	// 注册根路径的处理函数
	router.PathPrefix("/").Handler(fileServer)

	//serverAddress := ":56781"
	log.Printf("Listening on port: %v", serverAddress)
	srv = &http.Server{Addr: serverAddress, Handler: router}
	Serve(srv)
}
func OsStop() {
	ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
	defer cancel()
	if err := srv.Shutdown(ctx); err != nil {
		log.Fatalf("Server forced to shutdown: %v", err)
	}
	log.Println("Server stopped.")
}
func OsRestart() {
	// 停止当前服务
	OsStop()
	// 重新启动服务
	OsStart()
}


================================================
FILE: cloud/cmd/msg.go
================================================
/*
 * GodoOS - A lightweight cloud desktop
 * Copyright (C) 2024 https://godoos.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package cmd

import (
	"encoding/json"
	"net/http"
)

type APIResponse struct {
	Message string `json:"message"`
	Code    int    `json:"code"`
	Data    any    `json:"data,omitempty"`
	Error   string `json:"error,omitempty"`
}

func WriteJSONResponse(w http.ResponseWriter, res APIResponse, status int) {
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(status)
	json.NewEncoder(w).Encode(res)
}

// HTTPError 返回带有JSON错误消息的HTTP错误
func HTTPError(w http.ResponseWriter, status int, message string) {
	WriteJSONResponse(w, APIResponse{Message: message, Code: -1}, status)
}
func ErrorMsg(w http.ResponseWriter, message string) {
	WriteJSONResponse(w, APIResponse{Message: message, Code: -1}, 200)
}
func ErrorData(w http.ResponseWriter, data any, message string) {
	WriteJSONResponse(w, APIResponse{Message: message, Data: data, Code: -1}, 200)
}
func Error(w http.ResponseWriter, message string, err string) {
	WriteJSONResponse(w, APIResponse{Message: message, Error: err, Code: -1}, 200)
}
func SuccessMsg(w http.ResponseWriter, data any, message string) {
	WriteJSONResponse(w, APIResponse{Message: message, Data: data, Code: 0}, 200)
}


================================================
FILE: cloud/cmd/serve.go
================================================
package cmd

import (
	"context"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/signal"
	"sync"
	"syscall"
	"time"

	"github.com/gorilla/mux"
)

func Serve(srv *http.Server) {
	var wg sync.WaitGroup
	wg.Add(1)

	go func() {
		defer wg.Done()
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("Error starting server: %v\n", err)
		}
	}()
	// 监听退出信号
	ctx, cancel := context.WithCancel(context.Background())
	go func() {
		c := make(chan os.Signal, 1)
		signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
		<-c
		log.Println("Received signal, gracefully shutting down...")
		cancel()
	}()

	<-ctx.Done()
	shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer shutdownCancel()
	if err := srv.Shutdown(shutdownCtx); err != nil {
		log.Printf("Error during server shutdown: %v\n", err)
	}
	wg.Wait()
}

type loggingMiddleware struct {
}

func (l loggingMiddleware) Middleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		startTime := time.Now()
		defer func() {
			log.Printf(
				"%s %s %s %v",
				r.Method,
				r.URL.Path,
				r.Proto,
				time.Since(startTime),
			)
		}()
		next.ServeHTTP(w, r)
	})
}
func recoverMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		defer func() {
			if err := recover(); err != nil {
				// log.Printf("Recovered from panic: %v", err)
				// http.Error(w, "Internal Server Error", http.StatusInternalServerError)
				ErrorMsg(w, "Internal Server Error:"+fmt.Sprintf("%v", err))
			}
		}()
		next.ServeHTTP(w, r)
	})
}

// CORS 中间件
func corsMiddleware() mux.MiddlewareFunc {
	allowHeaders := "Content-Type, Accept, Authorization, Origin,Pwd"
	allowMethods := "GET, POST, PUT, DELETE, OPTIONS"

	return func(next http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			w.Header().Set("Access-Control-Allow-Origin", "*")
			w.Header().Set("Access-Control-Allow-Methods", allowMethods)
			w.Header().Set("Access-Control-Allow-Headers", allowHeaders)

			// 如果是预检请求(OPTIONS),直接返回 200 OK
			if r.Method == http.MethodOptions {
				w.WriteHeader(http.StatusOK)
				return
			}

			next.ServeHTTP(w, r)
		})
	}
}


================================================
FILE: cloud/deps/frontend.go
================================================
package deps

import "embed"

//go:embed dist
var Frontendassets embed.FS


================================================
FILE: cloud/go.mod
================================================
module godocloud

go 1.23.2

require github.com/gorilla/mux v1.8.1


================================================
FILE: cloud/go.sum
================================================
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=


================================================
FILE: cloud/main.go
================================================
package main

import "godocloud/cmd"

func main() {
	cmd.OsStart()
}


================================================
FILE: compose-dev.yaml
================================================
services:
  app:
    entrypoint:
    - sleep
    - infinity
    image: docker/dev-environments-javascript:stable-1
    init: true
    volumes:
    - type: bind
      source: /var/run/docker.sock
      target: /var/run/docker.sock



================================================
FILE: docker/Dockerfile-dev
================================================
# docker build -f Dockerfile-dev -t godoos/godoos-dev:latest .
# docker run -it --rm -v $(pwd):/app -p 56780:56780 --name godoos-dev godoos/godoos-dev:latest
FROM golang:alpine AS dev

# 设置环境变量
ENV GO111MODULE=on \
    GOPROXY=https://goproxy.cn,direct \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# 设置工作目录
WORKDIR /app

# 将代码复制到容器中
COPY . .

# 设置 GOPATH 和 GOPROXY
ENV GOPATH=$GOPATH:/app/ GOPROXY=https://mirrors.aliyun.com/goproxy,https://goproxy.cn,direct

# 构建二进制文件
CMD ["go", "run", "./godo/main.go"]

# 暴露端口
EXPOSE 56780

================================================
FILE: docker/nginx.conf
================================================
server {
    listen       80;
    server_name  localhost;

    # 代理所有请求到 /dist 目录
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 错误页配置
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

================================================
FILE: docker-compose.yml
================================================
version: '3.8'

services:
  godoos:
    build:
      context: .
      dockerfile: Dockerfile
    image: godoos/godoos:latest
    ports:
      - "56780:56780"
    command: ["/godoos"]

================================================
FILE: docs/Api.md
================================================
## API
- 系统接口地址: http://localhost:56780

### 读取目录

#### HTTP 方法
`GET`

#### 路径
`/files/read`

#### 请求参数
- **Query 参数**: `path` (目录路径)

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 目录内容列表

#### 示例
```bash
PATH_PARAM="/path/to/directory"
curl -X GET "http://localhost:56780/files/read?path=$PATH_PARAM"
```
---

### 获取文件或目录状态

#### HTTP 方法
`GET`

#### 路径
`/files/stat`

#### 请求参数
- **Query 参数**: `path` (文件或目录路径)

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 文件或目录的状态信息

#### 示例
```bash
# 获取文件或目录状态
PATH_PARAM="/path/to/file_or_directory"
curl -X GET "http://localhost:56780/files/stat?path=$PATH_PARAM"
```
---

### 更改文件权限

#### HTTP 方法
`POST`

#### 路径
`/files/chmod`

#### 请求体
- **Content-Type**: `application/json`
- **Body**: `{ "path": "string", "mode": "string" }`

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 操作结果

#### 示例
```bash
# 更改文件权限
JSON='{"path":"/path/to/file","mode":"0644"}'
curl -X POST -H "Content-Type: application/json" -d "$JSON" "http://localhost:56780/files/chmod"
```
---

### 检查文件或目录是否存在

#### HTTP 方法
`GET`

#### 路径
`/files/exists`

#### 请求参数
- **Query 参数**: `path` (文件或目录路径)

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 存在性检查结果
#### 示例
```bash
# 检查文件或目录是否存在
PATH_PARAM="/path/to/file_or_directory"
curl -X GET "http://localhost:56780/files/exists?path=$PATH_PARAM"
```
---

### 读取文件内容

#### HTTP 方法
`GET`

#### 路径
`/files/readfile`

#### 请求参数
- **Query 参数**: `path` (文件路径)

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 文件内容
#### 示例
```bash
# 读取文件内容
PATH_PARAM="/path/to/file"
curl -X GET "http://localhost:56780/files/readfile?path=$PATH_PARAM"
```
---

### 删除文件

#### HTTP 方法
`GET`

#### 路径
`/files/unlink`

#### 请求参数
- **Query 参数**: `path` (文件路径)

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 操作结果
#### 示例
```bash
# 删除文件
PATH_PARAM="/path/to/file"
curl -X GET "http://localhost:56780/files/unlink?path=$PATH_PARAM"
```
---

### 清空文件系统

#### HTTP 方法
`GET`

#### 路径
`/files/clear`

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 操作结果
#### 示例
```bash
# 清空文件系统
curl -X GET "http://localhost:56780/files/clear"
```
---

### 重命名文件或目录

#### HTTP 方法
`GET`

#### 路径
`/files/rename`

#### 请求参数
- **Query 参数**: `oldPath` (原文件或目录路径), `newPath` (新文件或目录路径)

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 操作结果
#### 示例
```bash
# 重命名文件或目录
OLD_PATH_PARAM="/path/to/old_file_or_directory"
NEW_PATH_PARAM="/path/to/new_file_or_directory"
curl -X GET "http://localhost:56780/files/rename?oldPath=$OLD_PATH_PARAM&newPath=$NEW_PATH_PARAM"
```
---

### 创建目录

#### HTTP 方法
`POST`

#### 路径
`/files/mkdir`

#### 请求参数
- **Query 参数**: `dirPath` (目录路径)

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 操作结果
#### 示例
```bash
# 创建目录
DIR_PATH_PARAM="/path/to/new_directory"
curl -X POST "http://localhost:56780/files/mkdir?dirPath=$DIR_PATH_PARAM"
```
---

### 删除目录

#### HTTP 方法
`GET`

#### 路径
`/files/rmdir`

#### 请求参数
- **Query 参数**: `dirPath` (目录路径)

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 操作结果
#### 示例
```bash
# 删除目录
DIR_PATH_PARAM="/path/to/directory"
curl -X GET "http://localhost:56780/files/rmdir?dirPath=$DIR_PATH_PARAM"
```
---

### 复制文件

#### HTTP 方法
`GET`

#### 路径
`/files/copyfile`

#### 请求参数
- **Query 参数**: `srcPath` (源文件路径), `dstPath` (目标文件路径)

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 操作结果
#### 示例
```bash
# 复制文件
SRC_PATH_PARAM="/path/to/source_file"
DST_PATH_PARAM="/path/to/destination_file"
curl -X GET "http://localhost:56780/files/copyfile?srcPath=$SRC_PATH_PARAM&dstPath=$DST_PATH_PARAM"
```
---

### 写入文件

#### HTTP 方法
`POST`

#### 路径
`/files/writefile`

#### 请求参数
- **Query 参数**: `filePath` (文件路径)

#### 请求体
- **Content-Type**: `multipart/form-data`
- **Body**: 包含 `content` 的表单数据

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 操作结果
#### 示例
```bash
# 写入文件
FILE_PATH_PARAM="/path/to/file"
CONTENT="This is the content to be written."
curl -X POST -F "content=@-$CONTENT" "http://localhost:56780/files/writefile?filePath=$FILE_PATH_PARAM"
```
---

### 追加文件内容

#### HTTP 方法
`POST`

#### 路径
`/files/appendfile`

#### 请求参数
- **Query 参数**: `filePath` (文件路径)

#### 请求体
- **Content-Type**: `multipart/form-data`
- **Body**: 包含 `content` 的表单数据

#### 响应
- **Content-Type**: `application/json`
- **响应体**: 操作结果
#### 示例
```bash
# 追加文件内容
FILE_PATH_PARAM="/path/to/file"
CONTENT="This is the content to be appended."
curl -X POST -F "content=@-$CONTENT" "http://localhost:56780/files/appendfile?filePath=$FILE_PATH_PARAM"
```
---

### 文件系统事件监听

#### 功能
监听文件系统变化事件

#### 参数
- **path** (监听的文件或目录路径)
- **callback** (事件回调函数)
- **errback** (错误回调函数)



================================================
FILE: docs/Faq.md
================================================
## 是否支持浏览器访问?
- 支持。
```
cd frontend
pnpm build
```
然后复制打包后的dist目录到运行程序的根目录,然后重启程序。访问地址为http://localhost:56780/

## 为什么找不到本地文件?
程序默认为浏览器存储。进入系统设置,修改存储方式为本地存储。

## 是否支持切换存储目录?
-支持。
进入系统设置页面,修改存储目录即可。修改后程序会重启一次。

## docker部署失败?
daemon.json文件配置:
```json
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "registry-mirrors": [
    "https://docker.m.daocloud.io"
  ]
}

```
systemctl daemon-reload
systemctl restart docker

### linux版本如何做守护进程
- 下载web版
- 假设运行目录为/root/godoos
```
chmod a+x /root/godoos
vim /etc/systemd/system/godoos.service
```
- 编辑服务文件
```
[Unit]
Description=Godoos Service
After=network.target

[Service]
ExecStart=/root/godoos
Restart=on-failure
User=myuser
Environment=ENV_VAR=value

[Install]
WantedBy=multi-user.target
```
- 加载服务文件
```
systemctl daemon-reload
systemctl enable godoos
```
- 启动服务
```
systemctl start godoos
```
- 查看服务状态
```
systemctl status godoos
```
- 停止服务
```
systemctl stop godoos
```
### docker部署或web部署在虚拟机上不知道配置反向代理

左下角,系统设置,选远程存储,添加docker的ip或虚拟机的ip地址(例子:http://192.168.1.16:56780)

### 如何配置onlyoffice

```
docker pull onlyoffice/documentserver

docker run -i -t -d -p 8000:80 -e JWT_ENABLED=false --restart=always --name=onlyoffice --privileged=true -v /data/onlyoffice/logs:/var/log/onlyoffice  -v /data/onlyoffice/data:/var/www/onlyoffice/Data  -v /data/onlyoffice/lib:/var/lib/onlyoffice -v /data/onlyoffice/db:/var/lib/postgresql  onlyoffice/documentserver
```

- 系统设置,编辑器配置填写onlyoffice的网址,如:http://127.0.0.1:8000
- 局域网内只配置一台机器即可,其他机器访问的时候,需要配置onlyoffice的公网ip,如:http://192.168.1.1:8000



================================================
FILE: docs/Markdown.md
================================================

## 概览
Markdown 编辑器允许您使用丰富的文本编辑体验创建和编辑 Markdown 文件。它包括实时保存、文件导入/导出以及访问最近的 Markdown 文件等功能。

## 开始使用
### 打开编辑器
- 通过应用程序菜单或快捷方式访问 Markdown 编辑器。

### 编辑内容
- 使用编辑器界面,利用 Markdown 语法输入和格式化文本。
- 编辑器支持 Markdown 格式的实时预览。

### 保存更改
- 当编辑器处于聚焦状态时,按 `Ctrl+S` (`Cmd+S` 在 Mac 上) 来保存更改。
- 或者,点击工具栏中的保存按钮。

### 导入文件
- 点击上传按钮或使用文件输入对话框来导入现有的 Markdown 文件。
- 文件的内容将加载到编辑器中,并且其标题将设置为文件名。

### 导出文件
- 点击下载按钮以导出当前的 Markdown 文档。
- 文件将以 Markdown 格式保存到您的本地存储中。

### 查看最近的文件
- 通过点击工具栏中的菜单按钮切换抽屉,以查看最近的文件。
- 抽屉列出您最近访问过的 Markdown 文件及其标题和最后修改时间。

## 界面组件
### 工具栏
- **菜单按钮**:打开抽屉以显示最近的文件。
- **上传按钮**:触发文件输入对话框以导入 Markdown 文件。
- **下载按钮**:将当前文档导出为 Markdown 文件。
- **保存按钮**:将当前文档保存到指定路径。

### 标题输入框
- 在这里输入您的 Markdown 文档的标题。

### 编辑区域
- 这里是您撰写和编辑 Markdown 内容的地方。

### 抽屉
- 显示最近访问过的 Markdown 文件列表。

## 小贴士
- 在尝试保存或导出文档之前,请确保文档有标题。
- 编辑器会在您按下保存快捷键或点击保存按钮时自动保存更改。
- 利用抽屉可以快速在最近的文档之间切换,而不会丢失工作进度。

---
本手册提供了全面的指南,帮助您有效地使用 Markdown 编辑器。遵循这些说明,最大化您的写作和编辑体验。

================================================
FILE: docs/Store.en.md
================================================
## GodoOS App Store Development Tutorial

### Quick Start
1. Download the [mysql5.7 zip package](https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-winx64.zip), and extract it to the `.godoos/run/windows/` directory under the user directory, naming the folder `mysql5.7`.
2. Copy the `mysql5.7` from this program's `docs/demo/mysql5.7` to the `.godoos/run/windows/mysql5.7` directory under the user directory.
3. Open the app store, add an app, select development mode, input `mysql5.7` as the local path, and click OK.

### Development Requirements

1. Basic HTML development skills.
2. Familiarity with the executable file startup process, then configure the JSON file according to the following flow.

### How to Add an Application

1. Create an application folder under the `.godoos/run/windows/` directory in the user directory.
2. An application requires two configuration files; create the `install.json` and `store.json` files at the root of the application directory. The configuration file formats are as follows:
- `install.json` [Sample](./demo/mysql5.7/install.json)
```json
{
    "name": "",             // string, Name of the application.
    "url": "",              // string, Download URL of the application or adapter package.
    "pkg": "",              // string, Official download URL of the application. Can be empty.
    "webUrl":"",            // string, If set, the application will be displayed on the desktop.
    "isDev": true,          // boolean, Whether it is a development environment. If set to true, data will not be downloaded.
    "version": "1.0.0",     // string, Version of the application.
    "icon": "",             // string, Icon of the application, accessible network address.
    "hasStart": true,       // boolean, Indicates whether startup and shutdown are shown.
    "hasRestart": true,     // boolean, Whether a restart is needed.
    "setting": true         // boolean, Whether settings are needed. Only shown when the application is stopped.
}
```

- Note: If a web application does not require a backend process, store.json does not need to be configured.
The structure of install.json is:

```json
type InstallInfo struct {
	Name          string `json:"name"`          // Name of the application. Important, must match the directory name of the application.
	URL           string `json:"url"`           // Download URL of the application or adapter package.
	Pkg           string `json:"pkg"`           // Official download URL of the application.
	WebUrl        string `json:"webUrl"`        // Web address of the application.
	IsDev         bool   `json:"isDev"`         // Flag indicating whether it is a developer version.
	Version       string `json:"version"`       // Version number of the application.
	Desc          string `json:"desc"`          // Description information of the application.
	Icon          string `json:"icon"`          // Path to the application icon.
	HasStart      bool   `json:"hasStart"`      // Flag indicating whether startup and shutdown are shown.
	HasRestart    bool   `json:"hasRestart"`    // Flag indicating whether a restart is needed after installation.
	Setting       bool   `json:"setting"`       // Flag indicating whether configuration is needed.
	Dependencies  []Item `json:"dependencies"`  // Dependencies.
    History      []InstallHastory `json:"history"`// History
}
type InstallHastory struct {
	Version string `json:"version"`
	URL     string `json:"url"`
	Pkg     string `json:"pkg"` // Official download URL of the application.
}
```
- store.json [Sample](./demo/mysql5.7/store.json)

```json
{
    "setting": {
        "binPath": "{exePath}/bin/mysqld.exe", // string, Important, must be set. Path to the startup program.
        "confPath": "{exePath}/my.ini",        // string, Can be empty. Path to the configuration file.
        "progressName": "mysqld.exe",          // string, Process name. Not required if single-threaded.
        "isOn": true                           // boolean, Whether to start the daemon process.
    },
    "config": {                                 // object, Configuration file. Any configuration inside can be filled out, used in conjunction with commands. Can be set via HTTP.
    },
    "commands": {},                             // object, List of commands. Available for invocation by `installCmds` inside `install`, also callable through external HTTP requests.
    "install": {                                // object, Installation configuration.
        "installEnvs": [],                      // object[], Environment variables.
        "installCmds": []                       // object[], Startup commands. Can invoke commands from the command list set `commands`.
    },
    "start": {
        "startEnvs": [],
        "beforeCmds": [],                       // List of commands to execute before startup. Can invoke commands from the command list set `commands`.
        "startCmds": [                          // object[], Pure parameter command set. Will start `setting.binPath`, cannot invoke commands from the `commands` list.
            "--defaults-file={exePath}/my.ini"
        ],
        "AfterCmds": []                        // List of commands to execute after startup. Can invoke commands from the command list set `commands`.
    }
}
```
- Note: The core replacement parameter is `{exePath}`, which is the execution directory of the program. Other `{parameters}` correspond to the config in `store.json`.


The structure for `store.json` is as follows:

```json
type StoreInfo struct {
	Setting  Setting          `json:"setting"`  // Configuration information for the application store.
	Config   map[string]any   `json:"config"`   // Mapping of application configuration information.
	Commands map[string][]Cmd `json:"commands"` // Collection of application commands.
	Install  InstallStruct    `json:"install"`  // Information for installing the application.
	Start    StartStruct      `json:"start"`    // Information for starting the application.
}
```
The structure for Setting is:
```json
// Contains critical setting information such as the binary file path and configuration file path of the application.
type Setting struct {
	BinPath      string `json:"binPath"`      // Path to the application's binary file.
	ConfPath     string `json:"confPath"`     // Path to the application's configuration file.
	ProgressName string `json:"progressName"` // Name of the process.
	IsOn         bool   `json:"isOn"`         // Indicates if the daemon process is running.
}
```
The structure for Cmd is:
```json
type Cmd struct {
	Name     string   `json:"name"`               // Name of the command.
	FilePath string   `json:"filePath,omitempty"` // Path to the command file.
	Content  string   `json:"content,omitempty"`  // Content of the command.
	BinPath  string   `json:"binPath,omitempty"`  // Path to the binary file for executing the command.
	TplPath  string   `json:"tplPath,omitempty"`  // Template path for the command.
	Cmds     []string `json:"cmds,omitempty"`     // List of subcommands to be executed.
	Waiting  int      `json:"waiting"`            // Waiting time.
	Kill     bool     `json:"kill"`               // Flag indicating whether to terminate previous commands. If the process name is set in `content`, priority is given to killing the process by name.
	Envs     []Item   `json:"envs"`               // Environment variables during command execution.
}
```
The structure for Install is:
```json
// `InstallStruct` describes environment variables and command lists during the installation process.
type InstallStruct struct {
	InstallEnvs []Item   `json:"installEnvs"` // Environment variables required during installation.
	InstallCmds []string `json:"installCmds"` // List of commands to execute during installation.
}
type StartStruct struct {
	StartEnvs  []Item   `json:"startEnvs"`  // Environment variables required during startup.
	BeforeCmds []string `json:"beforeCmds"` // List of commands to execute before startup. Commands can be invoked from the `commands` list.
	StartCmds  []string `json:"startCmds"`  // List of commands to execute during startup.
	AfterCmds  []string `json:"afterCmds"`  // List of commands to execute after startup. Commands can be invoked from the `commands` list.
}
// `Item` is a generic key-value pair structure used to represent configuration items or environment variables, etc.
type Item struct {
	Name  string `json:"name"`  // Name of the configuration item.
	Value any    `json:"value"` // Value of the configuration item.
}
```

3. To add an application in the app store, select local addition and input the name of the application directory (no need to fill in the entire directory).

### Explanation of the Configuration File `store.json`

1. install can invoke commands from the commands list.
2. Commands in the commands list can also invoke their own commands.
3. All commands can be chained together.

### How to Set Configuration
1. Create a static directory under the application directory and create an index.html file. Set setting to true in install.json. Frontend configuration example [Sample](./demo/mysql5.7/static/index.html)
```js
const postData = {
	dataDir: dataDir, // Corresponds to the config configuration item in store.json
	logDir: logDir,   // Corresponds to the config configuration item in store.json
	port: port,       // Corresponds to the config configuration item in store.json
	name: "mysql5.7", // Application name
	cmdKey: "setting" // Command key, name of cmds
};
const comp = await fetch('http://localhost:56780/store/setting', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(postData)
});
```
- It is crucial to set name and cmdKey correctly; name is the application name, and cmdKey corresponds to the key in the commands object in store.json. An object can configure a series of commands, which can refer to the structure of Cmd, sample:
```json
"commands": {
        "initData": [
            {
                "name": "exec",
                "binPath": "{exePath}/bin/mysqld.exe",
                "cmds": [
                    "--defaults-file={exePath}/my.ini",
                    "--initialize"
                ],
                "waiting": 1 //Waiting seconds
            },
            {
                "name": "exec",
                "binPath": "{exePath}/bin/mysqld.exe",
                "cmds": [
                    "--defaults-file={exePath}/my.ini",
                    "--init-file={exePath}/password.txt"
                ],
                "waiting": 3,
                "content": "mysqld.exe",
                "kill": true
            },
            {
                "name": "start"
            }
        ],
		 "setting": [
            {
                "name": "changeFile",
                "tplPath": "{exePath}/my.ini.tpl",
                "filePath": "{exePath}/my.ini"
            },
            {
                "name": "initData"
            }
        ],
}
```
- In the above sample, setting invokes the initData command again.
- The fixed address for POST is http://localhost:56780/store/setting
- The principle works by sending configuration information to the store service through an http request to the /store/setting interface. Then, the store service will automatically update the configuration information and start the application based on the configuration information.

### Explanation of the static Directory
1. `index.html` is the homepage of the application.
2. When install is executed, files under the static directory are automatically copied to the .godoos/static/ application directory.
3. If store.json sets icon and the file exists in the static directory, the application icon is that file. Otherwise, it is the icon in install.json.

### Description of Built-in Applications
- The system encapsulates some functions for handling process control and file operations. Below are detailed descriptions of each function:
1. `start` Start the application.
2. `stop`  Stop the application.
3. `restart` Restart the application.
4. `exec` Execute a command. Must set binPath and cmds.
5. `writeFile` Write to a file. Must set filePath and content. Based on config, replaces {parameters} in content.
6. `changeFile` Modify a file. Must set filePath and tplPath. Based on config, performs replacements in the template file.
7. `deleteFile` Delete a file.
8. `unzip`  Unzip a file. Must set filePath and content. content is the extraction directory.
9. `zip` Compress a file. Must set filePath and content. filePath is the folder to be compressed, and content is the name of the compressed file. 
10. `mkdir`  Create a directory. Must set FilePath, which is the path of the directory to be created.
11. `startApp`  Start another application. content is the name of the application.
12. `stopApp`  Stop another application. content is the name of the application.

### Advanced Operations
1. Download [mysql8.0](https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-winx64.zip)
2. Refer to the mysql8.0 directory under demo and attempt to create your own installation package.



================================================
FILE: docs/Store.md
================================================
## GodoOS应用商店开发教程

### 快速开始
1. 下载[mysql5.7的zip包](https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-winx64.zip),并解压到用户目录.godoos/run/windows/目录下,文件夹命名为mysql5.7
2. 复制本程序docs/demo/mysql5.7到用户目录.godoos/run/windows/mysql5.7目录下
3. 打开应用商店,添加应用,选择开发模式,本地路径输入mysql5.7,点击确定

### 开发条件

1. 会简单的html开发
2. 熟悉可执行文件的启动流程,然后根据如下的流程配置json文件

### 如何添加一个应用

1. 在用户目录.godoos/run/windows/下建立一个应用文件夹。
2. 一个应用需要包含两个配置文件,在应用根目录下创建`install.json`和`store.json`两个文件。 配置文件格式如下:
- install.json [样本](./demo/mysql5.7/install.json)
```json
{
    "name": "",             // string, 应用程序名称。
    "url": "",              // string, 应用程序下载地址或适配包的下载地址。
    "pkg": "",              // string, 应用程序的官方下载地址。可为空。
    "webUrl":"",            // string, 如何设置,应用程序将显示到桌面。
    "isDev": true,          // boolean, 是否为开发环境。如果设置为true将不会下载数据。
    "version": "1.0.0",     // string, 应用程序版本。
    "icon": "",             // string, 应用程序图标,为可访问的网络地址。
    "hasStart": true,       // boolean, 表示是否显示启动和停止。
    "hasRestart": true,     // boolean, 是否需要重启。
    "setting": true         // boolean, 是否需要设置。只有应用停止才会显示。
}

```
- 备注:如果不需要后端进程的web应用,store.json可以不用配置。

install.json的结构体为:
```json
type InstallInfo struct {
	Name         string           `json:"name"`         // 应用程序名称。
	URL          string           `json:"url"`          // 应用程序下载地址或适配包的下载地址。
	Pkg          string           `json:"pkg"`          // 应用程序的官方下载地址。
	WebUrl       string           `json:"webUrl"`       // 应用程序的网页地址。
	IsDev        bool             `json:"isDev"`        // 标志位,表示是否为开发者版本。
	Version      string           `json:"version"`      // 应用程序的版本号。
	Desc         string           `json:"desc"`         // 应用程序的描述信息。
	Icon         string           `json:"icon"`         // 应用程序的图标路径。
	HasStart     bool             `json:"hasStart"`     // 标志位,表示是否显示启动和停止。
	HasRestart   bool             `json:"hasRestart"`   // 标志位,表示安装后是否需要重启。
	Setting      bool             `json:"setting"`      // 标志位,表示是否需要配置。
	Dependencies []Item           `json:"dependencies"` // 依赖项。
	Categrory    string           `json:"category"`     // 应用程序的分类。
	History      []InstallHastory `json:"history"`      // 应用程序的历史版本。
}
type InstallHastory struct {
	Version string `json:"version"`
	URL     string `json:"url"`
	Pkg     string `json:"pkg"` // 应用程序的官方下载地址。
}
```

- store.json [样本](./demo/mysql5.7/store.json)

```json
{
    "name": "mysql5.7",     // string, 应用程序名称。可不设置,会继承自install.json
    "setting": {
        "binPath": "{exePath}/bin/mysqld.exe", // string, 重要,必须设置。为启动程序路径。
        "confPath": "{exePath}/my.ini",// string, 可为空。为配置文件路径。
        "progressName": "mysqld.exe",// string, 进程名称。如果为单线程可不设置。
        "isOn": true // boolean, 是否启动守护进程
    },
    "config": { // object, 配置文件。里面的配置可以任意填写,和commands配合使用。可以通过http设置里面的参数。
    },
    "commands": {},// object, 命令列表集。可供install里的installCmds调用,也可以通过外部http请求调用。
    "install": { // object, 安装配置。
        "installEnvs": [],// object[], 环境变量。
        "installCmds": []// object[], 启动命令。可调用命令列表集commands里面的命令。
    },
    "start": {
        "startEnvs": [],
        "beforeCmds": [],// 启动前需要执行的命令列表。可调用命令列表集commands里面的命令。
        "startCmds": [// object[], 纯参数命令集。将启动`setting.binPath`,不可调用命令列表集`commands`里面的命令。
            "--defaults-file={exePath}/my.ini"
        ],
        "AfterCmds": []// 启动后需要执行的命令列表。可调用命令列表集commands里面的命令。
    }
}
```

- 备注:核心的替换参数为`{exePath}`即程序的执行目录。其他`{参数}`对应`store.json`里的`config`。

store.json的结构体为:

```json
type StoreInfo struct {
	Name     string           `json:"name"`     // 应用程序商店的名称。
	Setting  Setting          `json:"setting"`  // 应用程序商店的配置信息。
	Config   map[string]any   `json:"config"`   // 应用程序的配置信息映射。
	Commands map[string][]Cmd `json:"commands"` // 应用程序的命令集合。
	Install  InstallStruct    `json:"install"`  // 安装应用程序的信息。
	Start    StartStruct      `json:"start"`    // 启动应用程序的信息。
}
```
Setting的结构体为:
```json
// 包含应用程序的二进制文件路径、配置文件路径等关键设置信息。
type Setting struct {
	BinPath      string `json:"binPath"`      // 应用程序二进制文件的路径。
	ConfPath     string `json:"confPath"`     // 应用程序配置文件的路径。
	ProgressName string `json:"progressName"` // 进程的名称。
	IsOn         bool   `json:"isOn"`         //是否守护进程运行。
}
```
Cmd的结构体为:
```json
type Cmd struct {
	Name     string   `json:"name"`               // 命令的名称。
	FilePath string   `json:"filePath,omitempty"` // 命令文件的路径。
	Content  string   `json:"content,omitempty"`  // 命令的内容。
	BinPath  string   `json:"binPath,omitempty"`  // 执行命令的二进制文件路径。
	TplPath  string   `json:"tplPath,omitempty"`  // 命令的模板路径。
	Cmds     []string `json:"cmds,omitempty"`     // 要执行的子命令列表。
	Waiting  int      `json:"waiting"`            // 等待的时间。
	Kill     bool     `json:"kill"`               // 标志位,表示是否需要终止之前的命令。如果设置了`content`中的进程名,则优先以进程名字杀死进程
	Envs     []Item   `json:"envs"`               // 命令执行时的环境变量。
}
```
Install的结构体为:
```json
// InstallStruct 描述了安装过程中的环境变量和命令列表。
type InstallStruct struct {
	InstallEnvs []Item   `json:"installEnvs"` // 安装过程中需要的环境变量。
	InstallCmds []string `json:"installCmds"` // 安装过程中需要执行的命令列表。
}
type StartStruct struct {
	StartEnvs  []Item   `json:"startEnvs"`  // 启动过程中需要的环境变量。
	BeforeCmds []string `json:"beforeCmds"` // 启动前需要执行的命令列表。可调用命令列表集commands里面的命令。
	StartCmds  []string `json:"startCmds"`  // 启动过程中需要执行的命令列表。
	AfterCmds  []string `json:"afterCmds"`  // 启动后需要执行的命令列表。可调用命令列表集commands里面的命令。
}
// Item 是一个通用的键值对结构体,用于表示配置项或环境变量等。
type Item struct {
	Name  string `json:"name"`  // 配置项的名称。
	Value any    `json:"value"` // 配置项的值。
}
```

3. 在应用商店添加应用,选择本地添加,输入应用的目录名字(不需要填写整个目录)。

### 配置文件`store.json`说明

1. `install`可以调用`commands`里的命令。
2. `commands`里的命令也可以调用自身的命令。
3. 所有的命令都可以串联使用。

### 如何设置配置
1. 在应用目录下建立`static`目录,并创建`index.html`文件。`install.json`中`setting`设置为`true`。
前端配置样列 [样本](./demo/mysql5.7/static/index.html)
```js
const postData = {
dataDir: dataDir,// 此处对应store.json中的config配置项
logDir: logDir,// 此处对应store.json中的config配置项
port: port, // 此处对应store.json中的config配置项
name: "mysql5.7",// 应用名称
cmdKey: "setting"// 命令键,cmds的name
 }
const comp = await fetch('http://localhost:56780/store/setting', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(postData)
});
```
- 关键要设置好`name`和`cmdKey`,`name`为应用名称,`cmdKey`对应`store.json`中的`commands`对象中的键,一个对象中又可以配置一系列的命令,可以参考Cmd的结构体,样例:
```json
"commands": {
        "initData": [
            {
                "name": "exec",
                "binPath": "{exePath}/bin/mysqld.exe",
                "cmds": [
                    "--defaults-file={exePath}/my.ini",
                    "--initialize"
                ],
                "waiting": 1 //为等待的秒数
            },
            {
                "name": "exec",
                "binPath": "{exePath}/bin/mysqld.exe",
                "cmds": [
                    "--defaults-file={exePath}/my.ini",
                    "--init-file={exePath}/password.txt"
                ],
                "waiting": 3,
                "content": "mysqld.exe",
                "kill": true
            },
            {
                "name": "start"
            }
        ],
		 "setting": [
            {
                "name": "changeFile",
                "tplPath": "{exePath}/my.ini.tpl",
                "filePath": "{exePath}/my.ini"
            },
            {
                "name": "initData"
            }
        ],
}
```
- 上述样例中setting又调用了initData命令。
- post的固定地址为`http://localhost:56780/store/setting`
- 原理是通过`http`请求`/store/setting`接口,将配置信息发送给`store`服务,然后`store`服务会根据配置信息,自动更换配置信息,并启动应用

### static目录说明
1. `index.html`是应用的首页
2. `static`目录下的在执行install时文件会自动复制到`.godoos/static/`应用目录下
3. `store.json`如果设置了`icon`,并且`static`目录下存在该文件,则应用图标为该文件。否则为`install.json`中的icon	

### `commands`内置函数说明
- 系统封装了一些用于处理进程控制和文件操作的功能函数,以下是各函数的详细描述:
1. `start` 启动应用
2. `stop` 停止应用
3. `restart` 重启应用
4. `exec` 执行命令 必须设置binPath和cmds
5. `writeFile` 写入文件 必须设置filePath和content,以config为依据,对content中的`{参数}`进行替换
6. `changeFile` 修改文件 必须设置filePath和tplPath,以config为依据,在模板文件中进行替换
7. `deleteFile` 删除文件
8. `unzip` 解压文件 必须设置filePath和content,content为解压目录 
9. `zip` 压缩文件 必须设置filePath和content,filePath为将要压缩的文件夹,content为压缩后的文件名 
10. `mkdir` 创建文件夹 必须设置FilePath,FilePath为创建的文件夹路径  
11. `startApp` 启动其他应用,content为应用名
12. `stopApp` 停止其他应用,content为应用名

- 保留命令`uninstall`,如果设置了`uninstall`,系统在卸载的时候将会执行它

### 进阶操作
1. 下载[mysql8.0](https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-winx64.zip)
2. 参考demo下的mysql8.0目录,尝试自己制作安装包



================================================
FILE: docs/ai.md
================================================
## ai配置专题

- godoos支持的ai体系有ollama、 openai、gitee、cloudflare、deepseek、volces、bigmodel、aliyunDashscope、01ai、groq、mistral、anthropic、llamafamily、siliconflow等,这些ai供应商大部分都是可以免费使用的。其中ollama可以本地配置下载模型,godoos 提供了ollama的模型下载管理功能,用户可以直接下载模型到godoos中。具体安装细节和申请详情,可以到网络上搜索教程。

### 第一步:配置私钥和地址

- 点左下角ai配置
- 可配置ollama的地址
- 可配置各个引擎商的私钥

### 第二步:添加模型

- 点击桌面模型管理
- 如果已配置好ollama,支持在直接点击下载模型。如果以前已安装过,可点刷新按钮,模型会自动同步。
- 如果是其他引擎,请点击添加按钮,选择网络引擎,填写需要调用的模型名称,点确定,模型会保存。
- 点左下角ai配置,默认模型设置,聊天选择刚刚设定的模型。



================================================
FILE: docs/demo/mysql5.7/install.json
================================================
{
    "name": "mysql5.7",
    "pkg": "https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-winx64.zip",
    "url": "https://gitee.com/ruitao_admin/godoos-image/releases/download/godoos-store/mysql5.7.zip",
    "isDev": true,
    "version": "5.7.44",
    "icon": "https://img0.baidu.com/it/u=1087008535,3349487719&fm=253&fmt=auto&app=138&f=PNG?w=969&h=500",
    "hasStart": true,
    "hasRestart": true,
    "setting": true,
    "isOn": true
}

================================================
FILE: docs/demo/mysql5.7/my.ini
================================================
[client]
port = 3306

[mysql]
no-auto-rehash
default-character-set = utf8

[mysqld]
basedir = ""
datadir = "data"
port = 3306
server_id = 1
character-set-server = utf8

explicit_defaults_for_timestamp = on
skip-ssl

table_open_cache = 256

log_timestamps = SYSTEM

log-error = "logs/mysql.log"
log_syslog = 0
[mysqldump]
quick
max_allowed_packet = 512M


================================================
FILE: docs/demo/mysql5.7/my.ini.tpl
================================================
[client]
port = {port}

[mysql]
no-auto-rehash
default-character-set = utf8

[mysqld]
basedir = "{exePath}"
datadir = "{dataDir}"
port = {port}
server_id = 1
character-set-server = utf8

explicit_defaults_for_timestamp = on
skip-ssl

table_open_cache = 256

log_timestamps = SYSTEM

log-error = "{logDir}/mysql.log"
log_syslog = 0
[mysqldump]
quick
max_allowed_packet = 512M


================================================
FILE: docs/demo/mysql5.7/password.txt
================================================
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

================================================
FILE: docs/demo/mysql5.7/password.txt.tpl
================================================
ALTER USER 'root'@'localhost' IDENTIFIED BY '{password}';

================================================
FILE: docs/demo/mysql5.7/static/index.html
================================================
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>MySQL 设置</title>
    <!-- 可以在这里添加CSS样式 -->
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
        }

        .container {
            max-width: 500px;
            margin: 10px auto;
            background: white;
            padding: 20px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        h3 {
            text-align: center;
        }

        label {
            margin-top: 10px;
        }

        input {
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
        }

        .button {
            margin-top: 20px;
            padding: 10px 20px;
            background-color: #007BFF;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }

        .button:hover {
            background-color: #0056b3;
        }

        /* 模态对话框背景 */
        .modal {
            display: none;
            /* 默认隐藏 */
            position: fixed;
            /* 固定位置 */
            z-index: 1;
            /* 层叠顺序 */
            left: 0;
            top: 0;
            width: 100%;
            /* 全屏宽度 */
            height: 100%;
            /* 全屏高度 */
            overflow: auto;
            /* 启用滚动条 */
            background-color: rgba(0, 0, 0, 0.4);
            /* 半透明黑色背景 */
        }

        /* 模态对话框内容 */
        .modal-content {
            background-color: #fefefe;
            margin: 15% auto;
            /* 15% 从顶部开始,居中 */
            padding: 20px;
            border: 1px solid #888;
            width: 80%;
            /* 或者设置为固定宽度 */
        }

        /* 关闭按钮 */
        .close {
            color: #aaa;
            float: right;
            font-size: 28px;
            font-weight: bold;
        }

        .close:hover,
        .close:focus {
            color: black;
            text-decoration: none;
            cursor: pointer;
        }

        .tab {
            overflow: hidden;
        }

        /* Tab按钮样式 */
        .tab button {
            background-color: inherit;
            float: left;
            border: none;
            outline: none;
            cursor: pointer;
            padding: 14px 16px;
            transition: 0.3s;
        }

        /* 活动的tab按钮高亮 */
        .tab button:hover {
            background-color: #ddd;
        }

        .tab button.active {
            background-color: #ccc;
        }

        /* Tab页内容样式 */
        .tabcontent {
            display: none;
            padding: 6px 12px;
            border-top: 1px solid #ccc;
            flex-direction: column;
        }
    </style>
</head>

<body>
    <div class="container">
        <h3>MySQL 设置</h3>
        <div class="tab">
            <button class="tablinks" onclick="openTab(event, 'General')">常规设置</button>
            <button class="tablinks" onclick="openTab(event, 'Password')">设置密码</button>
        </div>
        <div id="General" class="tabcontent">
            <label for="dataDir">存储地址:</label>
            <input type="text" id="dataDir" name="dataDir">

            <label for="logDir">日志地址:</label>
            <input type="text" id="logDir" name="logDir">

            <label for="port">端口号:</label>
            <input type="text" id="port" name="port">

            <button type="submit" id="saveConfig" class="button">保存</button>
        </div>
        <div id="Password" class="tabcontent">
            <label for="password">密码:</label>
            <input type="password" id="password" name="password" placeholder="请输入数据库密码,不能小于3位">

            <button type="submit" id="savePwd" class="button">保存</button>
        </div>
    </div>
    <div id="myModal" class="modal">
        <div class="modal-content">
            <span class="close">&times;</span>
            <p id="modalText"></p>
        </div>
    </div>
    <script>
        function openTab(evt, tabName) {
            var i, tabcontent, tablinks;
            tabcontent = document.getElementsByClassName("tabcontent");
            for (i = 0; i < tabcontent.length; i++) {
                tabcontent[i].style.display = "none";
            }
            tablinks = document.getElementsByClassName("tablinks");
            for (i = 0; i < tablinks.length; i++) {
                tablinks[i].className = tablinks[i].className.replace(" active", "");
            }
            document.getElementById(tabName).style.display = "flex";
            evt.currentTarget.className += " active";
        }
        document.addEventListener('DOMContentLoaded', function () {
            let localData = localStorage.getItem('mysqlSettings');
            if (localData) {
                localData = JSON.parse(localData);
                // 填充表单字段
                document.getElementById('dataDir').value = localData.dataDir;
                document.getElementById('logDir').value = localData.logDir;
                document.getElementById('port').value = localData.port;
                //document.getElementById('password').value = savedData.password;
            }
            // 获取模态对话框元素
            const modal = document.getElementById("myModal");
            // 获取关闭按钮
            const span = document.getElementsByClassName("close")[0];
            // 获取模态对话框文本
            const modalText = document.getElementById("modalText");
            // 页面加载时激活第一个 tab
            document.querySelector('.tablinks:first-child').click();


            function showMsg(msg) {
                // 替换 alert 为显示模态对话框
                modal.style.display = "block";
                modalText.textContent = msg;
            }
            async function OpenDirDialog() {
                if (window.go) {
                    return window['go']['app']['App']['OpenDirDialog']();
                } else {
                    return ""
                }
            }
            document.getElementById('dataDir').addEventListener('click', async function () {
                let dir = await OpenDirDialog();
                if (dir) {
                    document.getElementById('dataDir').value = dir;
                }
            });
            document.getElementById('logDir').addEventListener('click', async function () {
                let dir = await OpenDirDialog();
                if (dir) {
                    document.getElementById('logDir').value = dir;
                }
            });
            // 添加事件监听器来处理表单提交
            document.getElementById('saveConfig').addEventListener('click', async function (event) {
                event.preventDefault(); // 阻止默认的表单提交行为

                // 获取表单字段的值
                const dataDir = document.getElementById('dataDir').value;
                const logDir = document.getElementById('logDir').value;
                const port = document.getElementById('port').value;

                // 表单字段的校验
                if (!dataDir || !logDir || !port) {
                    showMsg('所有字段都是必填项!');
                    return;
                }

                // 端口应该是一个数字
                if (isNaN(port)) {
                    showMsg('端口号必须是一个数字!');
                    return;
                }

                // 假设端口号应该在 1 到 65535 之间
                if (port < 1 || port > 65535) {
                    showMsg('端口号必须在 1 到 65535 之间!');
                    return;
                }
                const postData = {
                    dataDir: dataDir,
                    logDir: logDir,
                    port: port,
                    name: "mysql5.7",
                    cmdKey: "setting"
                }
                const comp = await fetch('http://localhost:56780/store/setting', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(postData)
                });
                if (!comp.ok) {
                    showMsg('设置失败');
                    return;
                }
                // 存储数据到 localStorage
                localStorage.setItem('mysqlSettings', JSON.stringify(postData));
                showMsg('设置成功');
            });
            document.getElementById('savePwd').addEventListener('click', async function (event) {
                event.preventDefault(); // 阻止默认的表单提交行为

                // 获取表单字段的值
                const password = document.getElementById('password').value;

                // 表单字段的校验
                if (!password || password.length < 3) {
                    showMsg('密码不能为空');
                    return;
                }
                const pwData = {
                    password: password,
                    name: "mysql5.7",
                    cmdKey: "changePassword"
                }
                const res = await fetch('http://localhost:56780/store/setting', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(pwData)
                });
                if (!res.ok) {
                    showMsg('设置失败');
                    return;
                }

                showMsg('设置成功');
            });
            // 当用户点击关闭按钮时关闭模态对话框
            span.onclick = function () {
                modal.style.display = "none";
            }

            // 当用户点击模态对话框以外的地方时关闭模态对话框
            window.onclick = function (event) {
                if (event.target == modal) {
                    modal.style.display = "none";
                }
            }
        });
    </script>
</body>

</html>

================================================
FILE: docs/demo/mysql5.7/store.json
================================================
{
    "setting": {
        "binPath": "{exePath}/bin/mysqld.exe",
        "confPath": "{exePath}/my.ini",
        "progressName": "mysqld.exe",
        "isOn": true
    },
    "config": {
        "password": "root",
        "port": 3306,
        "dataDir": "{exePath}/data",
        "logDir": "{exePath}/logs"
    },
    "commands": {
        "initData": [
            {
                "name": "exec",
                "binPath": "{exePath}/bin/mysqld.exe",
                "cmds": [
                    "--defaults-file={exePath}/my.ini",
                    "--initialize"
                ],
                "waiting": 1
            },
            {
                "name": "exec",
                "binPath": "{exePath}/bin/mysqld.exe",
                "cmds": [
                    "--defaults-file={exePath}/my.ini",
                    "--init-file={exePath}/password.txt"
                ],
                "waiting": 3,
                "content": "mysqld.exe",
                "kill": true
            },
            {
                "name": "start"
            }
        ],
        "setting": [
            {
                "name": "changeFile",
                "tplPath": "{exePath}/my.ini.tpl",
                "filePath": "{exePath}/my.ini"
            },
            {
                "name": "initData"
            }
        ],
        "changePassword": [
            {
                "name": "changeFile",
                "tplPath": "{exePath}/password.txt.tpl",
                "filePath": "{exePath}/password.txt"
            },
            {
                "name": "stop"
            },
            {
                "name": "exec",
                "binPath": "{exePath}/bin/mysqld.exe",
                "cmds": [
                    "--defaults-file={exePath}/my.ini",
                    "--init-file={exePath}/password.txt"
                ],
                "waiting": 3,
                "content": "mysqld.exe",
                "kill": true
            }
        ]
    },
    "install": {
        "installEnvs": [],
        "installCmds": [
            "initData"
        ]
    },
    "start": {
        "startEnvs": [],
        "startCmds": [
            "--defaults-file={exePath}/my.ini"
        ]
    }
}

================================================
FILE: docs/demo/mysql8.0/install.json
================================================
{
    "name": "mysql8.0",
    "pkg": "https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-winx64.zip",
    "url": "",
    "isDev": true,
    "version": "8.0.39",
    "icon": "https://img0.baidu.com/it/u=1087008535,3349487719&fm=253&fmt=auto&app=138&f=PNG?w=969&h=500",
    "hasStart": true,
    "hasRestart": true,
    "setting": true,
    "isOn": true
}

================================================
FILE: docs/demo/mysql8.0/my.ini.tpl
================================================
[client]
port = 3306

[mysql]
no-auto-rehash
default-character-set = utf8mb4

[mysqld]
basedir = "{exePath}"
datadir = "{dataDir}"
port = {port}
server_id = 1
character-set-server = utf8mb4

default_authentication_plugin = mysql_native_password

explicit_defaults_for_timestamp = on
tls-version = ''
skip-mysqlx 

table_open_cache = 256

log_timestamps = SYSTEM

log-error = "{logDir}/mysql.log"

[mysqldump]
quick
max_allowed_packet = 512M


================================================
FILE: docs/demo/nginx/store.json
================================================
{
    "name": "nginx",
    "setting": {
        "binPath": "{exePath}/nginx.exe",
        "progressName":"nginx.exe"
    },
    "start": {
        "startCmds": [
            "-p", 
            "{exePath}"
        ]
    }
}

================================================
FILE: docs/demo/redis5.0/store.json
================================================
{
    "name": "redis5.0",
    "setting": {
        "binPath": "{exePath}/redis-server.exe"
    },
    "start": {
        "startCmds": [
            "{exePath}/redis.windows.conf"
        ]
    }
}

================================================
FILE: frontend/.gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
./dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?


================================================
FILE: frontend/.vscode/extensions.json
================================================
{
  "recommendations": [
    "Vue.volar",
    "tauri-apps.tauri-vscode",
    "rust-lang.rust-analyzer"
  ]
}


================================================
FILE: frontend/README.md
================================================
## godoos 

## 什么是模型标签:

模型标签是godoos框架的一个核心概念,godoos框架中的模型标签用于描述一个模型的归类,比如这个模型属于哪个公司,模型的大类名称,模型的分类等等。

## 什么是模型引擎:

godoos框架中提供了两种模型引擎:本地引擎和网络引擎,本地引擎用于本地模型调用,网络引擎用于网络模型调用


================================================
FILE: frontend/auto-imports.d.ts
================================================
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
// biome-ignore lint: disable
export {}
declare global {
  const EffectScope: typeof import('vue')['EffectScope']
  const ElMessage: typeof import('element-plus/es')['ElMessage']
  const computed: typeof import('vue')['computed']
  const createApp: typeof import('vue')['createApp']
  const customRef: typeof import('vue')['customRef']
  const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
  const defineComponent: typeof import('vue')['defineComponent']
  const effectScope: typeof import('vue')['effectScope']
  const getCurrentInstance: typeof import('vue')['getCurrentInstance']
  const getCurrentScope: typeof import('vue')['getCurrentScope']
  const h: typeof import('vue')['h']
  const inject: typeof import('vue')['inject']
  const isProxy: typeof import('vue')['isProxy']
  const isReactive: typeof import('vue')['isReactive']
  const isReadonly: typeof import('vue')['isReadonly']
  const isRef: typeof import('vue')['isRef']
  const markRaw: typeof import('vue')['markRaw']
  const nextTick: typeof import('vue')['nextTick']
  const onActivated: typeof import('vue')['onActivated']
  const onBeforeMount: typeof import('vue')['onBeforeMount']
  const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
  const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
  const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
  const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
  const onDeactivated: typeof import('vue')['onDeactivated']
  const onErrorCaptured: typeof import('vue')['onErrorCaptured']
  const onMounted: typeof import('vue')['onMounted']
  const onRenderTracked: typeof import('vue')['onRenderTracked']
  const onRenderTriggered: typeof import('vue')['onRenderTriggered']
  const onScopeDispose: typeof import('vue')['onScopeDispose']
  const onServerPrefetch: typeof import('vue')['onServerPrefetch']
  const onUnmounted: typeof import('vue')['onUnmounted']
  const onUpdated: typeof import('vue')['onUpdated']
  const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
  const provide: typeof import('vue')['provide']
  const reactive: typeof import('vue')['reactive']
  const readonly: typeof import('vue')['readonly']
  const ref: typeof import('vue')['ref']
  const resolveComponent: typeof import('vue')['resolveComponent']
  const shallowReactive: typeof import('vue')['shallowReactive']
  const shallowReadonly: typeof import('vue')['shallowReadonly']
  const shallowRef: typeof import('vue')['shallowRef']
  const toRaw: typeof import('vue')['toRaw']
  const toRef: typeof import('vue')['toRef']
  const toRefs: typeof import('vue')['toRefs']
  const toValue: typeof import('vue')['toValue']
  const triggerRef: typeof import('vue')['triggerRef']
  const unref: typeof import('vue')['unref']
  const useAttrs: typeof import('vue')['useAttrs']
  const useCssModule: typeof import('vue')['useCssModule']
  const useCssVars: typeof import('vue')['useCssVars']
  const useId: typeof import('vue')['useId']
  const useLink: typeof import('vue-router')['useLink']
  const useModel: typeof import('vue')['useModel']
  const useRoute: typeof import('vue-router')['useRoute']
  const useRouter: typeof import('vue-router')['useRouter']
  const useSlots: typeof import('vue')['useSlots']
  const useTemplateRef: typeof import('vue')['useTemplateRef']
  const watch: typeof import('vue')['watch']
  const watchEffect: typeof import('vue')['watchEffect']
  const watchPostEffect: typeof import('vue')['watchPostEffect']
  const watchSyncEffect: typeof import('vue')['watchSyncEffect']
}
// for type re-export
declare global {
  // @ts-ignore
  export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
  import('vue')
}


================================================
FILE: frontend/components.d.ts
================================================
/* eslint-disable */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}

/* prettier-ignore */
declare module 'vue' {
  export interface GlobalComponents {
    Ad: typeof import('./src/components/desktop/Ad.vue')['default']
    AddApp: typeof import('./src/components/store/AddApp.vue')['default']
    AiChatInfo: typeof import('./src/components/localchat/AiChatInfo.vue')['default']
    AiChatLeft: typeof import('./src/components/localchat/AiChatLeft.vue')['default']
    AiChatMain: typeof import('./src/components/localchat/AiChatMain.vue')['default']
    AiChatMessage: typeof import('./src/components/localchat/AiChatMessage.vue')['default']
    Aimodel: typeof import('./src/components/ai/aimodel.vue')['default']
    Aisetting: typeof import('./src/components/ai/aisetting.vue')['default']
    AiSettingApi: typeof import('./src/components/ai/AiSettingApi.vue')['default']
    AiSettingConf: typeof import('./src/components/ai/AiSettingConf.vue')['default']
    AiSettingDef: typeof import('./src/components/ai/AiSettingDef.vue')['default']
    AppIcon: typeof import('./src/components/taskbar/AppIcon.vue')['default']
    AppIconGroup: typeof import('./src/components/taskbar/AppIconGroup.vue')['default']
    AppItem: typeof import('./src/components/store/AppItem.vue')['default']
    Assistant: typeof import('./src/components/ai/assistant.vue')['default']
    AssistantAdd: typeof import('./src/components/ai/AssistantAdd.vue')['default']
    Battery: typeof import('./src/components/taskbar/Battery.vue')['default']
    BatteryPop: typeof import('./src/components/taskbar/BatteryPop.vue')['default']
    BottomBar: typeof import('./src/components/desktop/mobile/BottomBar.vue')['default']
    Browser: typeof import('./src/components/builtin/Browser.vue')['default']
    Calendar: typeof import('./src/components/builtin/Calendar.vue')['default']
    Chat: typeof import('./src/components/chat/Chat.vue')['default']
    ChatBox: typeof import('./src/components/chat/ChatBox.vue')['default']
    ChatContent: typeof import('./src/components/localchat/ChatContent.vue')['default']
    ChatDomain: typeof import('./src/components/localchat/ChatDomain.vue')['default']
    ChatEditor: typeof import('./src/components/localchat/ChatEditor.vue')['default']
    ChatFoot: typeof import('./src/components/localchat/ChatFoot.vue')['default']
    ChatGroupMember: typeof import('./src/components/chat/chatGroupMember.vue')['default']
    ChatMenu: typeof import('./src/components/chat/ChatMenu.vue')['default']
    ChatMessage: typeof import('./src/components/chat/ChatMessage.vue')['default']
    ChatMsgList: typeof import('./src/components/chat/ChatMsgList.vue')['default']
    ChatNav: typeof import('./src/components/localchat/ChatNav.vue')['default']
    ChatUserInfo: typeof import('./src/components/chat/chatUserInfo.vue')['default']
    ChatUserList: typeof import('./src/components/chat/ChatUserList.vue')['default']
    ChatUserSetting: typeof import('./src/components/chat/ChatUserSetting.vue')['default']
    ChatWorkList: typeof import('./src/components/chat/ChatWorkList.vue')['default']
    CloseButton: typeof import('./src/components/ui/CloseButton.vue')['default']
    CloseDesktop: typeof import('./src/components/desktop/CloseDesktop.vue')['default']
    ColorPicker: typeof import('./src/components/setting/ColorPicker.vue')['default']
    Computer: typeof import('./src/components/computer/Computer.vue')['default']
    ComputerNavBar: typeof import('./src/components/computer/ComputerNavBar.vue')['default']
    ContextMenu: typeof import('./src/components/builtin/ContextMenu.vue')['default']
    CreateUrl: typeof import('./src/components/builtin/CreateUrl.vue')['default']
    CustomIcon: typeof import('./src/components/taskbar/CustomIcon.vue')['default']
    DateNote: typeof import('./src/components/builtin/DateNote.vue')['default']
    DateTime: typeof import('./src/components/taskbar/DateTime.vue')['default']
    DateTimeShow: typeof import('./src/components/taskbar/DateTimeShow.vue')['default']
    DeskItem: typeof import('./src/components/desktop/DeskItem.vue')['default']
    Desktop: typeof import('./src/components/desktop/Desktop.vue')['default']
    DesktopBackground: typeof import('./src/components/desktop/DesktopBackground.vue')['default']
    DialogProcess: typeof import('./src/components/window/DialogProcess.vue')['default']
    DialogTemp: typeof import('./src/components/window/DialogTemp.vue')['default']
    DownAddbox: typeof import('./src/components/ai/DownAddbox.vue')['default']
    DownLabeleditor: typeof import('./src/components/ai/DownLabeleditor.vue')['default']
    DownModelInfo: typeof import('./src/components/ai/DownModelInfo.vue')['default']
    EditFileName: typeof import('./src/components/builtin/EditFileName.vue')['default']
    EditType: typeof import('./src/components/builtin/EditType.vue')['default']
    ElAside: typeof import('element-plus/es')['ElAside']
    ElAvatar: typeof import('element-plus/es')['ElAvatar']
    ElBadge: typeof import('element-plus/es')['ElBadge']
    ElButton: typeof import('element-plus/es')['ElButton']
    ElCard: typeof import('element-plus/es')['ElCard']
    ElCarousel: typeof import('element-plus/es')['ElCarousel']
    ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
    ElCol: typeof import('element-plus/es')['ElCol']
    ElCollapse: typeof import('element-plus/es')['ElCollapse']
    ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
    ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
    ElContainer: typeof import('element-plus/es')['ElContainer']
    ElDialog: typeof import('element-plus/es')['ElDialog']
    ElDrawer: typeof import('element-plus/es')['ElDrawer']
    ElDropdown: typeof import('element-plus/es')['ElDropdown']
    ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
    ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
    ElEmpty: typeof import('element-plus/es')['ElEmpty']
    ElFooter: typeof import('element-plus/es')['ElFooter']
    ElForm: typeof import('element-plus/es')['ElForm']
    ElFormItem: typeof import('element-plus/es')['ElFormItem']
    ElHeader: typeof import('element-plus/es')['ElHeader']
    ElIcon: typeof import('element-plus/es')['ElIcon']
    ElImage: typeof import('element-plus/es')['ElImage']
    ElInput: typeof import('element-plus/es')['ElInput']
    ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
    ElMain: typeof import('element-plus/es')['ElMain']
    ElMenu: typeof import('element-plus/es')['ElMenu']
    ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
    ElOption: typeof import('element-plus/es')['ElOption']
    ElPageHeader: typeof import('element-plus/es')['ElPageHeader']
    ElPagination: typeof import('element-plus/es')['ElPagination']
    ElPopover: typeof import('element-plus/es')['ElPopover']
    ElProgress: typeof import('element-plus/es')['ElProgress']
    ElRadio: typeof import('element-plus/es')['ElRadio']
    ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
    ElRow: typeof import('element-plus/es')['ElRow']
    ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
    ElSelect: typeof import('element-plus/es')['ElSelect']
    ElSlider: typeof import('element-plus/es')['ElSlider']
    ElSpace: typeof import('element-plus/es')['ElSpace']
    ElSwitch: typeof import('element-plus/es')['ElSwitch']
    ElTable: typeof import('element-plus/es')['ElTable']
    ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
    ElTabPane: typeof import('element-plus/es')['ElTabPane']
    ElTabs: typeof import('element-plus/es')['ElTabs']
    ElTag: typeof import('element-plus/es')['ElTag']
    ElText: typeof import('element-plus/es')['ElText']
    ElTooltip: typeof import('element-plus/es')['ElTooltip']
    ElTransfer: typeof import('element-plus/es')['ElTransfer']
    ElTree: typeof import('element-plus/es')['ElTree']
    Error: typeof import('./src/components/taskbar/Error.vue')['default']
    FileIcon: typeof import('./src/components/builtin/FileIcon.vue')['default']
    FileIconImg: typeof import('./src/components/builtin/FileIconImg.vue')['default']
    FileIconIs: typeof import('./src/components/builtin/FileIconIs.vue')['default']
    FileList: typeof import('./src/components/builtin/FileList.vue')['default']
    FileProps: typeof import('./src/components/builtin/FileProps.vue')['default']
    FilePwd: typeof import('./src/components/oa/FilePwd.vue')['default']
    FileTree: typeof import('./src/components/builtin/FileTree.vue')['default']
    FileViewer: typeof import('./src/components/builtin/FileViewer.vue')['default']
    FrpcConfig: typeof import('./src/components/setting/FrpcConfig.vue')['default']
    FrpcEdit: typeof import('./src/components/setting/FrpcEdit.vue')['default']
    IframeFile: typeof import('./src/components/window/IframeFile.vue')['default']
    ImageViewer: typeof import('./src/components/builtin/ImageViewer.vue')['default']
    Install: typeof import('./src/components/install/Install.vue')['default']
    InstallCompony: typeof import('./src/components/install/InstallCompony.vue')['default']
    InstallMember: typeof import('./src/components/install/InstallMember.vue')['default']
    InstallPerson: typeof import('./src/components/install/InstallPerson.vue')['default']
    KnowledgeChat: typeof import('./src/components/localchat/KnowledgeChat.vue')['default']
    LocalChat: typeof import('./src/components/localchat/LocalChat.vue')['default']
    LocalNas: typeof import('./src/components/setting/LocalNas.vue')['default']
    LocalProxy: typeof import('./src/components/setting/LocalProxy.vue')['default']
    LockDesktop: typeof import('./src/components/desktop/LockDesktop.vue')['default']
    Magnet: typeof import('./src/components/taskbar/Magnet.vue')['default']
    MenuBar: typeof import('./src/components/window/MenuBar.vue')['default']
    MenuFooter: typeof import('./src/components/window/MenuFooter.vue')['default']
    MenuList: typeof import('./src/components/taskbar/MenuList.vue')['default']
    MessageCenterPop: typeof import('./src/components/taskbar/MessageCenterPop.vue')['default']
    MessageIcon: typeof import('./src/components/taskbar/MessageIcon.vue')['default']
    Mobile: typeof import('./src/components/desktop/mobile/Mobile.vue')['default']
    MobileApp: typeof import('./src/components/desktop/mobile/MobileApp.vue')['default']
    MobileTemplate: typeof import('./src/components/window/MobileTemplate.vue')['default']
    MusicStore: typeof import('./src/components/builtin/MusicStore.vue')['default']
    MusicViewer: typeof import('./src/components/builtin/MusicViewer.vue')['default']
    NasClient: typeof import('./src/components/setting/NasClient.vue')['default']
    NetProxy: typeof import('./src/components/setting/NetProxy.vue')['default']
    NetWork: typeof import('./src/components/taskbar/NetWork.vue')['default']
    NetworkPop: typeof import('./src/components/taskbar/NetworkPop.vue')['default']
    NotFound: typeof import('./src/components/window/NotFound.vue')['default']
    Notice: typeof import('./src/components/desktop/Notice.vue')['default']
    NotifyGroup: typeof import('./src/components/builtin/NotifyGroup.vue')['default']
    OnlyOffice: typeof import('./src/components/window/OnlyOffice.vue')['default']
    OpeningDesktop: typeof import('./src/components/desktop/OpeningDesktop.vue')['default']
    OpenWiteDialog: typeof import('./src/components/builtin/OpenWiteDialog.vue')['default']
    OsImage: typeof import('./src/components/builtin/OsImage.vue')['default']
    PdfViewer: typeof import('./src/components/builtin/PdfViewer.vue')['default']
    PictureStore: typeof import('./src/components/builtin/PictureStore.vue')['default']
    PlanTasks: typeof import('./src/components/oa/PlanTasks.vue')['default']
    ProcessManager: typeof import('./src/components/setting/ProcessManager.vue')['default']
    QuickLink: typeof import('./src/components/computer/QuickLink.vue')['default']
    RectChosen: typeof import('./src/components/builtin/RectChosen.vue')['default']
    RouterLink: typeof import('vue-router')['RouterLink']
    RouterView: typeof import('vue-router')['RouterView']
    Screen: typeof import('./src/components/desktop/Screen.vue')['default']
    ScreenContent: typeof import('./src/components/desktop/ScreenContent.vue')['default']
    ScreenRecorder: typeof import('./src/components/taskbar/ScreenRecorder.vue')['default']
    Screenshort: typeof import('./src/components/taskbar/Screenshort.vue')['default']
    SetAccount: typeof import('./src/components/setting/SetAccount.vue')['default']
    SetCustom: typeof import('./src/components/setting/SetCustom.vue')['default']
    SetFilePwd: typeof import('./src/components/setting/SetFilePwd.vue')['default']
    SetLang: typeof import('./src/components/setting/SetLang.vue')['default']
    SetNas: typeof import('./src/components/setting/SetNas.vue')['default']
    SetSystem: typeof import('./src/components/setting/SetSystem.vue')['default']
    Setting: typeof import('./src/components/setting/Setting.vue')['default']
    SetUpdate: typeof import('./src/components/setting/SetUpdate.vue')['default']
    ShareFiles: typeof import('./src/components/oa/ShareFiles.vue')['default']
    ShowNews: typeof import('./src/components/taskbar/ShowNews.vue')['default']
    StartMenu: typeof import('./src/components/taskbar/StartMenu.vue')['default']
    StartOption: typeof import('./src/components/taskbar/StartOption.vue')['default']
    StateIcon: typeof import('./src/components/taskbar/StateIcon.vue')['default']
    Store: typeof import('./src/components/store/Store.vue')['default']
    Taskbar: typeof import('./src/components/taskbar/Taskbar.vue')['default']
    Upgrade: typeof import('./src/components/desktop/Upgrade.vue')['default']
    UpPopover: typeof import('./src/components/computer/UpPopover.vue')['default']
    UrlBrowser: typeof import('./src/components/builtin/UrlBrowser.vue')['default']
    Version: typeof import('./src/components/builtin/Version.vue')['default']
    VideoViewer: typeof import('./src/components/builtin/VideoViewer.vue')['default']
    WebDavClient: typeof import('./src/components/setting/WebDavClient.vue')['default']
    WinButton: typeof import('./src/components/ui/WinButton.vue')['default']
    WinCheckBox: typeof import('./src/components/ui/WinCheckBox.vue')['default']
    WindowGroup: typeof import('./src/components/window/WindowGroup.vue')['default']
    WindowInner: typeof import('./src/components/window/WindowInner.vue')['default']
    WindowNode: typeof import('./src/components/window/WindowNode.vue')['default']
    WindowTemplate: typeof import('./src/components/window/WindowTemplate.vue')['default']
    WinInput: typeof import('./src/components/ui/WinInput.vue')['default']
    WinLoading: typeof import('./src/components/ui/WinLoading.vue')['default']
    WinLogo: typeof import('./src/components/ui/WinLogo.vue')['default']
    WinProcess: typeof import('./src/components/ui/WinProcess.vue')['default']
    WinSelect: typeof import('./src/components/ui/WinSelect.vue')['default']
    WinUpButtonGroup: typeof import('./src/components/ui/WinUpButtonGroup.vue')['default']
  }
}


================================================
FILE: frontend/env.d.ts
================================================
declare module '*.vue' {
    import type { DefineComponent } from 'vue'
    const component: DefineComponent<{}, {}, any>
    export default component
}
declare module '*.png';
declare module '*.ts';

================================================
FILE: frontend/index.html
================================================
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/icon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <title>GodoOS</title>
    <script src="/font/iconfont.js"></script>
    <style>
      .icon {
        width: 1em;
        height: 1em;
        vertical-align: -0.15em;
        fill: currentColor;
        overflow: hidden;
      }

    </style>
  </head>

  <body>
    <div id="app"></div>
    <!-- 获取浏览器地址参数 -->
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>


================================================
FILE: frontend/package.json
================================================
{
  "name": "godoos",
  "private": true,
  "version": "1.0.6",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "@element-plus/icons-vue": "^2.3.1",
    "@liripeng/vue-audio-player": "^1.6.2",
    "@onlyoffice/document-editor-vue": "^1.4.0",
    "cherry-markdown": "^0.8.52",
    "dexie": "^4.0.8",
    "dingtalk-jsapi": "^3.0.42",
    "element-plus": "^2.7.7",
    "file-saver": "^2.0.5",
    "js-md5": "^0.8.3",
    "jszip": "^3.10.1",
    "lunar-typescript": "^1.7.6",
    "moment": "^2.30.1",
    "pinia": "^2.1.7",
    "pinia-plugin-persist": "^1.0.0",
    "qrcode": "^1.5.4",
    "swiper": "^11.1.15",
    "vant": "^4.9.15",
    "vue": "^3.4.31",
    "vue-i18n": "^9.13.1",
    "vue-router": "^4.4.0",
    "vue-web-screen-shot": "^1.5.3",
    "vue3-lottie": "^3.3.1"
  },
  "devDependencies": {
    "@types/file-saver": "^2.0.7",
    "@types/node": "^20.14.10",
    "@vitejs/plugin-vue": "^5.0.5",
    "sass": "^1.77.8",
    "terser": "^5.31.3",
    "typescript": "^5.5.3",
    "unplugin-auto-import": "^0.18.0",
    "unplugin-vue-components": "^0.27.2",
    "vite": "^5.3.3"
  }
}


================================================
FILE: frontend/package.json.md5
================================================
1614d5e4a6075926d6bcdc3612ab9b84

================================================
FILE: frontend/public/baiban/assets/index-BBuZupZQ.js
================================================
var RO=Object.defineProperty;var LO=(e,t,n)=>t in e?RO(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var m=(e,t,n)=>(LO(e,typeof t!="symbol"?t+"":t,n),n);function FO(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!="string"&&!Array.isArray(r)){for(const o in r)if(o!=="default"&&!(o in e)){const s=Object.getOwnPropertyDescriptor(r,o);s&&Object.defineProperty(e,o,s.get?s:{enumerable:!0,get:()=>r[o]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const s of o)if(s.type==="childList")for(const i of s.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerPolicy&&(s.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?s.credentials="include":o.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(o){if(o.ep)return;o.ep=!0;const s=n(o);fetch(o.href,s)}})();var tn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function pc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var SI={exports:{}},ff={},vI={exports:{}},xe={};/**
 * @license React
 * react.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */var Cu=Symbol.for("react.element"),NO=Symbol.for("react.portal"),zO=Symbol.for("react.fragment"),BO=Symbol.for("react.strict_mode"),UO=Symbol.for("react.profiler"),HO=Symbol.for("react.provider"),KO=Symbol.for("react.context"),WO=Symbol.for("react.forward_ref"),VO=Symbol.for("react.suspense"),GO=Symbol.for("react.memo"),YO=Symbol.for("react.lazy"),Nw=Symbol.iterator;function XO(e){return e===null||typeof e!="object"?null:(e=Nw&&e[Nw]||e["@@iterator"],typeof e=="function"?e:null)}var xI={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},wI=Object.assign,bI={};function fc(e,t,n){this.props=e,this.context=t,this.refs=bI,this.updater=n||xI}fc.prototype.isReactComponent={};fc.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};fc.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function PI(){}PI.prototype=fc.prototype;function Lv(e,t,n){this.props=e,this.context=t,this.refs=bI,this.updater=n||xI}var Fv=Lv.prototype=new PI;Fv.constructor=Lv;wI(Fv,fc.prototype);Fv.isPureReactComponent=!0;var zw=Array.isArray,CI=Object.prototype.hasOwnProperty,Nv={current:null},II={key:!0,ref:!0,__self:!0,__source:!0};function EI(e,t,n){var r,o={},s=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(s=""+t.key),t)CI.call(t,r)&&!II.hasOwnProperty(r)&&(o[r]=t[r]);var a=arguments.length-2;if(a===1)o.children=n;else if(1<a){for(var c=Array(a),l=0;l<a;l++)c[l]=arguments[l+2];o.children=c}if(e&&e.defaultProps)for(r in a=e.defaultProps,a)o[r]===void 0&&(o[r]=a[r]);return{$$typeof:Cu,type:e,key:s,ref:i,props:o,_owner:Nv.current}}function qO(e,t){return{$$typeof:Cu,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function zv(e){return typeof e=="object"&&e!==null&&e.$$typeof===Cu}function ZO(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(n){return t[n]})}var Bw=/\/+/g;function $g(e,t){return typeof e=="object"&&e!==null&&e.key!=null?ZO(""+e.key):t.toString(36)}function nh(e,t,n,r,o){var s=typeof e;(s==="undefined"||s==="boolean")&&(e=null);var i=!1;if(e===null)i=!0;else switch(s){case"string":case"number":i=!0;break;case"object":switch(e.$$typeof){case Cu:case NO:i=!0}}if(i)return i=e,o=o(i),e=r===""?"."+$g(i,0):r,zw(o)?(n="",e!=null&&(n=e.replace(Bw,"$&/")+"/"),nh(o,t,n,"",function(l){return l})):o!=null&&(zv(o)&&(o=qO(o,n+(!o.key||i&&i.key===o.key?"":(""+o.key).replace(Bw,"$&/")+"/")+e)),t.push(o)),1;if(i=0,r=r===""?".":r+":",zw(e))for(var a=0;a<e.length;a++){s=e[a];var c=r+$g(s,a);i+=nh(s,t,n,c,o)}else if(c=XO(e),typeof c=="function")for(e=c.call(e),a=0;!(s=e.next()).done;)s=s.value,c=r+$g(s,a++),i+=nh(s,t,n,c,o);else if(s==="object")throw t=String(e),Error("Objects are not valid as a React child (found: "+(t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return i}function td(e,t,n){if(e==null)return e;var r=[],o=0;return nh(e,r,"","",function(s){return t.call(n,s,o++)}),r}function QO(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(n){(e._status===0||e._status===-1)&&(e._status=1,e._result=n)},function(n){(e._status===0||e._status===-1)&&(e._status=2,e._result=n)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var mn={current:null},rh={transition:null},JO={ReactCurrentDispatcher:mn,ReactCurrentBatchConfig:rh,ReactCurrentOwner:Nv};function _I(){throw Error("act(...) is not supported in production builds of React.")}xe.Children={map:td,forEach:function(e,t,n){td(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return td(e,function(){t++}),t},toArray:function(e){return td(e,function(t){return t})||[]},only:function(e){if(!zv(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};xe.Component=fc;xe.Fragment=zO;xe.Profiler=UO;xe.PureComponent=Lv;xe.StrictMode=BO;xe.Suspense=VO;xe.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=JO;xe.act=_I;xe.cloneElement=function(e,t,n){if(e==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var r=wI({},e.props),o=e.key,s=e.ref,i=e._owner;if(t!=null){if(t.ref!==void 0&&(s=t.ref,i=Nv.current),t.key!==void 0&&(o=""+t.key),e.type&&e.type.defaultProps)var a=e.type.defaultProps;for(c in t)CI.call(t,c)&&!II.hasOwnProperty(c)&&(r[c]=t[c]===void 0&&a!==void 0?a[c]:t[c])}var c=arguments.length-2;if(c===1)r.children=n;else if(1<c){a=Array(c);for(var l=0;l<c;l++)a[l]=arguments[l+2];r.children=a}return{$$typeof:Cu,type:e.type,key:o,ref:s,props:r,_owner:i}};xe.createContext=function(e){return e={$$typeof:KO,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},e.Provider={$$typeof:HO,_context:e},e.Consumer=e};xe.createElement=EI;xe.createFactory=function(e){var t=EI.bind(null,e);return t.type=e,t};xe.createRef=function(){return{current:null}};xe.forwardRef=function(e){return{$$typeof:WO,render:e}};xe.isValidElement=zv;xe.lazy=function(e){return{$$typeof:YO,_payload:{_status:-1,_result:e},_init:QO}};xe.memo=function(e,t){return{$$typeof:GO,type:e,compare:t===void 0?null:t}};xe.startTransition=function(e){var t=rh.transition;rh.transition={};try{e()}finally{rh.transition=t}};xe.unstable_act=_I;xe.useCallback=function(e,t){return mn.current.useCallback(e,t)};xe.useContext=function(e){return mn.current.useContext(e)};xe.useDebugValue=function(){};xe.useDeferredValue=function(e){return mn.current.useDeferredValue(e)};xe.useEffect=function(e,t){return mn.current.useEffect(e,t)};xe.useId=function(){return mn.current.useId()};xe.useImperativeHandle=function(e,t,n){return mn.current.useImperativeHandle(e,t,n)};xe.useInsertionEffect=function(e,t){return mn.current.useInsertionEffect(e,t)};xe.useLayoutEffect=function(e,t){return mn.current.useLayoutEffect(e,t)};xe.useMemo=function(e,t){return mn.current.useMemo(e,t)};xe.useReducer=function(e,t,n){return mn.current.useReducer(e,t,n)};xe.useRef=function(e){return mn.current.useRef(e)};xe.useState=function(e){return mn.current.useState(e)};xe.useSyncExternalStore=function(e,t,n){return mn.current.useSyncExternalStore(e,t,n)};xe.useTransition=function(){return mn.current.useTransition()};xe.version="18.3.1";vI.exports=xe;var x=vI.exports;const Se=pc(x),eD=FO({__proto__:null,default:Se},[x]);/**
 * @license React
 * react-jsx-runtime.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */var tD=x,nD=Symbol.for("react.element"),rD=Symbol.for("react.fragment"),oD=Object.prototype.hasOwnProperty,sD=tD.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,iD={key:!0,ref:!0,__self:!0,__source:!0};function kI(e,t,n){var r,o={},s=null,i=null;n!==void 0&&(s=""+n),t.key!==void 0&&(s=""+t.key),t.ref!==void 0&&(i=t.ref);for(r in t)oD.call(t,r)&&!iD.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)o[r]===void 0&&(o[r]=t[r]);return{$$typeof:nD,type:e,key:s,ref:i,props:o,_owner:sD.current}}ff.Fragment=rD;ff.jsx=kI;ff.jsxs=kI;SI.exports=ff;var h=SI.exports,Ry={},TI={exports:{}},nr={},$I={exports:{}},MI={};/**
 * @license React
 * scheduler.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */(function(e){function t(H,U){var W=H.length;H.push(U);e:for(;0<W;){var Z=W-1>>>1,le=H[Z];if(0<o(le,U))H[Z]=U,H[W]=le,W=Z;else break e}}function n(H){return H.length===0?null:H[0]}function r(H){if(H.length===0)return null;var U=H[0],W=H.pop();if(W!==U){H[0]=W;e:for(var Z=0,le=H.length,be=le>>>1;Z<be;){var Me=2*(Z+1)-1,ae=H[Me],Ae=Me+1,Re=H[Ae];if(0>o(ae,W))Ae<le&&0>o(Re,ae)?(H[Z]=Re,H[Ae]=W,Z=Ae):(H[Z]=ae,H[Me]=W,Z=Me);else if(Ae<le&&0>o(Re,W))H[Z]=Re,H[Ae]=W,Z=Ae;else break e}}return U}function o(H,U){var W=H.sortIndex-U.sortIndex;return W!==0?W:H.id-U.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var i=Date,a=i.now();e.unstable_now=function(){return i.now()-a}}var c=[],l=[],u=1,d=null,p=3,f=!1,y=!1,g=!1,w=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,v=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function b(H){for(var U=n(l);U!==null;){if(U.callback===null)r(l);else if(U.startTime<=H)r(l),U.sortIndex=U.expirationTime,t(c,U);else break;U=n(l)}}function E(H){if(g=!1,b(H),!y)if(n(c)!==null)y=!0,q(C);else{var U=n(l);U!==null&&Q(E,U.startTime-H)}}function C(H,U){y=!1,g&&(g=!1,S(k),k=-1),f=!0;var W=p;try{for(b(U),d=n(c);d!==null&&(!(d.expirationTime>U)||H&&!O());){var Z=d.callback;if(typeof Z=="function"){d.callback=null,p=d.priorityLevel;var le=Z(d.expirationTime<=U);U=e.unstable_now(),typeof le=="function"?d.callback=le:d===n(c)&&r(c),b(U)}else r(c);d=n(c)}if(d!==null)var be=!0;else{var Me=n(l);Me!==null&&Q(E,Me.startTime-U),be=!1}return be}finally{d=null,p=W,f=!1}}var I=!1,_=null,k=-1,$=5,T=-1;function O(){return!(e.unstable_now()-T<$)}function N(){if(_!==null){var H=e.unstable_now();T=H;var U=!0;try{U=_(!0,H)}finally{U?F():(I=!1,_=null)}}else I=!1}var F;if(typeof v=="function")F=function(){v(N)};else if(typeof MessageChannel<"u"){var L=new MessageChannel,B=L.port2;L.port1.onmessage=N,F=function(){B.postMessage(null)}}else F=function(){w(N,0)};function q(H){_=H,I||(I=!0,F())}function Q(H,U){k=w(function(){H(e.unstable_now())},U)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(H){H.callback=null},e.unstable_continueExecution=function(){y||f||(y=!0,q(C))},e.unstable_forceFrameRate=function(H){0>H||125<H?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):$=0<H?Math.floor(1e3/H):5},e.unstable_getCurrentPriorityLevel=function(){return p},e.unstable_getFirstCallbackNode=function(){return n(c)},e.unstable_next=function(H){switch(p){case 1:case 2:case 3:var U=3;break;default:U=p}var W=p;p=U;try{return H()}finally{p=W}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(H,U){switch(H){case 1:case 2:case 3:case 4:case 5:break;default:H=3}var W=p;p=H;try{return U()}finally{p=W}},e.unstable_scheduleCallback=function(H,U,W){var Z=e.unstable_now();switch(typeof W=="object"&&W!==null?(W=W.delay,W=typeof W=="number"&&0<W?Z+W:Z):W=Z,H){case 1:var le=-1;break;case 2:le=250;break;case 5:le=1073741823;break;case 4:le=1e4;break;default:le=5e3}return le=W+le,H={id:u++,callback:U,priorityLevel:H,startTime:W,expirationTime:le,sortIndex:-1},W>Z?(H.sortIndex=W,t(l,H),n(c)===null&&H===n(l)&&(g?(S(k),k=-1):g=!0,Q(E,W-Z))):(H.sortIndex=le,t(c,H),y||f||(y=!0,q(C))),H},e.unstable_shouldYield=O,e.unstable_wrapCallback=function(H){var U=p;return function(){var W=p;p=U;try{return H.apply(this,arguments)}finally{p=W}}}})(MI);$I.exports=MI;var aD=$I.exports;/**
 * @license React
 * react-dom.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */var cD=x,Jn=aD;function Y(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var AI=new Set,Ll={};function zi(e,t){Za(e,t),Za(e+"Capture",t)}function Za(e,t){for(Ll[e]=t,e=0;e<t.length;e++)AI.add(t[e])}var No=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Ly=Object.prototype.hasOwnProperty,lD=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,Uw={},Hw={};function uD(e){return Ly.call(Hw,e)?!0:Ly.call(Uw,e)?!1:lD.test(e)?Hw[e]=!0:(Uw[e]=!0,!1)}function dD(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function hD(e,t,n,r){if(t===null||typeof t>"u"||dD(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function yn(e,t,n,r,o,s,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=s,this.removeEmptyString=i}var Kt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Kt[e]=new yn(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Kt[t]=new yn(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Kt[e]=new yn(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Kt[e]=new yn(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Kt[e]=new yn(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Kt[e]=new yn(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Kt[e]=new yn(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Kt[e]=new yn(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Kt[e]=new yn(e,5,!1,e.toLowerCase(),null,!1,!1)});var Bv=/[\-:]([a-z])/g;function Uv(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Bv,Uv);Kt[t]=new yn(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Bv,Uv);Kt[t]=new yn(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Bv,Uv);Kt[t]=new yn(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Kt[e]=new yn(e,1,!1,e.toLowerCase(),null,!1,!1)});Kt.xlinkHref=new yn("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Kt[e]=new yn(e,1,!1,e.toLowerCase(),null,!0,!0)});function Hv(e,t,n,r){var o=Kt.hasOwnProperty(t)?Kt[t]:null;(o!==null?o.type!==0:r||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(hD(t,n,o,r)&&(n=null),r||o===null?uD(t)&&(n===null?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=n===null?o.type===3?!1:"":n:(t=o.attributeName,r=o.attributeNamespace,n===null?e.removeAttribute(t):(o=o.type,n=o===3||o===4&&n===!0?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}var Xo=cD.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,nd=Symbol.for("react.element"),ma=Symbol.for("react.portal"),ya=Symbol.for("react.fragment"),Kv=Symbol.for("react.strict_mode"),Fy=Symbol.for("react.profiler"),jI=Symbol.for("react.provider"),OI=Symbol.for("react.context"),Wv=Symbol.for("react.forward_ref"),Ny=Symbol.for("react.suspense"),zy=Symbol.for("react.suspense_list"),Vv=Symbol.for("react.memo"),gs=Symbol.for("react.lazy"),DI=Symbol.for("react.offscreen"),Kw=Symbol.iterator;function Fc(e){return e===null||typeof e!="object"?null:(e=Kw&&e[Kw]||e["@@iterator"],typeof e=="function"?e:null)}var ut=Object.assign,Mg;function ll(e){if(Mg===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);Mg=t&&t[1]||""}return`
`+Mg+e}var Ag=!1;function jg(e,t){if(!e||Ag)return"";Ag=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(l){var r=l}Reflect.construct(e,[],t)}else{try{t.call()}catch(l){r=l}e.call(t.prototype)}else{try{throw Error()}catch(l){r=l}e()}}catch(l){if(l&&r&&typeof l.stack=="string"){for(var o=l.stack.split(`
`),s=r.stack.split(`
`),i=o.length-1,a=s.length-1;1<=i&&0<=a&&o[i]!==s[a];)a--;for(;1<=i&&0<=a;i--,a--)if(o[i]!==s[a]){if(i!==1||a!==1)do if(i--,a--,0>a||o[i]!==s[a]){var c=`
`+o[i].replace(" at new "," at ");return e.displayName&&c.includes("<anonymous>")&&(c=c.replace("<anonymous>",e.displayName)),c}while(1<=i&&0<=a);break}}}finally{Ag=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?ll(e):""}function pD(e){switch(e.tag){case 5:return ll(e.type);case 16:return ll("Lazy");case 13:return ll("Suspense");case 19:return ll("SuspenseList");case 0:case 2:case 15:return e=jg(e.type,!1),e;case 11:return e=jg(e.type.render,!1),e;case 1:return e=jg(e.type,!0),e;default:return""}}function By(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case ya:return"Fragment";case ma:return"Portal";case Fy:return"Profiler";case Kv:return"StrictMode";case Ny:return"Suspense";case zy:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case OI:return(e.displayName||"Context")+".Consumer";case jI:return(e._context.displayName||"Context")+".Provider";case Wv:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Vv:return t=e.displayName||null,t!==null?t:By(e.type)||"Memo";case gs:t=e._payload,e=e._init;try{return By(e(t))}catch{}}return null}function fD(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return By(t);case 8:return t===Kv?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Ds(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function RI(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function gD(e){var t=RI(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,s=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(i){r=""+i,s.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function rd(e){e._valueTracker||(e._valueTracker=gD(e))}function LI(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=RI(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function op(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Uy(e,t){var n=t.checked;return ut({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Ww(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=Ds(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function FI(e,t){t=t.checked,t!=null&&Hv(e,"checked",t,!1)}function Hy(e,t){FI(e,t);var n=Ds(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ky(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ky(e,t.type,Ds(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Vw(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ky(e,t,n){(t!=="number"||op(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var ul=Array.isArray;function La(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+Ds(n),t=null,o=0;o<e.length;o++){if(e[o].value===n){e[o].selected=!0,r&&(e[o].defaultSelected=!0);return}t!==null||e[o].disabled||(t=e[o])}t!==null&&(t.selected=!0)}}function Wy(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(Y(91));return ut({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function Gw(e,t){var n=t.value;if(n==null){if(n=t.children,t=t.defaultValue,n!=null){if(t!=null)throw Error(Y(92));if(ul(n)){if(1<n.length)throw Error(Y(93));n=n[0]}t=n}t==null&&(t=""),n=t}e._wrapperState={initialValue:Ds(n)}}function NI(e,t){var n=Ds(t.value),r=Ds(t.defaultValue);n!=null&&(n=""+n,n!==e.value&&(e.value=n),t.defaultValue==null&&e.defaultValue!==n&&(e.defaultValue=n)),r!=null&&(e.defaultValue=""+r)}function Yw(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function zI(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Vy(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?zI(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var od,BI=function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,n,r,o){MSApp.execUnsafeLocalFunction(function(){return e(t,n,r,o)})}:e}(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(od=od||document.createElement("div"),od.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=od.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Fl(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var vl={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},mD=["Webkit","ms","Moz","O"];Object.keys(vl).forEach(function(e){mD.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),vl[t]=vl[e]})});function UI(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||vl.hasOwnProperty(e)&&vl[e]?(""+t).trim():t+"px"}function HI(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=UI(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var yD=ut({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Gy(e,t){if(t){if(yD[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(Y(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(Y(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(Y(61))}if(t.style!=null&&typeof t.style!="object")throw Error(Y(62))}}function Yy(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Xy=null;function Gv(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var qy=null,Fa=null,Na=null;function Xw(e){if(e=_u(e)){if(typeof qy!="function")throw Error(Y(280));var t=e.stateNode;t&&(t=vf(t),qy(e.stateNode,e.type,t))}}function KI(e){Fa?Na?Na.push(e):Na=[e]:Fa=e}function WI(){if(Fa){var e=Fa,t=Na;if(Na=Fa=null,Xw(e),t)for(e=0;e<t.length;e++)Xw(t[e])}}function VI(e,t){return e(t)}function GI(){}var Og=!1;function YI(e,t,n){if(Og)return e(t,n);Og=!0;try{return VI(e,t,n)}finally{Og=!1,(Fa!==null||Na!==null)&&(GI(),WI())}}function Nl(e,t){var n=e.stateNode;if(n===null)return null;var r=vf(n);if(r===null)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(e=e.type,r=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!r;break e;default:e=!1}if(e)return null;if(n&&typeof n!="function")throw Error(Y(231,t,typeof n));return n}var Zy=!1;if(No)try{var Nc={};Object.defineProperty(Nc,"passive",{get:function(){Zy=!0}}),window.addEventListener("test",Nc,Nc),window.removeEventListener("test",Nc,Nc)}catch{Zy=!1}function SD(e,t,n,r,o,s,i,a,c){var l=Array.prototype.slice.call(arguments,3);try{t.apply(n,l)}catch(u){this.onError(u)}}var xl=!1,sp=null,ip=!1,Qy=null,vD={onError:function(e){xl=!0,sp=e}};function xD(e,t,n,r,o,s,i,a,c){xl=!1,sp=null,SD.apply(vD,arguments)}function wD(e,t,n,r,o,s,i,a,c){if(xD.apply(this,arguments),xl){if(xl){var l=sp;xl=!1,sp=null}else throw Error(Y(198));ip||(ip=!0,Qy=l)}}function Bi(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function XI(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function qw(e){if(Bi(e)!==e)throw Error(Y(188))}function bD(e){var t=e.alternate;if(!t){if(t=Bi(e),t===null)throw Error(Y(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(o===null)break;var s=o.alternate;if(s===null){if(r=o.return,r!==null){n=r;continue}break}if(o.child===s.child){for(s=o.child;s;){if(s===n)return qw(o),e;if(s===r)return qw(o),t;s=s.sibling}throw Error(Y(188))}if(n.return!==r.return)n=o,r=s;else{for(var i=!1,a=o.child;a;){if(a===n){i=!0,n=o,r=s;break}if(a===r){i=!0,r=o,n=s;break}a=a.sibling}if(!i){for(a=s.child;a;){if(a===n){i=!0,n=s,r=o;break}if(a===r){i=!0,r=s,n=o;break}a=a.sibling}if(!i)throw Error(Y(189))}}if(n.alternate!==r)throw Error(Y(190))}if(n.tag!==3)throw Error(Y(188));return n.stateNode.current===n?e:t}function qI(e){return e=bD(e),e!==null?ZI(e):null}function ZI(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=ZI(e);if(t!==null)return t;e=e.sibling}return null}var QI=Jn.unstable_scheduleCallback,Zw=Jn.unstable_cancelCallback,PD=Jn.unstable_shouldYield,CD=Jn.unstable_requestPaint,St=Jn.unstable_now,ID=Jn.unstable_getCurrentPriorityLevel,Yv=Jn.unstable_ImmediatePriority,JI=Jn.unstable_UserBlockingPriority,ap=Jn.unstable_NormalPriority,ED=Jn.unstable_LowPriority,eE=Jn.unstable_IdlePriority,gf=null,to=null;function _D(e){if(to&&typeof to.onCommitFiberRoot=="function")try{to.onCommitFiberRoot(gf,e,void 0,(e.current.flags&128)===128)}catch{}}var Dr=Math.clz32?Math.clz32:$D,kD=Math.log,TD=Math.LN2;function $D(e){return e>>>=0,e===0?32:31-(kD(e)/TD|0)|0}var sd=64,id=4194304;function dl(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function cp(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,s=e.pingedLanes,i=n&268435455;if(i!==0){var a=i&~o;a!==0?r=dl(a):(s&=i,s!==0&&(r=dl(s)))}else i=n&~o,i!==0?r=dl(i):s!==0&&(r=dl(s));if(r===0)return 0;if(t!==0&&t!==r&&!(t&o)&&(o=r&-r,s=t&-t,o>=s||o===16&&(s&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0<t;)n=31-Dr(t),o=1<<n,r|=e[n],t&=~o;return r}function MD(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function AD(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,s=e.pendingLanes;0<s;){var i=31-Dr(s),a=1<<i,c=o[i];c===-1?(!(a&n)||a&r)&&(o[i]=MD(a,t)):c<=t&&(e.expiredLanes|=a),s&=~a}}function Jy(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function tE(){var e=sd;return sd<<=1,!(sd&4194240)&&(sd=64),e}function Dg(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Iu(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Dr(t),e[t]=n}function jD(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-Dr(n),s=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~s}}function Xv(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-Dr(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var Fe=0;function nE(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}var rE,qv,oE,sE,iE,eS=!1,ad=[],Is=null,Es=null,_s=null,zl=new Map,Bl=new Map,ys=[],OD="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Qw(e,t){switch(e){case"focusin":case"focusout":Is=null;break;case"dragenter":case"dragleave":Es=null;break;case"mouseover":case"mouseout":_s=null;break;case"pointerover":case"pointerout":zl.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Bl.delete(t.pointerId)}}function zc(e,t,n,r,o,s){return e===null||e.nativeEvent!==s?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:s,targetContainers:[o]},t!==null&&(t=_u(t),t!==null&&qv(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,o!==null&&t.indexOf(o)===-1&&t.push(o),e)}function DD(e,t,n,r,o){switch(t){case"focusin":return Is=zc(Is,e,t,n,r,o),!0;case"dragenter":return Es=zc(Es,e,t,n,r,o),!0;case"mouseover":return _s=zc(_s,e,t,n,r,o),!0;case"pointerover":var s=o.pointerId;return zl.set(s,zc(zl.get(s)||null,e,t,n,r,o)),!0;case"gotpointercapture":return s=o.pointerId,Bl.set(s,zc(Bl.get(s)||null,e,t,n,r,o)),!0}return!1}function aE(e){var t=pi(e.target);if(t!==null){var n=Bi(t);if(n!==null){if(t=n.tag,t===13){if(t=XI(n),t!==null){e.blockedOn=t,iE(e.priority,function(){oE(n)});return}}else if(t===3&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=n.tag===3?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function oh(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var n=tS(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(n===null){n=e.nativeEvent;var r=new n.constructor(n.type,n);Xy=r,n.target.dispatchEvent(r),Xy=null}else return t=_u(n),t!==null&&qv(t),e.blockedOn=n,!1;t.shift()}return!0}function Jw(e,t,n){oh(e)&&n.delete(t)}function RD(){eS=!1,Is!==null&&oh(Is)&&(Is=null),Es!==null&&oh(Es)&&(Es=null),_s!==null&&oh(_s)&&(_s=null),zl.forEach(Jw),Bl.forEach(Jw)}function Bc(e,t){e.blockedOn===t&&(e.blockedOn=null,eS||(eS=!0,Jn.unstable_scheduleCallback(Jn.unstable_NormalPriority,RD)))}function Ul(e){function t(o){return Bc(o,e)}if(0<ad.length){Bc(ad[0],e);for(var n=1;n<ad.length;n++){var r=ad[n];r.blockedOn===e&&(r.blockedOn=null)}}for(Is!==null&&Bc(Is,e),Es!==null&&Bc(Es,e),_s!==null&&Bc(_s,e),zl.forEach(t),Bl.forEach(t),n=0;n<ys.length;n++)r=ys[n],r.blockedOn===e&&(r.blockedOn=null);for(;0<ys.length&&(n=ys[0],n.blockedOn===null);)aE(n),n.blockedOn===null&&ys.shift()}var za=Xo.ReactCurrentBatchConfig,lp=!0;function LD(e,t,n,r){var o=Fe,s=za.transition;za.transition=null;try{Fe=1,Zv(e,t,n,r)}finally{Fe=o,za.transition=s}}function FD(e,t,n,r){var o=Fe,s=za.transition;za.transition=null;try{Fe=4,Zv(e,t,n,r)}finally{Fe=o,za.transition=s}}function Zv(e,t,n,r){if(lp){var o=tS(e,t,n,r);if(o===null)Wg(e,t,r,up,n),Qw(e,r);else if(DD(o,e,t,n,r))r.stopPropagation();else if(Qw(e,r),t&4&&-1<OD.indexOf(e)){for(;o!==null;){var s=_u(o);if(s!==null&&rE(s),s=tS(e,t,n,r),s===null&&Wg(e,t,r,up,n),s===o)break;o=s}o!==null&&r.stopPropagation()}else Wg(e,t,r,null,n)}}var up=null;function tS(e,t,n,r){if(up=null,e=Gv(r),e=pi(e),e!==null)if(t=Bi(e),t===null)e=null;else if(n=t.tag,n===13){if(e=XI(t),e!==null)return e;e=null}else if(n===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return up=e,null}function cE(
Download .txt
gitextract_n9qlzxsf/

├── .gitignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.en.md
├── README.md
├── app/
│   └── app.go
├── build/
│   ├── README.md
│   ├── darwin/
│   │   ├── Info.dev.plist
│   │   └── Info.plist
│   └── windows/
│       ├── info.json
│       ├── installer/
│       │   ├── project.nsi
│       │   └── wails_tools.nsh
│       └── wails.exe.manifest
├── build.linux.sh
├── build.win.sh
├── cloud/
│   ├── .gitignore
│   ├── README.md
│   ├── build.sh
│   ├── cmd/
│   │   ├── main.go
│   │   ├── msg.go
│   │   └── serve.go
│   ├── deps/
│   │   └── frontend.go
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── compose-dev.yaml
├── docker/
│   ├── Dockerfile-dev
│   └── nginx.conf
├── docker-compose.yml
├── docs/
│   ├── Api.md
│   ├── Faq.md
│   ├── Markdown.md
│   ├── Store.en.md
│   ├── Store.md
│   ├── ai.md
│   └── demo/
│       ├── mysql5.7/
│       │   ├── install.json
│       │   ├── my.ini
│       │   ├── my.ini.tpl
│       │   ├── password.txt
│       │   ├── password.txt.tpl
│       │   ├── static/
│       │   │   └── index.html
│       │   └── store.json
│       ├── mysql8.0/
│       │   ├── install.json
│       │   └── my.ini.tpl
│       ├── nginx/
│       │   └── store.json
│       └── redis5.0/
│           └── store.json
├── frontend/
│   ├── .gitignore
│   ├── .vscode/
│   │   └── extensions.json
│   ├── README.md
│   ├── auto-imports.d.ts
│   ├── components.d.ts
│   ├── env.d.ts
│   ├── index.html
│   ├── package.json
│   ├── package.json.md5
│   ├── public/
│   │   ├── baiban/
│   │   │   ├── assets/
│   │   │   │   ├── index-BBuZupZQ.js
│   │   │   │   ├── index-C7Nv1nqD.js
│   │   │   │   ├── index-CB2-j8Sp.js
│   │   │   │   ├── index-CbiYJP60.css
│   │   │   │   ├── index-CdI7WPm4.js
│   │   │   │   ├── index-D7I3m8ha.js
│   │   │   │   ├── index-DQ-zJgK-.js
│   │   │   │   ├── index-DQ5iesJJ.css
│   │   │   │   ├── index-e9sqCFI7.css
│   │   │   │   └── index-kFFNEmpN.js
│   │   │   ├── index.html
│   │   │   └── static/
│   │   │       └── translations/
│   │   │           ├── ar.json
│   │   │           ├── ca.json
│   │   │           ├── cs.json
│   │   │           ├── da.json
│   │   │           ├── de.json
│   │   │           ├── en.json
│   │   │           ├── es.json
│   │   │           ├── fa.json
│   │   │           ├── fi.json
│   │   │           ├── fr.json
│   │   │           ├── gl.json
│   │   │           ├── he.json
│   │   │           ├── hi-in.json
│   │   │           ├── hr.json
│   │   │           ├── hu.json
│   │   │           ├── id.json
│   │   │           ├── it.json
│   │   │           ├── ja.json
│   │   │           ├── ko-kr.json
│   │   │           ├── ku.json
│   │   │           ├── languages.json
│   │   │           ├── main.json
│   │   │           ├── my.json
│   │   │           ├── ne.json
│   │   │           ├── no.json
│   │   │           ├── pl.json
│   │   │           ├── pt-br.json
│   │   │           ├── pt-pt.json
│   │   │           ├── ro.json
│   │   │           ├── ru.json
│   │   │           ├── sl.json
│   │   │           ├── sv.json
│   │   │           ├── te.json
│   │   │           ├── th.json
│   │   │           ├── tr.json
│   │   │           ├── uk.json
│   │   │           ├── vi.json
│   │   │           ├── zh-cn.json
│   │   │           └── zh-tw.json
│   │   ├── bot/
│   │   │   ├── chat.json
│   │   │   └── search.json
│   │   ├── calculator/
│   │   │   ├── css/
│   │   │   │   └── cal.css
│   │   │   ├── index.html
│   │   │   └── js/
│   │   │       └── cal.js
│   │   ├── docx/
│   │   │   ├── assets/
│   │   │   │   ├── index.03fab396.css
│   │   │   │   ├── index.15480821.css
│   │   │   │   ├── index.2535d7f3.css
│   │   │   │   ├── index.2a68c9e8.js
│   │   │   │   ├── index.30955838.js
│   │   │   │   ├── index.3842052e.js
│   │   │   │   ├── index.461a1f59.js
│   │   │   │   ├── index.4e9c2fed.js
│   │   │   │   ├── index.572c8ee8.js
│   │   │   │   ├── index.5f048ec4.js
│   │   │   │   ├── index.6dcf988b.css
│   │   │   │   ├── index.77c27592.js
│   │   │   │   ├── index.82ba8f6a.js
│   │   │   │   ├── index.8fae8eed.js
│   │   │   │   ├── index.97977da0.js
│   │   │   │   ├── index.9cb6c062.js
│   │   │   │   ├── index.af10cfdc.css
│   │   │   │   ├── index.bae472f7.js
│   │   │   │   ├── index.da267adb.js
│   │   │   │   ├── index.de73f97d.js
│   │   │   │   ├── index.ea630926.css
│   │   │   │   ├── index.ec407d42.css
│   │   │   │   ├── index.eff96d1a.css
│   │   │   │   ├── index.f6f10f0f.js
│   │   │   │   ├── vendor.68ee6001.js
│   │   │   │   └── vendor.d13e5cc9.js
│   │   │   └── index.html
│   │   ├── excel/
│   │   │   ├── assets/
│   │   │   │   └── iconfont/
│   │   │   │       ├── demo.css
│   │   │   │       ├── demo_index.html
│   │   │   │       ├── iconfont.css
│   │   │   │       ├── iconfont.js
│   │   │   │       └── iconfont.json
│   │   │   ├── css/
│   │   │   │   └── luckysheet.css
│   │   │   ├── demo.html
│   │   │   ├── demoData/
│   │   │   │   ├── chat.js
│   │   │   │   ├── demoFeature.js
│   │   │   │   ├── getTargetData.js
│   │   │   │   ├── sheetCell.js
│   │   │   │   ├── sheetChart.js
│   │   │   │   ├── sheetComment.js
│   │   │   │   ├── sheetConditionFormat.js
│   │   │   │   ├── sheetDataVerification.js
│   │   │   │   ├── sheetFormula.js
│   │   │   │   ├── sheetPicture.js
│   │   │   │   ├── sheetPivotTable.js
│   │   │   │   ├── sheetPivotTableData.js
│   │   │   │   ├── sheetSparkline.js
│   │   │   │   └── sheetTable.js
│   │   │   ├── expendPlugins/
│   │   │   │   ├── chart/
│   │   │   │   │   └── chartmix.css
│   │   │   │   ├── exceljs.js
│   │   │   │   ├── export.js
│   │   │   │   ├── filesaver.js
│   │   │   │   ├── luckyexcel.js
│   │   │   │   └── print/
│   │   │   │       ├── print.css
│   │   │   │       └── print.js
│   │   │   ├── fonts/
│   │   │   │   └── FontAwesome.otf
│   │   │   ├── index.html
│   │   │   ├── luckysheet.umd.js
│   │   │   └── plugins/
│   │   │       ├── css/
│   │   │       │   └── pluginsCss.css
│   │   │       ├── js/
│   │   │       │   └── plugin.js
│   │   │       └── plugins.css
│   │   ├── font/
│   │   │   ├── demo.css
│   │   │   ├── demo_index.html
│   │   │   ├── iconfont.css
│   │   │   ├── iconfont.js
│   │   │   └── iconfont.json
│   │   ├── gantt/
│   │   │   ├── README.md
│   │   │   ├── composer.json
│   │   │   ├── gantt.css
│   │   │   ├── ganttDrawerSVG.js
│   │   │   ├── ganttGridEditor.js
│   │   │   ├── ganttMaster.js
│   │   │   ├── ganttPrint.css
│   │   │   ├── ganttTask.js
│   │   │   ├── ganttTestSuite.js
│   │   │   ├── ganttUtilities.js
│   │   │   ├── ganttZoom.js
│   │   │   ├── index.html
│   │   │   ├── libs/
│   │   │   │   ├── date.js
│   │   │   │   ├── dialogs.js
│   │   │   │   ├── forms.js
│   │   │   │   ├── i18nJs.js
│   │   │   │   ├── jquery/
│   │   │   │   │   ├── JST/
│   │   │   │   │   │   └── jquery.JST.js
│   │   │   │   │   ├── dateField/
│   │   │   │   │   │   ├── jquery.dateField.css
│   │   │   │   │   │   └── jquery.dateField.js
│   │   │   │   │   ├── jquery.timers.js
│   │   │   │   │   ├── svg/
│   │   │   │   │   │   ├── jquery.svgdom.1.8.js
│   │   │   │   │   │   └── jquery.svgdom.pack.js
│   │   │   │   │   └── valueSlider/
│   │   │   │   │       ├── jquery.mb.slider.js
│   │   │   │   │       └── mb.slider.css
│   │   │   │   ├── layout.js
│   │   │   │   └── utilities.js
│   │   │   ├── license.txt
│   │   │   └── platform.css
│   │   ├── kanban/
│   │   │   ├── CNAME
│   │   │   ├── asset-manifest.json
│   │   │   ├── index.html
│   │   │   ├── manifest.json
│   │   │   ├── service-worker.js
│   │   │   └── static/
│   │   │       ├── css/
│   │   │       │   └── main.5a0187ba.chunk.css
│   │   │       └── js/
│   │   │           ├── 2.929441b1.chunk.js
│   │   │           ├── 2.929441b1.chunk.js.LICENSE.txt
│   │   │           ├── main.3373143f.chunk.js
│   │   │           └── runtime-main.04a7ba0b.js
│   │   ├── markdown/
│   │   │   ├── dist/
│   │   │   │   └── addons/
│   │   │   │       ├── advance/
│   │   │   │       │   └── cherry-table-echarts-plugin.js
│   │   │   │       ├── cherry-code-block-mermaid-plugin.js
│   │   │   │       └── cherry-code-block-plantuml-plugin.js
│   │   │   ├── drawio/
│   │   │   │   ├── Actions.js
│   │   │   │   ├── Dialogs.js
│   │   │   │   ├── Editor.js
│   │   │   │   ├── EditorUi.js
│   │   │   │   ├── Format.js
│   │   │   │   ├── Graph.js
│   │   │   │   ├── Init.js
│   │   │   │   ├── Menus.js
│   │   │   │   ├── Shapes.js
│   │   │   │   ├── Sidebar.js
│   │   │   │   ├── Toolbar.js
│   │   │   │   ├── atlas.css
│   │   │   │   ├── dark-default.xml
│   │   │   │   ├── dark.css
│   │   │   │   ├── default-old.xml
│   │   │   │   ├── default.xml
│   │   │   │   ├── drawio-demo.js
│   │   │   │   ├── font/
│   │   │   │   │   └── graph.iconfont.less
│   │   │   │   ├── grapheditor.css
│   │   │   │   ├── image/
│   │   │   │   │   └── stencils/
│   │   │   │   │       ├── arrows.xml
│   │   │   │   │       ├── basic.xml
│   │   │   │   │       ├── bpmn.xml
│   │   │   │   │       └── flowchart.xml
│   │   │   │   ├── jscolor/
│   │   │   │   │   └── jscolor.js
│   │   │   │   ├── lib/
│   │   │   │   │   └── base64.js
│   │   │   │   ├── resources/
│   │   │   │   │   ├── en.txt
│   │   │   │   │   └── zh.txt
│   │   │   │   ├── src/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   ├── common.css
│   │   │   │   │   │   └── explorer.css
│   │   │   │   │   ├── grapheditor.less
│   │   │   │   │   ├── js/
│   │   │   │   │   │   ├── editor/
│   │   │   │   │   │   │   ├── mxDefaultKeyHandler.js
│   │   │   │   │   │   │   ├── mxDefaultPopupMenu.js
│   │   │   │   │   │   │   ├── mxDefaultToolbar.js
│   │   │   │   │   │   │   └── mxEditor.js
│   │   │   │   │   │   ├── handler/
│   │   │   │   │   │   │   ├── mxCellHighlight.js
│   │   │   │   │   │   │   ├── mxCellMarker.js
│   │   │   │   │   │   │   ├── mxCellTracker.js
│   │   │   │   │   │   │   ├── mxConnectionHandler.js
│   │   │   │   │   │   │   ├── mxConstraintHandler.js
│   │   │   │   │   │   │   ├── mxEdgeHandler.js
│   │   │   │   │   │   │   ├── mxEdgeSegmentHandler.js
│   │   │   │   │   │   │   ├── mxElbowEdgeHandler.js
│   │   │   │   │   │   │   ├── mxGraphHandler.js
│   │   │   │   │   │   │   ├── mxHandle.js
│   │   │   │   │   │   │   ├── mxKeyHandler.js
│   │   │   │   │   │   │   ├── mxPanningHandler.js
│   │   │   │   │   │   │   ├── mxPopupMenuHandler.js
│   │   │   │   │   │   │   ├── mxRubberband.js
│   │   │   │   │   │   │   ├── mxSelectionCellsHandler.js
│   │   │   │   │   │   │   ├── mxTooltipHandler.js
│   │   │   │   │   │   │   └── mxVertexHandler.js
│   │   │   │   │   │   ├── index.txt
│   │   │   │   │   │   ├── io/
│   │   │   │   │   │   │   ├── mxCellCodec.js
│   │   │   │   │   │   │   ├── mxChildChangeCodec.js
│   │   │   │   │   │   │   ├── mxCodec.js
│   │   │   │   │   │   │   ├── mxCodecRegistry.js
│   │   │   │   │   │   │   ├── mxDefaultKeyHandlerCodec.js
│   │   │   │   │   │   │   ├── mxDefaultPopupMenuCodec.js
│   │   │   │   │   │   │   ├── mxDefaultToolbarCodec.js
│   │   │   │   │   │   │   ├── mxEditorCodec.js
│   │   │   │   │   │   │   ├── mxGenericChangeCodec.js
│   │   │   │   │   │   │   ├── mxGraphCodec.js
│   │   │   │   │   │   │   ├── mxGraphViewCodec.js
│   │   │   │   │   │   │   ├── mxModelCodec.js
│   │   │   │   │   │   │   ├── mxObjectCodec.js
│   │   │   │   │   │   │   ├── mxRootChangeCodec.js
│   │   │   │   │   │   │   ├── mxStylesheetCodec.js
│   │   │   │   │   │   │   └── mxTerminalChangeCodec.js
│   │   │   │   │   │   ├── layout/
│   │   │   │   │   │   │   ├── hierarchical/
│   │   │   │   │   │   │   │   ├── model/
│   │   │   │   │   │   │   │   │   ├── mxGraphAbstractHierarchyCell.js
│   │   │   │   │   │   │   │   │   ├── mxGraphHierarchyEdge.js
│   │   │   │   │   │   │   │   │   ├── mxGraphHierarchyModel.js
│   │   │   │   │   │   │   │   │   ├── mxGraphHierarchyNode.js
│   │   │   │   │   │   │   │   │   └── mxSwimlaneModel.js
│   │   │   │   │   │   │   │   ├── mxHierarchicalLayout.js
│   │   │   │   │   │   │   │   ├── mxSwimlaneLayout.js
│   │   │   │   │   │   │   │   └── stage/
│   │   │   │   │   │   │   │       ├── mxCoordinateAssignment.js
│   │   │   │   │   │   │   │       ├── mxHierarchicalLayoutStage.js
│   │   │   │   │   │   │   │       ├── mxMedianHybridCrossingReduction.js
│   │   │   │   │   │   │   │       ├── mxMinimumCycleRemover.js
│   │   │   │   │   │   │   │       └── mxSwimlaneOrdering.js
│   │   │   │   │   │   │   ├── mxCircleLayout.js
│   │   │   │   │   │   │   ├── mxCompactTreeLayout.js
│   │   │   │   │   │   │   ├── mxCompositeLayout.js
│   │   │   │   │   │   │   ├── mxEdgeLabelLayout.js
│   │   │   │   │   │   │   ├── mxFastOrganicLayout.js
│   │   │   │   │   │   │   ├── mxGraphLayout.js
│   │   │   │   │   │   │   ├── mxParallelEdgeLayout.js
│   │   │   │   │   │   │   ├── mxPartitionLayout.js
│   │   │   │   │   │   │   ├── mxRadialTreeLayout.js
│   │   │   │   │   │   │   └── mxStackLayout.js
│   │   │   │   │   │   ├── model/
│   │   │   │   │   │   │   ├── mxCell.js
│   │   │   │   │   │   │   ├── mxCellPath.js
│   │   │   │   │   │   │   ├── mxGeometry.js
│   │   │   │   │   │   │   └── mxGraphModel.js
│   │   │   │   │   │   ├── mxClient.js
│   │   │   │   │   │   ├── shape/
│   │   │   │   │   │   │   ├── mxActor.js
│   │   │   │   │   │   │   ├── mxArrow.js
│   │   │   │   │   │   │   ├── mxArrowConnector.js
│   │   │   │   │   │   │   ├── mxCloud.js
│   │   │   │   │   │   │   ├── mxConnector.js
│   │   │   │   │   │   │   ├── mxCylinder.js
│   │   │   │   │   │   │   ├── mxDoubleEllipse.js
│   │   │   │   │   │   │   ├── mxEllipse.js
│   │   │   │   │   │   │   ├── mxHexagon.js
│   │   │   │   │   │   │   ├── mxImageShape.js
│   │   │   │   │   │   │   ├── mxLabel.js
│   │   │   │   │   │   │   ├── mxLine.js
│   │   │   │   │   │   │   ├── mxMarker.js
│   │   │   │   │   │   │   ├── mxPolyline.js
│   │   │   │   │   │   │   ├── mxRectangleShape.js
│   │   │   │   │   │   │   ├── mxRhombus.js
│   │   │   │   │   │   │   ├── mxShape.js
│   │   │   │   │   │   │   ├── mxStencil.js
│   │   │   │   │   │   │   ├── mxStencilRegistry.js
│   │   │   │   │   │   │   ├── mxSwimlane.js
│   │   │   │   │   │   │   ├── mxText.js
│   │   │   │   │   │   │   └── mxTriangle.js
│   │   │   │   │   │   ├── util/
│   │   │   │   │   │   │   ├── mxAbstractCanvas2D.js
│   │   │   │   │   │   │   ├── mxAnimation.js
│   │   │   │   │   │   │   ├── mxAutoSaveManager.js
│   │   │   │   │   │   │   ├── mxClipboard.js
│   │   │   │   │   │   │   ├── mxConstants.js
│   │   │   │   │   │   │   ├── mxDictionary.js
│   │   │   │   │   │   │   ├── mxDivResizer.js
│   │   │   │   │   │   │   ├── mxDragSource.js
│   │   │   │   │   │   │   ├── mxEffects.js
│   │   │   │   │   │   │   ├── mxEvent.js
│   │   │   │   │   │   │   ├── mxEventObject.js
│   │   │   │   │   │   │   ├── mxEventSource.js
│   │   │   │   │   │   │   ├── mxForm.js
│   │   │   │   │   │   │   ├── mxGuide.js
│   │   │   │   │   │   │   ├── mxImage.js
│   │   │   │   │   │   │   ├── mxImageBundle.js
│   │   │   │   │   │   │   ├── mxImageExport.js
│   │   │   │   │   │   │   ├── mxLog.js
│   │   │   │   │   │   │   ├── mxMorphing.js
│   │   │   │   │   │   │   ├── mxMouseEvent.js
│   │   │   │   │   │   │   ├── mxObjectIdentity.js
│   │   │   │   │   │   │   ├── mxPanningManager.js
│   │   │   │   │   │   │   ├── mxPoint.js
│   │   │   │   │   │   │   ├── mxPopupMenu.js
│   │   │   │   │   │   │   ├── mxRectangle.js
│   │   │   │   │   │   │   ├── mxResources.js
│   │   │   │   │   │   │   ├── mxSvgCanvas2D.js
│   │   │   │   │   │   │   ├── mxToolbar.js
│   │   │   │   │   │   │   ├── mxUndoManager.js
│   │   │   │   │   │   │   ├── mxUndoableEdit.js
│   │   │   │   │   │   │   ├── mxUrlConverter.js
│   │   │   │   │   │   │   ├── mxUtils.js
│   │   │   │   │   │   │   ├── mxVmlCanvas2D.js
│   │   │   │   │   │   │   ├── mxWindow.js
│   │   │   │   │   │   │   ├── mxXmlCanvas2D.js
│   │   │   │   │   │   │   └── mxXmlRequest.js
│   │   │   │   │   │   └── view/
│   │   │   │   │   │       ├── mxCellEditor.js
│   │   │   │   │   │       ├── mxCellOverlay.js
│   │   │   │   │   │       ├── mxCellRenderer.js
│   │   │   │   │   │       ├── mxCellState.js
│   │   │   │   │   │       ├── mxCellStatePreview.js
│   │   │   │   │   │       ├── mxConnectionConstraint.js
│   │   │   │   │   │       ├── mxEdgeStyle.js
│   │   │   │   │   │       ├── mxGraph.js
│   │   │   │   │   │       ├── mxGraphSelectionModel.js
│   │   │   │   │   │       ├── mxGraphView.js
│   │   │   │   │   │       ├── mxLayoutManager.js
│   │   │   │   │   │       ├── mxMultiplicity.js
│   │   │   │   │   │       ├── mxOutline.js
│   │   │   │   │   │       ├── mxPerimeter.js
│   │   │   │   │   │       ├── mxPrintPreview.js
│   │   │   │   │   │       ├── mxStyleRegistry.js
│   │   │   │   │   │       ├── mxStylesheet.js
│   │   │   │   │   │       ├── mxSwimlaneManager.js
│   │   │   │   │   │       └── mxTemporaryCellStates.js
│   │   │   │   │   └── resources/
│   │   │   │   │       ├── editor.txt
│   │   │   │   │       ├── editor_de.txt
│   │   │   │   │       ├── editor_zh.txt
│   │   │   │   │       ├── graph.txt
│   │   │   │   │       ├── graph_de.txt
│   │   │   │   │       └── graph_zh.txt
│   │   │   │   └── theme/
│   │   │   │       └── default.xml
│   │   │   ├── drawio.html
│   │   │   ├── index.html
│   │   │   ├── katex/
│   │   │   │   ├── README.md
│   │   │   │   ├── contrib/
│   │   │   │   │   ├── auto-render.js
│   │   │   │   │   ├── auto-render.mjs
│   │   │   │   │   ├── copy-tex.js
│   │   │   │   │   ├── copy-tex.mjs
│   │   │   │   │   ├── mathtex-script-type.js
│   │   │   │   │   ├── mathtex-script-type.mjs
│   │   │   │   │   ├── mhchem.js
│   │   │   │   │   ├── mhchem.mjs
│   │   │   │   │   ├── render-a11y-string.js
│   │   │   │   │   └── render-a11y-string.mjs
│   │   │   │   ├── katex.css
│   │   │   │   ├── katex.js
│   │   │   │   └── katex.mjs
│   │   │   ├── mxgraph/
│   │   │   │   ├── css/
│   │   │   │   │   ├── common.css
│   │   │   │   │   └── explorer.css
│   │   │   │   └── mxClient.js
│   │   │   └── scripts/
│   │   │       ├── ai-chat-demo.js
│   │   │       ├── api-demo.js
│   │   │       ├── chatgpt-demo.js
│   │   │       ├── dialog.css
│   │   │       ├── drawio.js
│   │   │       ├── h5-demo.js
│   │   │       ├── html-docx.js
│   │   │       ├── index.js
│   │   │       ├── modal.js
│   │   │       ├── multiple-demo.js
│   │   │       ├── notoolbar-demo.js
│   │   │       ├── pinyin/
│   │   │       │   ├── README.md
│   │   │       │   ├── hanziPinyin.js
│   │   │       │   ├── hanziPinyinWithoutYin.js
│   │   │       │   ├── pinyin.js
│   │   │       │   └── pinyin_dist.js
│   │   │       ├── pptx-dialog.css
│   │   │       ├── preview-demo.js
│   │   │       ├── suggester-demo.js
│   │   │       ├── tex-svg.js
│   │   │       └── xss-demo.js
│   │   ├── mind/
│   │   │   ├── css/
│   │   │   │   ├── app.css
│   │   │   │   ├── chunk-3222d6ee.css
│   │   │   │   ├── chunk-b15d02c4.css
│   │   │   │   └── chunk-vendors.css
│   │   │   ├── index.html
│   │   │   └── js/
│   │   │       ├── app.js
│   │   │       ├── chunk-3222d6ee.js
│   │   │       ├── chunk-b15d02c4.js
│   │   │       └── chunk-vendors.js
│   │   ├── picedit/
│   │   │   ├── dist/
│   │   │   │   ├── bundle.js
│   │   │   │   └── bundle.js.LICENSE.txt
│   │   │   ├── images/
│   │   │   │   └── test-collection.json
│   │   │   └── index.html
│   │   ├── ppt/
│   │   │   ├── assets/
│   │   │   │   ├── index-FEB_hL87.css
│   │   │   │   ├── index-NZ0pT4uX.js
│   │   │   │   ├── index-O-Ts9bLA.js
│   │   │   │   └── index-eVh7c3Gk.css
│   │   │   └── index.html
│   │   └── text/
│   │       ├── css/
│   │       │   ├── css2.css
│   │       │   ├── index.css
│   │       │   ├── styles.css
│   │       │   ├── tab.css
│   │       │   ├── vanilla-appearance.css
│   │       │   ├── vanilla-highlighting.css
│   │       │   └── vanilla-layout.css
│   │       ├── index.html
│   │       ├── js/
│   │       │   ├── base.js
│   │       │   ├── init.js
│   │       │   ├── script.js
│   │       │   └── script2.js
│   │       ├── manifest.webmanifest
│   │       └── service-worker.js
│   ├── src/
│   │   ├── App.vue
│   │   ├── assets/
│   │   │   ├── chat.scss
│   │   │   ├── emoji.json
│   │   │   ├── imglist.scss
│   │   │   ├── left.scss
│   │   │   ├── list.scss
│   │   │   ├── main.scss
│   │   │   ├── root.scss
│   │   │   ├── store.json
│   │   │   ├── store.scss
│   │   │   └── windows10.scss
│   │   ├── auto-imports.d.ts
│   │   ├── components/
│   │   │   ├── ai/
│   │   │   │   ├── AiSettingApi.vue
│   │   │   │   ├── AiSettingConf.vue
│   │   │   │   ├── AiSettingDef.vue
│   │   │   │   ├── AssistantAdd.vue
│   │   │   │   ├── DownAddbox.vue
│   │   │   │   ├── DownLabeleditor.vue
│   │   │   │   ├── DownModelInfo.vue
│   │   │   │   ├── aimodel.vue
│   │   │   │   ├── aisetting.vue
│   │   │   │   └── assistant.vue
│   │   │   ├── builtin/
│   │   │   │   ├── Browser.vue
│   │   │   │   ├── Calendar.vue
│   │   │   │   ├── ContextMenu.vue
│   │   │   │   ├── CreateUrl.vue
│   │   │   │   ├── DateNote.vue
│   │   │   │   ├── EditFileName.vue
│   │   │   │   ├── EditType.vue
│   │   │   │   ├── FileIcon.vue
│   │   │   │   ├── FileIconImg.vue
│   │   │   │   ├── FileIconIs.vue
│   │   │   │   ├── FileList.vue
│   │   │   │   ├── FileProps.vue
│   │   │   │   ├── FileTree.vue
│   │   │   │   ├── FileViewer.vue
│   │   │   │   ├── ImageViewer.vue
│   │   │   │   ├── MusicStore.vue
│   │   │   │   ├── MusicViewer.vue
│   │   │   │   ├── NotifyGroup.vue
│   │   │   │   ├── OpenWiteDialog.vue
│   │   │   │   ├── OsImage.vue
│   │   │   │   ├── PdfViewer.vue
│   │   │   │   ├── PictureStore.vue
│   │   │   │   ├── RectChosen.vue
│   │   │   │   ├── UrlBrowser.vue
│   │   │   │   ├── Version.vue
│   │   │   │   └── VideoViewer.vue
│   │   │   ├── chat/
│   │   │   │   ├── Chat.vue
│   │   │   │   ├── ChatBox.vue
│   │   │   │   ├── ChatMenu.vue
│   │   │   │   ├── ChatMessage.vue
│   │   │   │   ├── ChatMsgList.vue
│   │   │   │   ├── ChatUserList.vue
│   │   │   │   ├── ChatUserSetting.vue
│   │   │   │   ├── ChatWorkList.vue
│   │   │   │   ├── chatGroupMember.vue
│   │   │   │   └── chatUserInfo.vue
│   │   │   ├── computer/
│   │   │   │   ├── Computer.vue
│   │   │   │   ├── ComputerNavBar.vue
│   │   │   │   ├── QuickLink.vue
│   │   │   │   └── UpPopover.vue
│   │   │   ├── desktop/
│   │   │   │   ├── Ad.vue
│   │   │   │   ├── CloseDesktop.vue
│   │   │   │   ├── DeskItem.vue
│   │   │   │   ├── Desktop.vue
│   │   │   │   ├── DesktopBackground.vue
│   │   │   │   ├── LockDesktop.vue
│   │   │   │   ├── Notice.vue
│   │   │   │   ├── OpeningDesktop.vue
│   │   │   │   ├── Screen.vue
│   │   │   │   ├── ScreenContent.vue
│   │   │   │   ├── Upgrade.vue
│   │   │   │   └── mobile/
│   │   │   │       ├── BottomBar.vue
│   │   │   │       ├── Mobile.vue
│   │   │   │       ├── MobileApp.vue
│   │   │   │       └── util.scss
│   │   │   ├── install/
│   │   │   │   ├── Install.vue
│   │   │   │   ├── InstallCompony.vue
│   │   │   │   ├── InstallMember.vue
│   │   │   │   └── InstallPerson.vue
│   │   │   ├── localchat/
│   │   │   │   ├── AiChatInfo.vue
│   │   │   │   ├── AiChatLeft.vue
│   │   │   │   ├── AiChatMain.vue
│   │   │   │   ├── AiChatMessage.vue
│   │   │   │   ├── ChatContent.vue
│   │   │   │   ├── ChatDomain.vue
│   │   │   │   ├── ChatEditor.vue
│   │   │   │   ├── ChatFoot.vue
│   │   │   │   ├── ChatNav.vue
│   │   │   │   ├── KnowledgeChat.vue
│   │   │   │   └── LocalChat.vue
│   │   │   ├── oa/
│   │   │   │   ├── FilePwd.vue
│   │   │   │   ├── PlanTasks.vue
│   │   │   │   └── ShareFiles.vue
│   │   │   ├── setting/
│   │   │   │   ├── ColorPicker.vue
│   │   │   │   ├── FrpcConfig.vue
│   │   │   │   ├── FrpcEdit.vue
│   │   │   │   ├── LocalNas.vue
│   │   │   │   ├── LocalProxy.vue
│   │   │   │   ├── NasClient.vue
│   │   │   │   ├── NetProxy.vue
│   │   │   │   ├── ProcessManager.vue
│   │   │   │   ├── SetAccount.vue
│   │   │   │   ├── SetCustom.vue
│   │   │   │   ├── SetFilePwd.vue
│   │   │   │   ├── SetLang.vue
│   │   │   │   ├── SetNas.vue
│   │   │   │   ├── SetSystem.vue
│   │   │   │   ├── SetUpdate.vue
│   │   │   │   ├── Setting.vue
│   │   │   │   ├── WebDavClient.vue
│   │   │   │   └── setStyle.css
│   │   │   ├── store/
│   │   │   │   ├── AddApp.vue
│   │   │   │   ├── AppItem.vue
│   │   │   │   └── Store.vue
│   │   │   ├── taskbar/
│   │   │   │   ├── AppIcon.vue
│   │   │   │   ├── AppIconGroup.vue
│   │   │   │   ├── Battery.vue
│   │   │   │   ├── BatteryPop.vue
│   │   │   │   ├── CustomIcon.vue
│   │   │   │   ├── DateTime.vue
│   │   │   │   ├── DateTimeShow.vue
│   │   │   │   ├── Error.vue
│   │   │   │   ├── Magnet.vue
│   │   │   │   ├── MenuList.vue
│   │   │   │   ├── MessageCenterPop.vue
│   │   │   │   ├── MessageIcon.vue
│   │   │   │   ├── NetWork.vue
│   │   │   │   ├── NetworkPop.vue
│   │   │   │   ├── ScreenRecorder.vue
│   │   │   │   ├── Screenshort.vue
│   │   │   │   ├── ShowNews.vue
│   │   │   │   ├── StartMenu.vue
│   │   │   │   ├── StartOption.vue
│   │   │   │   ├── StateIcon.vue
│   │   │   │   └── Taskbar.vue
│   │   │   ├── ui/
│   │   │   │   ├── CloseButton.vue
│   │   │   │   ├── WinButton.vue
│   │   │   │   ├── WinCheckBox.vue
│   │   │   │   ├── WinInput.vue
│   │   │   │   ├── WinLoading.vue
│   │   │   │   ├── WinLogo.vue
│   │   │   │   ├── WinProcess.vue
│   │   │   │   ├── WinSelect.vue
│   │   │   │   └── WinUpButtonGroup.vue
│   │   │   └── window/
│   │   │       ├── DialogProcess.vue
│   │   │       ├── DialogTemp.vue
│   │   │       ├── IframeFile.vue
│   │   │       ├── MenuBar.vue
│   │   │       ├── MenuFooter.vue
│   │   │       ├── MobileTemplate.vue
│   │   │       ├── NotFound.vue
│   │   │       ├── OnlyOffice.vue
│   │   │       ├── WindowGroup.vue
│   │   │       ├── WindowInner.vue
│   │   │       ├── WindowNode.vue
│   │   │       └── WindowTemplate.vue
│   │   ├── components.d.ts
│   │   ├── hook/
│   │   │   ├── useAi.ts
│   │   │   ├── useAppMenu.ts
│   │   │   ├── useAppOpen.ts
│   │   │   ├── useComputer.ts
│   │   │   ├── useContextMenu.ts
│   │   │   ├── useFileDrag.ts
│   │   │   ├── usePlugin.ts
│   │   │   ├── useRectChosen.ts
│   │   │   └── useWebdav.ts
│   │   ├── i18n/
│   │   │   ├── index.ts
│   │   │   └── lang/
│   │   │       ├── en.json
│   │   │       └── zh.json
│   │   ├── main.ts
│   │   ├── stores/
│   │   │   ├── aichat.ts
│   │   │   ├── assistant.ts
│   │   │   ├── chat.ts
│   │   │   ├── choose.ts
│   │   │   ├── db.ts
│   │   │   ├── file.ts
│   │   │   ├── filePwd.ts
│   │   │   ├── history.ts
│   │   │   ├── index.ts
│   │   │   ├── labels/
│   │   │   │   ├── aya.ts
│   │   │   │   ├── bakllava.ts
│   │   │   │   ├── bge.ts
│   │   │   │   ├── bgereranker.ts
│   │   │   │   ├── bilibili.ts
│   │   │   │   ├── chatglm.ts
│   │   │   │   ├── codegemma.ts
│   │   │   │   ├── codellama.ts
│   │   │   │   ├── codeqwen.ts
│   │   │   │   ├── deepseek.ts
│   │   │   │   ├── deepseekcoder.ts
│   │   │   │   ├── dmeta.ts
│   │   │   │   ├── duckdbnsql.ts
│   │   │   │   ├── gemma.ts
│   │   │   │   ├── h2o.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── internlm.ts
│   │   │   │   ├── llama.ts
│   │   │   │   ├── llamavision.ts
│   │   │   │   ├── llava.ts
│   │   │   │   ├── mindchat.ts
│   │   │   │   ├── mingyi.ts
│   │   │   │   ├── minicpm.ts
│   │   │   │   ├── mistral.ts
│   │   │   │   ├── mixtral.ts
│   │   │   │   ├── moondream.ts
│   │   │   │   ├── mxbai.ts
│   │   │   │   ├── nemo.ts
│   │   │   │   ├── neuralchat.ts
│   │   │   │   ├── nomic.ts
│   │   │   │   ├── openchat.ts
│   │   │   │   ├── paraformer.ts
│   │   │   │   ├── phi.ts
│   │   │   │   ├── qwen.ts
│   │   │   │   ├── sd.ts
│   │   │   │   ├── snowflake.ts
│   │   │   │   ├── solar.ts
│   │   │   │   ├── starcoder2.ts
│   │   │   │   ├── starlinglm.ts
│   │   │   │   ├── telespeech.ts
│   │   │   │   ├── vits.ts
│   │   │   │   ├── whisper.ts
│   │   │   │   ├── wizardlm2.ts
│   │   │   │   ├── yi.ts
│   │   │   │   ├── zephyr.ts
│   │   │   │   └── zipformer.ts
│   │   │   ├── localchat.ts
│   │   │   ├── login.ts
│   │   │   ├── message.ts
│   │   │   ├── model.ts
│   │   │   ├── modelconfig.ts
│   │   │   ├── notify.ts
│   │   │   ├── prompt/
│   │   │   │   ├── index.ts
│   │   │   │   ├── prompts-en.json
│   │   │   │   └── prompts-zh.json
│   │   │   ├── proxy.ts
│   │   │   ├── store.ts
│   │   │   └── upgrade.ts
│   │   ├── system/
│   │   │   ├── aiconfig.ts
│   │   │   ├── applist.ts
│   │   │   ├── config.ts
│   │   │   ├── core/
│   │   │   │   ├── FIleInterface.ts
│   │   │   │   ├── FileLocal.ts
│   │   │   │   ├── FileMode.ts
│   │   │   │   ├── FileOs.ts
│   │   │   │   ├── FileSystem.ts
│   │   │   │   ├── Path.ts
│   │   │   │   ├── SystemFileConfig.ts
│   │   │   │   └── createInitFile.ts
│   │   │   ├── dinglogin.ts
│   │   │   ├── event/
│   │   │   │   ├── EventHook.ts
│   │   │   │   ├── EventListener.ts
│   │   │   │   ├── Eventer.ts
│   │   │   │   ├── eventBus.ts
│   │   │   │   └── index.ts
│   │   │   ├── index.ts
│   │   │   ├── initBuiltin.ts
│   │   │   ├── initConfig.ts
│   │   │   ├── member.ts
│   │   │   ├── menu/
│   │   │   │   ├── Menu.ts
│   │   │   │   ├── MenuItem.ts
│   │   │   │   └── Tary.ts
│   │   │   ├── notification/
│   │   │   │   └── Notification.ts
│   │   │   ├── qiyeweixinlogin.ts
│   │   │   ├── root.ts
│   │   │   ├── router.ts
│   │   │   ├── third_login.ts
│   │   │   ├── type/
│   │   │   │   ├── enum.ts
│   │   │   │   ├── file.ts
│   │   │   │   ├── mod.d.ts
│   │   │   │   └── type.ts
│   │   │   └── window/
│   │   │       ├── BrowserWindow.ts
│   │   │       ├── Dialog.ts
│   │   │       ├── MakeDragable.ts
│   │   │       └── dom/
│   │   │           ├── DragElement.ts
│   │   │           └── ScaleElement.ts
│   │   ├── util/
│   │   │   ├── Icon.ts
│   │   │   ├── Tree.ts
│   │   │   ├── clientid.ts
│   │   │   ├── common.ts
│   │   │   ├── debounce.ts
│   │   │   ├── device.ts
│   │   │   ├── file.ts
│   │   │   ├── glowingBorder.ts
│   │   │   ├── goutil.ts
│   │   │   ├── markdown.ts
│   │   │   ├── modash.ts
│   │   │   ├── msg.ts
│   │   │   ├── screenRecorder.ts
│   │   │   ├── sharePath.ts
│   │   │   ├── stepComponent.ts
│   │   │   ├── thirdlogin.ts
│   │   │   └── unzip.ts
│   │   └── vite-env.d.ts
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   ├── vite.config.ts
│   └── wailsjs/
│       ├── go/
│       │   └── app/
│       │       ├── App.d.ts
│       │       └── App.js
│       └── runtime/
│           ├── package.json
│           ├── runtime.d.ts
│           └── runtime.js
├── go.mod
├── go.sum
├── main.go
├── packages/
│   ├── baiban/
│   │   ├── .eslintrc.cjs
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── postcss.config.js
│   │   ├── public/
│   │   │   └── static/
│   │   │       └── translations/
│   │   │           ├── ar.json
│   │   │           ├── ca.json
│   │   │           ├── cs.json
│   │   │           ├── da.json
│   │   │           ├── de.json
│   │   │           ├── en.json
│   │   │           ├── es.json
│   │   │           ├── fa.json
│   │   │           ├── fi.json
│   │   │           ├── fr.json
│   │   │           ├── gl.json
│   │   │           ├── he.json
│   │   │           ├── hi-in.json
│   │   │           ├── hr.json
│   │   │           ├── hu.json
│   │   │           ├── id.json
│   │   │           ├── it.json
│   │   │           ├── ja.json
│   │   │           ├── ko-kr.json
│   │   │           ├── ku.json
│   │   │           ├── languages.json
│   │   │           ├── main.json
│   │   │           ├── my.json
│   │   │           ├── ne.json
│   │   │           ├── no.json
│   │   │           ├── pl.json
│   │   │           ├── pt-br.json
│   │   │           ├── pt-pt.json
│   │   │           ├── ro.json
│   │   │           ├── ru.json
│   │   │           ├── sl.json
│   │   │           ├── sv.json
│   │   │           ├── te.json
│   │   │           ├── th.json
│   │   │           ├── tr.json
│   │   │           ├── uk.json
│   │   │           ├── vi.json
│   │   │           ├── zh-cn.json
│   │   │           └── zh-tw.json
│   │   ├── src/
│   │   │   ├── App.css
│   │   │   ├── App.jsx
│   │   │   ├── assets/
│   │   │   │   └── font/
│   │   │   │       └── font.css
│   │   │   ├── components/
│   │   │   │   ├── SaveButton.tsx
│   │   │   │   └── SaveWithInput.tsx
│   │   │   ├── index.css
│   │   │   └── main.jsx
│   │   ├── tailwind.config.js
│   │   └── vite.config.js
│   ├── kanban/
│   │   ├── .gitignore
│   │   ├── CNAME
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── public/
│   │   │   ├── CNAME
│   │   │   ├── index.html
│   │   │   └── manifest.json
│   │   ├── src/
│   │   │   ├── PersonalKanban/
│   │   │   │   ├── Introduction.stories.mdx
│   │   │   │   ├── assets/
│   │   │   │   │   └── locales/
│   │   │   │   │       ├── cn/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── de/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── en/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── es/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── fr/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── in/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       ├── jp/
│   │   │   │   │       │   └── translations.json
│   │   │   │   │       └── ru/
│   │   │   │   │           └── translations.json
│   │   │   │   ├── components/
│   │   │   │   │   ├── Board/
│   │   │   │   │   │   ├── Board.stories.tsx
│   │   │   │   │   │   ├── Board.tsx
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── Card/
│   │   │   │   │   │   ├── Card.stories.tsx
│   │   │   │   │   │   ├── Card.tsx
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── Column/
│   │   │   │   │   │   ├── Column.stories.tsx
│   │   │   │   │   │   ├── Column.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── ColumnForm/
│   │   │   │   │   │   ├── ColumnForm.stories.tsx
│   │   │   │   │   │   ├── ColumnForm.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── IconButton/
│   │   │   │   │   │   ├── IconButton.stories.tsx
│   │   │   │   │   │   ├── IconButton.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── KanbanBoard/
│   │   │   │   │   │   ├── KanbanBoard.stories.tsx
│   │   │   │   │   │   ├── KanbanBoard.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── KanbanCard/
│   │   │   │   │   │   ├── KanbanCard.stories.tsx
│   │   │   │   │   │   ├── KanbanCard.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── KanbanColumn/
│   │   │   │   │   │   ├── KanbanColumn.stories.tsx
│   │   │   │   │   │   ├── KanbanColumn.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   ├── Radio/
│   │   │   │   │   │   ├── Radio.stories.tsx
│   │   │   │   │   │   ├── Radio.tsx
│   │   │   │   │   │   └── index.tsx
│   │   │   │   │   └── RecordForm/
│   │   │   │   │       ├── RecordForm.stories.tsx
│   │   │   │   │       ├── RecordForm.tsx
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── constants/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── containers/
│   │   │   │   │   ├── KanbanBoard/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── title.tsx
│   │   │   │   │   └── Toolbar/
│   │   │   │   │       └── index.tsx
│   │   │   │   ├── enums/
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   ├── providers/
│   │   │   │   │   ├── ThemeProvider.tsx
│   │   │   │   │   └── TranslationProvider.tsx
│   │   │   │   ├── services/
│   │   │   │   │   ├── StorageService.ts
│   │   │   │   │   └── Utils.ts
│   │   │   │   └── types/
│   │   │   │       └── index.tsx
│   │   │   ├── index.css
│   │   │   ├── index.tsx
│   │   │   ├── react-app-env.d.ts
│   │   │   ├── reportWebVitals.ts
│   │   │   ├── service-worker.ts
│   │   │   ├── serviceWorkerRegistration.ts
│   │   │   └── setupTests.ts
│   │   └── tsconfig.json
│   ├── mind/
│   │   ├── .prettierignore
│   │   ├── .prettierrc
│   │   ├── babel.config.js
│   │   ├── package.json
│   │   ├── public/
│   │   │   └── index.html
│   │   ├── scripts/
│   │   │   ├── createNodeImageList.js
│   │   │   └── updateVersion.js
│   │   ├── src/
│   │   │   ├── App.vue
│   │   │   ├── api/
│   │   │   │   └── index.js
│   │   │   ├── assets/
│   │   │   │   ├── icon-font/
│   │   │   │   │   └── iconfont.css
│   │   │   │   └── svg/
│   │   │   │       ├── business/
│   │   │   │       │   └── 商务
│   │   │   │       ├── education/
│   │   │   │       │   └── 教育
│   │   │   │       ├── festival/
│   │   │   │       │   └── 节日
│   │   │   │       ├── food/
│   │   │   │       │   └── 食物
│   │   │   │       ├── medicine/
│   │   │   │       │   └── 医疗
│   │   │   │       ├── tools/
│   │   │   │       │   └── 工具
│   │   │   │       └── travel/
│   │   │   │           └── 旅行
│   │   │   ├── components/
│   │   │   │   └── ImgUpload/
│   │   │   │       ├── index.vue
│   │   │   │       └── style.less
│   │   │   ├── config/
│   │   │   │   ├── constant.js
│   │   │   │   ├── en.js
│   │   │   │   ├── icon.js
│   │   │   │   ├── image.js
│   │   │   │   ├── index.js
│   │   │   │   ├── zh.js
│   │   │   │   └── zhtw.js
│   │   │   ├── i18n.js
│   │   │   ├── lang/
│   │   │   │   ├── en_us.js
│   │   │   │   ├── index.js
│   │   │   │   ├── zh_cn.js
│   │   │   │   └── zh_tw.js
│   │   │   ├── main.js
│   │   │   ├── pages/
│   │   │   │   ├── Doc.vue
│   │   │   │   └── Edit/
│   │   │   │       ├── Index.vue
│   │   │   │       └── components/
│   │   │   │           ├── BaseStyle.vue
│   │   │   │           ├── Color.vue
│   │   │   │           ├── Contextmenu.vue
│   │   │   │           ├── Count.vue
│   │   │   │           ├── CustomNodeContent.vue
│   │   │   │           ├── Demonstrate.vue
│   │   │   │           ├── Edit.vue
│   │   │   │           ├── Export.vue
│   │   │   │           ├── FormulaSidebar.vue
│   │   │   │           ├── Fullscreen.vue
│   │   │   │           ├── Import.vue
│   │   │   │           ├── MouseAction.vue
│   │   │   │           ├── Navigator.vue
│   │   │   │           ├── NavigatorToolbar.vue
│   │   │   │           ├── NodeAnnotationBtn.vue
│   │   │   │           ├── NodeAttachment.vue
│   │   │   │           ├── NodeHyperlink.vue
│   │   │   │           ├── NodeIcon.vue
│   │   │   │           ├── NodeIconSidebar.vue
│   │   │   │           ├── NodeIconToolbar.vue
│   │   │   │           ├── NodeImage.vue
│   │   │   │           ├── NodeImgPreview.vue
│   │   │   │           ├── NodeNote.vue
│   │   │   │           ├── NodeNoteContentShow.vue
│   │   │   │           ├── NodeOuterFrame.vue
│   │   │   │           ├── NodeTag.vue
│   │   │   │           ├── NodeTagStyle.vue
│   │   │   │           ├── Outline.vue
│   │   │   │           ├── OutlineEdit.vue
│   │   │   │           ├── OutlineSidebar.vue
│   │   │   │           ├── RichTextToolbar.vue
│   │   │   │           ├── Scale.vue
│   │   │   │           ├── Scrollbar.vue
│   │   │   │           ├── Search.vue
│   │   │   │           ├── Setting.vue
│   │   │   │           ├── ShortcutKey.vue
│   │   │   │           ├── Sidebar.vue
│   │   │   │           ├── SidebarTrigger.vue
│   │   │   │           ├── SourceCodeEdit.vue
│   │   │   │           ├── Structure.vue
│   │   │   │           ├── Style.vue
│   │   │   │           ├── Theme.vue
│   │   │   │           ├── Toolbar.vue
│   │   │   │           └── ToolbarNodeBtnList.vue
│   │   │   ├── router.js
│   │   │   ├── store.js
│   │   │   └── utils/
│   │   │       ├── handleClipboardText.js
│   │   │       ├── index.js
│   │   │       └── loading.js
│   │   └── vue.config.js
│   ├── photoshop/
│   │   ├── .babelrc
│   │   ├── .gitignore
│   │   ├── MIT-LICENSE.txt
│   │   ├── README.md
│   │   ├── SECURITY.md
│   │   ├── examples/
│   │   │   ├── add-edit-imgData.html
│   │   │   ├── open-edit-save.html
│   │   │   └── zoom.html
│   │   ├── images/
│   │   │   └── test-collection.json
│   │   ├── index.html
│   │   ├── manifest-disabled.json
│   │   ├── package.json
│   │   ├── service-worker.js
│   │   ├── src/
│   │   │   ├── css/
│   │   │   │   ├── component.css
│   │   │   │   ├── layout.css
│   │   │   │   ├── menu.css
│   │   │   │   ├── popup.css
│   │   │   │   ├── print.css
│   │   │   │   ├── reset.css
│   │   │   │   └── utility.css
│   │   │   └── js/
│   │   │       ├── actions/
│   │   │       │   ├── _README.md
│   │   │       │   ├── activate-tool.js
│   │   │       │   ├── add-layer-filter.js
│   │   │       │   ├── autoresize-canvas.js
│   │   │       │   ├── base.js
│   │   │       │   ├── bundle.js
│   │   │       │   ├── clear-layer.js
│   │   │       │   ├── delete-layer-filter.js
│   │   │       │   ├── delete-layer-settings.js
│   │   │       │   ├── delete-layer.js
│   │   │       │   ├── index.js
│   │   │       │   ├── init-canvas-zoom.js
│   │   │       │   ├── insert-layer.js
│   │   │       │   ├── prepare-canvas.js
│   │   │       │   ├── refresh-action-attributes.js
│   │   │       │   ├── refresh-layers-gui.js
│   │   │       │   ├── reorder-layer.js
│   │   │       │   ├── reset-layers.js
│   │   │       │   ├── reset-selection.js
│   │   │       │   ├── select-layer.js
│   │   │       │   ├── select-next-layer.js
│   │   │       │   ├── select-previous-layer.js
│   │   │       │   ├── set-object-property.js
│   │   │       │   ├── set-selection.js
│   │   │       │   ├── stop-animation.js
│   │   │       │   ├── store/
│   │   │       │   │   └── image-store.js
│   │   │       │   ├── toggle-layer-visibility.js
│   │   │       │   ├── update-config.js
│   │   │       │   ├── update-layer-image.js
│   │   │       │   └── update-layer.js
│   │   │       ├── app.js
│   │   │       ├── config-menu.js
│   │   │       ├── config.js
│   │   │       ├── core/
│   │   │       │   ├── base-gui.js
│   │   │       │   ├── base-layers.js
│   │   │       │   ├── base-search.js
│   │   │       │   ├── base-selection.js
│   │   │       │   ├── base-state.js
│   │   │       │   ├── base-tools.js
│   │   │       │   ├── components/
│   │   │       │   │   ├── color-input.js
│   │   │       │   │   ├── color-picker-gradient.js
│   │   │       │   │   ├── index.js
│   │   │       │   │   ├── number-input.js
│   │   │       │   │   ├── range.js
│   │   │       │   │   └── swatches.js
│   │   │       │   └── gui/
│   │   │       │       ├── gui-colors.js
│   │   │       │       ├── gui-details.js
│   │   │       │       ├── gui-information.js
│   │   │       │       ├── gui-layers.js
│   │   │       │       ├── gui-menu.js
│   │   │       │       ├── gui-preview.js
│   │   │       │       └── gui-tools.js
│   │   │       ├── languages/
│   │   │       │   ├── ar.json
│   │   │       │   ├── credits.js
│   │   │       │   ├── de.json
│   │   │       │   ├── el.json
│   │   │       │   ├── empty.json
│   │   │       │   ├── es.json
│   │   │       │   ├── fr.json
│   │   │       │   ├── it.json
│   │   │       │   ├── ja.json
│   │   │       │   ├── ko.json
│   │   │       │   ├── lt.json
│   │   │       │   ├── nl.json
│   │   │       │   ├── pt.json
│   │   │       │   ├── ru.json
│   │   │       │   ├── tr.json
│   │   │       │   ├── uk.json
│   │   │       │   └── zh.json
│   │   │       ├── libs/
│   │   │       │   ├── canvastotiff.js
│   │   │       │   ├── clipboard.js
│   │   │       │   ├── color-matrix.js
│   │   │       │   ├── color-thief.js
│   │   │       │   ├── gifjs/
│   │   │       │   │   ├── gif.js
│   │   │       │   │   └── gif.worker.js
│   │   │       │   ├── glfx.js
│   │   │       │   ├── helpers.js
│   │   │       │   ├── imagefilters.js
│   │   │       │   ├── jquery.translate.js
│   │   │       │   ├── popup.js
│   │   │       │   ├── vintage.js
│   │   │       │   └── zoomView.js
│   │   │       ├── main.js
│   │   │       ├── modules/
│   │   │       │   ├── edit/
│   │   │       │   │   ├── copy.js
│   │   │       │   │   ├── paste.js
│   │   │       │   │   ├── redo.js
│   │   │       │   │   ├── selection.js
│   │   │       │   │   └── undo.js
│   │   │       │   ├── effects/
│   │   │       │   │   ├── abstract/
│   │   │       │   │   │   └── css.js
│   │   │       │   │   ├── black_and_white.js
│   │   │       │   │   ├── blueprint.js
│   │   │       │   │   ├── borders.js
│   │   │       │   │   ├── box_blur.js
│   │   │       │   │   ├── browser.js
│   │   │       │   │   ├── common/
│   │   │       │   │   │   ├── blur.js
│   │   │       │   │   │   ├── brightness.js
│   │   │       │   │   │   ├── contrast.js
│   │   │       │   │   │   ├── grayscale.js
│   │   │       │   │   │   ├── hue-rotate.js
│   │   │       │   │   │   ├── invert.js
│   │   │       │   │   │   ├── saturate.js
│   │   │       │   │   │   ├── sepia.js
│   │   │       │   │   │   └── shadow.js
│   │   │       │   │   ├── denoise.js
│   │   │       │   │   ├── dither.js
│   │   │       │   │   ├── dot_screen.js
│   │   │       │   │   ├── edge.js
│   │   │       │   │   ├── emboss.js
│   │   │       │   │   ├── enrich.js
│   │   │       │   │   ├── grains.js
│   │   │       │   │   ├── heatmap.js
│   │   │       │   │   ├── instagram/
│   │   │       │   │   │   ├── 1977.js
│   │   │       │   │   │   ├── aden.js
│   │   │       │   │   │   ├── clarendon.js
│   │   │       │   │   │   ├── gingham.js
│   │   │       │   │   │   ├── inkwell.js
│   │   │       │   │   │   ├── lofi.js
│   │   │       │   │   │   ├── toaster.js
│   │   │       │   │   │   ├── valencia.js
│   │   │       │   │   │   └── xpro2.js
│   │   │       │   │   ├── mosaic.js
│   │   │       │   │   ├── night_vision.js
│   │   │       │   │   ├── oil.js
│   │   │       │   │   ├── pencil.js
│   │   │       │   │   ├── sharpen.js
│   │   │       │   │   ├── solarize.js
│   │   │       │   │   ├── tilt_shift.js
│   │   │       │   │   ├── vibrance.js
│   │   │       │   │   ├── vignette.js
│   │   │       │   │   ├── vintage.js
│   │   │       │   │   └── zoom_blur.js
│   │   │       │   ├── file/
│   │   │       │   │   ├── new.js
│   │   │       │   │   ├── open.js
│   │   │       │   │   ├── print.js
│   │   │       │   │   ├── quickload.js
│   │   │       │   │   ├── quicksave.js
│   │   │       │   │   └── save.js
│   │   │       │   ├── help/
│   │   │       │   │   ├── about.js
│   │   │       │   │   └── shortcuts.js
│   │   │       │   ├── image/
│   │   │       │   │   ├── auto_adjust.js
│   │   │       │   │   ├── color_corrections.js
│   │   │       │   │   ├── decrease_colors.js
│   │   │       │   │   ├── flip.js
│   │   │       │   │   ├── histogram.js
│   │   │       │   │   ├── information.js
│   │   │       │   │   ├── opacity.js
│   │   │       │   │   ├── palette.js
│   │   │       │   │   ├── resize.js
│   │   │       │   │   ├── rotate.js
│   │   │       │   │   ├── size.js
│   │   │       │   │   ├── translate.js
│   │   │       │   │   └── trim.js
│   │   │       │   ├── layer/
│   │   │       │   │   ├── clear.js
│   │   │       │   │   ├── composition.js
│   │   │       │   │   ├── delete.js
│   │   │       │   │   ├── differences.js
│   │   │       │   │   ├── duplicate.js
│   │   │       │   │   ├── flatten.js
│   │   │       │   │   ├── merge.js
│   │   │       │   │   ├── move.js
│   │   │       │   │   ├── new.js
│   │   │       │   │   ├── raster.js
│   │   │       │   │   ├── rename.js
│   │   │       │   │   └── visibility.js
│   │   │       │   ├── tools/
│   │   │       │   │   ├── color_to_alpha.js
│   │   │       │   │   ├── color_zoom.js
│   │   │       │   │   ├── content_fill.js
│   │   │       │   │   ├── keypoints.js
│   │   │       │   │   ├── replace_color.js
│   │   │       │   │   ├── restore_alpha.js
│   │   │       │   │   ├── search.js
│   │   │       │   │   ├── settings.js
│   │   │       │   │   ├── sprites.js
│   │   │       │   │   └── translate.js
│   │   │       │   └── view/
│   │   │       │       ├── full_screen.js
│   │   │       │       ├── grid.js
│   │   │       │       ├── guides.js
│   │   │       │       ├── ruler.js
│   │   │       │       └── zoom.js
│   │   │       └── tools/
│   │   │           ├── animation.js
│   │   │           ├── blur.js
│   │   │           ├── brush.js
│   │   │           ├── bulge_pinch.js
│   │   │           ├── clone.js
│   │   │           ├── crop.js
│   │   │           ├── desaturate.js
│   │   │           ├── erase.js
│   │   │           ├── fill.js
│   │   │           ├── gradient.js
│   │   │           ├── magic_erase.js
│   │   │           ├── media.js
│   │   │           ├── pencil.js
│   │   │           ├── pick_color.js
│   │   │           ├── select.js
│   │   │           ├── selection.js
│   │   │           ├── shape.js
│   │   │           ├── shapes/
│   │   │           │   ├── arrow.js
│   │   │           │   ├── bezier_curve.js
│   │   │           │   ├── callout.js
│   │   │           │   ├── cog.js
│   │   │           │   ├── cylinder.js
│   │   │           │   ├── ellipse.js
│   │   │           │   ├── heart.js
│   │   │           │   ├── hexagon.js
│   │   │           │   ├── human.js
│   │   │           │   ├── line.js
│   │   │           │   ├── moon.js
│   │   │           │   ├── parallelogram.js
│   │   │           │   ├── pentagon.js
│   │   │           │   ├── plus.js
│   │   │           │   ├── polygon.js
│   │   │           │   ├── rectangle.js
│   │   │           │   ├── right_triangle.js
│   │   │           │   ├── romb.js
│   │   │           │   ├── star.js
│   │   │           │   ├── tear.js
│   │   │           │   ├── trapezoid.js
│   │   │           │   └── triangle.js
│   │   │           ├── sharpen.js
│   │   │           └── text.js
│   │   ├── tools/
│   │   │   └── translator/
│   │   │       ├── config.php
│   │   │       ├── index.php
│   │   │       └── libs/
│   │   │           ├── GoogleTranslate.php
│   │   │           └── translator.php
│   │   └── webpack.config.js
│   ├── pptx/
│   │   ├── .eslintrc.cjs
│   │   ├── .github/
│   │   │   ├── ISSUE_TEMPLATE/
│   │   │   │   ├── bug_report.md
│   │   │   │   └── feature_request.md
│   │   │   └── workflows/
│   │   │       └── deploy.yml
│   │   ├── .gitignore
│   │   ├── .husky/
│   │   │   └── commit-msg
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── commitlint.config.cjs
│   │   ├── doc/
│   │   │   ├── Canvas.md
│   │   │   ├── CustomElement.md
│   │   │   ├── DirectoryAndData.md
│   │   │   └── Q&A.md
│   │   ├── env.d.ts
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── App.vue
│   │   │   ├── assets/
│   │   │   │   └── styles/
│   │   │   │       ├── font.scss
│   │   │   │       ├── global.scss
│   │   │   │       ├── mixin.scss
│   │   │   │       ├── prosemirror.scss
│   │   │   │       └── variable.scss
│   │   │   ├── components/
│   │   │   │   ├── Button.vue
│   │   │   │   ├── ButtonGroup.vue
│   │   │   │   ├── Checkbox.vue
│   │   │   │   ├── CheckboxButton.vue
│   │   │   │   ├── ColorPicker/
│   │   │   │   │   ├── Alpha.vue
│   │   │   │   │   ├── Checkboard.vue
│   │   │   │   │   ├── EditableInput.vue
│   │   │   │   │   ├── Hue.vue
│   │   │   │   │   ├── Saturation.vue
│   │   │   │   │   └── index.vue
│   │   │   │   ├── Contextmenu/
│   │   │   │   │   ├── MenuContent.vue
│   │   │   │   │   ├── index.vue
│   │   │   │   │   └── types.ts
│   │   │   │   ├── Divider.vue
│   │   │   │   ├── Drawer.vue
│   │   │   │   ├── FileInput.vue
│   │   │   │   ├── FullscreenSpin.vue
│   │   │   │   ├── Input.vue
│   │   │   │   ├── LaTeXEditor/
│   │   │   │   │   ├── FormulaContent.vue
│   │   │   │   │   ├── SymbolContent.vue
│   │   │   │   │   ├── hfmath.ts
│   │   │   │   │   └── index.vue
│   │   │   │   ├── Message.vue
│   │   │   │   ├── Modal.vue
│   │   │   │   ├── MoveablePanel.vue
│   │   │   │   ├── NumberInput.vue
│   │   │   │   ├── Popover.vue
│   │   │   │   ├── PopoverMenuItem.vue
│   │   │   │   ├── RadioButton.vue
│   │   │   │   ├── RadioGroup.vue
│   │   │   │   ├── Select.vue
│   │   │   │   ├── SelectGroup.vue
│   │   │   │   ├── Slider.vue
│   │   │   │   ├── Switch.vue
│   │   │   │   ├── Tabs.vue
│   │   │   │   ├── TextArea.vue
│   │   │   │   └── WritingBoard.vue
│   │   │   ├── components.d.ts
│   │   │   ├── configs/
│   │   │   │   ├── animation.ts
│   │   │   │   ├── canvas.ts
│   │   │   │   ├── chartTypes.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── font.ts
│   │   │   │   ├── hotkey.ts
│   │   │   │   ├── imageClip.ts
│   │   │   │   ├── latex.ts
│   │   │   │   ├── lines.ts
│   │   │   │   ├── shapes.ts
│   │   │   │   ├── storage.ts
│   │   │   │   ├── symbol.ts
│   │   │   │   └── theme.ts
│   │   │   ├── global.d.ts
│   │   │   ├── hooks/
│   │   │   │   ├── useAddSlidesOrElements.ts
│   │   │   │   ├── useAlignActiveElement.ts
│   │   │   │   ├── useAlignElementToCanvas.ts
│   │   │   │   ├── useCombineElement.ts
│   │   │   │   ├── useCopyAndPasteElement.ts
│   │   │   │   ├── useCreateElement.ts
│   │   │   │   ├── useDeleteElement.ts
│   │   │   │   ├── useExport.ts
│   │   │   │   ├── useGlobalHotkey.ts
│   │   │   │   ├── useHideElement.ts
│   │   │   │   ├── useHistorySnapshot.ts
│   │   │   │   ├── useImport.ts
│   │   │   │   ├── useLink.ts
│   │   │   │   ├── useLoadSlides.ts
│   │   │   │   ├── useLockElement.ts
│   │   │   │   ├── useMoveElement.ts
│   │   │   │   ├── useOrderElement.ts
│   │   │   │   ├── usePasteEvent.ts
│   │   │   │   ├── usePasteTextClipboardData.ts
│   │   │   │   ├── useScaleCanvas.ts
│   │   │   │   ├── useScreening.ts
│   │   │   │   ├── useSearch.ts
│   │   │   │   ├── useSelectElement.ts
│   │   │   │   ├── useShapeFormatPainter.ts
│   │   │   │   ├── useSlideBackgroundStyle.ts
│   │   │   │   ├── useSlideHandler.ts
│   │   │   │   ├── useSlideTheme.ts
│   │   │   │   ├── useTextFormatPainter.ts
│   │   │   │   └── useUniformDisplayElement.ts
│   │   │   ├── main.ts
│   │   │   ├── mocks/
│   │   │   │   ├── layout.ts
│   │   │   │   ├── slides.ts
│   │   │   │   ├── theme.ts
│   │   │   │   ├── tpl/
│   │   │   │   │   ├── dangjian.json
│   │   │   │   │   ├── jianyuezi.json
│   │   │   │   │   ├── product.json
│   │   │   │   │   ├── science.json
│   │   │   │   │   ├── summary.json
│   │   │   │   │   └── taikongren.json
│   │   │   │   └── tpl.ts
│   │   │   ├── plugins/
│   │   │   │   ├── directive/
│   │   │   │   │   ├── clickOutside.ts
│   │   │   │   │   ├── contextmenu.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── tooltip.scss
│   │   │   │   │   └── tooltip.ts
│   │   │   │   └── icon.ts
│   │   │   ├── store/
│   │   │   │   ├── index.ts
│   │   │   │   ├── keyboard.ts
│   │   │   │   ├── main.ts
│   │   │   │   ├── screen.ts
│   │   │   │   ├── slides.ts
│   │   │   │   └── snapshot.ts
│   │   │   ├── types/
│   │   │   │   ├── edit.ts
│   │   │   │   ├── export.ts
│   │   │   │   ├── injectKey.ts
│   │   │   │   ├── mobile.ts
│   │   │   │   ├── slides.ts
│   │   │   │   └── toolbar.ts
│   │   │   ├── utils/
│   │   │   │   ├── clipboard.ts
│   │   │   │   ├── common.ts
│   │   │   │   ├── crypto.ts
│   │   │   │   ├── database.ts
│   │   │   │   ├── element.ts
│   │   │   │   ├── emitter.ts
│   │   │   │   ├── font.ts
│   │   │   │   ├── fullscreen.ts
│   │   │   │   ├── htmlParser/
│   │   │   │   │   ├── format.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lexer.ts
│   │   │   │   │   ├── parser.ts
│   │   │   │   │   ├── stringify.ts
│   │   │   │   │   ├── tags.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── image.ts
│   │   │   │   ├── message.ts
│   │   │   │   ├── print.ts
│   │   │   │   ├── prosemirror/
│   │   │   │   │   ├── commands/
│   │   │   │   │   │   ├── setListStyle.ts
│   │   │   │   │   │   ├── setTextAlign.ts
│   │   │   │   │   │   ├── setTextIndent.ts
│   │   │   │   │   │   └── toggleList.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── plugins/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── inputrules.ts
│   │   │   │   │   │   ├── keymap.ts
│   │   │   │   │   │   └── placeholder.ts
│   │   │   │   │   ├── schema/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── marks.ts
│   │   │   │   │   │   └── nodes.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── selection.ts
│   │   │   │   ├── svg2Base64.ts
│   │   │   │   ├── svgPathParser.ts
│   │   │   │   └── textParser.ts
│   │   │   └── views/
│   │   │       ├── Editor/
│   │   │       │   ├── Canvas/
│   │   │       │   │   ├── AlignmentLine.vue
│   │   │       │   │   ├── EditableElement.vue
│   │   │       │   │   ├── ElementCreateSelection.vue
│   │   │       │   │   ├── GridLines.vue
│   │   │       │   │   ├── LinkDialog.vue
│   │   │       │   │   ├── MouseSelection.vue
│   │   │       │   │   ├── Operate/
│   │   │       │   │   │   ├── BorderLine.vue
│   │   │       │   │   │   ├── CommonElementOperate.vue
│   │   │       │   │   │   ├── ImageElementOperate.vue
│   │   │       │   │   │   ├── LineElementOperate.vue
│   │   │       │   │   │   ├── LinkHandler.vue
│   │   │       │   │   │   ├── MultiSelectOperate.vue
│   │   │       │   │   │   ├── ResizeHandler.vue
│   │   │       │   │   │   ├── RotateHandler.vue
│   │   │       │   │   │   ├── ShapeElementOperate.vue
│   │   │       │   │   │   ├── TableElementOperate.vue
│   │   │       │   │   │   ├── TextElementOperate.vue
│   │   │       │   │   │   └── index.vue
│   │   │       │   │   ├── Ruler.vue
│   │   │       │   │   ├── ShapeCreateCanvas.vue
│   │   │       │   │   ├── ViewportBackground.vue
│   │   │       │   │   ├── hooks/
│   │   │       │   │   │   ├── useCommonOperate.ts
│   │   │       │   │   │   ├── useDragElement.ts
│   │   │       │   │   │   ├── useDragLineElement.ts
│   │   │       │   │   │   ├── useDropImageOrText.ts
│   │   │       │   │   │   ├── useInsertFromCreateSelection.ts
│   │   │       │   │   │   ├── useMouseSelection.ts
│   │   │       │   │   │   ├── useMoveShapeKeypoint.ts
│   │   │       │   │   │   ├── useRotateElement.ts
│   │   │       │   │   │   ├── useScaleElement.ts
│   │   │       │   │   │   ├── useSelectElement.ts
│   │   │       │   │   │   └── useViewportSize.ts
│   │   │       │   │   └── index.vue
│   │   │       │   ├── CanvasTool/
│   │   │       │   │   ├── ChartPool.vue
│   │   │       │   │   ├── LinePool.vue
│   │   │       │   │   ├── MediaInput.vue
│   │   │       │   │   ├── ShapeItemThumbnail.vue
│   │   │       │   │   ├── ShapePool.vue
│   │   │       │   │   ├── TableGenerator.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── EditorHeader/
│   │   │       │   │   ├── HotkeyDoc.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── ExportDialog/
│   │   │       │   │   ├── ExportImage.vue
│   │   │       │   │   ├── ExportJSON.vue
│   │   │       │   │   ├── ExportPDF.vue
│   │   │       │   │   ├── ExportPPTX.vue
│   │   │       │   │   ├── ExportSpecificFile.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── NotesPanel.vue
│   │   │       │   ├── Remark/
│   │   │       │   │   ├── Editor.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── SearchPanel.vue
│   │   │       │   ├── SelectPanel.vue
│   │   │       │   ├── Thumbnails/
│   │   │       │   │   ├── LayoutPool.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── Toolbar/
│   │   │       │   │   ├── ElementAnimationPanel.vue
│   │   │       │   │   ├── ElementPositionPanel.vue
│   │   │       │   │   ├── ElementStylePanel/
│   │   │       │   │   │   ├── AudioStylePanel.vue
│   │   │       │   │   │   ├── ChartStylePanel/
│   │   │       │   │   │   │   ├── ChartDataEditor.vue
│   │   │       │   │   │   │   └── index.vue
│   │   │       │   │   │   ├── ImageStylePanel.vue
│   │   │       │   │   │   ├── LatexStylePanel.vue
│   │   │       │   │   │   ├── LineStylePanel.vue
│   │   │       │   │   │   ├── MultiStylePanel.vue
│   │   │       │   │   │   ├── ShapeStylePanel.vue
│   │   │       │   │   │   ├── TableStylePanel.vue
│   │   │       │   │   │   ├── TextStylePanel.vue
│   │   │       │   │   │   ├── VideoStylePanel.vue
│   │   │       │   │   │   └── index.vue
│   │   │       │   │   ├── MultiPositionPanel.vue
│   │   │       │   │   ├── SlideAnimationPanel.vue
│   │   │       │   │   ├── SlideDesignPanel.vue
│   │   │       │   │   ├── SymbolPanel.vue
│   │   │       │   │   ├── ThemeStylesExtract.vue
│   │   │       │   │   ├── common/
│   │   │       │   │   │   ├── ColorButton.vue
│   │   │       │   │   │   ├── ElementColorMask.vue
│   │   │       │   │   │   ├── ElementFilter.vue
│   │   │       │   │   │   ├── ElementFlip.vue
│   │   │       │   │   │   ├── ElementOpacity.vue
│   │   │       │   │   │   ├── ElementOutline.vue
│   │   │       │   │   │   ├── ElementShadow.vue
│   │   │       │   │   │   ├── RichTextBase.vue
│   │   │       │   │   │   └── TextColorButton.vue
│   │   │       │   │   └── index.vue
│   │   │       │   └── index.vue
│   │   │       ├── Mobile/
│   │   │       │   ├── MobileEditor/
│   │   │       │   │   ├── ElementToolbar.vue
│   │   │       │   │   ├── Header.vue
│   │   │       │   │   ├── MobileEditableElement.vue
│   │   │       │   │   ├── MobileOperate.vue
│   │   │       │   │   ├── SlideToolbar.vue
│   │   │       │   │   └── index.vue
│   │   │       │   ├── MobilePlayer.vue
│   │   │       │   ├── MobilePreview.vue
│   │   │       │   ├── MobileThumbnails.vue
│   │   │       │   └── index.vue
│   │   │       ├── Screen/
│   │   │       │   ├── BaseView.vue
│   │   │       │   ├── CountdownTimer.vue
│   │   │       │   ├── PresenterView.vue
│   │   │       │   ├── ScreenElement.vue
│   │   │       │   ├── ScreenSlide.vue
│   │   │       │   ├── ScreenSlideList.vue
│   │   │       │   ├── SlideThumbnails.vue
│   │   │       │   ├── WritingBoardTool.vue
│   │   │       │   ├── hooks/
│   │   │       │   │   ├── useExecPlay.ts
│   │   │       │   │   ├── useFullscreen.ts
│   │   │       │   │   └── useSlideSize.ts
│   │   │       │   └── index.vue
│   │   │       └── components/
│   │   │           ├── ThumbnailSlide/
│   │   │           │   ├── ThumbnailElement.vue
│   │   │           │   └── index.vue
│   │   │           └── element/
│   │   │               ├── AudioElement/
│   │   │               │   ├── AudioPlayer.vue
│   │   │               │   ├── BaseAudioElement.vue
│   │   │               │   ├── ScreenAudioElement.vue
│   │   │               │   └── index.vue
│   │   │               ├── ChartElement/
│   │   │               │   ├── BaseChartElement.vue
│   │   │               │   ├── Chart.vue
│   │   │               │   └── index.vue
│   │   │               ├── ElementOutline.vue
│   │   │               ├── ImageElement/
│   │   │               │   ├── BaseImageElement.vue
│   │   │               │   ├── ImageClipHandler.vue
│   │   │               │   ├── ImageOutline/
│   │   │               │   │   ├── ImageEllipseOutline.vue
│   │   │               │   │   ├── ImagePolygonOutline.vue
│   │   │               │   │   ├── ImageRectOutline.vue
│   │   │               │   │   └── index.vue
│   │   │               │   ├── index.vue
│   │   │               │   ├── useClipImage.ts
│   │   │               │   └── useFilter.ts
│   │   │               ├── LatexElement/
│   │   │               │   ├── BaseLatexElement.vue
│   │   │               │   └── index.vue
│   │   │               ├── LineElement/
│   │   │               │   ├── BaseLineElement.vue
│   │   │               │   ├── LinePointMarker.vue
│   │   │               │   └── index.vue
│   │   │               ├── ProsemirrorEditor.vue
│   │   │               ├── ShapeElement/
│   │   │               │   ├── BaseShapeElement.vue
│   │   │               │   ├── GradientDefs.vue
│   │   │               │   └── index.vue
│   │   │               ├── TableElement/
│   │   │               │   ├── BaseTableElement.vue
│   │   │               │   ├── CustomTextarea.vue
│   │   │               │   ├── EditableTable.vue
│   │   │               │   ├── StaticTable.vue
│   │   │               │   ├── index.vue
│   │   │               │   ├── useHideCells.ts
│   │   │               │   ├── useSubThemeColor.ts
│   │   │               │   └── utils.ts
│   │   │               ├── TextElement/
│   │   │               │   ├── BaseTextElement.vue
│   │   │               │   └── index.vue
│   │   │               ├── VideoElement/
│   │   │               │   ├── BaseVideoElement.vue
│   │   │               │   ├── ScreenVideoElement.vue
│   │   │               │   ├── VideoPlayer/
│   │   │               │   │   ├── index.vue
│   │   │               │   │   └── useMSE.ts
│   │   │               │   └── index.vue
│   │   │               └── hooks/
│   │   │                   ├── useElementFlip.ts
│   │   │                   ├── useElementOutline.ts
│   │   │                   └── useElementShadow.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   └── vite.config.ts
│   └── word/
│       ├── .editorconfig
│       ├── .eslintrc
│       ├── .gitignore
│       ├── .prettierrc
│       ├── .vscode/
│       │   └── settings.json
│       ├── LICENSE
│       ├── README.md
│       ├── cypress/
│       │   ├── e2e/
│       │   │   ├── control/
│       │   │   │   ├── checkbox.cy.ts
│       │   │   │   ├── select.cy.ts
│       │   │   │   └── text.cy.ts
│       │   │   ├── editor.cy.ts
│       │   │   └── menus/
│       │   │       ├── block.cy.ts
│       │   │       ├── checkbox.cy.ts
│       │   │       ├── codeblock.cy.ts
│       │   │       ├── date.cy.ts
│       │   │       ├── format.cy.ts
│       │   │       ├── hyperlink.cy.ts
│       │   │       ├── image.cy.ts
│       │   │       ├── latex.cy.ts
│       │   │       ├── pagebreak.cy.ts
│       │   │       ├── painter.cy.ts
│       │   │       ├── print.cy.ts
│       │   │       ├── row.cy.ts
│       │   │       ├── search.cy.ts
│       │   │       ├── separator.cy.ts
│       │   │       ├── table.cy.ts
│       │   │       ├── text.cy.ts
│       │   │       ├── title.cy.ts
│       │   │       ├── undoRedo.cy.ts
│       │   │       └── watermark.cy.ts
│       │   ├── fixtures/
│       │   │   └── example.json
│       │   ├── global.d.ts
│       │   ├── support/
│       │   │   ├── commands.ts
│       │   │   └── e2e.ts
│       │   └── tsconfig.json
│       ├── cypress.config.ts
│       ├── docs/
│       │   ├── .vitepress/
│       │   │   └── config.ts
│       │   ├── en/
│       │   │   ├── guide/
│       │   │   │   ├── api-common.md
│       │   │   │   ├── api-instance.md
│       │   │   │   ├── command-execute.md
│       │   │   │   ├── command-get.md
│       │   │   │   ├── contextmenu-custom.md
│       │   │   │   ├── contextmenu-internal.md
│       │   │   │   ├── eventbus.md
│       │   │   │   ├── i18n.md
│       │   │   │   ├── listener.md
│       │   │   │   ├── option.md
│       │   │   │   ├── override.md
│       │   │   │   ├── plugin-custom.md
│       │   │   │   ├── plugin-internal.md
│       │   │   │   ├── schema.md
│       │   │   │   ├── shortcut-custom.md
│       │   │   │   ├── shortcut-internal.md
│       │   │   │   └── start.md
│       │   │   └── index.md
│       │   ├── guide/
│       │   │   ├── api-common.md
│       │   │   ├── api-instance.md
│       │   │   ├── command-execute.md
│       │   │   ├── command-get.md
│       │   │   ├── contextmenu-custom.md
│       │   │   ├── contextmenu-internal.md
│       │   │   ├── eventbus.md
│       │   │   ├── i18n.md
│       │   │   ├── listener.md
│       │   │   ├── option.md
│       │   │   ├── override.md
│       │   │   ├── plugin-custom.md
│       │   │   ├── plugin-internal.md
│       │   │   ├── schema.md
│       │   │   ├── shortcut-custom.md
│       │   │   ├── shortcut-internal.md
│       │   │   └── start.md
│       │   └── index.md
│       ├── index.html
│       ├── package.json
│       ├── scripts/
│       │   ├── release.js
│       │   └── verifyCommit.js
│       ├── src/
│       │   ├── components/
│       │   │   ├── dialog/
│       │   │   │   ├── Dialog.ts
│       │   │   │   └── dialog.css
│       │   │   └── signature/
│       │   │       ├── Signature.ts
│       │   │       └── signature.css
│       │   ├── editor/
│       │   │   ├── assets/
│       │   │   │   └── css/
│       │   │   │       ├── block/
│       │   │   │       │   └── block.css
│       │   │   │       ├── contextmenu/
│       │   │   │       │   └── contextmenu.css
│       │   │   │       ├── control/
│       │   │   │       │   └── select.css
│       │   │   │       ├── date/
│       │   │   │       │   └── datePicker.css
│       │   │   │       ├── hyperlink/
│       │   │   │       │   └── hyperlink.css
│       │   │   │       ├── index.css
│       │   │   │       ├── previewer/
│       │   │   │       │   └── previewer.css
│       │   │   │       ├── resizer/
│       │   │   │       │   └── resizer.css
│       │   │   │       ├── table/
│       │   │   │       │   └── table.css
│       │   │   │       └── zone/
│       │   │   │           └── zone.css
│       │   │   ├── core/
│       │   │   │   ├── actuator/
│       │   │   │   │   ├── Actuator.ts
│       │   │   │   │   └── handlers/
│       │   │   │   │       └── positionContextChange.ts
│       │   │   │   ├── command/
│       │   │   │   │   ├── Command.ts
│       │   │   │   │   └── CommandAdapt.ts
│       │   │   │   ├── contextmenu/
│       │   │   │   │   ├── ContextMenu.ts
│       │   │   │   │   └── menus/
│       │   │   │   │       ├── controlMenus.ts
│       │   │   │   │       ├── globalMenus.ts
│       │   │   │   │       ├── hyperlinkMenus.ts
│       │   │   │   │       ├── imageMenus.ts
│       │   │   │   │       └── tableMenus.ts
│       │   │   │   ├── cursor/
│       │   │   │   │   ├── Cursor.ts
│       │   │   │   │   └── CursorAgent.ts
│       │   │   │   ├── draw/
│       │   │   │   │   ├── Draw.ts
│       │   │   │   │   ├── control/
│       │   │   │   │   │   ├── Control.ts
│       │   │   │   │   │   ├── checkbox/
│       │   │   │   │   │   │   └── CheckboxControl.ts
│       │   │   │   │   │   ├── date/
│       │   │   │   │   │   │   └── DateControl.ts
│       │   │   │   │   │   ├── interactive/
│       │   │   │   │   │   │   └── ControlSearch.ts
│       │   │   │   │   │   ├── radio/
│       │   │   │   │   │   │   └── RadioControl.ts
│       │   │   │   │   │   ├── richtext/
│       │   │   │   │   │   │   └── Border.ts
│       │   │   │   │   │   ├── select/
│       │   │   │   │   │   │   └── SelectControl.ts
│       │   │   │   │   │   └── text/
│       │   │   │   │   │       └── TextControl.ts
│       │   │   │   │   ├── frame/
│       │   │   │   │   │   ├── Background.ts
│       │   │   │   │   │   ├── Footer.ts
│       │   │   │   │   │   ├── Header.ts
│       │   │   │   │   │   ├── LineNumber.ts
│       │   │   │   │   │   ├── Margin.ts
│       │   │   │   │   │   ├── PageBorder.ts
│       │   │   │   │   │   ├── PageNumber.ts
│       │   │   │   │   │   ├── Placeholder.ts
│       │   │   │   │   │   └── Watermark.ts
│       │   │   │   │   ├── interactive/
│       │   │   │   │   │   ├── Group.ts
│       │   │   │   │   │   └── Search.ts
│       │   │   │   │   ├── particle/
│       │   │   │   │   │   ├── CheckboxParticle.ts
│       │   │   │   │   │   ├── HyperlinkParticle.ts
│       │   │   │   │   │   ├── ImageParticle.ts
│       │   │   │   │   │   ├── LineBreakParticle.ts
│       │   │   │   │   │   ├── ListParticle.ts
│       │   │   │   │   │   ├── PageBreak.ts
│       │   │   │   │   │   ├── RadioParticle.ts
│       │   │   │   │   │   ├── Separator.ts
│       │   │   │   │   │   ├── Subscript.ts
│       │   │   │   │   │   ├── Superscript.ts
│       │   │   │   │   │   ├── TextParticle.ts
│       │   │   │   │   │   ├── block/
│       │   │   │   │   │   │   ├── BlockParticle.ts
│       │   │   │   │   │   │   └── modules/
│       │   │   │   │   │   │       ├── BaseBlock.ts
│       │   │   │   │   │   │       ├── IFrameBlock.ts
│       │   │   │   │   │   │       └── VideoBlock.ts
│       │   │   │   │   │   ├── date/
│       │   │   │   │   │   │   ├── DateParticle.ts
│       │   │   │   │   │   │   └── DatePicker.ts
│       │   │   │   │   │   ├── latex/
│       │   │   │   │   │   │   ├── LaTexParticle.ts
│       │   │   │   │   │   │   └── utils/
│       │   │   │   │   │   │       ├── LaTexUtils.ts
│       │   │   │   │   │   │       ├── hershey.ts
│       │   │   │   │   │   │       └── symbols.ts
│       │   │   │   │   │   ├── previewer/
│       │   │   │   │   │   │   └── Previewer.ts
│       │   │   │   │   │   └── table/
│       │   │   │   │   │       ├── TableOperate.ts
│       │   │   │   │   │       ├── TableParticle.ts
│       │   │   │   │   │       └── TableTool.ts
│       │   │   │   │   └── richtext/
│       │   │   │   │       ├── AbstractRichText.ts
│       │   │   │   │       ├── Highlight.ts
│       │   │   │   │       ├── Strikeout.ts
│       │   │   │   │       └── Underline.ts
│       │   │   │   ├── event/
│       │   │   │   │   ├── CanvasEvent.ts
│       │   │   │   │   ├── GlobalEvent.ts
│       │   │   │   │   ├── eventbus/
│       │   │   │   │   │   └── EventBus.ts
│       │   │   │   │   └── handlers/
│       │   │   │   │       ├── click.ts
│       │   │   │   │       ├── composition.ts
│       │   │   │   │       ├── copy.ts
│       │   │   │   │       ├── cut.ts
│       │   │   │   │       ├── drag.ts
│       │   │   │   │       ├── drop.ts
│       │   │   │   │       ├── input.ts
│       │   │   │   │       ├── keydown/
│       │   │   │   │       │   ├── backspace.ts
│       │   │   │   │       │   ├── delete.ts
│       │   │   │   │       │   ├── enter.ts
│       │   │   │   │       │   ├── index.ts
│       │   │   │   │       │   ├── left.ts
│       │   │   │   │       │   ├── right.ts
│       │   │   │   │       │   ├── tab.ts
│       │   │   │   │       │   └── updown.ts
│       │   │   │   │       ├── mousedown.ts
│       │   │   │   │       ├── mouseleave.ts
│       │   │   │   │       ├── mousemove.ts
│       │   │   │   │       ├── mouseup.ts
│       │   │   │   │       └── paste.ts
│       │   │   │   ├── history/
│       │   │   │   │   └── HistoryManager.ts
│       │   │   │   ├── i18n/
│       │   │   │   │   ├── I18n.ts
│       │   │   │   │   └── lang/
│       │   │   │   │       ├── en.json
│       │   │   │   │       └── zh-CN.json
│       │   │   │   ├── listener/
│       │   │   │   │   └── Listener.ts
│       │   │   │   ├── observer/
│       │   │   │   │   ├── ImageObserver.ts
│       │   │   │   │   ├── MouseObserver.ts
│       │   │   │   │   ├── ScrollObserver.ts
│       │   │   │   │   └── SelectionObserver.ts
│       │   │   │   ├── override/
│       │   │   │   │   └── Override.ts
│       │   │   │   ├── plugin/
│       │   │   │   │   └── Plugin.ts
│       │   │   │   ├── position/
│       │   │   │   │   └── Position.ts
│       │   │   │   ├── range/
│       │   │   │   │   └── RangeManager.ts
│       │   │   │   ├── register/
│       │   │   │   │   └── Register.ts
│       │   │   │   ├── shortcut/
│       │   │   │   │   ├── Shortcut.ts
│       │   │   │   │   └── keys/
│       │   │   │   │       ├── listKeys.ts
│       │   │   │   │       ├── richtextKeys.ts
│       │   │   │   │       └── titleKeys.ts
│       │   │   │   ├── worker/
│       │   │   │   │   ├── WorkerManager.ts
│       │   │   │   │   └── works/
│       │   │   │   │       ├── catalog.ts
│       │   │   │   │       ├── group.ts
│       │   │   │   │       └── wordCount.ts
│       │   │   │   └── zone/
│       │   │   │       ├── Zone.ts
│       │   │   │       └── ZoneTip.ts
│       │   │   ├── dataset/
│       │   │   │   ├── constant/
│       │   │   │   │   ├── Background.ts
│       │   │   │   │   ├── Checkbox.ts
│       │   │   │   │   ├── Common.ts
│       │   │   │   │   ├── ContextMenu.ts
│       │   │   │   │   ├── Control.ts
│       │   │   │   │   ├── Cursor.ts
│       │   │   │   │   ├── Editor.ts
│       │   │   │   │   ├── Element.ts
│       │   │   │   │   ├── Footer.ts
│       │   │   │   │   ├── Group.ts
│       │   │   │   │   ├── Header.ts
│       │   │   │   │   ├── LineBreak.ts
│       │   │   │   │   ├── LineNumber.ts
│       │   │   │   │   ├── List.ts
│       │   │   │   │   ├── PageBorder.ts
│       │   │   │   │   ├── PageBreak.ts
│       │   │   │   │   ├── PageNumber.ts
│       │   │   │   │   ├── Placeholder.ts
│       │   │   │   │   ├── Radio.ts
│       │   │   │   │   ├── Regular.ts
│       │   │   │   │   ├── Separator.ts
│       │   │   │   │   ├── Table.ts
│       │   │   │   │   ├── Title.ts
│       │   │   │   │   ├── Watermark.ts
│       │   │   │   │   └── Zone.ts
│       │   │   │   └── enum/
│       │   │   │       ├── Background.ts
│       │   │   │       ├── Block.ts
│       │   │   │       ├── Common.ts
│       │   │   │       ├── Control.ts
│       │   │   │       ├── Editor.ts
│       │   │   │       ├── Element.ts
│       │   │   │       ├── ElementStyle.ts
│       │   │   │       ├── Event.ts
│       │   │   │       ├── KeyMap.ts
│       │   │   │       ├── LineNumber.ts
│       │   │   │       ├── List.ts
│       │   │   │       ├── Observer.ts
│       │   │   │       ├── Row.ts
│       │   │   │       ├── Text.ts
│       │   │   │       ├── Title.ts
│       │   │   │       ├── VerticalAlign.ts
│       │   │   │       └── table/
│       │   │   │           ├── Table.ts
│       │   │   │           └── TableTool.ts
│       │   │   ├── index.ts
│       │   │   ├── interface/
│       │   │   │   ├── Background.ts
│       │   │   │   ├── Block.ts
│       │   │   │   ├── Catalog.ts
│       │   │   │   ├── Checkbox.ts
│       │   │   │   ├── Common.ts
│       │   │   │   ├── Control.ts
│       │   │   │   ├── Cursor.ts
│       │   │   │   ├── Draw.ts
│       │   │   │   ├── Editor.ts
│       │   │   │   ├── Element.ts
│       │   │   │   ├── Event.ts
│       │   │   │   ├── EventBus.ts
│       │   │   │   ├── Footer.ts
│       │   │   │   ├── Group.ts
│       │   │   │   ├── Header.ts
│       │   │   │   ├── LineBreak.ts
│       │   │   │   ├── LineNumber.ts
│       │   │   │   ├── Listener.ts
│       │   │   │   ├── Margin.ts
│       │   │   │   ├── PageBorder.ts
│       │   │   │   ├── PageBreak.ts
│       │   │   │   ├── PageNumber.ts
│       │   │   │   ├── Placeholder.ts
│       │   │   │   ├── Plugin.ts
│       │   │   │   ├── Position.ts
│       │   │   │   ├── Previewer.ts
│       │   │   │   ├── Radio.ts
│       │   │   │   ├── Range.ts
│       │   │   │   ├── Row.ts
│       │   │   │   ├── Search.ts
│       │   │   │   ├── Separator.ts
│       │   │   │   ├── Text.ts
│       │   │   │   ├── Title.ts
│       │   │   │   ├── Watermark.ts
│       │   │   │   ├── Zone.ts
│       │   │   │   ├── contextmenu/
│       │   │   │   │   └── ContextMenu.ts
│       │   │   │   ├── i18n/
│       │   │   │   │   └── I18n.ts
│       │   │   │   ├── shortcut/
│       │   │   │   │   └── Shortcut.ts
│       │   │   │   └── table/
│       │   │   │       ├── Colgroup.ts
│       │   │   │       ├── Table.ts
│       │   │   │       ├── Td.ts
│       │   │   │       └── Tr.ts
│       │   │   ├── types/
│       │   │   │   └── index.d.ts
│       │   │   └── utils/
│       │   │       ├── clipboard.ts
│       │   │       ├── element.ts
│       │   │       ├── hotkey.ts
│       │   │       ├── index.ts
│       │   │       ├── option.ts
│       │   │       ├── print.ts
│       │   │       └── ua.ts
│       │   ├── main.ts
│       │   ├── mock.ts
│       │   ├── plugins/
│       │   │   ├── barcode1d/
│       │   │   │   └── index.ts
│       │   │   ├── barcode2d/
│       │   │   │   └── index.ts
│       │   │   ├── copy/
│       │   │   │   └── index.ts
│       │   │   ├── docx/
│       │   │   │   ├── exportDocx.ts
│       │   │   │   ├── importDocx.ts
│       │   │   │   ├── index.ts
│       │   │   │   └── utils.ts
│       │   │   ├── excel/
│       │   │   │   ├── importExcel.ts
│       │   │   │   └── index.ts
│       │   │   ├── floatingToolbar/
│       │   │   │   ├── constant/
│       │   │   │   │   └── index.ts
│       │   │   │   ├── enum/
│       │   │   │   │   └── index.ts
│       │   │   │   ├── icons/
│       │   │   │   │   └── Svgs.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── interface/
│       │   │   │   │   └── index.ts
│       │   │   │   └── style/
│       │   │   │       └── index.scss
│       │   │   └── markdown/
│       │   │       └── index.ts
│       │   ├── style.css
│       │   ├── utils/
│       │   │   ├── index.ts
│       │   │   └── prism.ts
│       │   └── vite-env.d.ts
│       ├── tsconfig.json
│       └── vite.config.ts
├── test/
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── wails.json
Copy disabled (too large) Download .txt
Showing preview only (16,611K chars total). Download the full file to get everything.
SYMBOL INDEX (82331 symbols across 773 files)

FILE: app/app.go
  type App (line 15) | type App struct
    method Startup (line 26) | func (a *App) Startup(ctx context.Context) {
    method Shutdown (line 30) | func (a *App) Shutdown(ctx context.Context) {
    method OpenDirDialog (line 34) | func (a *App) OpenDirDialog() string {
    method ChooseFileDialog (line 43) | func (a *App) ChooseFileDialog() string {
    method RestartApp (line 52) | func (a *App) RestartApp() error {
  function NewApp (line 20) | func NewApp() *App {

FILE: cloud/cmd/main.go
  constant serverAddress (line 32) | serverAddress = ":56781"
  function OsStart (line 36) | func OsStart() {
  function OsStop (line 56) | func OsStop() {
  function OsRestart (line 64) | func OsRestart() {

FILE: cloud/cmd/msg.go
  type APIResponse (line 26) | type APIResponse struct
  function WriteJSONResponse (line 33) | func WriteJSONResponse(w http.ResponseWriter, res APIResponse, status in...
  function HTTPError (line 40) | func HTTPError(w http.ResponseWriter, status int, message string) {
  function ErrorMsg (line 43) | func ErrorMsg(w http.ResponseWriter, message string) {
  function ErrorData (line 46) | func ErrorData(w http.ResponseWriter, data any, message string) {
  function Error (line 49) | func Error(w http.ResponseWriter, message string, err string) {
  function SuccessMsg (line 52) | func SuccessMsg(w http.ResponseWriter, data any, message string) {

FILE: cloud/cmd/serve.go
  function Serve (line 17) | func Serve(srv *http.Server) {
  type loggingMiddleware (line 46) | type loggingMiddleware struct
    method Middleware (line 49) | func (l loggingMiddleware) Middleware(next http.Handler) http.Handler {
  function recoverMiddleware (line 64) | func recoverMiddleware(next http.Handler) http.Handler {
  function corsMiddleware (line 78) | func corsMiddleware() mux.MiddlewareFunc {

FILE: cloud/main.go
  function main (line 5) | func main() {

FILE: frontend/components.d.ts
  type GlobalComponents (line 9) | interface GlobalComponents {

FILE: frontend/public/baiban/assets/index-BBuZupZQ.js
  function FO (line 1) | function FO(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!="...
  function n (line 1) | function n(o){const s={};return o.integrity&&(s.integrity=o.integrity),o...
  function r (line 1) | function r(o){if(o.ep)return;o.ep=!0;const s=n(o);fetch(o.href,s)}
  function pc (line 1) | function pc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.c...
  function XO (line 9) | function XO(e){return e===null||typeof e!="object"?null:(e=Nw&&e[Nw]||e[...
  function fc (line 9) | function fc(e,t,n){this.props=e,this.context=t,this.refs=bI,this.updater...
  function PI (line 9) | function PI(){}
  function Lv (line 9) | function Lv(e,t,n){this.props=e,this.context=t,this.refs=bI,this.updater...
  function EI (line 9) | function EI(e,t,n){var r,o={},s=null,i=null;if(t!=null)for(r in t.ref!==...
  function qO (line 9) | function qO(e,t){return{$$typeof:Cu,type:e.type,key:t,ref:e.ref,props:e....
  function zv (line 9) | function zv(e){return typeof e=="object"&&e!==null&&e.$$typeof===Cu}
  function ZO (line 9) | function ZO(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,fun...
  function $g (line 9) | function $g(e,t){return typeof e=="object"&&e!==null&&e.key!=null?ZO(""+...
  function nh (line 9) | function nh(e,t,n,r,o){var s=typeof e;(s==="undefined"||s==="boolean")&&...
  function td (line 9) | function td(e,t,n){if(e==null)return e;var r=[],o=0;return nh(e,r,"","",...
  function QO (line 9) | function QO(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(...
  function _I (line 9) | function _I(){throw Error("act(...) is not supported in production build...
  function kI (line 17) | function kI(e,t,n){var r,o={},s=null,i=null;n!==void 0&&(s=""+n),t.key!=...
  function t (line 25) | function t(H,U){var W=H.length;H.push(U);e:for(;0<W;){var Z=W-1>>>1,le=H...
  function n (line 25) | function n(H){return H.length===0?null:H[0]}
  function r (line 25) | function r(H){if(H.length===0)return null;var U=H[0],W=H.pop();if(W!==U)...
  function o (line 25) | function o(H,U){var W=H.sortIndex-U.sortIndex;return W!==0?W:H.id-U.id}
  function b (line 25) | function b(H){for(var U=n(l);U!==null;){if(U.callback===null)r(l);else i...
  function E (line 25) | function E(H){if(g=!1,b(H),!y)if(n(c)!==null)y=!0,q(C);else{var U=n(l);U...
  function C (line 25) | function C(H,U){y=!1,g&&(g=!1,S(k),k=-1),f=!0;var W=p;try{for(b(U),d=n(c...
  function O (line 25) | function O(){return!(e.unstable_now()-T<$)}
  function N (line 25) | function N(){if(_!==null){var H=e.unstable_now();T=H;var U=!0;try{U=_(!0...
  function q (line 25) | function q(H){_=H,I||(I=!0,F())}
  function Q (line 25) | function Q(H,U){k=w(function(){H(e.unstable_now())},U)}
  function Y (line 33) | function Y(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
  function zi (line 33) | function zi(e,t){Za(e,t),Za(e+"Capture",t)}
  function Za (line 33) | function Za(e,t){for(Ll[e]=t,e=0;e<t.length;e++)AI.add(t[e])}
  function uD (line 33) | function uD(e){return Ly.call(Hw,e)?!0:Ly.call(Uw,e)?!1:lD.test(e)?Hw[e]...
  function dD (line 33) | function dD(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){c...
  function hD (line 33) | function hD(e,t,n,r){if(t===null||typeof t>"u"||dD(e,t,n,r))return!0;if(...
  function yn (line 33) | function yn(e,t,n,r,o,s,i){this.acceptsBooleans=t===2||t===3||t===4,this...
  function Uv (line 33) | function Uv(e){return e[1].toUpperCase()}
  function Hv (line 33) | function Hv(e,t,n,r){var o=Kt.hasOwnProperty(t)?Kt[t]:null;(o!==null?o.t...
  function Fc (line 33) | function Fc(e){return e===null||typeof e!="object"?null:(e=Kw&&e[Kw]||e[...
  function ll (line 33) | function ll(e){if(Mg===void 0)try{throw Error()}catch(n){var t=n.stack.t...
  function jg (line 34) | function jg(e,t){if(!e||Ag)return"";Ag=!0;var n=Error.prepareStackTrace;...
  function pD (line 37) | function pD(e){switch(e.tag){case 5:return ll(e.type);case 16:return ll(...
  function By (line 37) | function By(e){if(e==null)return null;if(typeof e=="function")return e.d...
  function fD (line 37) | function fD(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:r...
  function Ds (line 37) | function Ds(e){switch(typeof e){case"boolean":case"number":case"string":...
  function RI (line 37) | function RI(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="inp...
  function gD (line 37) | function gD(e){var t=RI(e)?"checked":"value",n=Object.getOwnPropertyDesc...
  function rd (line 37) | function rd(e){e._valueTracker||(e._valueTracker=gD(e))}
  function LI (line 37) | function LI(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n...
  function op (line 37) | function op(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u...
  function Uy (line 37) | function Uy(e,t){var n=t.checked;return ut({},t,{defaultChecked:void 0,d...
  function Ww (line 37) | function Ww(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checke...
  function FI (line 37) | function FI(e,t){t=t.checked,t!=null&&Hv(e,"checked",t,!1)}
  function Hy (line 37) | function Hy(e,t){FI(e,t);var n=Ds(t.value),r=t.type;if(n!=null)r==="numb...
  function Vw (line 37) | function Vw(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defau...
  function Ky (line 37) | function Ky(e,t,n){(t!=="number"||op(e.ownerDocument)!==e)&&(n==null?e.d...
  function La (line 37) | function La(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t...
  function Wy (line 37) | function Wy(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(Y(91));r...
  function Gw (line 37) | function Gw(e,t){var n=t.value;if(n==null){if(n=t.children,t=t.defaultVa...
  function NI (line 37) | function NI(e,t){var n=Ds(t.value),r=Ds(t.defaultValue);n!=null&&(n=""+n...
  function Yw (line 37) | function Yw(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!=...
  function zI (line 37) | function zI(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
  function Vy (line 37) | function Vy(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?zI(t...
  function Fl (line 37) | function Fl(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeT...
  function UI (line 37) | function UI(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typ...
  function HI (line 37) | function HI(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=...
  function Gy (line 37) | function Gy(e,t){if(t){if(yD[e]&&(t.children!=null||t.dangerouslySetInne...
  function Yy (line 37) | function Yy(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";swi...
  function Gv (line 37) | function Gv(e){return e=e.target||e.srcElement||window,e.correspondingUs...
  function Xw (line 37) | function Xw(e){if(e=_u(e)){if(typeof qy!="function")throw Error(Y(280));...
  function KI (line 37) | function KI(e){Fa?Na?Na.push(e):Na=[e]:Fa=e}
  function WI (line 37) | function WI(){if(Fa){var e=Fa,t=Na;if(Na=Fa=null,Xw(e),t)for(e=0;e<t.len...
  function VI (line 37) | function VI(e,t){return e(t)}
  function GI (line 37) | function GI(){}
  function YI (line 37) | function YI(e,t,n){if(Og)return e(t,n);Og=!0;try{return VI(e,t,n)}finall...
  function Nl (line 37) | function Nl(e,t){var n=e.stateNode;if(n===null)return null;var r=vf(n);i...
  function SD (line 37) | function SD(e,t,n,r,o,s,i,a,c){var l=Array.prototype.slice.call(argument...
  function xD (line 37) | function xD(e,t,n,r,o,s,i,a,c){xl=!1,sp=null,SD.apply(vD,arguments)}
  function wD (line 37) | function wD(e,t,n,r,o,s,i,a,c){if(xD.apply(this,arguments),xl){if(xl){va...
  function Bi (line 37) | function Bi(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else...
  function XI (line 37) | function XI(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.al...
  function qw (line 37) | function qw(e){if(Bi(e)!==e)throw Error(Y(188))}
  function bD (line 37) | function bD(e){var t=e.alternate;if(!t){if(t=Bi(e),t===null)throw Error(...
  function qI (line 37) | function qI(e){return e=bD(e),e!==null?ZI(e):null}
  function ZI (line 37) | function ZI(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;)...
  function _D (line 37) | function _D(e){if(to&&typeof to.onCommitFiberRoot=="function")try{to.onC...
  function $D (line 37) | function $D(e){return e>>>=0,e===0?32:31-(kD(e)/TD|0)|0}
  function dl (line 37) | function dl(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:retur...
  function cp (line 37) | function cp(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.susp...
  function MD (line 37) | function MD(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case...
  function AD (line 37) | function AD(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirati...
  function Jy (line 37) | function Jy(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?...
  function tE (line 37) | function tE(){var e=sd;return sd<<=1,!(sd&4194240)&&(sd=64),e}
  function Dg (line 37) | function Dg(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}
  function Iu (line 37) | function Iu(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,...
  function jD (line 37) | function jD(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLan...
  function Xv (line 37) | function Xv(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var...
  function nE (line 37) | function nE(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}
  function Qw (line 37) | function Qw(e,t){switch(e){case"focusin":case"focusout":Is=null;break;ca...
  function zc (line 37) | function zc(e,t,n,r,o,s){return e===null||e.nativeEvent!==s?(e={blockedO...
  function DD (line 37) | function DD(e,t,n,r,o){switch(t){case"focusin":return Is=zc(Is,e,t,n,r,o...
  function aE (line 37) | function aE(e){var t=pi(e.target);if(t!==null){var n=Bi(t);if(n!==null){...
  function oh (line 37) | function oh(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContaine...
  function Jw (line 37) | function Jw(e,t,n){oh(e)&&n.delete(t)}
  function RD (line 37) | function RD(){eS=!1,Is!==null&&oh(Is)&&(Is=null),Es!==null&&oh(Es)&&(Es=...
  function Bc (line 37) | function Bc(e,t){e.blockedOn===t&&(e.blockedOn=null,eS||(eS=!0,Jn.unstab...
  function Ul (line 37) | function Ul(e){function t(o){return Bc(o,e)}if(0<ad.length){Bc(ad[0],e);...
  function LD (line 37) | function LD(e,t,n,r){var o=Fe,s=za.transition;za.transition=null;try{Fe=...
  function FD (line 37) | function FD(e,t,n,r){var o=Fe,s=za.transition;za.transition=null;try{Fe=...
  function Zv (line 37) | function Zv(e,t,n,r){if(lp){var o=tS(e,t,n,r);if(o===null)Wg(e,t,r,up,n)...
  function tS (line 37) | function tS(e,t,n,r){if(up=null,e=Gv(r),e=pi(e),e!==null)if(t=Bi(e),t===...
  function cE (line 37) | function cE(e){switch(e){case"cancel":case"click":case"close":case"conte...
  function lE (line 37) | function lE(){if(sh)return sh;var e,t=Qv,n=t.length,r,o="value"in ws?ws....
  function ih (line 37) | function ih(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&...
  function cd (line 37) | function cd(){return!0}
  function eb (line 37) | function eb(){return!1}
  function rr (line 37) | function rr(e){function t(n,r,o,s,i){this._reactName=n,this._targetInst=...
  function ZD (line 37) | function ZD(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
  function e0 (line 37) | function e0(){return ZD}
  function dE (line 37) | function dE(e,t){switch(e){case"keyup":return aR.indexOf(t.keyCode)!==-1...
  function hE (line 37) | function hE(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:n...
  function lR (line 37) | function lR(e,t){switch(e){case"compositionend":return hE(t);case"keypre...
  function uR (line 37) | function uR(e,t){if(Sa)return e==="compositionend"||!t0&&dE(e,t)?(e=lE()...
  function ib (line 37) | function ib(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t===...
  function pE (line 37) | function pE(e,t,n,r){KI(r),t=dp(t,"onChange"),0<t.length&&(n=new Jv("onC...
  function hR (line 37) | function hR(e){CE(e,0)}
  function yf (line 37) | function yf(e){var t=wa(e);if(LI(t))return e}
  function pR (line 37) | function pR(e,t){if(e==="change")return t}
  function cb (line 37) | function cb(){bl&&(bl.detachEvent("onpropertychange",gE),Hl=bl=null)}
  function gE (line 37) | function gE(e){if(e.propertyName==="value"&&yf(Hl)){var t=[];pE(t,Hl,e,G...
  function fR (line 37) | function fR(e,t,n){e==="focusin"?(cb(),bl=t,Hl=n,bl.attachEvent("onprope...
  function gR (line 37) | function gR(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")retu...
  function mR (line 37) | function mR(e,t){if(e==="click")return yf(t)}
  function yR (line 37) | function yR(e,t){if(e==="input"||e==="change")return yf(t)}
  function SR (line 37) | function SR(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}
  function Kl (line 37) | function Kl(e,t){if(zr(e,t))return!0;if(typeof e!="object"||e===null||ty...
  function lb (line 37) | function lb(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
  function ub (line 37) | function ub(e,t){var n=lb(e);e=0;for(var r;n;){if(n.nodeType===3){if(r=e...
  function mE (line 37) | function mE(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType...
  function yE (line 37) | function yE(){for(var e=window,t=op();t instanceof e.HTMLIFrameElement;)...
  function n0 (line 37) | function n0(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
  function vR (line 37) | function vR(e){var t=yE(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n...
  function db (line 37) | function db(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.owne...
  function ld (line 37) | function ld(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["W...
  function Sf (line 37) | function Sf(e){if(Bg[e])return Bg[e];if(!xa[e])return e;var t=xa[e],n;fo...
  function Ks (line 37) | function Ks(e,t){PE.set(e,t),zi(t,[e])}
  function pb (line 37) | function pb(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,wD(r,...
  function CE (line 37) | function CE(e,t){t=(t&4)!==0;for(var n=0;n<e.length;n++){var r=e[n],o=r....
  function Qe (line 37) | function Qe(e,t){var n=t[cS];n===void 0&&(n=t[cS]=new Set);var r=e+"__bu...
  function Kg (line 37) | function Kg(e,t,n){var r=0;t&&(r|=4),IE(n,e,r,t)}
  function Wl (line 37) | function Wl(e){if(!e[ud]){e[ud]=!0,AI.forEach(function(n){n!=="selection...
  function IE (line 37) | function IE(e,t,n,r){switch(cE(t)){case 1:var o=LD;break;case 4:o=FD;bre...
  function Wg (line 37) | function Wg(e,t,n,r,o){var s=r;if(!(t&1)&&!(t&2)&&r!==null)e:for(;;){if(...
  function Vl (line 37) | function Vl(e,t,n){return{instance:e,listener:t,currentTarget:n}}
  function dp (line 37) | function dp(e,t){for(var n=t+"Capture",r=[];e!==null;){var o=e,s=o.state...
  function Qi (line 37) | function Qi(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5)...
  function fb (line 37) | function fb(e,t,n,r,o){for(var s=t._reactName,i=[];n!==null&&n!==r;){var...
  function gb (line 37) | function gb(e){return(typeof e=="string"?e:""+e).replace(CR,`
  function dd (line 38) | function dd(e,t,n){if(t=gb(t),gb(e)!==t&&n)throw Error(Y(425))}
  function hp (line 38) | function hp(){}
  function iS (line 38) | function iS(e,t){return e==="textarea"||e==="noscript"||typeof t.childre...
  function kR (line 38) | function kR(e){setTimeout(function(){throw e})}
  function Vg (line 38) | function Vg(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),...
  function ks (line 38) | function ks(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||...
  function yb (line 38) | function yb(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){va...
  function pi (line 38) | function pi(e){var t=e[qr];if(t)return t;for(var n=e.parentNode;n;){if(t...
  function _u (line 38) | function _u(e){return e=e[qr]||e[zo],!e||e.tag!==5&&e.tag!==6&&e.tag!==1...
  function wa (line 38) | function wa(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(Y(...
  function vf (line 38) | function vf(e){return e[Gl]||null}
  function Ws (line 38) | function Ws(e){return{current:e}}
  function tt (line 38) | function tt(e){0>ba||(e.current=lS[ba],lS[ba]=null,ba--)}
  function Ge (line 38) | function Ge(e,t){ba++,lS[ba]=e.current,e.current=t}
  function Qa (line 38) | function Qa(e,t){var n=e.type.contextTypes;if(!n)return Rs;var r=e.state...
  function $n (line 38) | function $n(e){return e=e.childContextTypes,e!=null}
  function pp (line 38) | function pp(){tt(Tn),tt(rn)}
  function Sb (line 38) | function Sb(e,t,n){if(rn.current!==Rs)throw Error(Y(168));Ge(rn,t),Ge(Tn...
  function EE (line 38) | function EE(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.g...
  function fp (line 38) | function fp(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMerged...
  function vb (line 38) | function vb(e,t,n){var r=e.stateNode;if(!r)throw Error(Y(169));n?(e=EE(e...
  function _E (line 38) | function _E(e){To===null?To=[e]:To.push(e)}
  function MR (line 38) | function MR(e){xf=!0,_E(e)}
  function Vs (line 38) | function Vs(){if(!Gg&&To!==null){Gg=!0;var e=0,t=Fe;try{var n=To;for(Fe=...
  function ui (line 38) | function ui(e,t){Pa[Ca++]=mp,Pa[Ca++]=gp,gp=e,mp=t}
  function kE (line 38) | function kE(e,t,n){dr[hr++]=Mo,dr[hr++]=Ao,dr[hr++]=Ii,Ii=e;var r=Mo;e=A...
  function r0 (line 38) | function r0(e){e.return!==null&&(ui(e,1),kE(e,1,0))}
  function o0 (line 38) | function o0(e){for(;e===gp;)gp=Pa[--Ca],Pa[Ca]=null,mp=Pa[--Ca],Pa[Ca]=n...
  function TE (line 38) | function TE(e,t){var n=fr(5,null,null,0);n.elementType="DELETED",n.state...
  function xb (line 38) | function xb(e,t){switch(e.tag){case 5:var n=e.type;return t=t.nodeType!=...
  function uS (line 38) | function uS(e){return(e.mode&1)!==0&&(e.flags&128)===0}
  function dS (line 38) | function dS(e){if(rt){var t=Yn;if(t){var n=t;if(!xb(e,t)){if(uS(e))throw...
  function wb (line 38) | function wb(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13...
  function hd (line 38) | function hd(e){if(e!==Xn)return!1;if(!rt)return wb(e),rt=!0,!1;var t;if(...
  function $E (line 38) | function $E(){for(var e=Yn;e;)e=ks(e.nextSibling)}
  function Ja (line 38) | function Ja(){Yn=Xn=null,rt=!1}
  function s0 (line 38) | function s0(e){$r===null?$r=[e]:$r.push(e)}
  function Hc (line 38) | function Hc(e,t,n){if(e=n.ref,e!==null&&typeof e!="function"&&typeof e!=...
  function pd (line 38) | function pd(e,t){throw e=Object.prototype.toString.call(t),Error(Y(31,e=...
  function bb (line 38) | function bb(e){var t=e._init;return t(e._payload)}
  function ME (line 38) | function ME(e){function t(S,v){if(e){var b=S.deletions;b===null?(S.delet...
  function a0 (line 38) | function a0(){i0=Ia=Sp=null}
  function c0 (line 38) | function c0(e){var t=yp.current;tt(yp),e._currentValue=t}
  function hS (line 38) | function hS(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)...
  function Ba (line 38) | function Ba(e,t){Sp=e,i0=Ia=null,e=e.dependencies,e!==null&&e.firstConte...
  function yr (line 38) | function yr(e){var t=e._currentValue;if(i0!==e)if(e={context:e,memoizedV...
  function l0 (line 38) | function l0(e){fi===null?fi=[e]:fi.push(e)}
  function jE (line 38) | function jE(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,l0(t)...
  function Bo (line 38) | function Bo(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t)...
  function u0 (line 38) | function u0(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
  function OE (line 38) | function OE(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={base...
  function Oo (line 38) | function Oo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:n...
  function Ts (line 38) | function Ts(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.sh...
  function ah (line 38) | function ah(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!...
  function Pb (line 38) | function Pb(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.upd...
  function vp (line 38) | function vp(e,t,n,r){var o=e.updateQueue;ms=!1;var s=o.firstBaseUpdate,i...
  function Cb (line 38) | function Cb(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.le...
  function gi (line 38) | function gi(e){if(e===ku)throw Error(Y(174));return e}
  function d0 (line 38) | function d0(e,t){switch(Ge(Xl,t),Ge(Yl,e),Ge(no,ku),e=t.nodeType,e){case...
  function tc (line 38) | function tc(){tt(no),tt(Yl),tt(Xl)}
  function DE (line 38) | function DE(e){gi(Xl.current);var t=gi(no.current),n=Vy(t,e.type);t!==n&...
  function h0 (line 38) | function h0(e){Yl.current===e&&(tt(no),tt(Yl))}
  function xp (line 38) | function xp(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedSta...
  function p0 (line 38) | function p0(){for(var e=0;e<Yg.length;e++)Yg[e]._workInProgressVersionPr...
  function Vt (line 38) | function Vt(){throw Error(Y(321))}
  function f0 (line 38) | function f0(e,t){if(t===null)return!1;for(var n=0;n<t.length&&n<e.length...
  function g0 (line 38) | function g0(e,t,n,r,o,s){if(Ei=s,lt=t,t.memoizedState=null,t.updateQueue...
  function m0 (line 38) | function m0(){var e=ql!==0;return ql=0,e}
  function Yr (line 38) | function Yr(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
  function Sr (line 38) | function Sr(){if(It===null){var e=lt.alternate;e=e!==null?e.memoizedStat...
  function Zl (line 38) | function Zl(e,t){return typeof t=="function"?t(e):t}
  function qg (line 38) | function qg(e){var t=Sr(),n=t.queue;if(n===null)throw Error(Y(311));n.la...
  function Zg (line 38) | function Zg(e){var t=Sr(),n=t.queue;if(n===null)throw Error(Y(311));n.la...
  function RE (line 38) | function RE(){}
  function LE (line 38) | function LE(e,t){var n=lt,r=Sr(),o=t(),s=!zr(r.memoizedState,o);if(s&&(r...
  function FE (line 38) | function FE(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},t=lt.updateQ...
  function NE (line 38) | function NE(e,t,n,r){t.value=n,t.getSnapshot=r,BE(t)&&UE(e)}
  function zE (line 38) | function zE(e,t,n){return n(function(){BE(t)&&UE(e)})}
  function BE (line 38) | function BE(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!zr(e,n...
  function UE (line 38) | function UE(e){var t=Bo(e,1);t!==null&&Rr(t,e,1,-1)}
  function Ib (line 38) | function Ib(e){var t=Yr();return typeof e=="function"&&(e=e()),t.memoize...
  function Ql (line 38) | function Ql(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null...
  function HE (line 38) | function HE(){return Sr().memoizedState}
  function lh (line 38) | function lh(e,t,n,r){var o=Yr();lt.flags|=e,o.memoizedState=Ql(1|t,n,voi...
  function wf (line 38) | function wf(e,t,n,r){var o=Sr();r=r===void 0?null:r;var s=void 0;if(It!=...
  function Eb (line 38) | function Eb(e,t){return lh(8390656,8,e,t)}
  function y0 (line 38) | function y0(e,t){return wf(2048,8,e,t)}
  function KE (line 38) | function KE(e,t){return wf(4,2,e,t)}
  function WE (line 38) | function WE(e,t){return wf(4,4,e,t)}
  function VE (line 38) | function VE(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(...
  function GE (line 38) | function GE(e,t,n){return n=n!=null?n.concat([e]):null,wf(4,4,VE.bind(nu...
  function S0 (line 38) | function S0(){}
  function YE (line 38) | function YE(e,t){var n=Sr();t=t===void 0?null:t;var r=n.memoizedState;re...
  function XE (line 38) | function XE(e,t){var n=Sr();t=t===void 0?null:t;var r=n.memoizedState;re...
  function qE (line 38) | function qE(e,t,n){return Ei&21?(zr(n,t)||(n=tE(),lt.lanes|=n,_i|=n,e.ba...
  function OR (line 38) | function OR(e,t){var n=Fe;Fe=n!==0&&4>n?n:4,e(!0);var r=Xg.transition;Xg...
  function ZE (line 38) | function ZE(){return Sr().memoizedState}
  function DR (line 38) | function DR(e,t,n){var r=Ms(e);if(n={lane:r,action:n,hasEagerState:!1,ea...
  function RR (line 38) | function RR(e,t,n){var r=Ms(e),o={lane:r,action:n,hasEagerState:!1,eager...
  function QE (line 38) | function QE(e){var t=e.alternate;return e===lt||t!==null&&t===lt}
  function JE (line 38) | function JE(e,t){Cl=wp=!0;var n=e.pending;n===null?t.next=t:(t.next=n.ne...
  function e_ (line 38) | function e_(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t....
  function Ir (line 38) | function Ir(e,t){if(e&&e.defaultProps){t=ut({},t),e=e.defaultProps;for(v...
  function pS (line 38) | function pS(e,t,n,r){t=e.memoizedState,n=n(r,t),n=n==null?t:ut({},t,n),e...
  function _b (line 38) | function _b(e,t,n,r,o,s,i){return e=e.stateNode,typeof e.shouldComponent...
  function t_ (line 38) | function t_(e,t,n){var r=!1,o=Rs,s=t.contextType;return typeof s=="objec...
  function kb (line 38) | function kb(e,t,n,r){e=t.state,typeof t.componentWillReceiveProps=="func...
  function fS (line 38) | function fS(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState...
  function nc (line 38) | function nc(e,t){try{var n="",r=t;do n+=pD(r),r=r.return;while(r);var o=...
  function Qg (line 40) | function Qg(e,t,n){return{value:e,source:null,stack:n??null,digest:t??nu...
  function gS (line 40) | function gS(e,t){try{console.error(t.value)}catch(n){setTimeout(function...
  function n_ (line 40) | function n_(e,t,n){n=Oo(-1,n),n.tag=3,n.payload={element:null};var r=t.v...
  function r_ (line 40) | function r_(e,t,n){n=Oo(-1,n),n.tag=3;var r=e.type.getDerivedStateFromEr...
  function Tb (line 40) | function Tb(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zR;v...
  function $b (line 40) | function $b(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null...
  function Mb (line 40) | function Mb(e,t,n,r,o){return e.mode&1?(e.flags|=65536,e.lanes=o,e):(e==...
  function un (line 40) | function un(e,t,n,r){t.child=e===null?AE(t,null,n,r):ec(t,e.child,n,r)}
  function Ab (line 40) | function Ab(e,t,n,r,o){n=n.render;var s=t.ref;return Ba(t,o),r=g0(e,t,n,...
  function jb (line 40) | function jb(e,t,n,r,o){if(e===null){var s=n.type;return typeof s=="funct...
  function o_ (line 40) | function o_(e,t,n,r,o){if(e!==null){var s=e.memoizedProps;if(Kl(s,r)&&e....
  function s_ (line 40) | function s_(e,t,n){var r=t.pendingProps,o=r.children,s=e!==null?e.memoiz...
  function i_ (line 40) | function i_(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&...
  function mS (line 40) | function mS(e,t,n,r,o){var s=$n(n)?Ci:rn.current;return s=Qa(t,s),Ba(t,o...
  function Ob (line 40) | function Ob(e,t,n,r,o){if($n(n)){var s=!0;fp(t)}else s=!1;if(Ba(t,o),t.s...
  function yS (line 40) | function yS(e,t,n,r,o,s){i_(e,t);var i=(t.flags&128)!==0;if(!r&&!i)retur...
  function a_ (line 40) | function a_(e){var t=e.stateNode;t.pendingContext?Sb(e,t.pendingContext,...
  function Db (line 40) | function Db(e,t,n,r,o){return Ja(),s0(o),t.flags|=256,un(e,t,n,r),t.child}
  function vS (line 40) | function vS(e){return{baseLanes:e,cachePool:null,transitions:null}}
  function c_ (line 40) | function c_(e,t,n){var r=t.pendingProps,o=it.current,s=!1,i=(t.flags&128...
  function v0 (line 40) | function v0(e,t){return t=If({mode:"visible",children:t},e.mode,0,null),...
  function fd (line 40) | function fd(e,t,n,r){return r!==null&&s0(r),ec(t,e.child,null,n),e=v0(t,...
  function UR (line 40) | function UR(e,t,n,r,o,s,i){if(n)return t.flags&256?(t.flags&=-257,r=Qg(E...
  function Rb (line 40) | function Rb(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),h...
  function Jg (line 40) | function Jg(e,t,n,r,o){var s=e.memoizedState;s===null?e.memoizedState={i...
  function l_ (line 40) | function l_(e,t,n){var r=t.pendingProps,o=r.revealOrder,s=r.tail;if(un(e...
  function uh (line 40) | function uh(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=nu...
  function Uo (line 40) | function Uo(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),_i|=t.la...
  function HR (line 40) | function HR(e,t,n){switch(t.tag){case 3:a_(t),Ja();break;case 5:DE(t);br...
  function Kc (line 40) | function Kc(e,t){if(!rt)switch(e.tailMode){case"hidden":t=e.tail;for(var...
  function Gt (line 40) | function Gt(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0...
  function KR (line 40) | function KR(e,t,n){var r=t.pendingProps;switch(o0(t),t.tag){case 2:case ...
  function WR (line 40) | function WR(e,t){switch(o0(t),t.tag){case 1:return $n(t.type)&&pp(),e=t....
  function Ea (line 40) | function Ea(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(n...
  function wS (line 40) | function wS(e,t,n){try{n()}catch(r){ft(e,t,r)}}
  function GR (line 40) | function GR(e,t){if(oS=lp,e=yE(),n0(e)){if("selectionStart"in e)var n={s...
  function Il (line 40) | function Il(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r...
  function Pf (line 40) | function Pf(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==nul...
  function bS (line 40) | function bS(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){...
  function p_ (line 40) | function p_(e){var t=e.alternate;t!==null&&(e.alternate=null,p_(t)),e.ch...
  function f_ (line 40) | function f_(e){return e.tag===5||e.tag===3||e.tag===4}
  function Fb (line 40) | function Fb(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||f_(...
  function PS (line 40) | function PS(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeTyp...
  function CS (line 40) | function CS(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertB...
  function ls (line 40) | function ls(e,t,n){for(n=n.child;n!==null;)g_(e,t,n),n=n.sibling}
  function g_ (line 40) | function g_(e,t,n){if(to&&typeof to.onCommitFiberUnmount=="function")try...
  function Nb (line 40) | function Nb(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n...
  function Cr (line 40) | function Cr(e,t){var n=t.deletions;if(n!==null)for(var r=0;r<n.length;r+...
  function m_ (line 40) | function m_(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 1...
  function Vr (line 40) | function Vr(e){var t=e.flags;if(t&2){try{e:{for(var n=e.return;n!==null;...
  function YR (line 40) | function YR(e,t,n){te=e,y_(e)}
  function y_ (line 40) | function y_(e,t,n){for(var r=(e.mode&1)!==0;te!==null;){var o=te,s=o.chi...
  function zb (line 40) | function zb(e){for(;te!==null;){var t=te;if(t.flags&8772){var n=t.altern...
  function Bb (line 40) | function Bb(e){for(;te!==null;){var t=te;if(t===e){te=null;break}var n=t...
  function Ub (line 40) | function Ub(e){for(;te!==null;){var t=te;try{switch(t.tag){case 0:case 1...
  function gn (line 40) | function gn(){return _e&6?St():dh!==-1?dh:dh=St()}
  function Ms (line 40) | function Ms(e){return e.mode&1?_e&2&&Bt!==0?Bt&-Bt:AR.transition!==null?...
  function Rr (line 40) | function Rr(e,t,n,r){if(50<_l)throw _l=0,ES=null,Error(Y(185));Iu(e,n,r)...
  function Mn (line 40) | function Mn(e,t){var n=e.callbackNode;AD(e,t);var r=cp(e,e===At?Bt:0);if...
  function S_ (line 40) | function S_(e,t){if(dh=-1,hh=0,_e&6)throw Error(Y(327));var n=e.callback...
  function _S (line 40) | function _S(e,t){var n=El;return e.current.memoizedState.isDehydrated&&(...
  function kS (line 40) | function kS(e){Pn===null?Pn=e:Pn.push.apply(Pn,e)}
  function qR (line 40) | function qR(e){for(var t=e;;){if(t.flags&16384){var n=t.updateQueue;if(n...
  function Ss (line 40) | function Ss(e,t){for(t&=~w0,t&=~Cf,e.suspendedLanes|=t,e.pingedLanes&=~t...
  function Hb (line 40) | function Hb(e){if(_e&6)throw Error(Y(327));Ua();var t=cp(e,0);if(!(t&1))...
  function P0 (line 40) | function P0(e,t){var n=_e;_e|=1;try{return e(t)}finally{_e=n,_e===0&&(rc...
  function ki (line 40) | function ki(e){bs!==null&&bs.tag===0&&!(_e&6)&&Ua();var t=_e;_e|=1;var n...
  function C0 (line 40) | function C0(){Hn=_a.current,tt(_a)}
  function wi (line 40) | function wi(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHa...
  function v_ (line 40) | function v_(e,t){do{var n=Ct;try{if(a0(),ch.current=bp,wp){for(var r=lt....
  function x_ (line 40) | function x_(){var e=Pp.current;return Pp.current=bp,e===null?bp:e}
  function I0 (line 40) | function I0(){(Et===0||Et===3||Et===2)&&(Et=4),At===null||!(_i&268435455...
  function Ep (line 40) | function Ep(e,t){var n=_e;_e|=2;var r=x_();(At!==e||Bt!==t)&&(_o=null,wi...
  function ZR (line 40) | function ZR(){for(;Ct!==null;)w_(Ct)}
  function QR (line 40) | function QR(){for(;Ct!==null&&!PD();)w_(Ct)}
  function w_ (line 40) | function w_(e){var t=C_(e.alternate,e,Hn);e.memoizedProps=e.pendingProps...
  function b_ (line 40) | function b_(e){var t=e;do{var n=t.alternate;if(e=t.return,t.flags&32768)...
  function di (line 40) | function di(e,t,n){var r=Fe,o=gr.transition;try{gr.transition=null,Fe=1,...
  function JR (line 40) | function JR(e,t,n,r){do Ua();while(bs!==null);if(_e&6)throw Error(Y(327)...
  function Ua (line 40) | function Ua(){if(bs!==null){var e=nE(Ip),t=gr.transition,n=Fe;try{if(gr....
  function Kb (line 40) | function Kb(e,t,n){t=nc(n,t),t=n_(e,t,1),e=Ts(e,t,1),t=gn(),e!==null&&(I...
  function ft (line 40) | function ft(e,t,n){if(e.tag===3)Kb(e,e,n);else for(;t!==null;){if(t.tag=...
  function e3 (line 40) | function e3(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),t=gn(),e.ping...
  function P_ (line 40) | function P_(e,t){t===0&&(e.mode&1?(t=id,id<<=1,!(id&130023424)&&(id=4194...
  function t3 (line 40) | function t3(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),P_(e,n)}
  function n3 (line 40) | function n3(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.mem...
  function I_ (line 40) | function I_(e,t){return QI(e,t)}
  function r3 (line 40) | function r3(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this....
  function fr (line 40) | function fr(e,t,n,r){return new r3(e,t,n,r)}
  function E0 (line 40) | function E0(e){return e=e.prototype,!(!e||!e.isReactComponent)}
  function o3 (line 40) | function o3(e){if(typeof e=="function")return E0(e)?1:0;if(e!=null){if(e...
  function As (line 40) | function As(e,t){var n=e.alternate;return n===null?(n=fr(e.tag,t,e.key,e...
  function ph (line 40) | function ph(e,t,n,r,o,s){var i=2;if(r=e,typeof e=="function")E0(e)&&(i=1...
  function bi (line 40) | function bi(e,t,n,r){return e=fr(7,e,r,t),e.lanes=n,e}
  function If (line 40) | function If(e,t,n,r){return e=fr(22,e,r,t),e.elementType=DI,e.lanes=n,e....
  function em (line 40) | function em(e,t,n){return e=fr(6,e,null,t),e.lanes=n,e}
  function tm (line 40) | function tm(e,t,n){return t=fr(4,e.children!==null?e.children:[],e.key,t...
  function s3 (line 40) | function s3(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork...
  function _0 (line 40) | function _0(e,t,n,r,o,s,i,a,c){return e=new s3(e,t,n,a,c),t===1?(t=1,s==...
  function i3 (line 40) | function i3(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?argum...
  function E_ (line 40) | function E_(e){if(!e)return Rs;e=e._reactInternals;e:{if(Bi(e)!==e||e.ta...
  function __ (line 40) | function __(e,t,n,r,o,s,i,a,c){return e=_0(n,r,!0,e,o,s,i,a,c),e.context...
  function Ef (line 40) | function Ef(e,t,n,r){var o=t.current,s=gn(),i=Ms(o);return n=E_(n),t.con...
  function _p (line 40) | function _p(e){if(e=e.current,!e.child)return null;switch(e.child.tag){c...
  function Wb (line 40) | function Wb(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var...
  function k0 (line 40) | function k0(e,t){Wb(e,t),(e=e.alternate)&&Wb(e,t)}
  function a3 (line 40) | function a3(){return null}
  function T0 (line 40) | function T0(e){this._internalRoot=e}
  function _f (line 40) | function _f(e){this._internalRoot=e}
  function $0 (line 40) | function $0(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
  function kf (line 40) | function kf(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
  function Vb (line 40) | function Vb(){}
  function c3 (line 40) | function c3(e,t,n,r,o){if(o){if(typeof r=="function"){var s=r;r=function...
  function Tf (line 40) | function Tf(e,t,n,r,o){var s=n._reactRootContainer;if(s){var i=s;if(type...
  function T_ (line 40) | function T_(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __R...
  function h3 (line 40) | async function h3(e,t){const{url:n,style:r="normal",weight:o="500",displ...
  function M_ (line 47) | function M_(e){return e&&typeof e=="object"&&"parents"in e}
  function A_ (line 47) | function A_(e){for(let t=0,n=e.parents.length;t<n;t++)if(e.parents[t].__...
  function j_ (line 47) | function j_(e,t){return e===t||Object.is(e,t)||!!(e&&t&&typeof e.equals=...
  function Gs (line 47) | function Gs(e,t){const n=Symbol.for(`com.tldraw.state/${e}`),r=globalThi...
  class Tp (line 47) | class Tp{constructor(){m(this,"arraySize",0);m(this,"array",Array(Yb));m...
    method constructor (line 47) | constructor(){m(this,"arraySize",0);m(this,"array",Array(Yb));m(this,"...
    method isEmpty (line 47) | get isEmpty(){if(this.array)return this.arraySize===0;if(this.set)retu...
    method add (line 47) | add(t){if(this.array)return this.array.indexOf(t)!==-1?!1:this.arraySi...
    method remove (line 47) | remove(t){if(this.array){const n=this.array.indexOf(t);return n===-1?!...
    method visit (line 47) | visit(t){if(this.array){for(let n=0;n<this.arraySize;n++){const r=this...
    method has (line 47) | has(t){return this.array?this.array.indexOf(t)!==-1:this.set.has(t)}
    method clear (line 47) | clear(){this.set?this.set.clear():(this.arraySize=0,this.array=[])}
    method size (line 47) | size(){return this.set?this.set.size:this.arraySize}
  class O_ (line 47) | class O_{constructor(t){m(this,"index",0);m(this,"buffer");this.capacity...
    method constructor (line 47) | constructor(t){m(this,"index",0);m(this,"buffer");this.capacity=t,this...
    method pushEntry (line 47) | pushEntry(t,n,r){if(r!==void 0){if(r===qn){this.clear();return}this.bu...
    method clear (line 47) | clear(){this.index=0,this.buffer.fill(void 0)}
    method getChangesSince (line 47) | getChangesSince(t){const{index:n,capacity:r,buffer:o}=this;for(let s=0...
  class p3 (line 47) | class p3{constructor(t,n){m(this,"offset",0);m(this,"maybeRemoved");this...
    method constructor (line 47) | constructor(t,n){m(this,"offset",0);m(this,"maybeRemoved");this.below=...
  function D_ (line 47) | function D_(e){yt.stack=new p3(yt.stack,e),e.parentSet.clear()}
  function R_ (line 47) | function R_(){const e=yt.stack;if(yt.stack=e.below,e.offset<e.child.pare...
  function $p (line 47) | function $p(e){if(yt.stack){if(yt.stack.child.parentSet.has(e))return;if...
  class f3 (line 47) | class f3{constructor(t,n,r){m(this,"_isActivelyListening",!1);m(this,"la...
    method constructor (line 47) | constructor(t,n,r){m(this,"_isActivelyListening",!1);m(this,"lastTrave...
    method isActivelyListening (line 47) | get isActivelyListening(){return this._isActivelyListening}
    method scheduleCount (line 47) | get scheduleCount(){return this._scheduleCount}
    method maybeScheduleEffect (line 47) | maybeScheduleEffect(){if(this._isActivelyListening&&this.lastReactedEp...
    method scheduleEffect (line 47) | scheduleEffect(){this._scheduleCount++,this._scheduleEffect?this._sche...
    method attach (line 47) | attach(){this._isActivelyListening=!0;for(let t=0,n=this.parents.lengt...
    method detach (line 47) | detach(){this._isActivelyListening=!1;for(let t=0,n=this.parents.lengt...
    method execute (line 47) | execute(){try{D_(this);const t=this.runEffect(this.lastReactedEpoch);r...
  function Sc (line 47) | function Sc(e,t,n){const r=new yc(e,t,n);return r.attach(),r.scheduleEff...
  function g3 (line 47) | function g3(e,t,n){const r=new yc(e,t,n);return{scheduler:r,start:o=>{co...
  class m3 (line 47) | class m3{constructor(t){m(this,"initialAtomValues",new Map);this.parent=...
    method constructor (line 47) | constructor(t){m(this,"initialAtomValues",new Map);this.parent=t}
    method isRoot (line 47) | get isRoot(){return this.parent===null}
    method commit (line 47) | commit(){if(this.isRoot){const t=this.initialAtomValues;this.initialAt...
    method abort (line 47) | abort(){Jt.globalEpoch++,this.initialAtomValues.forEach((t,n)=>{var r;...
  function dn (line 47) | function dn(){return Jt.globalEpoch}
  function L_ (line 47) | function L_(e){if(Jt.globalIsReacting)throw new Error("cannot change ato...
  function y3 (line 47) | function y3(e,t){Jt.currentTransaction?Jt.currentTransaction.initialAtom...
  function S3 (line 47) | function S3(){Jt.globalEpoch++}
  function v3 (line 47) | function v3(e){const t=new m3(Jt.currentTransaction);Jt.currentTransacti...
  function Mr (line 47) | function Mr(e){return Jt.currentTransaction?e():v3(e)}
  class x3 (line 47) | class x3{constructor(t,n,r){m(this,"isEqual");m(this,"computeDiff");m(th...
    method constructor (line 47) | constructor(t,n,r){m(this,"isEqual");m(this,"computeDiff");m(this,"las...
    method __unsafe__getWithoutCapture (line 47) | __unsafe__getWithoutCapture(t){return this.current}
    method get (line 47) | get(){return $p(this),this.current}
    method set (line 47) | set(t,n){var o,s;if(((o=this.isEqual)==null?void 0:o.call(this,this.cu...
    method update (line 47) | update(t){return this.set(t(this.current))}
    method getDiffSince (line 47) | getDiffSince(t){var n;return $p(this),t>=this.lastChangedEpoch?Do:((n=...
  function fn (line 47) | function fn(e,t,n){return new w3(e,t,n)}
  function b3 (line 47) | function b3(){Xb||(Xb=!0,console.warn(`Using \`@computed\` as a decorato...
  method constructor (line 60) | constructor(t,n){this.value=t,this.diff=n}
  function fl (line 60) | function fl(e,t){return new TS(e,t)}
  class P3 (line 60) | class P3{constructor(t,n,r){m(this,"lastChangedEpoch",mi);m(this,"lastTr...
    method constructor (line 60) | constructor(t,n,r){m(this,"lastChangedEpoch",mi);m(this,"lastTraversed...
    method isActivelyListening (line 60) | get isActivelyListening(){return!this.children.isEmpty}
    method __unsafe__getWithoutCapture (line 60) | __unsafe__getWithoutCapture(t){var r;if(!(this.lastChangedEpoch===mi)&...
    method get (line 60) | get(){try{return this.__unsafe__getWithoutCapture()}finally{$p(this)}}
    method getDiffSince (line 60) | getDiffSince(t){var n;return this.__unsafe__getWithoutCapture(!0),$p(t...
  function C3 (line 60) | function C3(e={},t,n,r){const o=r.value,s=Symbol.for("__@tldraw/state__c...
  function qb (line 60) | function qb(e={},t,n,r){return r.get?(b3(),I3(e,t,n,r)):C3(e,t,n,r)}
  function I3 (line 60) | function I3(e={},t,n,r){const o=r.get,s=Symbol.for("__@tldraw/state__com...
  function V (line 60) | function V(){if(arguments.length===1){const e=arguments[0];return(t,n,r)...
  function $f (line 60) | function $f(e,t){const n=Se.useRef(t);n.current=t;const[r,o,s]=Se.useMem...
  method apply (line 60) | apply(e,t,n){return $f(e.displayName??e.name??"tracked(???)",()=>e.apply...
  function or (line 60) | function or(e){let t=null;const n=e.$$typeof;return n===k3&&(e=e.type,t=...
  function $3 (line 60) | function $3(){const e=arguments[0],t=arguments[1],n=arguments.length===3...
  function js (line 60) | function js(e,t,n=Do){x.useEffect(()=>{const r=new yc(e,t);return r.atta...
  function K (line 60) | function K(){const e=arguments,t=e.length===3?e[2]:[e[0]],n=e.length===3...
  class fh (line 60) | class fh{constructor(t){m(this,"nextValue");m(this,"diff");this.previous...
    method constructor (line 60) | constructor(t){m(this,"nextValue");m(this,"diff");this.previousValue=t}
    method get (line 60) | get(){var r,o,s,i;const t=((o=(r=this.diff)==null?void 0:r.removed)==n...
    method _add (line 60) | _add(t,n){var r,o;this.nextValue??(this.nextValue=new Set(this.previou...
    method add (line 60) | add(t){var o,s,i;const n=this.previousValue.has(t);if(n)return((s=(o=t...
    method _remove (line 60) | _remove(t,n){var r,o;this.nextValue??(this.nextValue=new Set(this.prev...
    method remove (line 60) | remove(t){var o,s,i,a;const n=this.previousValue.has(t);if(!n)return((...
  function Mp (line 60) | function Mp(e,t){const n=[];e:for(const r of e){for(const o of n)if(t?t(...
  function fe (line 60) | function fe(e){return e.filter(t=>t!=null)}
  function Wn (line 60) | function Wn(e){return e[e.length-1]}
  function M3 (line 60) | function M3(e,t){let n,r=1/0;for(const o of e){const s=t(o);s<r&&(n=o,r=...
  function A3 (line 60) | function A3(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(l...
  function N_ (line 60) | function N_(e,t){let n,r;return function(...o){return n||(n=!0,setTimeou...
  function z_ (line 60) | function z_(e){const t=(...n)=>{try{return e(...n)}catch(r){throw r inst...
  method ok (line 60) | ok(e){return{ok:!0,value:e}}
  method err (line 60) | err(e){return{ok:!1,error:e}}
  function qo (line 60) | function qo(e,t){const n=t&&e&&typeof e=="object"&&t in e?e[t]:e;throw n...
  function B_ (line 60) | function B_(e,t){let n;const r=(...o)=>(n||(n={},n.promise=new Promise((...
  function j0 (line 60) | function j0(e,t){if(typeof e!="object"||e===null)return;let n=Qb.get(e);...
  class Ka (line 60) | class Ka{static async dataUrlToArrayBuffer(t){return fetch(t).then(funct...
    method dataUrlToArrayBuffer (line 60) | static async dataUrlToArrayBuffer(t){return fetch(t).then(function(n){...
    method blobToDataUrl (line 60) | static async blobToDataUrl(t){return await new Promise((n,r)=>{if(t){c...
    method blobToText (line 60) | static async blobToText(t){return await new Promise((n,r)=>{if(t){cons...
  function $S (line 60) | function $S(e){let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeA...
  function j3 (line 60) | function j3(e){const t=new DataView(e);let n=0;for(let r=0;r<t.byteLengt...
  class Zr (line 60) | class Zr{static isPng(t,n){return t.getUint8(n+0)===137&&t.getUint8(n+1)...
    method isPng (line 60) | static isPng(t,n){return t.getUint8(n+0)===137&&t.getUint8(n+1)===80&&...
    method getChunkType (line 60) | static getChunkType(t,n){return[String.fromCharCode(t.getUint8(n)),Str...
    method readChunks (line 60) | static readChunks(t,n=0){const r={};if(!Zr.isPng(t,n))throw new Error(...
    method parsePhys (line 60) | static parsePhys(t,n){return{ppux:t.getUint32(n),ppuy:t.getUint32(n+4)...
    method findChunk (line 60) | static findChunk(t,n){return Zr.readChunks(t)[n]}
    method setPhysChunk (line 60) | static setPhysChunk(t,n=1,r){let o=46,s=0;const i=Zr.findChunk(t,"pHYs...
  class jo (line 60) | class jo{static loadVideo(t){return new Promise((n,r)=>{const o=document...
    method loadVideo (line 60) | static loadVideo(t){return new Promise((n,r)=>{const o=document.create...
    method loadImage (line 60) | static loadImage(t){return new Promise((n,r)=>{const o=new Image;o.onl...
    method getVideoSize (line 60) | static async getVideoSize(t){return jo.usingObjectURL(t,async n=>{cons...
    method getImageSize (line 60) | static async getImageSize(t){const n=await jo.usingObjectURL(t,jo.load...
    method usingObjectURL (line 60) | static async usingObjectURL(t,n){const r=URL.createObjectURL(t);try{re...
  function Ys (line 60) | function Ys(e=""){let t=0,n=0,r=0,o=0;function s(){const i=t^t<<11;retur...
  function Ap (line 60) | function Ap(e,t,n,r=!1){const[o,s]=t,[i,a]=n,c=i+(e-o)/(s-o)*(a-i);retur...
  function ro (line 60) | function ro(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
  function Lr (line 60) | function Lr(e,t){if(ro(e,t))return e[t]}
  function t1 (line 60) | function t1(e){return Object.keys(e)}
  function bt (line 60) | function bt(e){return Object.values(e)}
  function An (line 60) | function An(e){return Object.entries(e)}
  function O0 (line 60) | function O0(e){return Object.fromEntries(e)}
  function nm (line 60) | function nm(e,t){const n={};let r=!1;for(const[o,s]of An(e))t(o,s)?n[o]=...
  function Mf (line 60) | function Mf(e,t){const n={};for(const[r,o]of An(e)){const s=t(r,o);n[r]=...
  function U_ (line 60) | function U_(e,t){if(e===t)return!0;const n=new Set(Object.keys(e)),r=new...
  function W_ (line 60) | function W_(e){if(e>="a"&&e<="z")return e.charCodeAt(0)-97+2;if(e>="A"&&...
  function V_ (line 60) | function V_(e){if(e.length!==W_(e.charAt(0)))throw new Error("invalid in...
  function n1 (line 60) | function n1(e){if(e===void 0)throw Error("n is undefined")}
  function r1 (line 60) | function r1(e){V_(e);const[t,...n]=e.split("");let r=!0;for(let o=n.leng...
  function D3 (line 60) | function D3(e){V_(e);const[t,...n]=e.split("");let r=!0;for(let o=n.leng...
  function ka (line 60) | function ka(e,t){if(t!==void 0&&e>=t)throw new Error(e+" >= "+t);if(e.sl...
  function gl (line 60) | function gl(e){const t=W_(e.charAt(0));if(t>e.length)throw new Error("in...
  function AS (line 60) | function AS(e){if(e===K_)throw new Error("invalid index: "+e);const t=gl...
  function Ji (line 60) | function Ji(e,t){if(e!==void 0&&AS(e),t!==void 0&&AS(t),e!==void 0&&t!==...
  function Ls (line 60) | function Ls(e,t,n){if(n===0)return[];if(n===1)return[Ji(e,t)];if(t===voi...
  function L3 (line 60) | function L3(e){AS(e)}
  function oc (line 60) | function oc(e,t,n){return Ls(e,t,n)}
  function rm (line 60) | function rm(e,t){return Ls(e,void 0,t)}
  function kl (line 60) | function kl(e,t){return Ls(e,t,1)[0]}
  function $o (line 60) | function $o(e){return Ls(e,void 0,1)[0]}
  function F3 (line 60) | function F3(e){return Ls(void 0,e,1)[0]}
  function eu (line 60) | function eu(e,t="a1"){return[t,...Ls(t,void 0,e)]}
  function en (line 60) | function en(e,t){return e.index<t.index?-1:e.index>t.index?1:0}
  function N3 (line 60) | function N3(e,t){return e.id>t.id?1:-1}
  function D0 (line 60) | function D0(e){try{return localStorage.getItem(e)}catch{return null}}
  function R0 (line 60) | function R0(e,t){try{localStorage.setItem(e,t)}catch{}}
  function z3 (line 60) | function z3(){try{localStorage.clear()}catch{}}
  function G_ (line 60) | function G_(e){try{return sessionStorage.getItem(e)}catch{return null}}
  function L0 (line 60) | function L0(e,t){try{sessionStorage.setItem(e,t)}catch{}}
  function Y_ (line 60) | function Y_(e){try{sessionStorage.removeItem(e)}catch{}}
  function B3 (line 60) | function B3(){try{sessionStorage.clear()}catch{}}
  function X_ (line 60) | function X_(){if(Vc)return;const e=Date.now(),t=e-jS;if(om+t<gh){Vc=requ...
  function q_ (line 60) | function q_(e){return U3()?(e(),()=>{}):(Ta.includes(e)||(Ta.push(e),o1|...
  function W3 (line 60) | function W3(e){return e!==null}
  function V3 (line 60) | function V3(){return typeof globalThis<"u"&&globalThis.structuredClone?[...
  class F0 (line 60) | class F0{constructor(t,n){m(this,"createDefaultProperties");m(this,"vali...
    method constructor (line 60) | constructor(t,n){m(this,"createDefaultProperties");m(this,"validator")...
    method create (line 60) | create(t){const n={...this.createDefaultProperties(),id:this.createId(...
    method clone (line 60) | clone(t){return{...Ye(t),id:this.createId()}}
    method createId (line 60) | createId(t){return this.typeName+":"+(t??Q_())}
    method createCustomId (line 60) | createCustomId(t){return this.typeName+":"+t}
    method parseId (line 60) | parseId(t){if(!this.isId(t))throw new Error(`ID "${t}" is not a valid ...
    method isId (line 60) | isId(t){if(!t)return!1;for(let n=0;n<this.typeName.length;n++)if(t[n]!...
    method withDefaultProperties (line 60) | withDefaultProperties(t){return new F0(this.typeName,{createDefaultPro...
    method validate (line 60) | validate(t,n){return n&&this.validator.validateUsingKnownGoodVersion?t...
  function Zo (line 60) | function Zo(e,t){return new F0(e,{createDefaultProperties:()=>({}),valid...
  class s1 (line 60) | class s1{constructor(){m(this,"items",new WeakMap)}get(t,n){return this....
    method constructor (line 60) | constructor(){m(this,"items",new WeakMap)}
    method get (line 60) | get(t,n){return this.items.has(t)||this.items.set(t,n(t)),this.items.g...
  function qe (line 60) | function qe(M,D){for(var G=-1,ee=M==null?0:M.length,Ze=0,me=[];++G<ee;){...
  function Ot (line 60) | function Ot(M,D){for(var G=-1,ee=D.length,Ze=M.length;++G<ee;)M[Ze+G]=D[...
  function wo (line 60) | function wo(M,D){for(var G=-1,ee=M==null?0:M.length;++G<ee;)if(D(M[G],G,...
  function Ac (line 60) | function Ac(M,D){for(var G=-1,ee=Array(M);++G<M;)ee[G]=D(G);return ee}
  function jc (line 60) | function jc(M){return function(D){return M(D)}}
  function bg (line 60) | function bg(M,D){return M.has(D)}
  function qi (line 60) | function qi(M,D){return M==null?void 0:M[D]}
  function jj (line 60) | function jj(M){var D=-1,G=Array(M.size);return M.forEach(function(ee,Ze)...
  function Oj (line 60) | function Oj(M,D){return function(G){return M(D(G))}}
  function Dj (line 60) | function Dj(M){var D=-1,G=Array(M.size);return M.forEach(function(ee){G[...
  function ri (line 60) | function ri(M){var D=-1,G=M==null?0:M.length;for(this.clear();++D<G;){va...
  function Gj (line 60) | function Gj(){this.__data__=Dc?Dc(null):{},this.size=0}
  function Yj (line 60) | function Yj(M){var D=this.has(M)&&delete this.__data__[M];return this.si...
  function Xj (line 60) | function Xj(M){var D=this.__data__;if(Dc){var G=D[M];return G===r?void 0...
  function qj (line 60) | function qj(M){var D=this.__data__;return Dc?D[M]!==void 0:Wr.call(D,M)}
  function Zj (line 60) | function Zj(M,D){var G=this.__data__;return this.size+=this.has(M)?0:1,G...
  function bo (line 60) | function bo(M){var D=-1,G=M==null?0:M.length;for(this.clear();++D<G;){va...
  function Qj (line 60) | function Qj(){this.__data__=[],this.size=0}
  function Jj (line 60) | function Jj(M){var D=this.__data__,G=qu(D,M);if(G<0)return!1;var ee=D.le...
  function eO (line 60) | function eO(M){var D=this.__data__,G=qu(D,M);return G<0?void 0:D[G][1]}
  function tO (line 60) | function tO(M){return qu(this.__data__,M)>-1}
  function nO (line 60) | function nO(M,D){var G=this.__data__,ee=qu(G,M);return ee<0?(++this.size...
  function oi (line 60) | function oi(M){var D=-1,G=M==null?0:M.length;for(this.clear();++D<G;){va...
  function rO (line 60) | function rO(){this.size=0,this.__data__={hash:new ri,map:new(Oc||bo),str...
  function oO (line 60) | function oO(M){var D=Zu(this,M).delete(M);return this.size-=D?1:0,D}
  function sO (line 60) | function sO(M){return Zu(this,M).get(M)}
  function iO (line 60) | function iO(M){return Zu(this,M).has(M)}
  function aO (line 60) | function aO(M,D){var G=Zu(this,M),ee=G.size;return G.set(M,D),this.size+...
  function Xu (line 60) | function Xu(M){var D=-1,G=M==null?0:M.length;for(this.__data__=new oi;++...
  function cO (line 60) | function cO(M){return this.__data__.set(M,r),this}
  function lO (line 60) | function lO(M){return this.__data__.has(M)}
  function is (line 60) | function is(M){var D=this.__data__=new bo(M);this.size=D.size}
  function uO (line 60) | function uO(){this.__data__=new bo,this.size=0}
  function dO (line 60) | function dO(M){var D=this.__data__,G=D.delete(M);return this.size=D.size,G}
  function hO (line 60) | function hO(M){return this.__data__.get(M)}
  function pO (line 60) | function pO(M){return this.__data__.has(M)}
  function fO (line 60) | function fO(M,D){var G=this.__data__;if(G instanceof bo){var ee=G.__data...
  function gO (line 60) | function gO(M,D){var G=Qu(M),ee=!G&&$O(M),Ze=!G&&!ee&&Tg(M),me=!G&&!ee&&...
  function qu (line 60) | function qu(M,D){for(var G=M.length;G--;)if(jw(M[G][0],D))return G;retur...
  function mO (line 60) | function mO(M,D,G){var ee=D(M);return Qu(M)?ee:Ot(ee,G(M))}
  function Rc (line 60) | function Rc(M){return M==null?M===void 0?$:S:ni&&ni in Object(M)?PO(M):T...
  function Tw (line 60) | function Tw(M){return Lc(M)&&Rc(M)==a}
  function $w (line 60) | function $w(M,D,G,ee,Ze){return M===D?!0:M==null||D==null||!Lc(M)&&!Lc(D...
  function yO (line 60) | function yO(M,D,G,ee,Ze,me){var pt=Qu(M),kt=Qu(D),Dt=pt?c:as(M),st=kt?c:...
  function SO (line 60) | function SO(M){if(!Rw(M)||_O(M))return!1;var D=Ow(M)?Fj:be;return D.test...
  function vO (line 60) | function vO(M){return Lc(M)&&Dw(M.length)&&!!ae[Rc(M)]}
  function xO (line 60) | function xO(M){if(!kO(M))return Bj(M);var D=[];for(var G in Object(M))Wr...
  function Mw (line 60) | function Mw(M,D,G,ee,Ze,me){var pt=G&o,kt=M.length,Dt=D.length;if(kt!=Dt...
  function wO (line 60) | function wO(M,D,G,ee,Ze,me,pt){switch(G){case N:if(M.byteLength!=D.byteL...
  function bO (line 60) | function bO(M,D,G,ee,Ze,me){var pt=G&o,kt=Aw(M),Dt=kt.length,st=Aw(D),Nn...
  function Aw (line 60) | function Aw(M){return mO(M,jO,CO)}
  function Zu (line 60) | function Zu(M,D){var G=M.__data__;return EO(D)?G[typeof D=="string"?"str...
  function Zi (line 60) | function Zi(M,D){var G=qi(M,D);return SO(G)?G:void 0}
  function PO (line 60) | function PO(M){var D=Wr.call(M,ni),G=M[ni];try{M[ni]=void 0;var ee=!0}ca...
  function IO (line 60) | function IO(M,D){return D=D??i,!!D&&(typeof M=="number"||Me.test(M))&&M>...
  function EO (line 60) | function EO(M){var D=typeof M;return D=="string"||D=="number"||D=="symbo...
  function _O (line 60) | function _O(M){return!!bw&&bw in M}
  function kO (line 60) | function kO(M){var D=M&&M.constructor,G=typeof D=="function"&&D.prototyp...
  function TO (line 60) | function TO(M){return Pw.call(M)}
  function si (line 60) | function si(M){if(M!=null){try{return ww.call(M)}catch{}try{return M+""}...
  function jw (line 60) | function jw(M,D){return M===D||M!==M&&D!==D}
  function MO (line 60) | function MO(M){return M!=null&&Dw(M.length)&&!Ow(M)}
  function AO (line 60) | function AO(M,D){return $w(M,D)}
  function Ow (line 60) | function Ow(M){if(!Rw(M))return!1;var D=Rc(M);return D==f||D==y||D==l||D...
  function Dw (line 60) | function Dw(M){return typeof M=="number"&&M>-1&&M%1==0&&M<=i}
  function Rw (line 60) | function Rw(M){var D=typeof M;return M!=null&&(D=="object"||D=="function")}
  function Lc (line 60) | function Lc(M){return M!=null&&typeof M=="object"}
  function jO (line 60) | function jO(M){return MO(M)?gO(M):xO(M)}
  function OO (line 60) | function OO(){return[]}
  function DO (line 60) | function DO(){return!1}
  function q3 (line 60) | function q3(e){if(e.length===0)return new Set;const t=e[0],n=e.slice(1),...
  function Z3 (line 60) | function Z3(e,t){const n={};for(const r of t)e.has(r)||(n.added??(n.adde...
  function i1 (line 60) | function i1(e,t){for(const[n,r]of Object.entries(e)){const o=r,s=t[n];if...
  function a1 (line 60) | function a1(e,t,n){const r=Object.fromEntries(Object.keys(n).map(o=>[o,n...
  class Q3 (line 60) | class Q3{constructor(t,n){m(this,"indexCache",new Map);m(this,"historyCa...
    method constructor (line 60) | constructor(t,n){m(this,"indexCache",new Map);m(this,"historyCache",ne...
    method filterHistory (line 60) | filterHistory(t){if(this.historyCache.has(t))return this.historyCache....
    method index (line 60) | index(t,n){const r=t+":"+n;if(this.indexCache.has(r))return this.index...
    method __uncached_createIndex (line 60) | __uncached_createIndex(t,n){const r=this.filterHistory(t),o=()=>{r.get...
    method record (line 60) | record(t,n=()=>({}),r="record:"+t+(n?":"+n.toString():"")){const o=thi...
    method records (line 60) | records(t,n=()=>({}),r="records:"+t+(n?":"+n.toString():"")){const o=t...
    method ids (line 60) | ids(t,n=()=>({}),r="ids:"+t+(n?":"+n.toString():"")){const o=this.filt...
    method exec (line 60) | exec(t,n){const r=a1(this,t,n);if(r.size===0)return Do;const o=this.at...
  class J_ (line 60) | class J_{constructor(t){m(this,"id",Q_());m(this,"atoms",fn("store_atoms...
    method constructor (line 60) | constructor(t){m(this,"id",Q_());m(this,"atoms",fn("store_atoms",{}));...
    method _flushHistory (line 60) | _flushHistory(){if(this.historyAccumulator.hasChanges()){const t=this....
    method filterChangesByScope (line 60) | filterChangesByScope(t,n){const r={added:nm(t.added,(o,s)=>this.scoped...
    method updateHistory (line 60) | updateHistory(t){this.historyAccumulator.add({changes:t,source:this.is...
    method validate (line 60) | validate(t){this.allRecords().forEach(n=>this.schema.validateRecord(th...
    method getSnapshot (line 60) | getSnapshot(t="document"){return{store:this.serialize(t),schema:this.s...
    method migrateSnapshot (line 60) | migrateSnapshot(t){const n=this.schema.migrateStoreSnapshot(t);if(n.ty...
    method loadSnapshot (line 60) | loadSnapshot(t){const n=this.schema.migrateStoreSnapshot(t);if(n.type=...
    method extractingChanges (line 60) | extractingChanges(t){const n=[],r=this.historyAccumulator.intercepting...
    method applyDiff (line 60) | applyDiff(t,n=!0){const r=this._runCallbacks;try{this._runCallbacks=n,...
    method ensureStoreIsUsable (line 60) | ensureStoreIsUsable(){var t;this._integrityChecker??(this._integrityCh...
    method markAsPossiblyCorrupted (line 60) | markAsPossiblyCorrupted(){this._isPossiblyCorrupted=!0}
    method isPossiblyCorrupted (line 60) | isPossiblyCorrupted(){return this._isPossiblyCorrupted}
  function Af (line 60) | function Af(e){const t={added:{},removed:{},updated:{}};for(const n of e...
  function J3 (line 60) | function J3(e){if(e.length===0)return[];const t=[];let n=[e[0]],r;for(le...
  class eL (line 60) | class eL{constructor(){m(this,"_history",[]);m(this,"_interceptors",new ...
    method constructor (line 60) | constructor(){m(this,"_history",[]);m(this,"_interceptors",new Set)}
    method intercepting (line 60) | intercepting(t){return this._interceptors.add(t),()=>{this._intercepto...
    method add (line 60) | add(t){this._history.push(t);for(const n of this._interceptors)n(t)}
    method flush (line 60) | flush(){const t=J3(this._history);return this._history=[],t}
    method clear (line 60) | clear(){this._history=[]}
    method hasChanges (line 60) | hasChanges(){return this._history.length>0}
  function tL (line 60) | function tL(e){const t=[];for(let n=e.length-1;n>=0;n--){const r=e[n];if...
  function Tl (line 60) | function Tl({sequence:e,sequenceId:t,retroactive:n=!0}){const r={sequenc...
  function sr (line 60) | function sr(e,t){return Object.fromEntries(An(t).map(([n,r])=>[n,`${e}/$...
  function xr (line 60) | function xr(e){const t=e.sequenceId;return Tl({sequenceId:t,retroactive:...
  function nL (line 60) | function nL(e){const t=new Map(e.map(s=>[s.id,s])),n=new Set,r=[];functi...
  function Op (line 60) | function Op(e){const[t,n]=e.split("/");return{sequenceId:t,version:parse...
  function c1 (line 60) | function c1(e,t){t&&_t(e.startsWith(t+"/"),`Every migration in sequence ...
  function ek (line 60) | function ek(e){if(_t(!e.sequenceId.includes("/"),`sequenceId cannot cont...
  function rL (line 60) | function rL(e){if(e.schemaVersion>2||e.schemaVersion<1)return Ha.err("Ba...
  class N0 (line 60) | class N0{constructor(t,n){m(this,"migrations",{});m(this,"sortedMigratio...
    method constructor (line 60) | constructor(t,n){m(this,"migrations",{});m(this,"sortedMigrations");va...
    method create (line 60) | static create(t,n){return new N0(t,n??{})}
    method validateRecord (line 60) | validateRecord(t,n,r,o){try{const s=Lr(this.types,n.typeName);if(!s)th...
    method getMigrationsSince (line 60) | getMigrationsSince(t){const n=rL(t);if(!n.ok)return n;const r=n.value,...
    method migratePersistedRecord (line 60) | migratePersistedRecord(t,n,r="up"){const o=this.getMigrationsSince(n);...
    method migrateStoreSnapshot (line 60) | migrateStoreSnapshot(t){let{store:n}=t;const r=this.getMigrationsSince...
    method createIntegrityChecker (line 60) | createIntegrityChecker(t){var n,r;return((r=(n=this.options).createInt...
    method serialize (line 60) | serialize(){return{schemaVersion:2,sequences:Object.fromEntries(Object...
    method serializeEarliestVersion (line 60) | serializeEarliestVersion(){return{schemaVersion:2,sequences:Object.fro...
  function oL (line 60) | function oL(e){if(!e.length)return null;let t="";for(const n of e)typeof...
  class Ce (line 60) | class Ce extends Error{constructor(n,r=[]){const o=oL(r),s=n.split(`
    method constructor (line 60) | constructor(n,r=[]){const o=oL(r),s=n.split(`
  function jn (line 62) | function jn(e,t){try{return t()}catch(n){throw n instanceof Ce?new Ce(n....
  function Fs (line 62) | function Fs(e){if(e===null)return"null";if(Array.isArray(e))return"an ar...
  class Sn (line 62) | class Sn{constructor(t,n){this.validationFn=t,this.validateUsingKnownGoo...
    method constructor (line 62) | constructor(t,n){this.validationFn=t,this.validateUsingKnownGoodVersio...
    method validate (line 62) | validate(t){return this.validationFn(t)}
    method validateUsingKnownGoodVersion (line 62) | validateUsingKnownGoodVersion(t,n){return Object.is(t,n)?t:this.valida...
    method isValid (line 62) | isValid(t){try{return this.validate(t),!0}catch{return!1}}
    method nullable (line 62) | nullable(){return uL(this)}
    method optional (line 62) | optional(){return nk(this)}
    method refine (line 62) | refine(t){return new Sn(n=>t(this.validate(n)),(n,r)=>{const o=this.va...
    method check (line 62) | check(t,n){return typeof t=="string"?this.refine(r=>(jn(`(check ${t})`...
  class sL (line 62) | class sL extends Sn{constructor(t){super(n=>{const r=l1.validate(n);for(...
    method constructor (line 62) | constructor(t){super(n=>{const r=l1.validate(n);for(let o=0;o<r.length...
    method nonEmpty (line 62) | nonEmpty(){return this.check(t=>{if(t.length===0)throw new Ce("Expecte...
    method lengthGreaterThan1 (line 62) | lengthGreaterThan1(){return this.check(t=>{if(t.length<=1)throw new Ce...
  class Dp (line 62) | class Dp extends Sn{constructor(t,n=!1){super(r=>{if(typeof r!="object"|...
    method constructor (line 62) | constructor(t,n=!1){super(r=>{if(typeof r!="object"||r===null)throw ne...
    method allowUnknownProperties (line 62) | allowUnknownProperties(){return new Dp(this.config,!0)}
    method extend (line 62) | extend(t){return new Dp({...this.config,...t})}
  class jf (line 62) | class jf extends Sn{constructor(t,n,r,o){super(s=>{this.expectObject(s);...
    method constructor (line 62) | constructor(t,n,r,o){super(s=>{this.expectObject(s);const{matchingSche...
    method expectObject (line 62) | expectObject(t){if(typeof t!="object"||t===null)throw new Ce(`Expected...
    method getMatchingSchemaAndVariant (line 62) | getMatchingSchemaAndVariant(t){const n=Lr(t,this.key);if(!this.useNumb...
    method validateUnknownVariants (line 62) | validateUnknownVariants(t){return new jf(this.key,this.config,t,this.u...
  class iL (line 62) | class iL extends Sn{constructor(t,n){super(r=>{if(typeof r!="object"||r=...
    method constructor (line 62) | constructor(t,n){super(r=>{if(typeof r!="object"||r===null)throw new C...
  function z0 (line 62) | function z0(e){return new Sn(t=>{if(typeof t!==e)throw new Ce(`Expected ...
  function on (line 62) | function on(e){return new Sn(t=>{if(t!==e)throw new Ce(`Expected ${e}, g...
  function Nt (line 62) | function Nt(e){return new sL(e)}
  function ve (line 62) | function ve(e){return new Dp(e)}
  function OS (line 62) | function OS(e){return typeof e=="object"&&e!==null&&(Object.getPrototype...
  function DS (line 62) | function DS(e){return e===null||typeof e=="number"||typeof e=="string"||...
  function Lp (line 62) | function Lp(e,t){return new iL(e,t)}
  function B0 (line 62) | function B0(e,t){return new jf(e,t,(n,r)=>{throw new Ce(`Expected one of...
  function lL (line 62) | function lL(e,t){return new jf(e,t,(n,r)=>{throw new Ce(`Expected one of...
  function Qo (line 62) | function Qo(e,t){return new Sn(n=>jn(e,()=>t.validate(n)),(n,r)=>jn(e,()...
  function Of (line 62) | function Of(e){return new Sn(t=>{if(!e.has(t)){const n=Array.from(e,r=>J...
  function nk (line 62) | function nk(e){return new Sn(t=>{if(t!==void 0)return e.validate(t)},(t,...
  function uL (line 62) | function uL(e){return new Sn(t=>t===null?null:e.validate(t),(t,n)=>n===n...
  function rk (line 62) | function rk(...e){return Of(new Set(e))}
  function ok (line 62) | function ok(e){try{return new URL(e)}catch{if(e.startsWith("/")||e.start...
  function mr (line 62) | function mr(e){return ge.refine(t=>{if(!t.startsWith(`${e}:`))throw new ...
  function H0 (line 62) | function H0(e,t){return ve({id:Df,typeName:on("asset"),type:on(e),props:...
  function bn (line 62) | function bn(e){return Ho.isId(e)}
  function CL (line 62) | function CL(e){const t={};for(const[r,o]of e)t[r]=nk(o);const n=Qo("inst...
  function _L (line 62) | function _L(e,t,n){return ve({id:_r,typeName:on("shape"),x:he,y:he,rotat...
  method up (line 62) | up(e){e.croppingShapeId=null}
  method up (line 62) | up(e){delete e.instanceId,delete e.cameraId}
  function FL (line 62) | function FL(e,t){return e.index<t.index?-1:e.index>t.index?1:0}
  function d1 (line 62) | function d1(e){e.typeName==="asset"&&("src"in e&&(e.src="<redacted>"),"s...
  function zL (line 62) | function zL(){return[Ho.create({id:"page:page",name:"Page 1",index:"a1",...
  function BL (line 62) | function BL(e){const t=e.query.ids("page"),n=()=>{if(!e.has(RS))return e...
  class an (line 62) | class an{constructor(t,n,r){this.id=t,this.defaultValue=n,this.type=r}st...
    method constructor (line 62) | constructor(t,n,r){this.id=t,this.defaultValue=n,this.type=r}
    method define (line 62) | static define(t,n){const{defaultValue:r,type:o=aL}=n;return new an(t,r...
    method defineEnum (line 62) | static defineEnum(t,n){const{defaultValue:r,values:o}=n;return new JL(...
    method validate (line 62) | validate(t){return this.type.validate(t)}
    method validateUsingKnownGoodVersion (line 62) | validateUsingKnownGoodVersion(t,n){return this.type.validateUsingKnown...
  class JL (line 62) | class JL extends an{constructor(t,n,r){super(t,n,rk(...r)),this.values=r}}
    method constructor (line 62) | constructor(t,n,r){super(t,n,rk(...r)),this.values=r}
  function $a (line 62) | function $a(e){return e?e.typeName==="shape":!1}
  function Kn (line 62) | function Kn(e){return e?e.startsWith("shape:"):!1}
  function Be (line 62) | function Be(e){return`shape:${e??QL()}`}
  function ck (line 62) | function ck(e){const t=new Map;for(const[n,r]of Object.entries(e))if(r i...
  function fo (line 62) | function fo(e,t){return Mf(t,(n,r)=>`com.tldraw.shape.${e}/${r}`)}
  function t5 (line 62) | function t5(e){const t=[];for(const[n,{migrations:r}]of Object.entries(e...
  function n5 (line 62) | function n5(e){return Zo("shape",{scope:"document",validator:Qo("shape",...
  function Jo (line 62) | function Jo(e){return e.isDarkMode?Np.darkMode:Np.lightMode}
  method up (line 62) | up(e){}
  function d5 (line 62) | function d5({shapes:e=u5,migrations:t}={}){const n=new Map;for(const s o...
  function h5 (line 62) | function h5(){const e=typeof window<"u"?window.navigator.languages??["en...
  function p5 (line 62) | function p5(e){for(const t of e){const n=f5(t);if(n)return n}return"en"}
  function f5 (line 62) | function f5(e){const t=ou.find(o=>o.locale===e.toLowerCase());if(t)retur...
  function n (line 66) | function n(){for(var s="",i=0;i<arguments.length;i++){var a=arguments[i]...
  function r (line 66) | function r(s){if(typeof s=="string"||typeof s=="number")return s;if(type...
  function o (line 66) | function o(s,i){return i?s?s+" "+i:s+i:s}
  class Bk (line 66) | class Bk extends x.Component{constructor(){super(...arguments);m(this,"s...
    method constructor (line 66) | constructor(){super(...arguments);m(this,"state",m5)}
    method getDerivedStateFromError (line 66) | static getDerivedStateFromError(n){return{error:n}}
    method componentDidCatch (line 66) | componentDidCatch(n){var r,o;(o=(r=this.props).onError)==null||o.call(...
    method render (line 66) | render(){const{error:n}=this.state;if(n!==null){const{fallback:r}=this...
  function su (line 66) | function su({children:e,fallback:t,...n}){return t===null?h.jsx(h.Fragme...
  function z (line 66) | function z(){return Se.useContext(Rf)}
  function y5 (line 66) | function y5(){return h.jsx("div",{className:"tl-background"})}
  function xc (line 66) | function xc(e,t,n,r,o,s){x.useLayoutEffect(()=>{const i=e.current;if(!i|...
  class P (line 66) | class P{constructor(t=0,n=0,r=1){this.x=t,this.y=n,this.z=r}get pressure...
    method constructor (line 66) | constructor(t=0,n=0,r=1){this.x=t,this.y=n,this.z=r}
    method pressure (line 66) | get pressure(){return this.z}
    method set (line 66) | set(t=this.x,n=this.y,r=this.z){return this.x=t,this.y=n,this.z=r,this}
    method setTo (line 66) | setTo({x:t=0,y:n=0,z:r=1}){return this.x=t,this.y=n,this.z=r,this}
    method rot (line 66) | rot(t){if(t===0)return this;const{x:n,y:r}=this,o=Math.sin(t),s=Math.c...
    method rotWith (line 66) | rotWith(t,n){if(n===0)return this;const r=this.x-t.x,o=this.y-t.y,s=Ma...
    method clone (line 66) | clone(){const{x:t,y:n,z:r}=this;return new P(t,n,r)}
    method sub (line 66) | sub(t){return this.x-=t.x,this.y-=t.y,this}
    method subXY (line 66) | subXY(t,n){return this.x-=t,this.y-=n,this}
    method subScalar (line 66) | subScalar(t){return this.x-=t,this.y-=t,this}
    method add (line 66) | add(t){return this.x+=t.x,this.y+=t.y,this}
    method addXY (line 66) | addXY(t,n){return this.x+=t,this.y+=n,this}
    method addScalar (line 66) | addScalar(t){return this.x+=t,this.y+=t,this}
    method clamp (line 66) | clamp(t,n){return this.x=Math.max(this.x,t),this.y=Math.max(this.y,t),...
    method div (line 66) | div(t){return this.x/=t,this.y/=t,this}
    method divV (line 66) | divV(t){return this.x/=t.x,this.y/=t.y,this}
    method mul (line 66) | mul(t){return this.x*=t,this.y*=t,this}
    method mulV (line 66) | mulV(t){return this.x*=t.x,this.y*=t.y,this}
    method abs (line 66) | abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this}
    method nudge (line 66) | nudge(t,n){const r=P.Tan(t,this);return this.add(r.mul(n))}
    method neg (line 66) | neg(){return this.x*=-1,this.y*=-1,this}
    method cross (line 66) | cross(t){return this.x=this.y*t.z-this.z*t.y,this.y=this.z*t.x-this.x*...
    method dpr (line 66) | dpr(t){return P.Dpr(this,t)}
    method cpr (line 66) | cpr(t){return P.Cpr(this,t)}
    method len2 (line 66) | len2(){return P.Len2(this)}
    method len (line 66) | len(){return P.Len(this)}
    method pry (line 66) | pry(t){return P.Pry(this,t)}
    method per (line 66) | per(){const{x:t,y:n}=this;return this.x=n,this.y=-t,this}
    method uni (line 66) | uni(){return P.Uni(this)}
    method tan (line 66) | tan(t){return P.Tan(this,t)}
    method dist (line 66) | dist(t){return P.Dist(this,t)}
    method distanceToLineSegment (line 66) | distanceToLineSegment(t,n){return P.DistanceToLineSegment(t,n,this)}
    method slope (line 66) | slope(t){return P.Slope(this,t)}
    method snapToGrid (line 66) | snapToGrid(t){return this.x=Math.round(this.x/t)*t,this.y=Math.round(t...
    method angle (line 66) | angle(t){return P.Angle(this,t)}
    method toAngle (line 66) | toAngle(){return P.ToAngle(this)}
    method lrp (line 66) | lrp(t,n){return this.x=this.x+(t.x-this.x)*n,this.y=this.y+(t.y-this.y...
    method equals (line 66) | equals(t){return P.Equals(this,t)}
    method equalsXY (line 66) | equalsXY(t,n){return P.EqualsXY(this,t,n)}
    method norm (line 66) | norm(){const t=this.len();return this.x=t===0?0:this.x/t,this.y=t===0?...
    method toFixed (line 66) | toFixed(){return P.ToFixed(this)}
    method toString (line 66) | toString(){return P.ToString(P.ToFixed(this))}
    method toJson (line 66) | toJson(){return P.ToJson(this)}
    method toArray (line 66) | toArray(){return P.ToArray(this)}
    method Add (line 66) | static Add(t,n){return new P(t.x+n.x,t.y+n.y)}
    method AddXY (line 66) | static AddXY(t,n,r){return new P(t.x+n,t.y+r)}
    method Sub (line 66) | static Sub(t,n){return new P(t.x-n.x,t.y-n.y)}
    method SubXY (line 66) | static SubXY(t,n,r){return new P(t.x-n,t.y-r)}
    method AddScalar (line 66) | static AddScalar(t,n){return new P(t.x+n,t.y+n)}
    method SubScalar (line 66) | static SubScalar(t,n){return new P(t.x-n,t.y-n)}
    method Div (line 66) | static Div(t,n){return new P(t.x/n,t.y/n)}
    method Mul (line 66) | static Mul(t,n){return new P(t.x*n,t.y*n)}
    method DivV (line 66) | static DivV(t,n){return new P(t.x/n.x,t.y/n.y)}
    method MulV (line 66) | static MulV(t,n){return new P(t.x*n.x,t.y*n.y)}
    method Neg (line 66) | static Neg(t){return new P(-t.x,-t.y)}
    method Per (line 66) | static Per(t){return new P(t.y,-t.x)}
    method Abs (line 66) | static Abs(t){return new P(Math.abs(t.x),Math.abs(t.y))}
    method Dist (line 66) | static Dist(t,n){return((t.y-n.y)**2+(t.x-n.x)**2)**.5}
    method DistMin (line 66) | static DistMin(t,n,r){return(t.x-n.x)*(t.x-n.x)+(t.y-n.y)*(t.y-n.y)<r**2}
    method Dist2 (line 66) | static Dist2(t,n){return(t.x-n.x)*(t.x-n.x)+(t.y-n.y)*(t.y-n.y)}
    method Dpr (line 66) | static Dpr(t,n){return t.x*n.x+t.y*n.y}
    method Cross (line 66) | static Cross(t,n){return new P(t.y*n.z-t.z*n.y,t.z*n.x-t.x*n.z)}
    method Cpr (line 66) | static Cpr(t,n){return t.x*n.y-n.x*t.y}
    method Len2 (line 66) | static Len2(t){return t.x*t.x+t.y*t.y}
    method Len (line 66) | static Len(t){return(t.x*t.x+t.y*t.y)**.5}
    method Pry (line 66) | static Pry(t,n){return P.Dpr(t,n)/P.Len(n)}
    method Uni (line 66) | static Uni(t){return P.Div(t,P.Len(t))}
    method Tan (line 66) | static Tan(t,n){return P.Uni(P.Sub(t,n))}
    method Min (line 66) | static Min(t,n){return new P(Math.min(t.x,n.x),Math.min(t.y,n.y))}
    method Max (line 66) | static Max(t,n){return new P(Math.max(t.x,n.x),Math.max(t.y,n.y))}
    method From (line 66) | static From({x:t,y:n,z:r=1}){return new P(t,n,r)}
    method FromArray (line 66) | static FromArray(t){return new P(t[0],t[1])}
    method Rot (line 66) | static Rot(t,n=0){const r=Math.sin(n),o=Math.cos(n);return new P(t.x*o...
    method RotWith (line 66) | static RotWith(t,n,r){const o=t.x-n.x,s=t.y-n.y,i=Math.sin(r),a=Math.c...
    method NearestPointOnLineThroughPoint (line 66) | static NearestPointOnLineThroughPoint(t,n,r){return P.Mul(n,P.Sub(r,t)...
    method NearestPointOnLineSegment (line 66) | static NearestPointOnLineSegment(t,n,r,o=!0){if(P.Equals(t,r)||P.Equal...
    method DistanceToLineThroughPoint (line 66) | static DistanceToLineThroughPoint(t,n,r){return P.Dist(r,P.NearestPoin...
    method DistanceToLineSegment (line 66) | static DistanceToLineSegment(t,n,r,o=!0){return P.Dist(r,P.NearestPoin...
    method Snap (line 66) | static Snap(t,n=1){return new P(Math.round(t.x/n)*n,Math.round(t.y/n)*n)}
    method Cast (line 66) | static Cast(t){return t instanceof P?t:P.From(t)}
    method Slope (line 66) | static Slope(t,n){return t.x===n.y?NaN:(t.y-n.y)/(t.x-n.x)}
    method IsNaN (line 66) | static IsNaN(t){return isNaN(t.x)||isNaN(t.y)}
    method Angle (line 66) | static Angle(t,n){return Math.atan2(n.y-t.y,n.x-t.x)}
    method Lrp (line 66) | static Lrp(t,n,r){return P.Sub(n,t).mul(r).add(t)}
    method Med (line 66) | static Med(t,n){return new P((t.x+n.x)/2,(t.y+n.y)/2)}
    method Equals (line 66) | static Equals(t,n){return Math.abs(t.x-n.x)<1e-4&&Math.abs(t.y-n.y)<1e-4}
    method EqualsXY (line 66) | static EqualsXY(t,n,r){return t.x===n&&t.y===r}
    method Clockwise (line 66) | static Clockwise(t,n,r){return(r.x-t.x)*(n.y-t.y)-(n.x-t.x)*(r.y-t.y)<0}
    method Rescale (line 66) | static Rescale(t,n){const r=P.Len(t);return new P(n*t.x/r,n*t.y/r)}
    method ScaleWithOrigin (line 66) | static ScaleWithOrigin(t,n,r){return P.Sub(t,r).mul(n).add(r)}
    method ToFixed (line 66) | static ToFixed(t,n=2){return new P(+t.x.toFixed(n),+t.y.toFixed(n),+t....
    method Nudge (line 66) | static Nudge(t,n,r){return P.Add(t,P.Tan(n,t).mul(r))}
    method ToString (line 66) | static ToString(t){return`${t.x}, ${t.y}`}
    method ToAngle (line 66) | static ToAngle(t){let n=Math.atan2(t.y,t.x);return n<0&&(n+=Math.PI*2),n}
    method FromAngle (line 66) | static FromAngle(t,n=1){return new P(Math.cos(t)*n,Math.sin(t)*n)}
    method ToArray (line 66) | static ToArray(t){return[t.x,t.y,t.z]}
    method ToJson (line 66) | static ToJson(t){const{x:n,y:r,z:o}=t;return{x:n,y:r,z:o}}
    method Average (line 66) | static Average(t){const n=t.length,r=new P(0,0);if(n===0)return r;for(...
    method Clamp (line 66) | static Clamp(t,n,r){return r===void 0?new P(Math.min(Math.max(t.x,n)),...
    method PointsBetween (line 66) | static PointsBetween(t,n,r=6){const o=[];for(let s=0;s<r;s++){const i=...
    method SnapToGrid (line 66) | static SnapToGrid(t,n=8){return new P(Math.round(t.x/n)*n,Math.round(t...
  function Ft (line 66) | function Ft(e){return`${j(e.x)},${j(e.y)} `}
  function Cn (line 66) | function Cn(e,t){return`${j((e.x+t.x)/2)},${j((e.y+t.y)/2)} `}
  function Ns (line 66) | function Ns(e,t,n){return Math.max(t,typeof n<"u"?Math.min(e,n):e)}
  function bd (line 66) | function bd(e,t=1e10){return e?Math.round(e*t)/t:0}
  function Ml (line 66) | function Ml(e,t,n=1e-6){return Math.abs(e-t)<=n}
  function Kp (line 66) | function Kp(e,t){const n=Math.pow(e-t,2)/Math.pow(e+t,2);return Pe*(e+t)...
  function Os (line 66) | function Os(e){return e=e%Oe,e<0?e=e+Oe:e===0&&(e=0),e}
  function $u (line 66) | function $u(e,t){return e=Os(e),t=Os(t),e>t&&(t+=Oe),t-e}
  function Uk (line 66) | function Uk(e,t){return Oe-$u(e,t)}
  function yh (line 66) | function yh(e,t){const n=(t-e)%Oe;return 2*n%Oe-n}
  function LS (line 66) | function LS(e){return(Oe+e)%Oe}
  function Wp (line 66) | function Wp(e,t){const n=Oe/t;let r=Math.floor((LS(e)+n/2)/n)*n%Oe;retur...
  function Hk (line 66) | function Hk(e,t){return e===t||Ml(e%(Math.PI/2)-t%(Math.PI/2),0)}
  function x5 (line 66) | function x5(e){return e*Pe/180}
  function w5 (line 66) | function w5(e){return e*180/Pe}
  function $i (line 66) | function $i(e,t,n){return new P(e.x,e.y).add(P.FromAngle(n,t))}
  function lm (line 66) | function lm(e,t,n){const r=e/2,o=t/2,s=[];let i=1/0,a=-1/0,c=1/0,l=-1/0;...
  function Xc (line 66) | function Xc(e,t,n,r){return e<r&&n<t}
  function kr (line 66) | function kr(e,t,n,r){const o=Math.max(e,n),s=Math.min(t,r);return o<=s?[...
  function y1 (line 66) | function y1(e,t,n){return(t.x-e.x)*(n.y-e.y)-(n.x-e.x)*(t.y-e.y)}
  function Zn (line 66) | function Zn(e,t){let n=0,r,o;for(let s=0;s<t.length;s++){if(r=t[s],r.x==...
  function j (line 66) | function j(e){return Math.round(e*1e4)/1e4}
  function Vp (line 66) | function Vp(e){return Math.round(e*100)/100}
  function vs (line 66) | function vs(e,t,n){return n<0?$u(e,t):Uk(e,t)}
  function FS (line 66) | function FS(e,t,n,r){let o;if(Math.abs(e)>Pe){o=yh(t,r);const s=yh(r,n);...
  function b5 (line 66) | function b5(e,t,n,r){const o=2*((t-e)%Oe)%Oe-(t-e)%Oe;return r?(Oe-Math....
  function zn (line 66) | function zn(e,{defaults:t,shouldStoreForSession:n=!0}){return B5({name:e...
  function B5 (line 66) | function B5(e){const t=H5(e),n=e.shouldStoreForSession?U5(e.name):null,r...
  function U5 (line 66) | function U5(e){try{return JSON.parse(G_(`tldraw_debug:${e}`)??"null")}ca...
  function dm (line 66) | function dm(e){try{return e()}catch{return null}}
  function H5 (line 66) | function H5(e){switch(dm(()=>um.TLDRAW_ENV)??dm(()=>um.VERCEL_PUBLIC_TLD...
  function Yp (line 66) | function Yp(e){if(e instanceof HTMLElement)return e;if(e.parentElement)r...
  function Ee (line 66) | function Ee(e){e.preventDefault(),$t.logPreventDefaults.get()&&console.w...
  function Mu (line 66) | function Mu(e,t){if(e.setPointerCapture(t.pointerId),$t.logPointerCaptur...
  function Au (line 66) | function Au(e,t){if(e.hasPointerCapture(t.pointerId)&&(e.releasePointerC...
  function _n (line 66) | function _n(e){return e.isKilled=!0,{point:{x:e.clientX,y:e.clientY,z:e....
  function K5 (line 66) | function K5(){const e=z();return x.useMemo(function(){let r,o;function s...
  function W5 (line 66) | function W5(){const e=z();x.useEffect(()=>{if(e.environment.isFirefox&&!...
  function V5 (line 66) | function V5({container:e,children:t}){return h.jsx(Yk.Provider,{value:e,...
  function cn (line 66) | function cn(){return yi(x.useContext(Yk),"useContainer used outside of <...
  function G5 (line 66) | function G5(){const e=z(),t=cn(),n=K("isFocused",()=>e.getInstanceState(...
  function Cd (line 66) | function Cd(){const{activeElement:e}=document;return!!(e&&(e.getAttribut...
  function q5 (line 66) | function q5(e){const t=z();x.useEffect(()=>{const n=e.current;if(!n)retu...
  function Z5 (line 66) | function Z5(e,t,n){return Math.max(t,Math.min(e,n))}
  method toVector (line 66) | toVector(e,t){return e===void 0&&(e=t),Array.isArray(e)?e:[e,e]}
  method add (line 66) | add(e,t){return[e[0]+t[0],e[1]+t[1]]}
  method sub (line 66) | sub(e,t){return[e[0]-t[0],e[1]-t[1]]}
  method addTo (line 66) | addTo(e,t){e[0]+=t[0],e[1]+=t[1]}
  method subTo (line 66) | subTo(e,t){e[0]-=t[0],e[1]-=t[1]}
  function b1 (line 66) | function b1(e,t,n){return t===0||Math.abs(t)===1/0?Math.pow(e,n*5):e*t*n...
  function P1 (line 66) | function P1(e,t,n,r=.15){return r===0?Z5(e,t,n):e<t?-b1(t-e,n-t,r)+t:e>n...
  function Q5 (line 66) | function Q5(e,[t,n],[r,o]){const[[s,i],[a,c]]=e;return[P1(t,s,i,r),P1(n,...
  function J5 (line 66) | function J5(e,t){if(typeof e!="object"||e===null)return e;var n=e[Symbol...
  function e6 (line 66) | function e6(e){var t=J5(e,"string");return typeof t=="symbol"?t:String(t)}
  function qt (line 66) | function qt(e,t,n){return t=e6(t),t in e?Object.defineProperty(e,t,{valu...
  function C1 (line 66) | function C1(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
  function at (line 66) | function at(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=n...
  function I1 (line 66) | function I1(e){return e?e[0].toUpperCase()+e.slice(1):""}
  function n6 (line 66) | function n6(e=!1,t){return e&&!t6.includes(t)}
  function r6 (line 66) | function r6(e,t="",n=!1){const r=Xk[e],o=r&&r[t]||t;return"on"+I1(e)+I1(...
  function s6 (line 66) | function s6(e){let t=e.substring(2).toLowerCase();const n=!!~t.indexOf("...
  function i6 (line 66) | function i6(e,t=""){const n=Xk[e],r=n&&n[t]||t;return e+r}
  function qk (line 66) | function qk(e){return"touches"in e}
  function a6 (line 66) | function a6(e){return qk(e)?"touch":"pointerType"in e?e.pointerType:"mou...
  function c6 (line 66) | function c6(e){return Array.from(e.touches).filter(t=>{var n,r;return t....
  function zS (line 66) | function zS(e,t){try{const n=t.clientX-e.clientX,r=t.clientY-e.clientY,o...
  function l6 (line 66) | function l6(e){return c6(e).map(t=>t.identifier)}
  function E1 (line 66) | function E1(e,t){const[n,r]=Array.from(e.touches).filter(o=>t.includes(o...
  function Zk (line 66) | function Zk(e){let{deltaX:t,deltaY:n,deltaMode:r}=e;return r===1?(t*=_1,...
  function u6 (line 66) | function u6(e){const t={};if("buttons"in e&&(t.buttons=e.buttons),"shift...
  function Xp (line 66) | function Xp(e,...t){return typeof e=="function"?e(...t):e}
  function d6 (line 66) | function d6(){}
  function h6 (line 66) | function h6(...e){return e.length===0?d6:e.length===1?e[0]:function(){le...
  function T1 (line 66) | function T1(e,t){return Object.assign({},t,e||{})}
  class Qk (line 66) | class Qk{constructor(t,n,r){this.ctrl=t,this.args=n,this.key=r,this.stat...
    method constructor (line 66) | constructor(t,n,r){this.ctrl=t,this.args=n,this.key=r,this.state||(thi...
    method state (line 66) | get state(){return this.ctrl.state[this.key]}
    method state (line 66) | set state(t){this.ctrl.state[this.key]=t}
    method shared (line 66) | get shared(){return this.ctrl.state.shared}
    method eventStore (line 66) | get eventStore(){return this.ctrl.gestureEventStores[this.key]}
    method timeoutStore (line 66) | get timeoutStore(){return this.ctrl.gestureTimeoutStores[this.key]}
    method config (line 66) | get config(){return this.ctrl.config[this.key]}
    method sharedConfig (line 66) | get sharedConfig(){return this.ctrl.config.shared}
    method handler (line 66) | get handler(){return this.ctrl.handlers[this.key]}
    method reset (line 66) | reset(){const{state:t,shared:n,ingKey:r,args:o}=this;n[r]=t._active=t....
    method start (line 66) | start(t){const n=this.state,r=this.config;n._active||(this.reset(),thi...
    method computeValues (line 66) | computeValues(t){const n=this.state;n._values=t,n.values=this.config.t...
    method computeInitial (line 66) | computeInitial(){const t=this.state;t._initial=t._values,t.initial=t.v...
    method compute (line 66) | compute(t){const{state:n,config:r,shared:o}=this;n.args=this.args;let ...
    method emit (line 66) | emit(){const t=this.state,n=this.shared,r=this.config;if(t._active||th...
    method clean (line 66) | clean(){this.eventStore.clean(),this.timeoutStore.clean()}
  function f6 (line 66) | function f6([e,t],n){const r=Math.abs(e),o=Math.abs(t);if(r>o&&r>n)retur...
  class g6 (line 66) | class g6 extends Qk{constructor(...t){super(...t),qt(this,"aliasKey","xy...
    method constructor (line 66) | constructor(...t){super(...t),qt(this,"aliasKey","xy")}
    method reset (line 66) | reset(){super.reset(),this.state.axis=void 0}
    method init (line 66) | init(){this.state.offset=[0,0],this.state.lastOffset=[0,0]}
    method computeOffset (line 66) | computeOffset(){this.state.offset=zt.add(this.state.lastOffset,this.st...
    method computeMovement (line 66) | computeMovement(){this.state.movement=zt.sub(this.state.offset,this.st...
    method axisIntent (line 66) | axisIntent(t){const n=this.state,r=this.config;if(!n.axis&&t){const o=...
    method restrictToAxis (line 66) | restrictToAxis(t){if(this.config.axis||this.config.lockDirection)switc...
  method enabled (line 66) | enabled(e=!0){return e}
  method eventOptions (line 66) | eventOptions(e,t,n){return at(at({},n.shared.eventOptions),e)}
  method preventDefault (line 66) | preventDefault(e=!1){return e}
  method triggerAllEvents (line 66) | triggerAllEvents(e=!1){return e}
  method rubberband (line 66) | rubberband(e=0){switch(e){case!0:return[$1,$1];case!1:return[0,0];defaul...
  method from (line 66) | from(e){if(typeof e=="function")return e;if(e!=null)return zt.toVector(e)}
  method transform (line 66) | transform(e,t,n){const r=e||n.shared.transform;return this.hasCustomTran...
  method threshold (line 66) | threshold(e){return zt.toVector(e,0)}
  method axis (line 66) | axis(e,t,{axis:n}){if(this.lockDirection=n==="lock",!this.lockDirection)...
  method axisThreshold (line 66) | axisThreshold(e=y6){return e}
  method bounds (line 66) | bounds(e={}){if(typeof e=="function")return s=>ju.bounds(e(s));if("curre...
  function e2 (line 66) | function e2(){return Ou&&"ontouchstart"in window}
  function S6 (line 66) | function S6(){return e2()||Ou&&window.navigator.maxTouchPoints>1}
  function v6 (line 66) | function v6(){return Ou&&"onpointerdown"in window}
  function x6 (line 66) | function x6(){return Ou&&"exitPointerLock"in window.document}
  function w6 (line 66) | function w6(){try{return"constructor"in GestureEvent}catch{return!1}}
  method device (line 66) | device(e,t,{pointer:{touch:n=!1,lock:r=!1,mouse:o=!1}={}}){return this.p...
  method preventScrollAxis (line 66) | preventScrollAxis(e,t,{preventScroll:n}){if(this.preventScrollDelay=type...
  method pointerCapture (line 66) | pointerCapture(e,t,{pointer:{capture:n=!0,buttons:r=1,keys:o=!0}={}}){re...
  method threshold (line 66) | threshold(e,t,{filterTaps:n=!1,tapsThreshold:r=3,axis:o=void 0}){const s...
  method swipe (line 66) | swipe({velocity:e=C6,distance:t=I6,duration:n=E6}={}){return{velocity:th...
  method delay (line 66) | delay(e=0){switch(e){case!0:return P6;case!1:return 0;default:return e}}
  method axisThreshold (line 66) | axisThreshold(e){return e?at(at({},M1),e):M1}
  method keyboardDisplacement (line 66) | keyboardDisplacement(e=_6){return e}
  function t2 (line 66) | function t2(e){const[t,n]=e.overflow,[r,o]=e._delta,[s,i]=e._direction;(...
  class $6 (line 66) | class $6 extends Qk{constructor(...t){super(...t),qt(this,"ingKey","pinc...
    method constructor (line 66) | constructor(...t){super(...t),qt(this,"ingKey","pinching"),qt(this,"al...
    method init (line 66) | init(){this.state.offset=[1,0],this.state.lastOffset=[1,0],this.state....
    method reset (line 66) | reset(){super.reset();const t=this.state;t._touchIds=[],t.canceled=!1,...
    method computeOffset (line 66) | computeOffset(){const{type:t,movement:n,lastOffset:r}=this.state;t==="...
    method computeMovement (line 66) | computeMovement(){const{offset:t,lastOffset:n}=this.state;this.state.m...
    method axisIntent (line 66) | axisIntent(){const t=this.state,[n,r]=t._movement;if(!t.axis){const o=...
    method restrictToAxis (line 66) | restrictToAxis(t){this.config.lockDirection&&(this.state.axis==="scale...
    method cancel (line 66) | cancel(){const t=this.state;t.canceled||setTimeout(()=>{t.canceled=!0,...
    method touchStart (line 66) | touchStart(t){this.ctrl.setEventIds(t);const n=this.state,r=this.ctrl....
    method pointerStart (line 66) | pointerStart(t){if(t.buttons!=null&&t.buttons%2!==1)return;this.ctrl.s...
    method pinchStart (line 66) | pinchStart(t,n){const r=this.state;r.origin=n.origin,this.computeValue...
    method touchMove (line 66) | touchMove(t){if(!this.state._active)return;const n=E1(t,this.state._to...
    method pointerMove (line 66) | pointerMove(t){const n=this.state._pointerEvents;if(n.has(t.pointerId)...
    method pinchMove (line 66) | pinchMove(t,n){const r=this.state,o=r._values[1],s=n.angle-o;let i=0;M...
    method touchEnd (line 66) | touchEnd(t){this.ctrl.setEventIds(t),this.state._active&&this.state._t...
    method pointerEnd (line 66) | pointerEnd(t){const n=this.state;this.ctrl.setEventIds(t);try{t.target...
    method gestureStart (line 66) | gestureStart(t){t.cancelable&&t.preventDefault();const n=this.state;n....
    method gestureMove (line 66) | gestureMove(t){if(t.cancelable&&t.preventDefault(),!this.state._active...
    method gestureEnd (line 66) | gestureEnd(t){this.state._active&&(this.state._active=!1,this.compute(...
    method wheel (line 66) | wheel(t){const n=this.config.modifierKey;n&&(Array.isArray(n)?!n.find(...
    method wheelStart (line 66) | wheelStart(t){this.start(t),this.wheelChange(t)}
    method wheelChange (line 66) | wheelChange(t){"uv"in t||t.cancelable&&t.preventDefault();const r=this...
    method wheelEnd (line 66) | wheelEnd(){this.state._active&&(this.state._active=!1,this.compute(),t...
    method bind (line 66) | bind(t){const n=this.config.device;n&&(t(n,"start",this[n+"Start"].bin...
  method device (line 66) | device(e,t,{shared:n,pointer:{touch:r=!1}={}}){if(n.target&&!pr.touch&&p...
  method bounds (line 66) | bounds(e,t,{scaleBounds:n={},angleBounds:r={}}){const o=i=>{const a=T1(X...
  method threshold (line 66) | threshold(e,t,n){return this.lockDirection=n.axis==="lock",zt.toVector(e...
  method modifierKey (line 66) | modifierKey(e){return e===void 0?"ctrlKey":e}
  method pinchOnWheel (line 66) | pinchOnWheel(e=!0){return e}
  class A6 (line 66) | class A6 extends g6{constructor(...t){super(...t),qt(this,"ingKey","whee...
    method constructor (line 66) | constructor(...t){super(...t),qt(this,"ingKey","wheeling")}
    method wheel (line 66) | wheel(t){this.state._active||this.start(t),this.wheelChange(t),this.ti...
    method wheelChange (line 66) | wheelChange(t){const n=this.state;n._delta=Zk(t),zt.addTo(n._movement,...
    method wheelEnd (line 66) | wheelEnd(){this.state._active&&(this.state._active=!1,this.compute(),t...
    method bind (line 66) | bind(t){t("wheel","",this.wheel.bind(this))}
  function O6 (line 66) | function O6(e){V0.set(e.key,e.engine),BS.set(e.key,e.resolver)}
  function L6 (line 66) | function L6(e,t){if(e==null)return{};var n={},r=Object.keys(e),o,s;for(s...
  function F6 (line 66) | function F6(e,t){if(e==null)return{};var n=L6(e,t),r,o;if(Object.getOwnP...
  method target (line 66) | target(e){if(e)return()=>"current"in e?e.current:e}
  method enabled (line 66) | enabled(e=!0){return e}
  method window (line 66) | window(e=pr.isBrowser?window:void 0){return e}
  method eventOptions (line 66) | eventOptions({passive:e=!0,capture:t=!1}={}){return{passive:e,capture:t}}
  method transform (line 66) | transform(e){return e}
  function vh (line 66) | function vh(e={},t){const n={};for(const[r,o]of Object.entries(t))switch...
  function B6 (line 66) | function B6(e,t,n={}){const r=e,{target:o,eventOptions:s,window:i,enable...
  class n2 (line 66) | class n2{constructor(t,n){qt(this,"_listeners",new Set),this._ctrl=t,thi...
    method constructor (line 66) | constructor(t,n){qt(this,"_listeners",new Set),this._ctrl=t,this._gest...
    method add (line 66) | add(t,n,r,o,s){const i=this._listeners,a=i6(n,r),c=this._gestureKey?th...
    method clean (line 66) | clean(){this._listeners.forEach(t=>t()),this._listeners.clear()}
  class U6 (line 66) | class U6{constructor(){qt(this,"_timeouts",new Map)}add(t,n,r=140,...o){...
    method constructor (line 66) | constructor(){qt(this,"_timeouts",new Map)}
    method add (line 66) | add(t,n,r=140,...o){this.remove(t),this._timeouts.set(t,window.setTime...
    method remove (line 66) | remove(t){const n=this._timeouts.get(t);n&&window.clearTimeout(n)}
    method clean (line 66) | clean(){this._timeouts.forEach(t=>void window.clearTimeout(t)),this._t...
  class H6 (line 66) | class H6{constructor(t){qt(this,"gestures",new Set),qt(this,"_targetEven...
    method constructor (line 66) | constructor(t){qt(this,"gestures",new Set),qt(this,"_targetEventStore"...
    method setEventIds (line 66) | setEventIds(t){if(qk(t))return this.touchIds=new Set(l6(t)),this.touch...
    method applyHandlers (line 66) | applyHandlers(t,n){this.handlers=t,this.nativeHandlers=n}
    method applyConfig (line 66) | applyConfig(t,n){this.config=B6(t,n,this.config)}
    method clean (line 66) | clean(){this._targetEventStore.clean();for(const t of this.gestures)th...
    method effect (line 66) | effect(){return this.config.shared.target&&this.bind(),()=>this._targe...
    method bind (line 66) | bind(...t){const n=this.config.shared,r={};let o;if(!(n.target&&(o=n.t...
  function na (line 66) | function na(e,t){e.gestures.add(t),e.gestureEventStores[t]=new n2(e,t),e...
  function K6 (line 66) | function K6(e,t){t.drag&&na(e,"drag"),t.wheel&&na(e,"wheel"),t.scroll&&n...
  function V6 (line 66) | function V6(e){const t={},n={},r=new Set;for(let o in e)W6.test(o)?(r.ad...
  function ra (line 66) | function ra(e,t,n,r,o,s){if(!e.has(n)||!V0.has(r))return;const i=n+"Star...
  function G6 (line 66) | function G6(e,t){const[n,r,o]=V6(e),s={};return ra(o,n,"onDrag","drag",s...
  function Y6 (line 66) | function Y6(e,t={},n,r){const o=Se.useMemo(()=>new H6(e),[]);if(o.applyH...
  function X6 (line 66) | function X6(e){return e.forEach(O6),function(n,r){const{handlers:o,nativ...
  function r2 (line 66) | function r2(e){let{deltaY:t,deltaX:n}=e,r=0;if(e.ctrlKey||e.altKey||e.me...
  function J6 (line 66) | function J6(e){const t=z(),n=x.useMemo(()=>{let r="not sure";const o=({e...
  function hm (line 66) | function hm(e,t,n){const r=e.getShape(t),o=e.getShapeHandles(r);return{s...
  function eF (line 66) | function eF(e,t){const n=z();return x.useMemo(()=>{const r=c=>{if(c.isKi...
  function fF (line 66) | function fF(e,t,n){var r,o,s,i,a,c,l=0,u=!1,d=!1,p=!0;if(typeof e!="func...
  function gF (line 66) | function gF(e,t,n){var r=!0,o=!0;if(typeof e!="function")throw new TypeE...
  function qp (line 66) | function qp(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}
  function mF (line 66) | function mF(e){return!!e&&typeof e=="object"}
  function yF (line 66) | function yF(e){return typeof e=="symbol"||mF(e)&&dF.call(e)==tF}
  function D1 (line 66) | function D1(e){if(typeof e=="number")return e;if(yF(e))return O1;if(qp(e...
  method constructor (line 66) | constructor(t=0,n=0,r=0,o=0){m(this,"x",0);m(this,"y",0);m(this,"w",0);m...
  method point (line 66) | get point(){return new P(this.x,this.y)}
  method point (line 66) | set point(t){this.x=t.x,this.y=t.y}
  method minX (line 66) | get minX(){return this.x}
  method minX (line 66) | set minX(t){this.x=t}
  method midX (line 66) | get midX(){return this.x+this.w/2}
  method maxX (line 66) | get maxX(){return this.x+this.w}
  method minY (line 66) | get minY(){return this.y}
  method minY (line 66) | set minY(t){this.y=t}
  method midY (line 66) | get midY(){return this.y+this.h/2}
  method maxY (line 66) | get maxY(){return this.y+this.h}
  method width (line 66) | get width(){return this.w}
  method width (line 66) | set width(t){this.w=t}
  method height (line 66) | get height(){return this.h}
  method height (line 66) | set height(t){this.h=t}
  method aspectRatio (line 66) | get aspectRatio(){return this.width/this.height}
  method center (line 66) | get center(){return new P(this.midX,this.midY)}
  method center (line 66) | set center(t){this.minX=t.x-this.width/2,this.minY=t.y-this.height/2}
  method corners (line 66) | get corners(){return[new P(this.minX,this.minY),new P(this.maxX,this.min...
  method cornersAndCenter (line 66) | get cornersAndCenter(){return[new P(this.minX,this.minY),new P(this.maxX...
  method sides (line 66) | get sides(){const{corners:t}=this;return[[t[0],t[1]],[t[1],t[2]],[t[2],t...
  method size (line 66) | get size(){return new P(this.w,this.h)}
  method toFixed (line 66) | toFixed(){return this.x=bd(this.x),this.y=bd(this.y),this.w=bd(this.w),t...
  method setTo (line 66) | setTo(t){return this.x=t.x,this.y=t.y,this.w=t.w,this.h=t.h,this}
  method set (line 66) | set(t=0,n=0,r=0,o=0){return this.x=t,this.y=n,this.w=r,this.h=o,this}
  method expand (line 66) | expand(t){const n=Math.min(this.minX,t.minX),r=Math.min(this.minY,t.minY...
  method expandBy (line 66) | expandBy(t){return this.x-=t,this.y-=t,this.w+=t*2,this.h+=t*2,this}
  method scale (line 66) | scale(t){return this.x/=t,this.y/=t,this.w/=t,this.h/=t,this}
  method clone (line 66) | clone(){const{x:t,y:n,w:r,h:o}=this;return new Je(t,n,r,o)}
  method translate (line 66) | translate(t){return this.x+=t.x,this.y+=t.y,this}
  method snapToGrid (line 66) | snapToGrid(t){const n=Math.round(this.minX/t)*t,r=Math.round(this.minY/t...
  method collides (line 66) | collides(t){return Je.Collides(this,t)}
  method contains (line 66) | contains(t){return Je.Contains(this,t)}
  method includes (line 66) | includes(t){return Je.Includes(this,t)}
  method containsPoint (line 66) | containsPoint(t,n=0){return Je.ContainsPoint(this,t,n)}
  method getHandlePoint (line 66) | getHandlePoint(t){switch(t){case"top_left":return new P(this.minX,this.m...
  method toJson (line 66) | toJson(){return{x:this.minX,y:this.minY,w:this.w,h:this.h}}
  method resize (line 66) | resize(t,n,r){const{minX:o,minY:s,maxX:i,maxY:a}=this;let{minX:c,minY:l,...
  method union (line 66) | union(t){const n=Math.min(this.minX,t.x),r=Math.min(this.minY,t.y),o=Mat...
  method From (line 66) | static From(t){return new Je(t.x,t.y,t.w,t.h)}
  method FromCenter (line 66) | static FromCenter(t,n){return new Je(t.x-n.x/2,t.y-n.y/2,n.x,n.y)}
  method FromPoints (line 66) | static FromPoints(t){if(t.length===0)return new Je;let n=1/0,r=1/0,o=-1/...
  method Expand (line 66) | static Expand(t,n){const r=Math.min(n.minX,t.minX),o=Math.min(n.minY,t.m...
  method ExpandBy (line 66) | static ExpandBy(t,n){return new Je(t.minX-n,t.minY-n,t.width+n*2,t.heigh...
  method Resize (line 66) | static Resize(t,n,r,o,s=!1){const{minX:i,minY:a,maxX:c,maxY:l}=t;let{min...
  method equals (line 66) | equals(t){return Je.Equals(this,t)}
  method Equals (line 66) | static Equals(t,n){return n.x===t.x&&n.y===t.y&&n.w===t.w&&n.h===t.h}
  method zeroFix (line 66) | zeroFix(){return this.w=Math.max(1,this.w),this.h=Math.max(1,this.h),this}
  method ZeroFix (line 66) | static ZeroFix(t){return new Je(t.x,t.y,Math.max(1,t.w),Math.max(1,t.h))}
  function xF (line 66) | function xF(e){switch(e){case"top":return"bottom";case"bottom":return"to...
  function wF (line 66) | function wF(e){switch(e){case"left":return"right";case"right":return"lef...
  function bF (line 66) | function bF(e){return e==="top_left"||e==="top_right"||e==="bottom_right...
  function PF (line 66) | function PF(e){const t=z();x.useLayoutEffect(()=>{let n=new ne;function ...
  method constructor (line 70) | constructor(t,n,r,o,s,i){m(this,"a",1);m(this,"b",0);m(this,"c",0);m(thi...
  method equals (line 70) | equals(t){return this===t||this.a===t.a&&this.b===t.b&&this.c===t.c&&thi...
  method identity (line 70) | identity(){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,...
  method multiply (line 70) | multiply(t){const n=t,{a:r,b:o,c:s,d:i,e:a,f:c}=this;return this.a=r*n.a...
  method rotate (line 70) | rotate(t,n,r){return t===0?this:n===void 0?this.multiply(je.Rotate(t)):t...
  method translate (line 70) | translate(t,n){return this.multiply(je.Translate(t,n))}
  method scale (line 70) | scale(t,n){return this.multiply(je.Scale(t,n))}
  method invert (line 70) | invert(){const{a:t,b:n,c:r,d:o,e:s,f:i}=this,a=t*o-n*r;return this.a=o/a...
  method applyToPoint (line 70) | applyToPoint(t){return je.applyToPoint(this,t)}
  method applyToPoints (line 70) | applyToPoints(t){return je.applyToPoints(this,t)}
  method rotation (line 70) | rotation(){return je.Rotation(this)}
  method point (line 70) | point(){return je.Point(this)}
  method decomposed (line 70) | decomposed(){return je.Decompose(this)}
  method toCssString (line 70) | toCssString(){return je.toCssString(this)}
  method setTo (line 70) | setTo(t){return Object.assign(this,t),this}
  method decompose (line 70) | decompose(){return je.Decompose(this)}
  method clone (line 70) | clone(){return new je(this.a,this.b,this.c,this.d,this.e,this.f)}
  method Identity (line 70) | static Identity(){return new je(1,0,0,1,0,0)}
  method Translate (line 70) | static Translate(t,n){return new je(1,0,0,1,t,n)}
  method Rotate (line 70) | static Rotate(t,n,r){if(t===0)return je.Identity();const o=Math.cos(t),s...
  method Multiply (line 70) | static Multiply(t,n){return{a:t.a*n.a+t.c*n.b,c:t.a*n.c+t.c*n.d,e:t.a*n....
  method Inverse (line 70) | static Inverse(t){const n=t.a*t.d-t.b*t.c;return{a:t.d/n,b:t.b/-n,c:t.c/...
  method Absolute (line 70) | static Absolute(t){const n=t.a*t.d-t.b*t.c;return{a:t.d/n,b:t.b/-n,c:t.c...
  method Compose (line 70) | static Compose(...t){const n=je.Identity();for(let r=0,o=t.length;r<o;r+...
  method Point (line 70) | static Point(t){return new P(t.e,t.f)}
  method Rotation (line 70) | static Rotation(t){let n;if(t.a!==0||t.c!==0){const r=(t.a*t.a+t.c*t.c)*...
  method Decompose (line 70) | static Decompose(t){let n,r,o;if(t.a!==0||t.c!==0){const s=(t.a*t.a+t.c*...
  method Smooth (line 70) | static Smooth(t,n=1e10){return t.a=Math.round(t.a*n)/n,t.b=Math.round(t....
  method toCssString (line 70) | static toCssString(t){return`matrix(${j(t.a)}, ${j(t.b)}, ${j(t.c)}, ${j...
  method applyToPoint (line 70) | static applyToPoint(t,n){return new P(t.a*n.x+t.c*n.y+t.e,t.b*n.x+t.d*n....
  method applyToXY (line 70) | static applyToXY(t,n,r){return[t.a*n+t.c*r+t.e,t.b*n+t.d*r+t.f]}
  method applyToPoints (line 70) | static applyToPoints(t,n){return n.map(r=>new P(t.a*r.x+t.c*r.y+t.e,t.b*...
  method applyToBounds (line 70) | static applyToBounds(t,n){return new ne(t.e+n.minX,t.f+n.minY,n.width,n....
  method From (line 70) | static From(t){return new je(t.a,t.b,t.c,t.d,t.e,t.f)}
  method Cast (line 70) | static Cast(t){return t instanceof je?t:je.From(t)}
  function s2 (line 70) | function s2(e,t){return t===0?e:s2(t,e%t)}
  function i2 (line 70) | function i2(e){const t=e.toString().split(".")[1];if(!t)return 1;const n...
  class Hi (line 70) | class Hi{constructor(t){m(this,"isFilled",!1);m(this,"isClosed",!0);m(th...
    method constructor (line 70) | constructor(t){m(this,"isFilled",!1);m(this,"isClosed",!0);m(this,"isL...
    method hitTestPoint (line 70) | hitTestPoint(t,n=0,r=!1){return this.isClosed&&(this.isFilled||r)&&Zn(...
    method distanceToPoint (line 70) | distanceToPoint(t,n=!1){return t.dist(this.nearestPoint(t))*(this.isCl...
    method distanceToLineSegment (line 70) | distanceToLineSegment(t,n){if(t.equals(n))return this.distanceToPoint(...
    method hitTestLineSegment (line 70) | hitTestLineSegment(t,n,r=0){return this.distanceToLineSegment(t,n)<=r}
    method nearestPointOnLineSegment (line 70) | nearestPointOnLineSegment(t,n){const{vertices:r}=this;let o,s=1/0,i,a,...
    method isPointInBounds (line 70) | isPointInBounds(t,n=0){const{bounds:r}=this;return!(t.x<r.minX-n||t.y<...
    method vertices (line 70) | get vertices(){return this._vertices||(this._vertices=this.getVertices...
    method getBounds (line 70) | getBounds(){return ne.FromPoints(this.vertices)}
    method bounds (line 70) | get bounds(){return this._bounds||(this._bounds=this.getBounds()),this...
    method center (line 70) | get center(){return this.bounds.center}
    method area (line 70) | get area(){return this._area||(this._area=this.getArea()),this._area}
    method getArea (line 70) | getArea(){if(!this.isClosed)return 0;const{vertices:t}=this;let n=0;fo...
    method toSimpleSvgPath (line 70) | toSimpleSvgPath(){let t="";const{vertices:n}=this,r=n.length;if(r===0)...
  class Br (line 70) | class Br extends Hi{constructor(n){super({...n,isClosed:!0,isFilled:!1})...
    method constructor (line 70) | constructor(n){super({...n,isClosed:!0,isFilled:!1});m(this,"children"...
    method getVertices (line 70) | getVertices(){return this.children.filter(n=>!n.isLabel).flatMap(n=>n....
    method nearestPoint (line 70) | nearestPoint(n){let r=1/0,o;const{children:s}=this;if(s.length===0)thr...
    method distanceToPoint (line 70) | distanceToPoint(n,r=!1){return Math.min(...this.children.map((o,s)=>o....
    method hitTestPoint (line 70) | hitTestPoint(n,r,o){return!!this.children.filter(s=>!s.isLabel).find(s...
    method hitTestLineSegment (line 70) | hitTestLineSegment(n,r,o){return!!this.children.filter(s=>!s.isLabel)....
    method getArea (line 70) | getArea(){return this.children[0].area}
    method toSimpleSvgPath (line 70) | toSimpleSvgPath(){let n="";for(const o of this.children)n+=o.toSimpleS...
  function IF (line 70) | function IF(e=!0){const[t,n]=x.useState(0),r=z();x.useEffect(()=>{if(!e)...
  function a2 (line 70) | function a2({geometry:e}){return e instanceof Br?h.jsx(h.Fragment,{child...
  function DF (line 70) | function DF(e,t){var n=e?e.length:0;return!!n&&LF(e,t,0)>-1}
  function RF (line 70) | function RF(e,t,n,r){for(var o=e.length,s=n+-1;++s<o;)if(t(e[s],s,e))ret...
  function LF (line 70) | function LF(e,t,n){if(t!==t)return RF(e,FF,n);for(var r=n-1,o=e.length;+...
  function FF (line 70) | function FF(e){return e!==e}
  function NF (line 70) | function NF(e,t){return e.has(t)}
  function zF (line 70) | function zF(e,t){return e==null?void 0:e[t]}
  function BF (line 70) | function BF(e){var t=!1;if(e!=null&&typeof e.toString!="function")try{t=...
  function c2 (line 70) | function c2(e){var t=-1,n=Array(e.size);return e.forEach(function(r){n[+...
  function Mi (line 70) | function Mi(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[...
  function YF (line 70) | function YF(){this.__data__=au?au(null):{}}
  function XF (line 70) | function XF(e){return this.has(e)&&delete this.__data__[e]}
  function qF (line 70) | function qF(e){var t=this.__data__;if(au){var n=t[e];return n===G0?void ...
  function ZF (line 70) | function ZF(e){var t=this.__data__;return au?t[e]!==void 0:X0.call(t,e)}
  function QF (line 70) | function QF(e,t){var n=this.__data__;return n[e]=au&&t===void 0?G0:t,this}
  function wc (line 70) | function wc(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[...
  function JF (line 70) | function JF(){this.__data__=[]}
  function eN (line 70) | function eN(e){var t=this.__data__,n=Lf(t,e);if(n<0)return!1;var r=t.len...
  function tN (line 70) | function tN(e){var t=this.__data__,n=Lf(t,e);return n<0?void 0:t[n][1]}
  function nN (line 70) | function nN(e){return Lf(this.__data__,e)>-1}
  function rN (line 70) | function rN(e,t){var n=this.__data__,r=Lf(n,e);return r<0?n.push([e,t]):...
  function bc (line 70) | function bc(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[...
  function oN (line 70) | function oN(){this.__data__={hash:new Mi,map:new(GF||wc),string:new Mi}}
  function sN (line 70) | function sN(e){return Ff(this,e).delete(e)}
  function iN (line 70) | function iN(e){return Ff(this,e).get(e)}
  function aN (line 70) | function aN(e){return Ff(this,e).has(e)}
  function cN (line 70) | function cN(e,t){return Ff(this,e).set(e,t),this}
  function Zp (line 70) | function Zp(e){var t=-1,n=e?e.length:0;for(this.__data__=new bc;++t<n;)t...
  function lN (line 70) | function lN(e){return this.__data__.set(e,G0),this}
  function uN (line 70) | function uN(e){return this.__data__.has(e)}
  function Lf (line 70) | function Lf(e,t){for(var n=e.length;n--;)if(SN(e[n][0],t))return n;retur...
  function dN (line 70) | function dN(e){if(!d2(e)||gN(e))return!1;var t=vN(e)||BF(e)?WF:AF;return...
  function hN (line 70) | function hN(e,t,n){var r=-1,o=DF,s=e.length,i=!0,a=[],c=a;if(s>=_F){var ...
  function Ff (line 70) | function Ff(e,t){var n=e.__data__;return fN(t)?n[typeof t=="string"?"str...
  function q0 (line 70) | function q0(e,t){var n=zF(e,t);return dN(n)?n:void 0}
  function fN (line 70) | function fN(e){var t=typeof e;return t=="string"||t=="number"||t=="symbo...
  function gN (line 70) | function gN(e){return!!R1&&R1 in e}
  function mN (line 70) | function mN(e){if(e!=null){try{return u2.call(e)}catch{}try{return e+""}...
  function yN (line 70) | function yN(e){return e&&e.length?hN(e):[]}
  function SN (line 70) | function SN(e,t){return e===t||e!==e&&t!==t}
  function vN (line 70) | function vN(e){var t=d2(e)?KF.call(e):"";return t==TF||t==$F}
  function d2 (line 70) | function d2(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}
  function xN (line 70) | function xN(){}
  function h2 (line 70) | function h2(e){return bN(e)}
  function PN (line 70) | function PN(){const e=z(),t=$3("userIds",()=>h2(e.getCollaborators().map...
  function p2 (line 70) | function p2(e){const t=z();return K(`latestPresence:${e}`,()=>t.getColla...
  function L1 (line 70) | function L1(e){return e>A5?"inactive":e>Kk?"idle":"active"}
  function _N (line 70) | function _N(e){const t=x.useRef((e==null?void 0:e.lastActivityTimestamp)...
  function $N (line 70) | function $N({className:e}){const t=z(),{Background:n,SvgDefs:r}=dt(),o=x...
  function MN (line 72) | function MN(){const e=z(),t=K("gridSize",()=>e.getDocumentSettings().gri...
  function AN (line 72) | function AN(){const e=z(),t=K("scribbles",()=>e.getInstanceState().scrib...
  function jN (line 72) | function jN(){const e=z(),t=K("brush",()=>e.getInstanceState().brush,[e]...
  function ON (line 72) | function ON(){const e=z(),t=K("zoomBrush",()=>e.getInstanceState().zoomB...
  function DN (line 72) | function DN(){const e=z(),t=K("snapLines",()=>e.snaps.getIndicators(),[e...
  function RN (line 72) | function RN(){const e=z(),t=K("handles shapeIdWithHandles",()=>{const{is...
  function LN (line 72) | function LN({shapeId:e}){const t=z(),{Handles:n}=dt(),r=K("zoomLevel",()...
  function FN (line 72) | function FN({shapeId:e,handle:t,zoom:n,isCoarse:r}){const o=eF(e,t.id),{...
  function NN (line 72) | function NN(){const e=z(),t=K("rendering shapes",()=>e.getRenderingShape...
  function zN (line 72) | function zN(){const e=z(),t=x.useRef(new Set);return js("reflow for cull...
  function BN (line 72) | function BN(){const e=z(),t=K("rendering shapes",()=>e.getRenderingShape...
  function UN (line 72) | function UN(){const e=z(),t=K("rendering shapes",()=>e.getRenderingShape...
  function HN (line 72) | function HN(){const e=z(),{ShapeIndicator:t}=dt(),n=K("hinting shape ids...
  function KN (line 72) | function KN(){return h.jsxs("g",{id:"cursor",children:[h.jsxs("g",{fill:...
  function WN (line 72) | function WN(){return h.jsx("path",{id:"cursor_hint",fill:"currentColor",...
  function VN (line 72) | function VN({id:e}){const t=z(),[n,r]=x.useState(null),o=K("is in root",...
  function GN (line 72) | function GN(){const e=z(),t=K("selection rotation",()=>e.getSelectionRot...
  function YN (line 72) | function YN(){const e=z(),t=K("selection rotation",()=>e.getSelectionRot...
  function XN (line 72) | function XN(){const{OnTheCanvas:e}=dt();return e?h.jsx(e,{}):null}
  function qN (line 72) | function qN(){const{InFrontOfTheCanvas:e}=dt();return e?h.jsx(e,{}):null}
  function ZN (line 72) | function ZN(){const e=z(),t=K("camera state",()=>e.getCameraState(),[e])...
  function QN (line 72) | function QN({className:e,zoom:t,point:n,color:r,viewport:o,opacity:s=1})...
  function JN (line 72) | function JN({x:e,y:t,z:n,size:r}){return h.jsxs("svg",{className:"tl-gri...
  function e4 (line 72) | function e4({handle:e,isCoarse:t,className:n,zoom:r}){const o=(t?Wk:Vk)/...
  function Z0 (line 72) | function Z0(e,t=!0){const n=e.length;if(n<2)return"";let r=e[0],o=e[1];i...
  function N1 (line 72) | function N1({scribble:e,zoom:t,color:n,opacity:r,className:o}){return e....
  function g2 (line 72) | function g2({bounds:e,rotation:t}){const n=x.useRef(null);return xc(n,e....
  function n4 (line 72) | function n4({bounds:e,rotation:t}){const n=z(),r=x.useRef(null),o=K("onl...
  function a4 (line 72) | function a4({points:e,zoom:t}){const n=2.5/t,r=e.reduce((p,f)=>Math.min(...
  function c4 (line 72) | function c4({gaps:e,direction:t,zoom:n}){const r=3.5/n;let o=[-1/0,1/0],...
  function l4 (line 72) | function l4({className:e,line:t,zoom:n}){return h.jsx("svg",{className:u...
  function u4 (line 72) | function u4(){return h.jsx("svg",{width:16,height:16,viewBox:"0 0 16 16"...
  function m2 (line 72) | function m2(e,t){const n=x.useRef(e);return t(e,n.current)?n.current:(n....
  function US (line 72) | function US(e){return m2(e,A3)}
  function Q0 (line 72) | function Q0(e){return m2(e,U_)}
  function h4 (line 72) | function h4({overrides:e={},children:t}){const n=Q0(e);return h.jsx(y2.P...
  function dt (line 72) | function dt(){return x.useContext(y2)}
  function S2 (line 72) | function S2(){J0.hardReset()}
  function p4 (line 72) | function p4(){J0.refreshPage()}
  function g4 (line 72) | function g4(){}
  function et (line 78) | function et(){return m4()}
  function y4 (line 78) | function y4(e){e.version<pa.AddAnimationSpeed&&(e.user.animationSpeed=1)...
  function S4 (line 78) | function S4(){return B1[Math.floor(Math.random()*B1.length)]}
  function v4 (line 78) | function v4(){var e,t;return typeof window>"u"?!1:((t=(e=window.matchMed...
  function x4 (line 78) | function x4(){var e,t;return typeof window>"u"?!1:((t=(e=window.matchMed...
  function mm (line 78) | function mm(){return{id:et()}}
  function b2 (line 78) | function b2(e){if(e===null||typeof e!="object"||!("version"in e)||!("use...
  function w4 (line 78) | function w4(){const e=JSON.parse(D0(x2)||"null")??null;return b2(e)}
  function b4 (line 78) | function b4(){R0(x2,JSON.stringify({version:ex,user:cu.get()}))}
  function P4 (line 78) | function P4(e){w2.validate(e),cu.set(e),b4(),I4()}
  function P2 (line 78) | function P2(){return ym===null&&(ym=et()),ym}
  function I4 (line 78) | function I4(){Wa==null||Wa.postMessage({type:C2,origin:P2(),data:{user:I...
  function I2 (line 78) | function I2(){let e=cu.get();return e||(e=w4(),cu.set(e)),e}
  function E2 (line 78) | function E2(e={}){return{derivePresenceState:e.derivePresenceState??(()=...
  function r (line 78) | function r(){}
  function o (line 78) | function o(c,l,u){this.fn=c,this.context=l,this.once=u||!1}
  function s (line 78) | function s(c,l,u,d,p){if(typeof u!="function")throw new TypeError("The l...
  function i (line 78) | function i(c,l){--c._eventsCount===0?c._events=new r:delete c._events[l]}
  function a (line 78) | function a(){this._events=new r,this._eventsCount=0}
  function zs (line 78) | function zs({children:e,className:t="",...n}){return h.jsx("svg",{...n,c...
  function tx (line 78) | function tx(e,t,n,r){const o=e.x-n.x,s=e.y-n.y,i=r.x-n.x,a=r.y-n.y,c=t.x...
  function Nf (line 78) | function Nf(e,t,n,r){const o=(t.x-e.x)*(t.x-e.x)+(t.y-e.y)*(t.y-e.y),s=2...
  function _4 (line 78) | function _4(e,t,n){const r=[];let o;for(let s=0,i=n.length-1;s<i;s++)o=t...
  function nx (line 78) | function nx(e,t,n){const r=[];let o;for(let s=1,i=n.length;s<i+1;s++)o=t...
  function k4 (line 78) | function k4(e,t,n,r){let o=n.x-e.x,s=n.y-e.y;const i=Math.sqrt(o*o+s*s),...
  function HS (line 78) | function HS(e,t,n){const r=[];let o,s,i;for(let a=0,c=n.length;a<c;a++)o...
  function U1 (line 78) | function U1(e,t,n){const r=[];let o,s,i;for(let a=1,c=n.length;a<c;a++)o...
  function Id (line 78) | function Id(e,t,n){return(n.y-e.y)*(t.x-e.x)>(t.y-e.y)*(n.x-e.x)}
  function rx (line 78) | function rx(e,t,n,r){return Id(e,n,r)!==Id(t,n,r)&&Id(e,t,n)!==Id(e,t,r)}
  function H1 (line 78) | function H1(e,t){const n=new Map;let r,o,s,i;for(let a=0,c=e.length;a<c;...
  function Sm (line 78) | function Sm(e){return`${e.x},${e.y}`}
  function T4 (line 78) | function T4(e){const t=P.Average(e);return e.sort((n,r)=>P.Angle(t,n)-P....
  function k2 (line 78) | function k2(e,t){let n,r,o,s;for(let i=0,a=e.length;i<a;i++){n=e[i],r=e[...
  function $4 (line 78) | function $4(e,t){let n,r,o,s;for(let i=0,a=e.length;i<a;i++){n=e[i],r=e[...
  class lu (line 78) | class lu extends Hi{constructor(n){super({...n,isClosed:!1,isFilled:!1})...
    method constructor (line 78) | constructor(n){super({...n,isClosed:!1,isFilled:!1});m(this,"start");m...
    method length (line 78) | get length(){return this._length?this._length:this.d.len()}
    method midPoint (line 78) | midPoint(){return this.start.lrp(this.end,.5)}
    method getVertices (line 78) | getVertices(){return[this.start,this.end]}
    method nearestPoint (line 78) | nearestPoint(n){const{start:r,end:o,u:s,ul:i}=this;if(i===0)return r;c...
    method hitTestLineSegment (line 78) | hitTestLineSegment(n,r,o=0){return rx(n,r,this.start,this.end)||this.d...
  class Ki (line 78) | class Ki extends Hi{constructor(n){super({isClosed:!1,isFilled:!1,...n})...
    method constructor (line 78) | constructor(n){super({isClosed:!1,isFilled:!1,...n});m(this,"points");...
    method segments (line 78) | get segments(){if(!this._segments){this._segments=[];const{vertices:n}...
    method length (line 78) | get length(){return this._length||(this._length=this.segments.reduce((...
    method getVertices (line 78) | getVertices(){return this.points}
    method nearestPoint (line 78) | nearestPoint(n){const{segments:r}=this;let o=this.points[0],s=1/0,i,a;...
    method hitTestLineSegment (line 78) | hitTestLineSegment(n,r,o=0){const{segments:s}=this;for(let i=0,a=s.len...
  class wt (line 78) | class wt extends Ki{constructor(t){super({...t}),this.isClosed=!0}}
    method constructor (line 78) | constructor(t){super({...t}),this.isClosed=!0}
  class Wo (line 78) | class Wo extends wt{constructor(n){const{x:r=0,y:o=0,width:s,height:i}=n...
    method constructor (line 78) | constructor(n){const{x:r=0,y:o=0,width:s,height:i}=n;super({...n,point...
    method getBounds (line 78) | getBounds(){return new ne(this.x,this.y,this.w,this.h)}
  class Fr (line 78) | class Fr{constructor(t){m(this,"canSnap",()=>!0);m(this,"canScroll",()=>...
    method constructor (line 78) | constructor(t){m(this,"canSnap",()=>!0);m(this,"canScroll",()=>!1);m(t...
    method providesBackgroundForChildren (line 78) | providesBackgroundForChildren(t){return!1}
    method canReceiveNewChildrenOfType (line 78) | canReceiveNewChildrenOfType(t,n){return!1}
    method canDropShapes (line 78) | canDropShapes(t,n){return!1}
    method expandSelectionOutlinePx (line 78) | expandSelectionOutlinePx(t){return 0}
    method getCanvasSvgDefs (line 78) | getCanvasSvgDefs(){return[]}
    method getBoundsSnapGeometry (line 78) | getBoundsSnapGeometry(t){return{}}
    method getHandleSnapGeometry (line 78) | getHandleSnapGeometry(t){return{}}
  function M4 (line 78) | function M4(e,t,n={}){const{closed:r=!1,snap:o=1,start:s="outset",end:i=...
  function K1 (line 78) | function K1({bounds:e,className:t}){const n=z(),r=K("zoom level",()=>n.g...
  class xh (line 78) | class xh extends Fr{constructor(){super(...arguments);m(this,"hideSelect...
    method constructor (line 78) | constructor(){super(...arguments);m(this,"hideSelectionBoundsFg",()=>!...
    method getDefaultProps (line 78) | getDefaultProps(){return{}}
    method getGeometry (line 78) | getGeometry(n){const r=this.editor.getSortedChildIdsForParent(n.id);re...
    method component (line 78) | component(n){const r=this.editor.getErasingShapeIds().includes(n.id),{...
    method indicator (line 78) | indicator(n){const r=this.editor.getShapeGeometry(n).bounds;return h.j...
  function $2 (line 78) | function $2(e){const t=[...T2],n=new Set;for(const r of e){if(A4.has(r.t...
  function W1 (line 78) | function W1(e,t){if(!t)return!1;switch(e.type){case"mixed":return t.type...
  class j4 (line 78) | class j4{constructor(t){m(this,"map");this.map=new Map(t)}get(t){return ...
    method constructor (line 78) | constructor(t){m(this,"map");this.map=new Map(t)}
    method get (line 78) | get(t){return this.map.get(t)}
    method getAsKnownValue (line 78) | getAsKnownValue(t){const n=this.get(t);if(n&&n.type!=="mixed")return n...
    method size (line 78) | get size(){return this.map.size}
    method equals (line 78) | equals(t){if(this.size!==t.size)return!1;const n=new Set;for(const[r,o...
    method keys (line 78) | keys(){return this.map.keys()}
    method values (line 78) | values(){return this.map.values()}
    method entries (line 78) | entries(){return this.map.entries()}
  method [Symbol.iterator] (line 78) | [Symbol.iterator](){return this.map[Symbol.iterator]()}
  class KS (line 78) | class KS extends j4{set(t,n){this.map.set(t,n)}applyValue(t,n){const r=t...
    method set (line 78) | set(t,n){this.map.set(t,n)}
    method applyValue (line 78) | applyValue(t,n){const r=this.get(t);if(!r){this.set(t,{type:"shared",v...
  class zf (line 78) | class zf{constructor(){m(this,"items",new WeakMap)}get(t,n){return this....
    method constructor (line 78) | constructor(){m(this,"items",new WeakMap)}
    method get (line 78) | get(t,n){return this.items.has(t)||this.items.set(t,n(t)),this.items.g...
    method access (line 78) | access(t){return this.items.get(t)}
    method set (line 78) | set(t,n){this.items.set(t,n)}
    method has (line 78) | has(t){return this.items.has(t)}
    method invalidate (line 78) | invalidate(t){this.items.delete(t)}
    method bust (line 78) | bust(){this.items=new WeakMap}
  function O4 (line 78) | function O4(e,t,n){return fetch(e).then(function(r){return r.arrayBuffer...
  function D4 (line 78) | function D4(e,t){var o;let n=e;const r=new Set(t);for(;r.has(n);)n=(o=/^...
  function Ed (line 78) | function Ed(e,t,n){if(n.length===0)return[];const r=new Map;for(const s ...
  function R4 (line 78) | function R4(e,t,n){const r=t.length;if(e.size===r)return;let o,s;for(let...
  function L4 (line 78) | function L4(e,t,n){const r=t.length;if(e.size===r)return;let o,s;for(let...
  function F4 (line 78) | function F4(e,t,n){var s;const r=t.length;if(e.size===r)return;let o={na...
  function N4 (line 78) | function N4(e,t,n){var s;const r=t.length;if(e.size===r)return;let o={na...
  function M2 (line 78) | function M2({editor:e}){const t=e.getSelectedShapes(),n=e.getSelectionRo...
  function wh (line 78) | function wh({delta:e,editor:t,snapshot:n,stage:r}){const{selectionPageCe...
  function o (line 78) | function o(){const s=r.get(),i={};for(const a of s){const{start:c,end:l}...
  function u (line 78) | function u(f){l||(l={...a}),l[f]?l[f]===a[f]&&(l[f]=[...l[f]]):l[f]=[]}
  function d (line 78) | function d(f,y,g){u(f),l[f]=l[f].filter(w=>w.arrowId!==y||w.handleId!==g...
  function p (line 78) | function p(f,y,g){u(f),l[f].push({arrowId:y,handleId:g})}
  function B4 (line 78) | function B4(e,t,n){const r=e.getShapeMaskedPageBounds(t);return r===void...
  function n (line 78) | function n(r){const o=r.getCurrentPageShapeIds(),s=r.getViewportPageBoun...
  function r (line 78) | function r(){const o={},s=t.get(),i=Array(s.size);return s.forEach(a=>i....
  function o (line 78) | function o(){const s=t();return r=s,new Set([...n.get()].filter(i=>vm(e,...
  function W4 (line 78) | function W4({context:e,editor:t,children:n}){return h.jsx(Rf.Provider,{v...
  function j2 (line 78) | function j2(){const e=x.useContext(A2);return e?{isDarkMode:e.isDarkMode...
  function V4 (line 78) | async function V4(e,t,n={}){var C,I;const r=typeof t[0]=="string"?t:t.ma...
  class Y4 (line 78) | class Y4{constructor(t){m(this,"_clickId","");m(this,"_clickTimeout");m(...
    method constructor (line 78) | constructor(t){m(this,"_clickId","");m(this,"_clickTimeout");m(this,"_...
    method clickState (line 78) | get clickState(){return this._clickState}
  class X4 (line 78) | class X4{constructor(t){m(this,"isSafari");m(this,"isIos");m(this,"isChr...
    method constructor (line 78) | constructor(t){m(this,"isSafari");m(this,"isIos");m(this,"isChromeForI...
  function ci (line 78) | function ci(e){return Z4}
  class q4 (line 78) | class q4{constructor(){m(this,"length",0);m(this,"head",null);m(this,"ta...
    method constructor (line 78) | constructor(){m(this,"length",0);m(this,"head",null);m(this,"tail",this)}
    method push (line 78) | push(t){return new ox(t,this)}
    method toArray (line 78) | toArray(){return Do}
  method [Symbol.iterator] (line 78) | [Symbol.iterator](){return{next(){return{value:void 0,done:!0}}}}
  class ox (line 78) | class ox{constructor(t,n){m(this,"length");this.head=t,this.tail=n,this....
    method constructor (line 78) | constructor(t,n){m(this,"length");this.head=t,this.tail=n,this.length=...
    method push (line 78) | push(t){return new ox(t,this)}
    method toArray (line 78) | toArray(){return Array.from(this)}
  method [Symbol.iterator] (line 78) | [Symbol.iterator](){let t=this;return{next(){if(t.length){const n=t.head...
  class Q4 (line 78) | class Q4{constructor(t,n){m(this,"_undos",fn("HistoryManager.undos",ci()...
    method constructor (line 78) | constructor(t,n){m(this,"_undos",fn("HistoryManager.undos",ci()));m(th...
    method getNumUndos (line 78) | getNumUndos(){return this._undos.get().length}
    method getNumRedos (line 78) | getNumRedos(){return this._redos.get().length}
    method clear (line 78) | clear(){this._undos.set(ci()),this._redos.set(ci())}
  class J4 (line 78) | class J4{constructor(t){m(this,"scribbleItems",new Map);m(this,"state","...
    method constructor (line 78) | constructor(t){m(this,"scribbleItems",new Map);m(this,"state","paused"...
    method reset (line 78) | reset(){this.editor.updateInstanceState({scribbles:[]}),this.scribbleI...
  class ez (line 78) | class ez{constructor(t){m(this,"_beforeCreateHandlers",{});m(this,"_afte...
    method constructor (line 78) | constructor(t){m(this,"_beforeCreateHandlers",{});m(this,"_afterCreate...
    method registerBeforeCreateHandler (line 78) | registerBeforeCreateHandler(t,n){return this._beforeCreateHandlers[t]|...
    method registerAfterCreateHandler (line 78) | registerAfterCreateHandler(t,n){return this._afterCreateHandlers[t]||(...
    method registerBeforeChangeHandler (line 78) | registerBeforeChangeHandler(t,n){return this._beforeChangeHandlers[t]|...
    method registerAfterChangeHandler (line 78) | registerAfterChangeHandler(t,n){return this._afterChangeHandlers[t]||(...
    method registerBeforeDeleteHandler (line 78) | registerBeforeDeleteHandler(t,n){return this._beforeDeleteHandlers[t]|...
    method registerAfterDeleteHandler (line 78) | registerAfterDeleteHandler(t,n){return this._afterDeleteHandlers[t]||(...
    method registerBatchCompleteHandler (line 78) | registerBatchCompleteHandler(t){return this._batchCompleteHandlers.pus...
  function li (line 78) | function li(e,t){const n=e.indexOf(t);n>=0&&e.splice(n,1)}
  function Eo (line 78) | function Eo(e,t,n,r,o){const s=e.filter(a=>(r==="forward"?a.startNode.id...
  function rz (line 78) | function rz(e){e.sort((t,n)=>n.gaps.length-t.gaps.length);for(let t=e.le...
  class Du (line 78) | class Du{constructor(t){m(this,"editor");this.manager=t,this.editor=t.ed...
    method constructor (line 78) | constructor(t){m(this,"editor");this.manager=t,this.editor=t.editor}
    method getSnapPointsCache (line 78) | getSnapPointsCache(){const{editor:t}=this;return t.store.createCompute...
    method getSnapPoints (line 78) | getSnapPoints(t){return this.getSnapPointsCache().get(t)??[]}
    method getSnappablePoints (line 78) | getSnappablePoints(){const t=this.getSnapPointsCache(),n=this.manager....
    method getSnappableGapNodes (line 78) | getSnappableGapNodes(){return Array.from(this.manager.getSnappableShap...
    method getVisibleGaps (line 78) | getVisibleGaps(){const t=[],n=[];let r,o;const s=this.getSnappableGapN...
    method snapTranslateShapes (line 78) | snapTranslateShapes({lockedAxis:t,initialSelectionPageBounds:n,initial...
    method snapResizeShapes (line 78) | snapResizeShapes({initialSelectionPageBounds:t,dragDelta:n,handle:r,is...
    method collectPointSnaps (line 78) | collectPointSnaps({selectionSnapPoints:t,otherNodeSnapPoints:n,minOffs...
    method collectGapSnaps (line 78) | collectGapSnaps({selectionPageBounds:t,minOffset:n,nearestSnapsX:r,nea...
    method getPointSnapLines (line 78) | getPointSnapLines({nearestSnapsX:t,nearestSnapsY:n}){const r={},o={};i...
    method getGapSnapLines (line 78) | getGapSnapLines({selectionPageBounds:t,nearestSnapsX:n,nearestSnapsY:r...
  function V1 (line 78) | function V1(e,t){const{minX:n,maxX:r,minY:o,maxY:s}=t,i=[];switch(e){cas...
  class O2 (line 78) | class O2{constructor(t){m(this,"editor");this.manager=t,this.editor=t.ed...
    method constructor (line 78) | constructor(t){m(this,"editor");this.manager=t,this.editor=t.editor}
    method getSnapGeometryCache (line 78) | getSnapGeometryCache(){const{editor:t}=this;return t.store.createCompu...
    method iterateSnapPointsInPageSpace (line 78) | *iterateSnapPointsInPageSpace(t,n){var o,s;const r=(o=this.getSnapGeom...
    method iterateSnapOutlines (line 78) | *iterateSnapOutlines(t,n){var o,s;const r=(o=this.getSnapGeometryCache...
    method getHandleSnapPosition (line 78) | getHandleSnapPosition({currentShapeId:t,handle:n,handleInPageSpace:r})...
    method snapHandle (line 78) | snapHandle({currentShapeId:t,handle:n}){const o=yi(this.editor.getShap...
  class Uf (line 78) | class Uf{constructor(t){m(this,"shapeBounds");m(this,"handles");m(this,"...
    method constructor (line 78) | constructor(t){m(this,"shapeBounds");m(this,"handles");m(this,"_snapIn...
    method getIndicators (line 78) | getIndicators(){return this._snapIndicators.get()??Do}
    method clearIndicators (line 78) | clearIndicators(){this.getIndicators().length&&this._snapIndicators.se...
    method setIndicators (line 78) | setIndicators(t){this._snapIndicators.set(t)}
    method getSnapThreshold (line 78) | getSnapThreshold(){return 8/this.editor.getZoomLevel()}
    method getSnappableShapes (line 78) | getSnappableShapes(){const{editor:t}=this,n=t.getRenderingBounds(),r=t...
    method getCurrentCommonAncestor (line 78) | getCurrentCommonAncestor(){return this.editor.findCommonAncestor(this....
  function G1 (line 78) | function G1(e){return e.replace(dz,`
  class fz (line 81) | class fz{constructor(t){m(this,"baseElm");m(this,"measureText",(t,n)=>{v...
    method constructor (line 81) | constructor(t){m(this,"baseElm");m(this,"measureText",(t,n)=>{var i;co...
    method measureElementTextNodeSpans (line 81) | measureElementTextNodeSpans(t,{shouldTruncateToFirstLine:n=!1}={}){con...
    method measureTextSpans (line 81) | measureTextSpans(t,n){var l;if(t==="")return[];const r=(l=this.baseElm...
  class gz (line 81) | class gz{constructor(t){m(this,"cancelRaf");m(this,"isPaused",!0);m(this...
    method constructor (line 81) | constructor(t){m(this,"cancelRaf");m(this,"isPaused",!0);m(this,"now",...
  class Hr (line 81) | class Hr{constructor(t,n){m(this,"updateUserPreferences",t=>{this.user.s...
    method constructor (line 81) | constructor(t,n){m(this,"updateUserPreferences",t=>{this.user.setUserP...
    method getUserPreferences (line 81) | getUserPreferences(){return{id:this.getId(),name:this.getName(),locale...
    method getIsDarkMode (line 81) | getIsDarkMode(){return this.user.userPreferences.get().isDarkMode??(th...
    method getEdgeScrollSpeed (line 81) | getEdgeScrollSpeed(){return this.user.userPreferences.get().edgeScroll...
    method getAnimationSpeed (line 81) | getAnimationSpeed(){return this.user.userPreferences.get().animationSp...
    method getId (line 81) | getId(){return this.user.userPreferences.get().id}
    method getName (line 81) | getName(){return this.user.userPreferences.get().name??ai.name}
    method getLocale (line 81) | getLocale(){return this.user.userPreferences.get().locale??ai.locale}
    method getColor (line 81) | getColor(){return this.user.userPreferences.get().color??ai.color}
    method getIsSnapMode (line 81) | getIsSnapMode(){return this.user.userPreferences.get().isSnapMode??ai....
    method getIsWrapMode (line 81) | getIsWrapMode(){return this.user.userPreferences.get().isWrapMode??ai....
  function Zc (line 81) | function Zc(e){return Math.abs(e.props.bend)<8}
  function Qp (line 81) | function Qp(e,t){if(t.type==="point")return;const n=e.getShape(t.boundSh...
  function X1 (line 81) | function X1(e,t,n,r){if(n.type==="point")return P.From(n);const o=e.getS...
  function jr (line 81) | function jr(e,t){const n=e.getShapePageTransform(t);let r,o;t.props.star...
  function ix (line 81) | function ix(e,t,n){if(!t||!n)return"safe";if(t===n)return"double-bound";...
  function Al (line 81) | function Al(e,t){const{start:n,end:r,arrowheadStart:o,arrowheadEnd:s}=t....
  function q1 (line 81) | function q1(e,t,n,r){if(r===void 0||r.isExact)return;const o=oe.applyToP...
  function xm (line 81) | function xm(e,t,n=0){const{arrowheadEnd:r,arrowheadStart:o}=t.props,s=t....
  function Z1 (line 81) | function Z1(e,t,n){const r=-2*(e.x*(t.y-n.y)-e.y*(t.x-n.x)+t.x*n.y-n.x*t...
  function vz (line 81) | function vz(e,t,n,r,o,s,i){const a=P.Angle(e,n),c=P.Angle(e,r);let l=$u(...
  class se (line 81) | class se{constructor(t,n){m(this,"id");m(this,"type");m(this,"shapeType"...
    method constructor (line 81) | constructor(t,n){m(this,"id");m(this,"type");m(this,"shapeType");m(thi...
    method getPath (line 81) | getPath(){return this._path.get()}
    method getCurrent (line 81) | getCurrent(){return this._current.get()}
    method getIsActive (line 81) | getIsActive(){return this._isActive.get()}
    method getCurrentToolIdMask (line 81) | getCurrentToolIdMask(){return this._currentToolIdMask.get()}
    method setCurrentToolIdMask (line 81) | setCurrentToolIdMask(t){this._currentToolIdMask.set(t)}
  class bh (line 81) | class bh extends se{constructor(){super(...arguments);m(this,"onKeyDown"...
    method constructor (line 81) | constructor(){super(...arguments);m(this,"onKeyDown",n=>{var r;switch(...
  class J (line 81) | class J extends E4.EventEmitter{constructor({store:n,user:r,shapeUtils:o...
    method constructor (line 81) | constructor({store:n,user:r,shapeUtils:o,tools:s,getContainer:i,initia...
    method dispose (line 81) | dispose(){this.disposables.forEach(n=>n()),this.disposables.clear()}
    method getShapeUtil (line 81) | getShapeUtil(n){const r=typeof n=="string"?n:n.type,o=Lr(this.shapeUti...
    method undo (line 81) | undo(){return this._flushEventsForTick(0),this.history.undo(),this}
    method getCanUndo (line 81) | getCanUndo(){return this.history.getNumUndos()>0}
    method redo (line 81) | redo(){return this._flushEventsForTick(0),this.history.redo(),this}
    method getCanRedo (line 81) | getCanRedo(){return this.history.getNumRedos()>0}
    method mark (line 81) | mark(n,r,o){return this.history.mark(n,r,o),this}
    method bail (line 81) | bail(){return this.history.bail(),this}
    method bailToMark (line 81) | bailToMark(n){return this.history.bailToMark(n),this}
    method batch (line 81) | batch(n){return this.history.batch(n),this}
    method _getArrowBindingsIndex (line 81) | _getArrowBindingsIndex(){return z4(this)}
    method getArrowsBoundTo (line 81) | getArrowsBoundTo(n){return this._getArrowBindingsIndex().get()[n]||Do}
    method getArrowInfoCache (line 81) | getArrowInfoCache(){return this.store.createComputedCache("arrow infoC...
    method getArrowInfo (line 81) | getArrowInfo(n){const r=typeof n=="string"?n:n.id;return this.getArrow...
    method annotateError (line 81) | annotateError(n,{origin:r,willCrashApp:o,tags:s,extras:i}){const a=thi...
    method createErrorAnnotations (line 81) | createErrorAnnotations(n,r){try{const o=this.getEditingShapeId();retur...
    method getCrashingError (line 81) | getCrashingError(){return this._crashingError}
    method crash (line 81) | crash(n){return this._crashingError=n,this.store.markAsPossiblyCorrupt...
    method getPath (line 81) | getPath(){return this.root.getPath().split("root.")[1]}
    method isIn (line 81) | isIn(n){const r=n.split(".").reverse();let o=this.root;for(;r.length>0...
    method isInAny (line 81) | isInAny(...n){return n.some(r=>this.isIn(r))}
    method setCurrentTool (line 81) | setCurrentTool(n,r={}){return this.root.transition(n,r),this}
    method getCurrentTool (line 81) | getCurrentTool(){return this.root.getCurrent()}
    method getCurrentToolId (line 81) | getCurrentToolId(){const n=this.getCurrentTool();return n?n.getCurrent...
    method getStateDescendant (line 81) | getStateDescendant(n){var s;const r=n.split(".").reverse();let o=this....
    method getDocumentSettings (line 81) | getDocumentSettings(){return this.store.get(RS)}
    method updateDocumentSettings (line 81) | updateDocumentSettings(n){return this.store.put([{...this.getDocumentS...
    method getInstanceState (line 81) | getInstanceState(){return this.store.get(In)}
    method updateInstanceState (line 81) | updateInstanceState(n,r){return this._updateInstanceState(n,{ephemeral...
    method getOpenMenus (line 81) | getOpenMenus(){return this.getInstanceState().openMenus}
    method addOpenMenu (line 81) | addOpenMenu(n){const r=new Set(this.getOpenMenus());return r.has(n)||(...
    method deleteOpenMenu (line 81) | deleteOpenMenu(n){const r=new Set(this.getOpenMenus());return r.has(n)...
    method clearOpenMenus (line 81) | clearOpenMenus(){return this.getOpenMenus().length&&this.updateInstanc...
    method getIsMenuOpen (line 81) | getIsMenuOpen(){return this.getOpenMenus().length>0}
    method getPageStates (line 81) | getPageStates(){return this._getPageStatesQuery().get()}
    method _getPageStatesQuery (line 81) | _getPageStatesQuery(){return this.store.query.records("instance_page_s...
    method getCurrentPageState (line 81) | getCurrentPageState(){return this.store.get(this._getCurrentPageStateI...
    method _getCurrentPageStateId (line 81) | _getCurrentPageStateId(){return Zt.createId(this.getCurrentPageId())}
    method updateCurrentPageState (line 81) | updateCurrentPageState(n,r){return this._setInstancePageState(n,r),this}
    method getSelectedShapeIds (line 81) | getSelectedShapeIds(){return this.getCurrentPageState().selectedShapeIds}
    method getSelectedShapes (line 81) | getSelectedShapes(){const{selectedShapeIds:n}=this.getCurrentPageState...
    method setSelectedShapes (line 81) | setSelectedShapes(n,r){const o=n.map(s=>typeof s=="string"?s:s.id);ret...
    method select (line 81) | select(...n){const r=typeof n[0]=="string"?n:n.map(o=>o.id);return thi...
    method deselect (line 81) | deselect(...n){const r=typeof n[0]=="string"?n:n.map(s=>s.id),o=this.g...
    method selectAll (line 81) | selectAll(){const n=this.getSortedChildIdsForParent(this.getCurrentPag...
    method selectNone (line 81) | selectNone(){return this.getSelectedShapeIds().length>0&&this.setSelec...
    method getOnlySelectedShapeId (line 81) | getOnlySelectedShapeId(){var n;return((n=this.getOnlySelectedShape())=...
    method getOnlySelectedShape (line 81) | getOnlySelectedShape(){const n=this.getSelectedShapes();return n.lengt...
    method getSelectionPageBounds (line 81) | getSelectionPageBounds(){const n=this.getCurrentPageState().selectedSh...
    method getSelectionRotation (line 81) | getSelectionRotation(){const n=this.getSelectedShapeIds();let r=!1,o=0...
    method getSelectionRotatedPageBounds (line 81) | getSelectionRotatedPageBounds(){const n=this.getSelectedShapeIds();if(...
    method getSelectionRotatedScreenBounds (line 81) | getSelectionRotatedScreenBounds(){const n=this.getSelectionRotatedPage...
    method getFocusedGroupId (line 81) | getFocusedGroupId(){return this.getCurrentPageState().focusedGroupId??...
    method getFocusedGroup (line 81) | getFocusedGroup(){const n=this.getFocusedGroupId();return n?this.getSh...
    method setFocusedGroup (line 81) | setFocusedGroup(n){const r=typeof n=="string"?n:(n==null?void 0:n.id)?...
    method popFocusedGroupId (line 81) | popFocusedGroupId(){const n=this.getFocusedGroup();if(n){const r=this....
    method getEditingShapeId (line 81) | getEditingShapeId(){return this.getCurrentPageState().editingShapeId}
    method getEditingShape (line 81) | getEditingShape(){const n=this.getEditingShapeId();return n?this.getSh...
    method setEditingShape (line 81) | setEditingShape(n){const r=typeof n=="string"?n:(n==null?void 0:n.id)?...
    method getHoveredShapeId (line 81) | getHoveredShapeId(){return this.getCurrentPageState().hoveredShapeId}
    method getHoveredShape (line 81) | getHoveredShape(){const n=this.getHoveredShapeId();return n?this.getSh...
    method setHoveredShape (line 81) | setHoveredShape(n){const r=typeof n=="string"?n:(n==null?void 0:n.id)?...
    method getHintingShapeIds (line 81) | getHintingShapeIds(){return this.getCurrentPageState().hintingShapeIds}
    method getHintingShape (line 81) | getHintingShape(){const n=this.getHintingShapeIds();return fe(n.map(r=...
    method setHintingShapes (line 81) | setHintingShapes(n){const r=typeof n[0]=="string"?n:n.map(o=>o.id);ret...
    method getErasingShapeIds (line 81) | getErasingShapeIds(){return this.getCurrentPageState().erasingShapeIds}
    method getErasingShapes (line 81) | getErasingShapes(){const n=this.getErasingShapeIds();return fe(n.map(r...
    method setErasingShapes (line 81) | setErasingShapes(n){const r=typeof n[0]=="string"?n:n.map(s=>s.id);r.s...
    method getCroppingShapeId (line 81) | getCroppingShapeId(){return this.getCurrentPageState().croppingShapeId}
    method setCroppingShape (line 81) | setCroppingShape(n){const r=typeof n=="string"?n:(n==null?void 0:n.id)...
    method getCameraId (line 81) | getCameraId(){return hn.createId(this.getCurrentPageId())}
    method getCamera (line 81) | getCamera(){return this.store.get(this.getCameraId())}
    method getZoomLevel (line 81) | getZoomLevel(){return this.getCamera().z}
    method _setCamera (line 81) | _setCamera(n,r=!1){const o=this.getCamera();return o.x===n.x&&o.y===n....
    method setCamera (line 81) | setCamera(n,r){const o=Number.isFinite(n.x)?n.x:0,s=Number.isFinite(n....
    method centerOnPoint (line 81) | centerOnPoint(n,r){if(!this.getInstanceState().canMoveCamera)return th...
    method zoomToContent (line 81) | zoomToContent(n={duration:220}){const r=this.getSelectionPageBounds()?...
    method zoomToFit (line 81) | zoomToFit(n){if(!this.getInstanceState().canMoveCamera)return this;con...
    method resetZoom (line 81) | resetZoom(n=this.getViewportScreenCenter(),r){if(!this.getInstanceStat...
    method zoomIn (line 81) | zoomIn(n=this.getViewportScreenCenter(),r){if(!this.getInstanceState()...
    method zoomOut (line 81) | zoomOut(n=this.getViewportScreenCenter(),r){if(!this.getInstanceState(...
    method zoomToSelection (line 81) | zoomToSelection(n){if(!this.getInstanceState().canMoveCamera)return th...
    method panZoomIntoView (line 81) | panZoomIntoView(n,r){if(!this.getInstanceState().canMoveCamera)return ...
    method zoomToBounds (line 81) | zoomToBounds(n,r){if(!this.getInstanceState().canMoveCamera)return thi...
    method pan (line 81) | pan(n,r){if(!this.getInstanceState().canMoveCamera)return this;const{x...
    method stopCameraAnimation (line 81) | stopCameraAnimation(){return this.emit("stop-camera-animation"),this}
    method _animateViewport (line 81) | _animateViewport(n){if(!this._viewportAnimation)return;const r=()=>{th...
    method _animateToViewport (line 81) | _animateToViewport(n,r={}){const{duration:o=0,easing:s=nn.easeInOutCub...
    method slideCamera (line 81) | slideCamera(n={}){if(!this.getInstanceState().canMoveCamera)return thi...
    method animateToUser (line 81) | animateToUser(n){const r=this.getCollaborators().find(o=>o.userId===n)...
    method animateToShape (line 81) | animateToShape(n,r=M5){if(!this.getInstanceState().canMoveCamera)retur...
    method updateViewportScreenBounds (line 81) | updateViewportScreenBounds(n,r=!1){n.width=Math.max(n.width,1),n.heigh...
    method getViewportScreenBounds (line 81) | getViewportScreenBounds(){const{x:n,y:r,w:o,h:s}=this.getInstanceState...
    method getViewportScreenCenter (line 81) | getViewportScreenCenter(){const n=this.getViewportScreenBounds();retur...
    method getViewportPageBounds (line 81) | getViewportPageBounds(){const{w:n,h:r}=this.getViewportScreenBounds(),...
    method getViewportPageCenter (line 81) | getViewportPageCenter(){return this.getViewportPageBounds().center}
    method screenToPage (line 81) | screenToPage(n){const{screenBounds:r}=this.store.unsafeGetWithoutCaptu...
    method pageToScreen (line 81) | pageToScreen(n){const r=this.getViewportScreenBounds(),{x:o,y:s,z:i=1}...
    method pageToViewport (line 81) | pageToViewport(n){const{x:r,y:o,z:s=1}=this.getCamera();return{x:(n.x+...
    method _getCollaboratorsQuery (line 81) | _getCollaboratorsQuery(){return this.store.query.records("instance_pre...
    method getCollaborators (line 81) | getCollaborators(){const n=this._getCollaboratorsQuery().get();return ...
    method getCollaboratorsOnCurrentPage (line 81) | getCollaboratorsOnCurrentPage(){const n=this.getCurrentPageId();return...
    method startFollowingUser (line 81) | startFollowingUser(n){const r=this._getCollaboratorsQuery().get().filt...
    method stopFollowingUser (line 81) | stopFollowingUser(){return this.updateInstanceState({followingUserId:n...
    method getCameraState (line 81) | getCameraState(){return this._cameraState.get()}
    method getUnorderedRenderingShapes (line 81) | getUnorderedRenderingShapes(n){const r=[];let o=Io*2,s=Io;const i=this...
    method getRenderingShapes (line 81) | getRenderingShapes(){return this.getUnorderedRenderingShapes(!0).sort(...
    method getRenderingBounds (line 81) | getRenderingBounds(){return this._renderingBounds.get()}
    method updateRenderingBounds (line 81) | updateRenderingBounds(){const n=this.getViewportPageBounds();return n....
    method _getAllPagesQuery (line 81) | _getAllPagesQuery(){return this.store.query.records("page")}
    method getPages (line 81) | getPages(){return this._getAllPagesQuery().get().sort(en)}
    method getCurrentPage (line 81) | getCurrentPage(){return this.getPage(this.getCurrentPageId())}
    method getCurrentPageId (line 81) | getCurrentPageId(){return this.getInstanceState().currentPageId}
    method getPage (line 81) | getPage(n){return this.store.get(typeof n=="string"?n:n.id)}
    method getCurrentPageShapeIds (line 81) | getCurrentPageShapeIds(){return this._currentPageShapeIds.get()}
    method getCurrentPageShapeIdsSorted (line 81) | getCurrentPageShapeIdsSorted(){return Array.from(this.getCurrentPageSh...
    method getPageShapeIds (line 81) | getPageShapeIds(n){const r=typeof n=="string"?n:n.id,o=this.store.quer...
    method setCurrentPage (line 81) | setCurrentPage(n,r){const o=typeof n=="string"?n:n.id;return this._set...
    method updatePage (line 81) | updatePage(n,r){return this._updatePage(n,r),this}
    method createPage (line 81) | createPage(n){return this._createPage(n),this}
    method deletePage (line 81) | deletePage(n){const r=typeof n=="string"?n:n.id;return this._deletePag...
    method duplicatePage (line 81) | duplicatePage(n,r=Ho.createId()){if(this.getPages().length>=Gp)return ...
    method renamePage (line 81) | renamePage(n,r,o){const s=typeof n=="string"?n:n.id;return this.getIns...
    method _getAllAssetsQuery (line 81) | _getAllAssetsQuery(){return this.store.query.records("asset")}
    method getAssets (line 81) | getAssets(){return this._getAllAssetsQuery().get()}
    method createAssets (line 81) | createAssets(n){return this._createAssets(n),this}
    method updateAssets (line 81) | updateAssets(n){return this._updateAssets(n),this}
    method deleteAssets (line 81) | deleteAssets(n){const r=typeof n[0]=="string"?n:n.map(o=>o.id);return ...
    method getAsset (line 81) | getAsset(n){return this.store.get(typeof n=="string"?n:n.id)}
    method _getShapeGeometryCache (line 81) | _getShapeGeometryCache(){return this.store.createComputedCache("bounds...
    method getShapeGeometry (line 81) | getShapeGeometry(n){return this._getShapeGeometryCache().get(typeof n=...
    method _getShapeHandlesCache (line 81) | _getShapeHandlesCache(){return this.store.createComputedCache("handles...
    method getShapeHandles (line 81) | getShapeHandles(n){return this._getShapeHandlesCache().get(typeof n=="...
    method getShapeLocalTransform (line 81) | getShapeLocalTransform(n){const r=typeof n=="string"?n:n.id,o=this.get...
    method _getShapePageTransformCache (line 81) | _getShapePageTransformCache(){return this.store.createComputedCache("p...
    method getShapeParentTransform (line 81) | getShapeParentTransform(n){const r=typeof n=="string"?n:n.id,o=this.ge...
    method getShapePageTransform (line 81) | getShapePageTransform(n){const r=typeof n=="string"?n:n.id;return this...
    method _getShapePageBoundsCache (line 81) | _getShapePageBoundsCache(){return this.store.createComputedCache("page...
    method getShapePageBounds (line 81) | getShapePageBounds(n){return this._getShapePageBoundsCache().get(typeo...
    method _getShapeClipPathCache (line 81) | _getShapeClipPathCache(){return this.store.createComputedCache("clipPa...
    method getShapeClipPath (line 81) | getShapeClipPath(n){return this._getShapeClipPathCache().get(typeof n=...
    method _getShapeMaskCache (line 81) | _getShapeMaskCache(){return this.store.createComputedCache("pageMaskCa...
    method getShapeMask (line 81) | getShapeMask(n){return this._getShapeMaskCache().get(typeof n=="string...
    method getShapeMaskedPageBounds (line 81) | getShapeMaskedPageBounds(n){return typeof n!="string"&&(n=n.id),this._...
    method _getShapeMaskedPageBoundsCache (line 81) | _getShapeMaskedPageBoundsCache(){return this.store.createComputedCache...
    method getShapeAncestors (line 81) | getShapeAncestors(n,r=[]){const o=typeof n=="string"?n:n.id,s=this.get...
    method findShapeAncestor (line 81) | findShapeAncestor(n,r){const o=typeof n=="string"?n:n.id,s=this.getSha...
    method hasAncestor (line 81) | hasAncestor(n,r){const o=typeof n=="string"?n:n==null?void 0:n.id,s=o&...
    method findCommonAncestor (line 81) | findCommonAncestor(n,r){var l;if(n.length===0)return;const o=typeof n[...
    method isShapeOrAncestorLocked (line 81) | isShapeOrAncestorLocked(n){const r=typeof n=="string"?this.getShape(n)...
    method _notVisibleShapes (line 81) | _notVisibleShapes(){return U4(this)}
    method getCulledShapes (line 81) | getCulledShapes(){const n=this._notVisibleShapes().get(),r=this.getSel...
    method getCurrentPageBounds (line 81) | getCurrentPageBounds(){let n;return this.getCurrentPageShapeIdsSorted(...
    method getSelectedShapeAtPoint (line 81) | getSelectedShapeAtPoint(n){const r=this.getSelectedShapeIds();return t...
    method getShapeAtPoint (line 81) | getShapeAtPoint(n,r={}){const o=this.getZoomLevel(),s=this.getViewport...
    method getShapesAtPoint (line 81) | getShapesAtPoint(n,r={}){return this.getCurrentPageShapes().filter(o=>...
    method isPointInShape (line 81) | isPointInShape(n,r,o={}){const{hitInside:s=!1,margin:i=0}=o,a=typeof n...
    method getPointInShapeSpace (line 81) | getPointInShapeSpace(n,r){const o=typeof n=="string"?n:n.id;return thi...
    method getPointInParentSpace (line 81) | getPointInParentSpace(n,r){const o=typeof n=="string"?n:n.id,s=this.ge...
    method getCurrentPageShapes (line 81) | getCurrentPageShapes(){return Array.from(this.getCurrentPageShapeIds()...
    method getCurrentPageShapesSorted (line 81) | getCurrentPageShapesSorted(){const n=[],r=this.getSortedChildIdsForPar...
    method getCurrentPageRenderingShapesSorted (line 81) | getCurrentPageRenderingShapesSorted(){const n=this.getCulledShapes();r...
    method isShapeOfType (line 81) | isShapeOfType(n,r){const o=typeof n=="string"?this.getShape(n):n;retur...
    method getShape (line 81) | getShape(n){const r=typeof n=="string"?n:n.id;if(Kn(r))return this.sto...
    method getShapeParent (line 81) | getShapeParent(n){const r=typeof n=="string"?n:n==null?void 0:n.id;if(...
    method getShapeNearestSibling (line 81) | getShapeNearestSibling(n,r){return r?r.parentId===n.parentId?r:this.fi...
    method isShapeInPage (line 81) | isShapeInPage(n,r=this.getCurrentPageId()){const o=typeof n=="string"?...
    method getAncestorPageId (line 81) | getAncestorPageId(n){const r=typeof n=="string"?n:n==null?void 0:n.id,...
    method reparentShapes (line 81) | reparentShapes(n,r,o){const s=typeof n[0]=="string"?n:n.map(y=>y.id);i...
    method getHighestIndexForParent (line 81) | getHighestIndexForParent(n){const r=typeof n=="string"?n:n.id,o=this._...
    method getSortedChildIdsForParent (line 81) | getSortedChildIdsForParent(n){const r=typeof n=="string"?n:n.id,o=this...
    method visitDescendants (line 81) | visitDescendants(n,r){const o=typeof n=="string"?n:n.id,s=this.getSort...
    method getShapeAndDescendantIds (line 81) | getShapeAndDescendantIds(n){const r=new Set,o=[...n];for(;o.length>0;)...
    method getDroppingOverShape (line 81) | getDroppingOverShape(n,r=[]){const o=this.getCurrentPageShapesSorted()...
    method getOutermostSelectableShape (line 81) | getOutermostSelectableShape(n,r){const o=typeof n=="string"?n:n.id,s=t...
    method rotateShapesBy (line 81) | rotateShapesBy(n,r){if((typeof n[0]=="string"?n:n.map(i=>i.id)).length...
    method getChangesToTranslateShape (line 81) | getChangesToTranslateShape(n,r){var i,a,c;let o=n;const s=this.getShap...
    method nudgeShapes (line 81) | nudgeShapes(n,r,o){const s=typeof n[0]=="string"?n:n.map(a=>a.id);if(s...
    method duplicateShapes (line 81) | duplicateShapes(n,r){const o=typeof n[0]=="string"?n:n.map(u=>u.id);if...
    method moveShapesToPage (line 81) | moveShapesToPage(n,r){const o=typeof n[0]=="string"?n:n.map(c=>c.id);i...
    method toggleLock (line 81) | toggleLock(n){const r=typeof n[0]=="string"?n:n.map(a=>a.id);if(this.g...
    method sendToBack (line 81) | sendToBack(n){const r=typeof n[0]=="string"?n:n.map(s=>s.id),o=Ed(this...
    method sendBackward (line 81) | sendBackward(n){const r=typeof n[0]=="string"?n:n.map(s=>s.id),o=Ed(th...
    method bringForward (line 81) | bringForward(n){const r=typeof n[0]=="string"?n:n.map(s=>s.id),o=Ed(th...
    method bringToFront (line 81) | bringToFront(n){const r=typeof n[0]=="string"?n:n.map(s=>s.id),o=Ed(th...
    method flipShapes (line 81) | flipShapes(n,r){const o=typeof n[0]=="string"?n:n.map(a=>a.id);if(this...
    method stackShapes (line 81) | stackShapes(n,r,o){const s=typeof n[0]=="string"?n:n.map(w=>w.id);if(t...
    method packShapes (line 81) | packShapes(n,r){var _,k;const o=typeof n[0]=="string"?n:n.map($=>$.id)...
    method alignShapes (line 81) | alignShapes(n,r){const o=typeof n[0]=="string"?n:n.map(l=>l.id);if(thi...
    method distributeShapes (line 81) | distributeShapes(n,r){const o=typeof n[0]=="string"?n:n.map(b=>b.id);i...
    method stretchShapes (line 81) | stretchShapes(n,r){const o=typeof n[0]=="string"?n:n.map(l=>l.id);if(t...
    method resizeShape (line 81) | resizeShape(n,r,o={}){var f;const s=typeof n=="string"?n:n.id;if(this....
    method _scalePagePoint (line 81) | _scalePagePoint(n,r,o,s){const i=P.RotWith(n,r,-s).sub(r),a=P.MulV(i,o...
    method _resizeUnalignedShape (line 81) | _resizeUnalignedShape(n,r,o){const{type:s}=o.initialShape,i=new P(r.x,...
    method getInitialMetaForShape (line 81) | getInitialMetaForShape(n){return{}}
    method createShape (line 81) | createShape(n){return this._createShapes([n]),this}
    method createShapes (line 81) | createShapes(n){if(!Array.isArray(n))throw Error("Editor.createShapes:...
    method animateShape (line 81) | animateShape(n,r){return this.animateShapes([n],r)}
    method animateShapes (line 81) | animateShapes(n,r={}){const{duration:o=500,easing:s=nn.linear}=r,i=et(...
    method groupShapes (line 81) | groupShapes(n,r=Be()){var f;if(!Array.isArray(n))throw Error("Editor.g...
    method ungroupShapes (line 81) | ungroupShapes(n){const r=typeof n[0]=="string"?n:n.map(a=>a.id);if(thi...
    method updateShape (line 81) | updateShape(n,r){return this.updateShapes([n],r),this}
    method updateShapes (line 81) | updateShapes(n,r){const o=Array(n.length);for(let s=0,i=n.length;s<i;s...
    method _getUnlockedShapeIds (line 81) | _getUnlockedShapeIds(n){return n.filter(r=>{var o;return!((o=this.getS...
    method deleteShapes (line 81) | deleteShapes(n){if(!Array.isArray(n))throw Error("Editor.deleteShapes:...
    method deleteShape (line 81) | deleteShape(n){return this.deleteShapes([typeof n=="string"?n:n.id]),t...
    method _extractSharedStyles (line 81) | _extractSharedStyles(n,r){if(this.isShapeOfType(n,"group")){const o=th...
    method _getSelectionSharedStyles (line 81) | _getSelectionSharedStyles(){const n=this.getSelectedShapes(),r=new KS;...
    method getStyleForNextShape (line 81) | getStyleForNextShape(n){const r=this.getInstanceState().stylesForNextS...
    method getShapeStyleIfExists (line 81) | getShapeStyleIfExists(n,r){const o=this.styleProps[n.type].get(r);if(o...
    method getSharedStyles (line 81) | getSharedStyles(){if(this.isIn("select")&&this.getSelectedShapeIds().l...
    method getSharedOpacity (line 81) | getSharedOpacity(){if(this.isIn("select")&&this.getSelectedShapeIds()....
    method setOpacityForNextShapes (line 81) | setOpacityForNextShapes(n,r){return this.updateInstanceState({opacityF...
    method setOpacityForSelectedShapes (line 81) | setOpacityForSelectedShapes(n,r){const o=this.getSelectedShapes();if(o...
    method setStyleForNextShapes (line 81) | setStyleForNextShapes(n,r,o){const s=this.getInstanceState().stylesFor...
    method setStyleForSelectedShapes (line 81) | setStyleForSelectedShapes(n,r,o){const s=this.getSelectedShapes();if(s...
    method registerExternalAssetHandler (line 81) | registerExternalAssetHandler(n,r){return this.externalAssetContentHand...
    method getAssetForExternalContent (line 81) | async getAssetForExternalContent(n){var r,o;return await((o=(r=this.ex...
    method registerExternalContentHandler (line 81) | registerExternalContentHandler(n,r){return this.externalContentHandler...
    method putExternalContent (line 81) | async putExternalContent(n){var r,o;return(o=(r=this.externalContentHa...
    method getContentFromCurrentPage (line 81) | getContentFromCurrentPage(n){const r=typeof n[0]=="string"?n:n.map(c=>...
    method putContentOntoCurrentPage (line 81) | putContentOntoCurrentPage(n,r={}){var k;if(this.getInstanceState().isR...
    method getSvgElement (line 82) | async getSvgElement(n,r={}){const o=await V4(this,n,r);if(!o)return;co...
    method getSvgString (line 82) | async getSvgString(n,r={}){const o=await this.getSvgElement(n,r);retur...
    method getSvg (line 82) | async getSvg(n,r={}){const o=await this.getSvgElement(n,r);if(o)return...
    method _updateInputsFromEvent (line 82) | _updateInputsFromEvent(n){var S;const{pointerVelocity:r,previousScreen...
    method cancel (line 82) | cancel(){return this.dispatch({type:"misc",name:"cancel"}),this}
    method interrupt (line 82) | interrupt(){return this.dispatch({type:"misc",name:"interrupt"}),this}
    method complete (line 82) | complete(){return this.dispatch({type:"misc",name:"complete"}),this}
    method cancelDoubleClick (line 82) | cancelDoubleClick(){this._clickManager.cancelDoubleClickTimeout()}
    method _flushEventsForTick (line 82) | _flushEventsForTick(n){this.batch(()=>{if(this._pendingEventsForNextTi...
  function _d (line 82) | function _d(e,t=e.getCurrentPageId()){const n=e.getPage(t).name;e.emit("...
  function Qc (line 82) | function Qc(e,t){if(!t)return e;let n=null;const r=Object.entries(t);for...
  function D2 (line 82) | function D2(e,t,n){const r=e.getShape(t);if(!r)return;n.push(r);const o=...
  function Ru (line 82) | function Ru(){const e=z(),t=j2();return K("isDarkMode",()=>(t==null?void...
  function ds (line 82) | function ds(e,t,n,r,o,s=16,i=16){const a=(-n-t)*(Pe/180),c=Math.sin(a),l...
  function Bn (line 82) | function Bn(e,t=0,n="black"){return Cz[e](w5(t),!1,n)}
  function Iz (line 82) | function Iz(){const e=z(),t=cn(),n=Ru();js("useCursor",()=>{const{type:r...
  function Ez (line 82) | function Ez(){const e=z(),t=cn(),n=Ru(),r=K($t.forceSrgb);Se.useEffect((...
  function ax (line 82) | function ax(e){const t=x.useRef();return x.useLayoutEffect(()=>{t.curren...
  function _z (line 82) | function _z(e){const t=z(),n=cn();x.useLayoutEffect(()=>{e?(t.getInstanc...
  function kz (line 82) | function kz(){const[e,t]=x.useState(0);x.useEffect(()=>t(n=>n+1),[])}
  function Tz (line 82) | function Tz(){return so?["iPad Simulator","iPhone Simulator","iPod Simul...
  function $z (line 82) | function $z(e){e.version<R2.Initial,e.version=Hf}
  function Mz (line 82) | function Mz(e){if(!e||typeof e!="object")return console.warn("Invalid in...
  function Az (line 82) | function Az(e){const t=e.query.ids("page");return V("sessionStateSnapsho...
  function jz (line 82) | function jz(e,t){const n=Mz(t);if(!n)return;const r=e.allRecords().filte...
  function Oz (line 82) | function Oz(e){var o;const t=[];for(const s of Object.values(e))(o=s.typ...
  function Dz (line 82) | function Dz(){window.alert(`Oops! We could not save changes to your brow...
  function Rz (line 86) | function Rz(){window.alert(`Oops! We could not access your browser's sto...
  function Fz (line 89) | function Fz(){return eP||(eP=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCur...
  function Nz (line 89) | function Nz(){return tP||(tP=[IDBCursor.prototype.advance,IDBCursor.prot...
  function zz (line 89) | function zz(e){const t=new Promise((n,r)=>{const o=()=>{e.removeEventLis...
  function Bz (line 89) | function Bz(e){if(WS.has(e))return;const t=new Promise((n,r)=>{const o=(...
  method get (line 89) | get(e,t,n){if(e instanceof IDBTransaction){if(t==="done")return WS.get(e...
  method set (line 89) | set(e,t,n){return e[t]=n,!0}
  method has (line 89) | has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!...
  function Uz (line 89) | function Uz(e){VS=e(VS)}
  function Hz (line 89) | function Hz(e){return e===IDBDatabase.prototype.transaction&&!("objectSt...
  function Kz (line 89) | function Kz(e){return typeof e=="function"?Hz(e):(e instanceof IDBTransa...
  function Ro (line 89) | function Ro(e){if(e instanceof IDBRequest)return zz(e);if(wm.has(e))retu...
  function Wz (line 89) | function Wz(e,t,{blocked:n,upgrade:r,blocking:o,terminated:s}={}){const ...
  function Vz (line 89) | function Vz(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return...
  function nP (line 89) | function nP(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="st...
  function Wf (line 89) | async function Wf(e,t){Jz(e);const n=await Wz(e,3,{upgrade(r){r.objectSt...
  function Xz (line 89) | async function Xz({persistenceKey:e,sessionId:t,didCancel:n}){const r=Kf...
  function qz (line 89) | async function qz({persistenceKey:e,schema:t,changes:n,sessionId:r,sessi...
  function Zz (line 89) | async function Zz({persistenceKey:e,schema:t,snapshot:n,sessionId:r,sess...
  function Qz (line 89) | async function Qz({persistenceKey:e,didCancel:t}){await Wf(Kf+e,async n=...
  function lx (line 89) | function lx(){const e=JSON.parse(D0(z2)||"[]")??[];return Array.isArray(...
  function Jz (line 89) | function Jz(e){const t=new Set(lx());t.add(e),R0(z2,JSON.stringify([...t...
  class r8 (line 89) | class r8{constructor(t){m(this,"onmessage")}postMessage(t){}close(){}}
    method constructor (line 89) | constructor(t){m(this,"onmessage")}
    method postMessage (line 89) | postMessage(t){}
    method close (line 89) | close(){}
  class s8 (line 89) | class s8{constructor(t,{persistenceKey:n,sessionId:r=ef,onLoad:o,onLoadE...
    method constructor (line 89) | constructor(t,{persistenceKey:n,sessionId:r=ef,onLoad:o,onLoadError:s}...
    method debug (line 89) | debug(...t){this.isDebugging&&console.debug(...t)}
    method connect (line 89) | async connect(t,n){this.debug("connecting");let r;try{r=await Xz({pers...
    method close (line 89) | close(){this.debug("closing"),this.didDispose=!0,this.disposables.forE...
    method schedulePersist (line 89) | schedulePersist(){this.debug("schedulePersist",this.scheduledPersistTi...
    method persistIfNeeded (line 89) | persistIfNeeded(){this.debug("persistIfNeeded",{isPersisting:this.isPe...
    method doPersist (line 89) | async doPersist(){_t(!this.isPersisting,"persist already in progress")...
  function B2 (line 89) | function B2({initialData:e,defaultName:t="",...n}){const r="schema"in n&...
  function i8 (line 89) | function i8(e){return Object.fromEntries(e.map(t=>[t.type,{props:t.props...
  function oP (line 89) | function oP(e){const t=B2(e);return e.snapshot&&t.loadSnapshot(e.snapsho...
  function U2 (line 89) | function U2(e){const[t,n]=x.useState(()=>oP(e));if(!U_(t.opts,e)){const ...
  function a8 (line 89) | function a8({persistenceKey:e,sessionId:t,...n}){const[r,o]=x.useState(n...
  function c8 (line 89) | function c8(){const e=z();x.useEffect(()=>{if(!H2)return;function t(n){(...
  function l8 (line 89) | function l8(){const e=z(),t=cn();x.useEffect(()=>{const n=s=>t.style.set...
  function p8 (line 89) | function p8(e){const{defaultName:t,snapshot:n,initialData:r,shapeUtils:o...
  function W2 (line 89) | function W2({onMount:e,children:t,store:n,tools:r,shapeUtils:o,user:s,in...
  function f8 (line 89) | function f8({children:e,onMount:t,autoFocus:n}){return l8(),Iz(),Ez(),c8...
  function g8 (line 89) | function g8({crashingError:e}){throw e}
  function V2 (line 89) | function V2({children:e}){return h.jsx("div",{className:"tl-loading",chi...
  function G2 (line 89) | function G2({children:e}){return h.jsx("div",{className:"tl-loading",chi...
  function m8 (line 89) | function m8(e){const t=z(),n=ax(r=>{const o=e==null?void 0:e(r);return r...
  function Ai (line 89) | function Ai({children:e,className:t="",...n}){return h.jsx("div",{...n,c...
  function Y2 (line 89) | function Y2(e,t,n={}){const{newPoint:r,handle:o,scaleX:s,scaleY:i}=t,{mi...
  class Pc (line 89) | class Pc extends Fr{constructor(){super(...arguments);m(this,"onResize",...
    method constructor (line 89) | constructor(){super(...arguments);m(this,"onResize",(n,r)=>Y2(n,r))}
    method getGeometry (line 89) | getGeometry(n){return new Wo({width:n.props.w,height:n.props.h,isFille...
    method getHandleSnapGeometry (line 89) | getHandleSnapGeometry(n){return{points:this.getGeometry(n).bounds.corn...
  method constructor (line 89) | constructor(){super(...arguments);m(this,"onPointerDown",n=>{this.parent...
  method constructor (line 89) | constructor(){super(...arguments);m(this,"markId","");m(this,"wasFocused...
  method complete (line 89) | complete(){const{originPagePoint:n}=this.editor.inputs;if(!this.wasFocus...
  method cancel (line 89) | cancel(){this.parent.transition("idle")}
  class Ph (line 89) | class Ph extends se{constructor(){super(...arguments);m(this,"onCreate")}}
    method constructor (line 89) | constructor(){super(...arguments);m(this,"onCreate")}
  function Vf (line 89) | function Vf(e){const t=z();return K("isEditing",()=>t.getEditingShapeId(...
  function v8 (line 89) | function v8(){return x.useId().replace(/:/g,"_")}
  function Xr (line 89) | function Xr(e){const t=z();return x.useMemo(function(){const o=l=>{if(l....
  function ux (line 89) | function ux(e,t=x8){return Math.max(w8,Math.ceil(e/t))}
  class X2 (line 89) | class X2 extends Hi{constructor(n){super({...n,isFilled:!1,isClosed:!1})...
    method constructor (line 89) | constructor(n){super({...n,isFilled:!1,isClosed:!1});m(this,"_center")...
    method nearestPoint (line 89) | nearestPoint(n){const{_center:r,measure:o,radius:s,angleEnd:i,angleSta...
    method hitTestLineSegment (line 89) | hitTestLineSegment(n,r){const{_center:o,radius:s,measure:i,angleStart:...
    method getVertices (line 89) | getVertices(){const{_center:n,measure:r,length:o,radius:s,angleStart:i...
  class dx (line 89) | class dx extends Hi{constructor(n){super({isClosed:!0,...n});m(this,"_ce...
    method constructor (line 89) | constructor(n){super({isClosed:!0,...n});m(this,"_center");m(this,"rad...
    method getBounds (line 89) | getBounds(){return new ne(this.x,this.y,this.radius*2,this.radius*2)}
    method getVertices (line 89) | getVertices(){const{_center:n,radius:r}=this,o=Oe*r,s=[];for(let i=0,a...
    method nearestPoint (line 89) | nearestPoint(n){const{_center:r,radius:o}=this;return r.equals(n)?P.Ad...
    method hitTestLineSegment (line 89) | hitTestLineSegment(n,r,o=0){const{_center:s,radius:i}=this;return Nf(n...
  class b8 (line 89) | class b8 extends Ki{constructor(n){const{start:r,cp1:o,cp2:s,end:i}=n;su...
    method constructor (line 89) | constructor(n){const{start:r,cp1:o,cp2:s,end:i}=n;super({...n,points:[...
    method getVertices (line 89) | getVertices(){const n=[],{a:r,b:o,c:s,d:i}=this;for(let a=0,c=10;a<=c;...
    method midPoint (line 89) | midPoint(){return P8(this,.5)}
    method nearestPoint (line 89) | nearestPoint(n){let r,o=1/0,s,i;for(const a of this.segments)i=a.neare...
  function P8 (line 89) | function P8(e,t){const{a:n,b:r,c:o,d:s}=e;return new P((1-t)*(1-t)*(1-t)...
  class C8 (line 89) | class C8 extends Hi{constructor(n){super({...n,isClosed:!1,isFilled:!1})...
    method constructor (line 89) | constructor(n){super({...n,isClosed:!1,isFilled:!1});m(this,"points");...
    method segments (line 89) | get segments(){if(!this._segments){this._segments=[];const{points:n}=t...
    method length (line 89) | get length(){return this._length||(this._length=this.segments.reduce((...
    method getVertices (line 89) | getVertices(){const n=this.segments.reduce((r,o)=>r.concat(o.vertices)...
    method nearestPoint (line 89) | nearestPoint(n){let r,o=1/0,s,i;for(const a of this.segments)i=a.neare...
    method hitTestLineSegment (line 89) | hitTestLineSegment(n,r){return this.segments.some(o=>o.hitTestLineSegm...
  class q2 (line 89) | class q2 extends Hi{constructor(n){super({...n,isClosed:!0});m(this,"w")...
    method constructor (line 89) | constructor(n){super({...n,isClosed:!0});m(this,"w");m(this,"h");m(thi...
    method edges (line 89) | get edges(){if(!this._edges){const{vertices:n}=this;this._edges=[];for...
    method getVertices (line 89) | getVertices(){const n=Math.max(1,this.w),r=Math.max(1,this.h),o=n/2,s=...
    method nearestPoint (line 89) | nearestPoint(n){let r,o=1/0,s,i;for(const a of this.edges)i=a.nearestP...
    method hitTestLineSegment (line 89) | hitTestLineSegment(n,r){return this.edges.some(o=>o.hitTestLineSegment...
    method getBounds (line 89) | getBounds(){return new ne(0,0,this.w,this.h)}
  class I8 (line 89) | class I8 extends q2{constructor(t){super({...t}),this.config=t}getVertic...
    method constructor (line 89) | constructor(t){super({...t}),this.config=t}
    method getVertices (line 89) | getVertices(){const t=Math.max(1,this.w),n=Math.max(1,this.h),r=t/2,o=...
  function sP (line 89) | function sP(e,t,n,r,o){const s=R5,i=n?L5:0,a=e-i,c=e+i,l=r?0:s,u=o?t:t-s...
  function hx (line 89) | function hx(e){if(!e.inputs.isDragging||e.inputs.isPanning||!e.getInstan...
  function E8 (line 89) | async function E8({shouldReload:e=!0}={}){B3(),await Promise.all(lx().ma...
  function _8 (line 89) | function _8(e,t="_blank"){J0.openWindow(e,t)}
  function SW (line 91) | function SW(e){return e.getSelectedShapeIds().map(r=>e.getShape(r)).filt...
  function xW (line 91) | function xW(e,t){const n=z();return K("selectedShapes",()=>n.getSelected...
  function wn (line 91) | function wn(e,t){const n=z();return K("selectedShapes",()=>{const r=n.ge...
  function wW (line 91) | function wW(){const e=z();return K("showAutoSizeToggle",()=>{const t=e.g...
  function XT (line 91) | function XT(){const e=z();return K("hasLinkShapeSelected",()=>{const t=e...
  function bW (line 91) | function bW(){const e=z();return K("onlyFlippableShape",()=>{const t=e.g...
  function qT (line 91) | function qT(){const e=z();return K("useCanRedo",()=>e.getCanRedo(),[e])}
  function ZT (line 91) | function ZT(){const e=z();return K("useCanUndo",()=>e.getCanUndo(),[e])}
  function PW (line 91) | function PW({children:e}){const t=z();return K("shouldDisplayHandles",()...
  function QT (line 91) | function QT(e,t={}){const{size:n=16,smoothing:r=.5}=t;if(e.length===0||n...
  function jx (line 91) | function jx(e,t={}){const{size:n=16,start:r={},end:o={},last:s=!1}=t,{ca...
  function lo (line 91) | function lo(e,t={}){var w;const{streamline:n=.5,size:r=16,simulatePressu...
  function Jf (line 91) | function Jf(e,t){const{size:n=16,thinning:r=.5,simulatePressure:o=!0,eas...
  function _W (line 91) | function _W(e,t={}){return jx(Jf(lo(e,t),t),t)}
  function ZP (line 91) | function ZP({scribble:e,zoom:t,color:n,opacity:r,className:o}){if(!e.poi...
  function ns (line 91) | function ns(){const e=z();return K("isReadonlyMode",()=>e.getInstanceSta...
  function TW (line 91) | function TW({size:e,width:t,height:n,hideAlternateHandles:r}){const o=j(...
  function DW (line 109) | function DW(e,t){var n=e==null?null:typeof Symbol<"u"&&e[Symbol.iterator...
  function QP (line 109) | function QP(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
  function Un (line 109) | function Un(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=n...
  function RW (line 109) | function RW(e,t,n){return t=WW(t),t in e?Object.defineProperty(e,t,{valu...
  function LW (line 109) | function LW(e,t){if(e==null)return{};var n={},r=Object.keys(e),o,s;for(s...
  function FW (line 109) | function FW(e,t){if(e==null)return{};var n=LW(e,t),r,o;if(Object.getOwnP...
  function JP (line 109) | function JP(e,t){return zW(e)||DW(e,t)||JT(e,t)||HW()}
  function Dd (line 109) | function Dd(e){return NW(e)||BW(e)||JT(e)||UW()}
  function NW (line 109) | function NW(e){if(Array.isArray(e))return av(e)}
  function zW (line 109) | function zW(e){if(Array.isArray(e))return e}
  function BW (line 109) | function BW(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iter...
  function JT (line 109) | function JT(e,t){if(e){if(typeof e=="string")return av(e,t);var n=Object...
  function av (line 109) | function av(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new A...
  function UW (line 109) | function UW(){throw new TypeError(`Invalid attempt to spread non-iterabl...
  function HW (line 110) | function HW(){throw new TypeError(`Invalid attempt to destructure non-it...
  function KW (line 111) | function KW(e,t){if(typeof e!="object"||e===null)return e;var n=e[Symbol...
  function WW (line 111) | function WW(e){var t=KW(e,"string");return typeof t=="symbol"?t:String(t)}
  function jl (line 111) | function jl(e){var t=e.sizes.shift(),n=Math.max(Math.ceil(t[0]),1),r=Mat...
  function Ym (line 111) | function Ym(e){var t=e.width===e.height,n=e.height===1,r=e.width===1,o=[...
  function Rd (line 111) | function Rd(e){var t=window&&"HTMLCanvasElement"in window,n=window&&"Off...
  function GW (line 116) | function GW(){return qm||(qm=YW()),qm}
  function YW (line 116) | async function YW(){const e=await Xm.maxWidth({usePromise:!0}),t=await X...
  function e$ (line 116) | async function e$(e,t){if(e<=eC&&t<=eC&&e*t<=XW)return[e,t];const{maxWid...
  function tC (line 120) | function tC(e,t){let n=0;for(;e[t+n];)n+=e[t+n]+1;return n+1}
  function qW (line 120) | function qW(e){return new TextDecoder("ascii").decode(e.slice(0,3))==="G...
  function ZW (line 120) | function ZW(e){const t=new Uint8Array(e);let n,r,o=0,s=0;if(!qW(e))retur...
  function QW (line 120) | function QW(e,t){const n=e.w/t.w,r=e.h/t.h;return n<=1&&r<=1?e:n>r?{w:e....
  function JW (line 120) | async function JW(e,t,n,r={}){const o=await jo.usingObjectURL(e,jo.loadI...
  function eV (line 120) | async function eV(e){return ZW(await e.arrayBuffer())}
  function tV (line 120) | function tV(e){if(typeof e!="string")throw new TypeError("Expected a str...
  function nV (line 120) | function nV(e){const t=new URL(e).host.replace("www.","");for(const n of...
  function oV (line 120) | function oV(e){const t=new URL(e).host.replace("www.","");for(const n of...
  function n$ (line 120) | function n$(e){return oV(e)??nV(e)}
  function Cs (line 120) | function Cs(e){try{return n$(e)}catch(t){console.error(t)}}
  method insertTextFirefox (line 124) | static insertTextFirefox(t,n){t.setRangeText(n,t.selectionStart||0,t.sel...
  method insert (line 124) | static insert(t,n){const r=t.ownerDocument,o=r.activeElement;o!==t&&t.fo...
  method set (line 124) | static set(t,n){t.select(),ln.insert(t,n)}
  method getSelection (line 124) | static getSelection(t){const{selectionStart:n,selectionEnd:r}=t;return t...
  method wrapSelection (line 124) | static wrapSelection(t,n,r){const{selectionStart:o,selectionEnd:s}=t,i=l...
  method replace (line 124) | static replace(t,n,r){let o=0;t.value.replace(n,(...s)=>{const i=o+s[s.l...
  method findLineEnd (line 124) | static findLineEnd(t,n){const r=t.lastIndexOf(`
  method indent (line 125) | static indent(t){var a;const{selectionStart:n,selectionEnd:r,value:o}=t,...
  method unindent (line 126) | static unindent(t){const{selectionStart:n,selectionEnd:r,value:o}=t,s=o....
  method indentCE (line 127) | static indentCE(t){var c;const n=window.getSelection(),r=t.innerText,o=L...
  method unindentCE (line 128) | static unindentCE(t){const n=window.getSelection(),r=t.innerText,o=Ld(t)...
  method normalizeText (line 129) | static normalizeText(t){return t.replace(ln.fixNewLines,`
  method normalizeTextForDom (line 130) | static normalizeTextForDom(t){return t.replace(ln.fixNewLines,`
  function Ld (line 133) | function Ld(e){if(typeof window.getSelection>"u")return;const t=window.g...
  function r$ (line 133) | function r$(e){return sV.test(e)}
  function iV (line 133) | function iV(e){return e.replace(/\t/g,Da)}
  function aV (line 133) | function aV(e){const t=e.split(`
  function cV (line 135) | function cV(e){return e.replace(/[ \t]+$/gm,"").replace(/\n+$/,"")}
  function lV (line 135) | function lV(e){return cV(aV(iV(e)))}
  function uV (line 135) | function uV(e,{maxImageDimension:t,maxAssetSize:n,acceptedImageMimeTypes...
  function nC (line 136) | async function nC(e,t,n){if(!t.length)return[];const r=P.From(n),o=[];fo...
  function o$ (line 136) | function o$(e,t){const n=e.getViewportPageBounds();let r=e.getSelectionP...
  function dV (line 136) | function dV(e,t,n){const r={id:Be(),type:"bookmark",x:n.x-150,y:n.y-160,...
  method constructor (line 136) | constructor(){super(...arguments);m(this,"onPointerDown",n=>{this.parent...
  method constructor (line 136) | constructor(){super(...arguments);m(this,"shape");m(this,"markId","");m(...
  method cancel (line 136) | cancel(){this.shape&&this.editor.bailToMark(this.markId),this.editor.set...
  method createArrowShape (line 136) | createArrowShape(){var u,d;const{originPagePoint:n}=this.editor.inputs,r...
  method updateArrowShapeEndHandle (line 136) | updateArrowShapeEndHandle(){var s,i,a;const n=this.shape;if(!n)throw Err...
  method startPreciseTimeout (line 136) | startPreciseTimeout(){this.preciseTimeout=window.setTimeout(()=>{this.ge...
  method clearPreciseTimeout (line 136) | clearPreciseTimeout(){clearTimeout(this.preciseTimeout)}
  class _h (line 136) | class _h extends se{constructor(){super(...arguments);m(this,"shapeType"...
    method constructor (line 136) | constructor(){super(...arguments);m(this,"shapeType","arrow")}
  class Ox (line 136) | class Ox extends se{constructor(){super(...arguments);m(this,"info",{});...
    method constructor (line 136) | constructor(){super(...arguments);m(this,"info",{});m(this,"initialSha...
    method canClose (line 136) | canClose(){return this.shapeType!=="highlight"}
    method getIsClosed (line 136) | getIsClosed(n,r){if(!this.canClose())return!1;const o=Mt[r],s=n[0].poi...
    method startShape (line 136) | startShape(){const{inputs:{originPagePoint:n,isPen:r}}=this.editor;thi...
    method updateDrawingShape (line 136) | updateDrawingShape(){const{initialShape:n}=this,{inputs:r}=this.editor...
    method getLineLength (line 136) | getLineLength(n){let r=0;for(const o of n)for(let s=0;s<o.points.lengt...
    method complete (line 136) | complete(){if(!this.canDraw){this.cancel();return}const{initialShape:n...
    method cancel (line 136) | cancel(){this.parent.transition("idle",this.info)}
  method constructor (line 136) | constructor(){super(...arguments);m(this,"onPointerDown",n=>{this.parent...
  class kh (line 136) | class kh extends se{constructor(){super(...arguments);m(this,"shapeType"...
    method constructor (line 136) | constructor(){super(...arguments);m(this,"shapeType","draw");m(this,"o...
  class cv (line 136) | class cv extends Ph{constructor(){super(...arguments);m(this,"shapeType"...
    method constructor (line 136) | constructor(){super(...arguments);m(this,"shapeType","frame");m(this,"...
  function fV (line 136) | function fV(e,t,n){return t.includes(e.id)?!1:e.parentId===n.parentId}
  method constructor (line 136) | constructor(){super(...arguments);m(this,"onPointerDown",n=>{this.parent...
  method constructor (line 136) | constructor(){super(...arguments);m(this,"markId","");m(this,"onPointerU...
  method complete (line 136) | complete(){const{originPagePoint:n}=this.editor.inputs,r=Be();this.markI...
  method cancel (line 136) | cancel(){this.parent.transition("idle")}
  class Th (line 136) | class Th extends se{constructor(){super(...arguments);m(this,"shapeType"...
    method constructor (line 136) | constructor(){super(...arguments);m(this,"shapeType","geo")}
  class $h (line 136) | class $h extends se{constructor(){super(...arguments);m(this,"shapeType"...
    method constructor (line 136) | constructor(){super(...arguments);m(this,"shapeType","highlight");m(th...
  method constructor (line 136) | constructor(){super(...arguments);m(this,"shapeId","");m(this,"onEnter",...
  method constructor (line 136) | constructor(){super(...arguments);m(this,"shape",{});m(this,"markId");m(...
  method complete (line 136) | complete(){this.parent.transition("idle",{shapeId:this.shape.id}),this.e...
  method cancel (line 136) | cancel(){this.markId&&this.editor.bailToMark(this.markId),this.parent.tr...
  class Mh (line 136) | class Mh extends se{constructor(){super(...arguments);m(this,"shapeType"...
    method constructor (line 136) | constructor(){super(...arguments);m(this,"shapeType","line")}
  method constructor (line 136) | constructor(){super(...arguments);m(this,"onPointerDown",n=>{this.parent...
  function We (line 136) | function We(e,t){var o;const n=new Set;for(const s of t){const i=e.getSh...
  function i$ (line 136) | function i$(e,t){const n=e.getSortedChildIdsForParent(t.id);if(n.length=...
  function sf (line 136) | function sf(e,t,n=!1){e.select(t),e.setEditingShape(t),e.setCurrentTool(...
  function a$ (line 136) | function a$(e){const t=e.getSelectionPageBounds(),n=e.getViewportPageBou...
  function l$ (line 136) | function l$(e,t,n,r){return Object.fromEntries(Object.entries(bV).map(([...
  function u$ (line 136) | function u$(e,t,n){const r=new Set(e.getSelectedShapeIds()),o=(Te+vi+n)*...
  function d$ (line 136) | function d$(e,t,n,r,o=!1){let s;const i=e.getCurrentPageShapesSorted(),a...
  method constructor (line 136) | constructor(){super(...arguments);m(this,"dragged",!1);m(this,"info",{})...
  method complete (line 136) | complete(){this.wasFocusedOnEnter&&(this.editor.getInstanceState().isToo...
  method cancel (line 136) | cancel(){this.editor.bailToMark(this.markId),this.parent.transition("idl...
  function oC (line 136) | function oC(e,t){let n=c$/e.getZoomLevel(),r;for(const o of u$(e,0,0)){c...
  function sC (line 136) | function sC(e,t,n){e.createShape({id:t,type:"note",x:n.x,y:n.y}).select(...
  class Ah (line 136) | class Ah extends se{constructor(){super(...arguments);m(this,"shapeType"...
    method constructor (line 136) | constructor(){super(...arguments);m(this,"shapeType","note")}
  function CV (line 136) | function CV(e){const t=e.getShapeAtPoint(e.inputs.currentPagePoint,{hitI...
  method constructor (line 136) | constructor(){super(...arguments);m(this,"onPointerMove",n=>{switch(n.ta...
  method constructor (line 136) | constructor(){super(...arguments);m(this,"shape");m(this,"markId","");m(...
  method complete (line 136) | complete(){var s;this.editor.mark("creating text shape");const n=Be(),{x...
  method cancel (line 136) | cancel(){this.parent.transition("idle"),this.editor.bailToMark(this.mark...
  class jh (line 136) | class jh extends se{constructor(){super(...arguments);m(this,"shapeType"...
    method constructor (line 136) | constructor(){super(...arguments);m(this,"shapeType","text")}
  function xt (line 136) | function xt(){return Jo({isDarkMode:Ru()})}
  function TV (line 136) | function TV(e){return e.replace(/\s/g," ")}
  function lv (line 136) | function lv(e,t,n){const{padding:r=0}=n;if(t.length===0)return null;cons...
  function $V (line 137) | function $V(e,t,n,r){if((e==="start-legacy"||e==="end-legacy")&&n.length...
  function MV (line 137) | function MV(e){return e==="start-legacy"||e==="middle-legacy"||e==="end-...
  function eg (line 137) | function eg({fontSize:e,font:t,align:n,verticalAlign:r,text:o,labelColor...
  function lc (line 137) | function lc(e){return{key:`${ao.id}:${e}`,getElement:async()=>{const t=A...
  function AV (line 137) | function AV(e){const t=dk[e];for(const n of document.fonts)if(t.includes...
  function Rx (line 137) | function Rx(e){return{key:`${ao.id}:${e}`,getElement:async()=>e!=="patte...
  function jV (line 137) | function jV(){const e=xt(),t=8/12;return h.jsxs(h.Fragment,{children:[h....
  function Lx (line 137) | function Lx(){return{key:`${ao.id}:pattern`,component:RV}}
  function DV (line 137) | function DV(){const t=z().getInstanceState().devicePixelRatio,[n,r]=x.us...
  function RV (line 137) | function RV(){const e=z(),t=x.useRef(null),{defs:n,isReady:r}=DV();retur...
  function h$ (line 137) | function h$(e){return e.classList.contains("tl-html-layer")?e:e.parentEl...
  function Vo (line 137) | function Vo(e,t,n={}){const{closed:r=!1,snap:o=1,start:s="outset",end:i=...
  function Fx (line 137) | function Fx(e,t){const n=cC.get(t);if(n)return n;const r=e.getArrowInfo(...
  function p$ (line 137) | function p$(e,t){const n=Mt[t.props.size];return jW+(n-Mt.s)*2+(n===Mt.x...
  function LV (line 137) | function LV(e,t,n){const r=Fx(e,t),o=p$(e,t),s=P.Nudge(n.start.point,n.e...
  function FV (line 137) | function FV(e,t,n){const r=Fx(e,t),o=p$(e,t),s=Math.sign(t.props.bend),i...
  function Oh (line 137) | function Oh(e,t){let n;const r=[],o=e.getArrowInfo(t),s=t.props.start.ty...
  function lC (line 137) | function lC(e,t,n,r,o,s){const i=HS(e,t,s),a=vs(n,r,o);return i==null?vo...
  function uC (line 137) | function uC(e,t){let n=null,r=-1/0;for(const o of t){const s=P.Dist2(e,o...
  function NV (line 137) | function NV(e,t,n,r){const o=vs(e,t,n);return e+o*r*n*-1}
  function zV (line 137) | function zV(e,t,n){const r=t==="end"?e.end.point:e.start.point,o=t==="en...
  function BV (line 137) | function BV({point:e,int:t}){const n=P.RotWith(t,e,Pe/6),r=P.RotWith(t,e...
  function UV (line 137) | function UV({point:e,int:t}){const n=P.RotWith(t,e,Pe/6),r=P.RotWith(t,e...
  function HV (line 137) | function HV({point:e,int:t}){const n=P.Sub(t,e).div(2),r=P.Add(e,P.Rot(n...
  function KV (line 137) | function KV({point:e,int:t}){const n=P.Lrp(e,t,.45),r=P.Dist(n,e);return...
  function WV (line 139) | function WV({point:e,int:t}){const n=P.Lrp(e,t,.75),r=P.RotWith(n,e,Pe/4...
  function VV (line 139) | function VV({int:e,point:t}){const n=P.Lrp(t,e,.85),r=P.Sub(n,t).div(2),...
  function GV (line 139) | function GV({int:e,point:t}){const n=P.Sub(e,t).div(2),r=P.Add(t,P.Rot(n...
  function af (line 139) | function af(e,t,n){const r=t==="end"?e.end.arrowhead:e.start.arrowhead;i...
  function YV (line 139) | function YV(e){const{start:t,end:n,handleArc:{radius:r,largeArcFlag:o,sw...
  function f$ (line 139) | function f$(e){const{start:t,end:n,bodyArc:{radius:r,largeArcFlag:o,swee...
  function g$ (line 139) | function g$(e,t){return`M${e.x},${e.y}L${t.x},${t.y}`}
  function XV (line 139) | function XV(e){return g$(e.start.handle,e.end.handle)}
  function m$ (line 139) | function m$(e){return g$(e.start.point,e.end.point)}
  function ZV (line 139) | function ZV(e,t,n){const r=z(),o=x.useRef(null),s=x.useRef(),i=K("isEdit...
  function QV (line 139) | function QV(){}
  class Dh (line 139) | class Dh extends Fr{constructor(){super(...arguments);m(this,"canEdit",(...
    method constructor (line 139) | constructor(){super(...arguments);m(this,"canEdit",()=>!0);m(this,"can...
    method getDefaultProps (line 139) | getDefaultProps(){return{dash:"draw",size:"m",fill:"none",color:"black...
    method getGeometry (line 139) | getGeometry(n){const r=this.editor.getArrowInfo(n),o=[],s=r.isStraight...
    method getHandles (line 139) | getHandles(n){const r=this.editor.getArrowInfo(n);return[{id:"start",t...
    method component (line 139) | component(n){const r=this.editor.getOnlySelectedShape(),o=this.editor....
    method indicator (line 139) | indicator(n){const{start:r,end:o}=jr(this.editor,n),s=this.editor.getA...
    method toSvg (line 139) | toSvg(n,r){r.addExportDef(Rx(n.props.fill)),n.props.text&&r.addExportD...
    method getCanvasSvgDefs (line 139) | getCanvasSvgDefs(){return[Lx(),{key:"arrow:dot",component:nG},{key:"ar...
  function tG (line 139) | function tG(e,t){const n=e.getArrowInfo(t);return n.isStraight?P.Dist(n....
  function nG (line 139) | function nG(){return h.jsx("marker",{id:"arrowhead-dot",className:"tl-ar...
  function rG (line 139) | function rG(){return h.jsxs("marker",{id:"arrowhead-cross",className:"tl...
  function uc (line 139) | function uc({url:e,zoomLevel:t}){return h.jsx("a",{className:ue("tl-hype...
  function Nx (line 139) | function Nx(e){return oG.map(n=>{const{offsetX:r,offsetY:o,blur:s,spread...
  class Rh (line 139) | class Rh extends Pc{constructor(){super(...arguments);m(this,"canResize"...
    method constructor (line 139) | constructor(){super(...arguments);m(this,"canResize",()=>!1);m(this,"h...
    method getDefaultProps (line 139) | getDefaultProps(){return{url:"",w:300,h:320,assetId:null}}
    method component (line 139) | component(n){const r=n.props.assetId?this.editor.getAsset(n.props.asse...
    method indicator (line 139) | indicator(n){return h.jsx("rect",{width:j(n.props.w),height:j(n.props....
  function fC (line 139) | function fC(e,t){const{url:n}=t.props,r=Si.createId($S(n));e.getAsset(r)...
  function ji (line 139) | function ji(e,t=!1){const n=e.length;if(n<2)return"";let r=e[0].point,o=...
  function aG (line 139) | function aG(e,t={}){const{start:n={},end:r={}}=t,{cap:o=!0}=n,{cap:s=!0}...
  function cG (line 139) | function cG(e){if(e.length<=2)return[e];const t=[];let n=[e[0]],r=P.Sub(...
  function Zm (line 139) | function Zm(e){const t=e[0];let n;for(;e.length>2&&(n=e[1],P.Dist2(t.poi...
  function lG (line 139) | function lG(e,t,n){return"M "+e+" "+t+" m -"+n+", 0 a "+n+","+n+" 0 1,1 ...
  function uG (line 139) | function uG(e,t={}){if(e.length===0)return"";if(e.length===1)return lG(e...
  function du (line 139) | function du(){const e=z();return K("zoom",()=>e.getZoomLevel()<.35,[e])}
  function uv (line 139) | function uv({strokeWidth:e,showAsComplete:t}){return{size:1+e,thinning:0...
  function dv (line 139) | function dv(e,t,n,r){return{...r?gC(t):e.dash==="draw"?e.isPen?pG(t):hG(...
  function hu (line 139) | function hu(e){const t=[];for(const n of e)if(n.type==="free"||n.points....
  function fG (line 139) | function fG(e,t){return{draw:"none",solid:"none",dotted:`0.1 ${t*2}`,das...
  class Lh (line 139) | class Lh extends Fr{constructor(){super(...arguments);m(this,"hideResize...
    method constructor (line 139) | constructor(){super(...arguments);m(this,"hideResizeHandles",n=>Qm(n))...
    method getDefaultProps (line 139) | getDefaultProps(){return{segments:[],color:"black",fill:"none",dash:"d...
    method getGeometry (line 139) | getGeometry(n){const r=hu(n.props.segments),o=Mt[n.props.size];if(n.pr...
    method component (line 139) | component(n){return h.jsx(zs,{id:n.id,children:h.jsx(mC,{shape:n,force...
    method ind
Copy disabled (too large) Download .json
Condensed preview — 1871 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (85,887K chars).
[
  {
    "path": ".gitignore",
    "chars": 60,
    "preview": "build/bin\nnode_modules\nfrontend/dist\ndist/*\n.VSCodeCounter\n\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 1252,
    "preview": "## 变更记录\n\n- 2024-09-10\n1. 重构本地聊天,修改发现机制(基于ip扫描和arp过滤)\n2. 本地聊天可批量发送图片/文件夹,修改发送机制,消息基于udp发送,文件基于tcp发送\n\n-2024-09-04\n1. 修复wor"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 461,
    "preview": "# Contributing\nWe are greating for all improvements, bug fixes and new features if it not break exists behaviour.\n\n## Co"
  },
  {
    "path": "Dockerfile",
    "chars": 732,
    "preview": "# docker build --no-cache -t godoos/godoos:latest .\r\n# docker run -it --rm -p 56780:56780 godoos/godoos:latest\r\n# docker"
  },
  {
    "path": "LICENSE",
    "chars": 35182,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\r\n                       Version 3, 19 November 2007\r\n\r\n Copyright "
  },
  {
    "path": "README.en.md",
    "chars": 9554,
    "preview": "<p align=\"center\">\n    <img src=\"./build/appicon.png\" width=\"120\" height=\"120\">\n</p>\n\n<h1 align=\"center\">GodoOS</h1>\nAn "
  },
  {
    "path": "README.md",
    "chars": 10396,
    "preview": "<p align=\"center\">\n    <img src=\"./build/appicon.png\" width=\"120\" height=\"120\">\n</p>\n\n<h1 align=\"center\">GodoOS</h1>\n一款高"
  },
  {
    "path": "app/app.go",
    "chars": 1616,
    "preview": "package app\n\nimport (\n\t\"context\"\n\t\"errors\"\n\tcmd \"godo/cmd\"\n\t\"os\"\n\t\"os/exec\"\n\t\"runtime\"\n\n\twruntime \"github.com/wailsapp/w"
  },
  {
    "path": "build/README.md",
    "chars": 1591,
    "preview": "# Build Directory\n\nThe build directory is used to house all the build files and assets for your application. \n\nThe struc"
  },
  {
    "path": "build/darwin/Info.dev.plist",
    "chars": 2308,
    "preview": "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1"
  },
  {
    "path": "build/darwin/Info.plist",
    "chars": 2168,
    "preview": "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1"
  },
  {
    "path": "build/windows/info.json",
    "chars": 356,
    "preview": "{\n\t\"fixed\": {\n\t\t\"file_version\": \"{{.Info.ProductVersion}}\"\n\t},\n\t\"info\": {\n\t\t\"0000\": {\n\t\t\t\"ProductVersion\": \"{{.Info.Prod"
  },
  {
    "path": "build/windows/installer/project.nsi",
    "chars": 4862,
    "preview": "Unicode true\n\n####\n## Please note: Template replacements don't work in this file. They are provided with default defines"
  },
  {
    "path": "build/windows/installer/wails_tools.nsh",
    "chars": 7547,
    "preview": "# DO NOT EDIT - Generated automatically by `wails build`\n\n!include \"x64.nsh\"\n!include \"WinVer.nsh\"\n!include \"FileFunc.ns"
  },
  {
    "path": "build/windows/wails.exe.manifest",
    "chars": 1036,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com"
  },
  {
    "path": "build.linux.sh",
    "chars": 239,
    "preview": "#!/bin/bash\n\n# 构建和压缩\nwails build -platform linux/amd64 -s -ldflags=\"-s -w\"\nwails build -platform linux/arm64 -s -ldflags"
  },
  {
    "path": "build.win.sh",
    "chars": 124,
    "preview": "wails build -ldflags=\"-s -w\" -platform windows/amd64 -nsis -s\nwails build -ldflags=\"-s -w\" -platform windows/arm64 -nsis"
  },
  {
    "path": "cloud/.gitignore",
    "chars": 31,
    "preview": "tmp\ndeps/dist\ndeps/*.zip\ndist/\n"
  },
  {
    "path": "cloud/README.md",
    "chars": 556,
    "preview": "## godocloud客户端安装帮助\n\n- cloud目录为企业版打包客户端而设定,可以自由定制客户端,根据以下步骤打包\n\n### 第一步:安装nodejs\n\n```\ncd ../frontend\nnpm i\nnpm run build\n"
  },
  {
    "path": "cloud/build.sh",
    "chars": 900,
    "preview": "#!/bin/bash\n\n# 定义要构建的平台\nPLATFORMS=(\"linux/amd64\" \"windows/amd64\" \"darwin/amd64\" \"linux/arm64\" \"windows/arm64\" \"darwin/ar"
  },
  {
    "path": "cloud/cmd/main.go",
    "chars": 1746,
    "preview": "/*\n * GodoOS - A lightweight cloud desktop\n * Copyright (C) 2024 https://godoos.com\n *\n * This program is free software:"
  },
  {
    "path": "cloud/cmd/msg.go",
    "chars": 1916,
    "preview": "/*\n * GodoOS - A lightweight cloud desktop\n * Copyright (C) 2024 https://godoos.com\n *\n * This program is free software:"
  },
  {
    "path": "cloud/cmd/serve.go",
    "chars": 2288,
    "preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/g"
  },
  {
    "path": "cloud/deps/frontend.go",
    "chars": 74,
    "preview": "package deps\n\nimport \"embed\"\n\n//go:embed dist\nvar Frontendassets embed.FS\n"
  },
  {
    "path": "cloud/go.mod",
    "chars": 67,
    "preview": "module godocloud\n\ngo 1.23.2\n\nrequire github.com/gorilla/mux v1.8.1\n"
  },
  {
    "path": "cloud/go.sum",
    "chars": 163,
    "preview": "github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=\ngithub.com/gorilla/mux v1.8.1/go.mod h1:AK"
  },
  {
    "path": "cloud/main.go",
    "chars": 69,
    "preview": "package main\n\nimport \"godocloud/cmd\"\n\nfunc main() {\n\tcmd.OsStart()\n}\n"
  },
  {
    "path": "compose-dev.yaml",
    "chars": 231,
    "preview": "services:\n  app:\n    entrypoint:\n    - sleep\n    - infinity\n    image: docker/dev-environments-javascript:stable-1\n    i"
  },
  {
    "path": "docker/Dockerfile-dev",
    "chars": 538,
    "preview": "# docker build -f Dockerfile-dev -t godoos/godoos-dev:latest .\n# docker run -it --rm -v $(pwd):/app -p 56780:56780 --nam"
  },
  {
    "path": "docker/nginx.conf",
    "chars": 310,
    "preview": "server {\n    listen       80;\n    server_name  localhost;\n\n    # 代理所有请求到 /dist 目录\n    location / {\n        root   /usr/s"
  },
  {
    "path": "docker-compose.yml",
    "chars": 182,
    "preview": "version: '3.8'\n\nservices:\n  godoos:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    image: godoos/godoos:la"
  },
  {
    "path": "docs/Api.md",
    "chars": 4612,
    "preview": "## API\n- 系统接口地址: http://localhost:56780\n\n### 读取目录\n\n#### HTTP 方法\n`GET`\n\n#### 路径\n`/files/read`\n\n#### 请求参数\n- **Query 参数**: "
  },
  {
    "path": "docs/Faq.md",
    "chars": 1605,
    "preview": "## 是否支持浏览器访问?\n- 支持。\n```\ncd frontend\npnpm build\n```\n然后复制打包后的dist目录到运行程序的根目录,然后重启程序。访问地址为http://localhost:56780/\n\n## 为什么找不"
  },
  {
    "path": "docs/Markdown.md",
    "chars": 917,
    "preview": "\n## 概览\nMarkdown 编辑器允许您使用丰富的文本编辑体验创建和编辑 Markdown 文件。它包括实时保存、文件导入/导出以及访问最近的 Markdown 文件等功能。\n\n## 开始使用\n### 打开编辑器\n- 通过应用程序菜单或"
  },
  {
    "path": "docs/Store.en.md",
    "chars": 13177,
    "preview": "## GodoOS App Store Development Tutorial\n\n### Quick Start\n1. Download the [mysql5.7 zip package](https://downloads.mysql"
  },
  {
    "path": "docs/Store.md",
    "chars": 8275,
    "preview": "## GodoOS应用商店开发教程\n\n### 快速开始\n1. 下载[mysql5.7的zip包](https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-winx64."
  },
  {
    "path": "docs/ai.md",
    "chars": 477,
    "preview": "## ai配置专题\n\n- godoos支持的ai体系有ollama、 openai、gitee、cloudflare、deepseek、volces、bigmodel、aliyunDashscope、01ai、groq、mistral、an"
  },
  {
    "path": "docs/demo/mysql5.7/install.json",
    "chars": 453,
    "preview": "{\n    \"name\": \"mysql5.7\",\n    \"pkg\": \"https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44-winx64.zip\",\n    \""
  },
  {
    "path": "docs/demo/mysql5.7/my.ini",
    "chars": 353,
    "preview": "[client]\nport = 3306\n\n[mysql]\nno-auto-rehash\ndefault-character-set = utf8\n\n[mysqld]\nbasedir = \"\"\ndatadir = \"data\"\nport ="
  },
  {
    "path": "docs/demo/mysql5.7/my.ini.tpl",
    "chars": 375,
    "preview": "[client]\nport = {port}\n\n[mysql]\nno-auto-rehash\ndefault-character-set = utf8\n\n[mysqld]\nbasedir = \"{exePath}\"\ndatadir = \"{"
  },
  {
    "path": "docs/demo/mysql5.7/password.txt",
    "chars": 53,
    "preview": "ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';"
  },
  {
    "path": "docs/demo/mysql5.7/password.txt.tpl",
    "chars": 57,
    "preview": "ALTER USER 'root'@'localhost' IDENTIFIED BY '{password}';"
  },
  {
    "path": "docs/demo/mysql5.7/static/index.html",
    "chars": 9710,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <title>MySQL 设置</title>\n    <!-- 可以在这里添加CSS样式"
  },
  {
    "path": "docs/demo/mysql5.7/store.json",
    "chars": 2234,
    "preview": "{\n    \"setting\": {\n        \"binPath\": \"{exePath}/bin/mysqld.exe\",\n        \"confPath\": \"{exePath}/my.ini\",\n        \"progr"
  },
  {
    "path": "docs/demo/mysql8.0/install.json",
    "chars": 361,
    "preview": "{\n    \"name\": \"mysql8.0\",\n    \"pkg\": \"https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-winx64.zip\",\n    \"url\":"
  },
  {
    "path": "docs/demo/mysql8.0/my.ini.tpl",
    "chars": 441,
    "preview": "[client]\nport = 3306\n\n[mysql]\nno-auto-rehash\ndefault-character-set = utf8mb4\n\n[mysqld]\nbasedir = \"{exePath}\"\ndatadir = \""
  },
  {
    "path": "docs/demo/nginx/store.json",
    "chars": 222,
    "preview": "{\n    \"name\": \"nginx\",\n    \"setting\": {\n        \"binPath\": \"{exePath}/nginx.exe\",\n        \"progressName\":\"nginx.exe\"\n   "
  },
  {
    "path": "docs/demo/redis5.0/store.json",
    "chars": 196,
    "preview": "{\n    \"name\": \"redis5.0\",\n    \"setting\": {\n        \"binPath\": \"{exePath}/redis-server.exe\"\n    },\n    \"start\": {\n       "
  },
  {
    "path": "frontend/.gitignore",
    "chars": 255,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\n./dist\nd"
  },
  {
    "path": "frontend/.vscode/extensions.json",
    "chars": 109,
    "preview": "{\n  \"recommendations\": [\n    \"Vue.volar\",\n    \"tauri-apps.tauri-vscode\",\n    \"rust-lang.rust-analyzer\"\n  ]\n}\n"
  },
  {
    "path": "frontend/README.md",
    "chars": 171,
    "preview": "## godoos \n\n## 什么是模型标签:\n\n模型标签是godoos框架的一个核心概念,godoos框架中的模型标签用于描述一个模型的归类,比如这个模型属于哪个公司,模型的大类名称,模型的分类等等。\n\n## 什么是模型引擎:\n\ngodo"
  },
  {
    "path": "frontend/auto-imports.d.ts",
    "chars": 4047,
    "preview": "/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n// noinspection JSUnusedGlobalSymbols\n// Generated by unplugin"
  },
  {
    "path": "frontend/components.d.ts",
    "chars": 15498,
    "preview": "/* eslint-disable */\n// @ts-nocheck\n// Generated by unplugin-vue-components\n// Read more: https://github.com/vuejs/core/"
  },
  {
    "path": "frontend/env.d.ts",
    "chars": 199,
    "preview": "declare module '*.vue' {\n    import type { DefineComponent } from 'vue'\n    const component: DefineComponent<{}, {}, any"
  },
  {
    "path": "frontend/index.html",
    "chars": 655,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/"
  },
  {
    "path": "frontend/package.json",
    "chars": 1179,
    "preview": "{\n  \"name\": \"godoos\",\n  \"private\": true,\n  \"version\": \"1.0.6\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n   "
  },
  {
    "path": "frontend/package.json.md5",
    "chars": 32,
    "preview": "1614d5e4a6075926d6bcdc3612ab9b84"
  },
  {
    "path": "frontend/public/baiban/assets/index-BBuZupZQ.js",
    "chars": 1061007,
    "preview": "var RO=Object.defineProperty;var LO=(e,t,n)=>t in e?RO(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;v"
  },
  {
    "path": "frontend/public/baiban/assets/index-C7Nv1nqD.js",
    "chars": 1060992,
    "preview": "var RO=Object.defineProperty;var LO=(e,t,n)=>t in e?RO(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;v"
  },
  {
    "path": "frontend/public/baiban/assets/index-CB2-j8Sp.js",
    "chars": 1060993,
    "preview": "var RO=Object.defineProperty;var LO=(e,t,n)=>t in e?RO(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;v"
  },
  {
    "path": "frontend/public/baiban/assets/index-CbiYJP60.css",
    "chars": 75749,
    "preview": "*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-conten"
  },
  {
    "path": "frontend/public/baiban/assets/index-CdI7WPm4.js",
    "chars": 1060979,
    "preview": "var RO=Object.defineProperty;var LO=(e,t,n)=>t in e?RO(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;v"
  },
  {
    "path": "frontend/public/baiban/assets/index-D7I3m8ha.js",
    "chars": 1060992,
    "preview": "var RO=Object.defineProperty;var LO=(e,t,n)=>t in e?RO(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;v"
  },
  {
    "path": "frontend/public/baiban/assets/index-DQ-zJgK-.js",
    "chars": 1100365,
    "preview": "var XL=Object.defineProperty;var qL=(e,n,t)=>n in e?XL(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t;v"
  },
  {
    "path": "frontend/public/baiban/assets/index-DQ5iesJJ.css",
    "chars": 75665,
    "preview": "*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-conten"
  },
  {
    "path": "frontend/public/baiban/assets/index-e9sqCFI7.css",
    "chars": 78281,
    "preview": "*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-conten"
  },
  {
    "path": "frontend/public/baiban/assets/index-kFFNEmpN.js",
    "chars": 1060994,
    "preview": "var RO=Object.defineProperty;var LO=(e,t,n)=>t in e?RO(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;v"
  },
  {
    "path": "frontend/public/baiban/index.html",
    "chars": 454,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"."
  },
  {
    "path": "frontend/public/baiban/static/translations/ar.json",
    "chars": 12182,
    "preview": "{\n\t\"action.align-bottom\": \"محاذاة للأسفل\",\n\t\"action.align-center-horizontal\": \"محاذاة أفقيًا\",\n\t\"action.align-center-hor"
  },
  {
    "path": "frontend/public/baiban/static/translations/ca.json",
    "chars": 12908,
    "preview": "{\n\t\"action.align-bottom\": \"Alinear amb la part inferior\",\n\t\"action.align-center-horizontal\": \"Alinear horitzontalment\",\n"
  },
  {
    "path": "frontend/public/baiban/static/translations/cs.json",
    "chars": 15848,
    "preview": "{\n\t\"action.align-bottom\": \"Zarovnat dolů\",\n\t\"action.align-center-horizontal\": \"Zarovnat horizontálně\",\n\t\"action.align-ce"
  },
  {
    "path": "frontend/public/baiban/static/translations/da.json",
    "chars": 7037,
    "preview": "{\n\t\"action.convert-to-bookmark\": \"Konverter til bogmærke\",\n\t\"action.copy\": \"Kopier\",\n\t\"action.cut\": \"Klip\",\n\t\"action.del"
  },
  {
    "path": "frontend/public/baiban/static/translations/de.json",
    "chars": 13604,
    "preview": "{\n\t\"action.align-bottom\": \"Unten ausrichten\",\n\t\"action.align-center-horizontal\": \"Horizontal ausrichten\",\n\t\"action.align"
  },
  {
    "path": "frontend/public/baiban/static/translations/en.json",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": "frontend/public/baiban/static/translations/es.json",
    "chars": 13173,
    "preview": "{\n\t\"action.align-bottom\": \"Alinear abajo\",\n\t\"action.align-center-horizontal\": \"Alinear horizontalmente\",\n\t\"action.align-"
  },
  {
    "path": "frontend/public/baiban/static/translations/fa.json",
    "chars": 15414,
    "preview": "{\n\t\"action.align-bottom\": \"تراز به پایین\",\n\t\"action.align-center-horizontal\": \"تراز به مرکز افقی\",\n\t\"action.align-center"
  },
  {
    "path": "frontend/public/baiban/static/translations/fi.json",
    "chars": 13749,
    "preview": "{\n\t\"action.align-bottom\": \"Tasa alareuna\",\n\t\"action.align-center-horizontal\": \"Tasaa pystysuunnassa\",\n\t\"action.align-cen"
  },
  {
    "path": "frontend/public/baiban/static/translations/fr.json",
    "chars": 17550,
    "preview": "{\n\t\"action.align-bottom\": \"Aligner en bas\",\n\t\"action.align-center-horizontal\": \"Aligner horizontalement\",\n\t\"action.align"
  },
  {
    "path": "frontend/public/baiban/static/translations/gl.json",
    "chars": 15920,
    "preview": "{\n\t\"action.align-bottom\": \"Aliñar abaixo\",\n\t\"action.align-center-horizontal\": \"Aliñar ao centro horizontalmente\",\n\t\"acti"
  },
  {
    "path": "frontend/public/baiban/static/translations/he.json",
    "chars": 2854,
    "preview": "{\n\t\"action.bring-forward\": \"הזז קדימה\",\n\t\"action.bring-to-front\": \"הבא לחזית\",\n\t\"action.copy\": \"העתק\",\n\t\"action.cut\": \"ג"
  },
  {
    "path": "frontend/public/baiban/static/translations/hi-in.json",
    "chars": 12228,
    "preview": "{\n\t\"action.align-bottom\": \"नीचे की तरफ अलाइन करें\",\n\t\"action.align-center-horizontal\": \"आड़ा अलाइन करें\",\n\t\"action.align-"
  },
  {
    "path": "frontend/public/baiban/static/translations/hr.json",
    "chars": 16139,
    "preview": "{\n\t\"action.align-bottom\": \"Poravnaj dno\",\n\t\"action.align-center-horizontal\": \"Poravnaj vodoravno\",\n\t\"action.align-center"
  },
  {
    "path": "frontend/public/baiban/static/translations/hu.json",
    "chars": 16855,
    "preview": "{\n\t\"action.align-bottom\": \"Lefelé igazítás\",\n\t\"action.align-center-horizontal\": \"Vízszintes igazítás\",\n\t\"action.align-ce"
  },
  {
    "path": "frontend/public/baiban/static/translations/id.json",
    "chars": 16703,
    "preview": "{\n\t\"action.align-bottom\": \"Sejajar Bawah\",\n\t\"action.align-center-horizontal\": \"Sejajar horizontal\",\n\t\"action.align-cente"
  },
  {
    "path": "frontend/public/baiban/static/translations/it.json",
    "chars": 15502,
    "preview": "{\n\t\"action.align-bottom\": \"Allinea in basso\",\n\t\"action.align-center-horizontal\": \"Allinea orizzontalmente\",\n\t\"action.ali"
  },
  {
    "path": "frontend/public/baiban/static/translations/ja.json",
    "chars": 12923,
    "preview": "{\n\t\"action.align-bottom\": \"下寄せ\",\n\t\"action.align-center-horizontal\": \"水平\",\n\t\"action.align-center-horizontal.short\": \"水平\","
  },
  {
    "path": "frontend/public/baiban/static/translations/ko-kr.json",
    "chars": 13778,
    "preview": "{\n\t\"action.align-bottom\": \"아래쪽 정렬\",\n\t\"action.align-center-horizontal\": \"가로 정렬\",\n\t\"action.align-center-horizontal.short\":"
  },
  {
    "path": "frontend/public/baiban/static/translations/ku.json",
    "chars": 3537,
    "preview": "{\n\t\"action.bring-forward\": \"بڕۆ پێشەوە\",\n\t\"action.bring-to-front\": \"بگوازرێتەوە بۆ پێشەوە\",\n\t\"action.copy\": \"کۆپی بکە\",\n"
  },
  {
    "path": "frontend/public/baiban/static/translations/languages.json",
    "chars": 1740,
    "preview": "[\n\t{\n\t\t\"locale\": \"ar\",\n\t\t\"label\": \"عربي\"\n\t},\n\t{\n\t\t\"locale\": \"ca\",\n\t\t\"label\": \"Català\"\n\t},\n\t{\n\t\t\"locale\": \"cs\",\n\t\t\"label\""
  },
  {
    "path": "frontend/public/baiban/static/translations/main.json",
    "chars": 16054,
    "preview": "{\n\t\"action.convert-to-bookmark\": \"Convert to Bookmark\",\n\t\"action.convert-to-embed\": \"Convert to Embed\",\n\t\"action.open-em"
  },
  {
    "path": "frontend/public/baiban/static/translations/my.json",
    "chars": 4693,
    "preview": "{\n\t\"action.align-bottom\": \"အောက်သို့ ညှိရန်\",\n\t\"action.align-center-horizontal\": \"အလျားလိုက် ဗဟိုဆီသို့ ညှိရန်\",\n\t\"actio"
  },
  {
    "path": "frontend/public/baiban/static/translations/ne.json",
    "chars": 13297,
    "preview": "{\n\t\"action.align-bottom\": \"तल पङ्क्तिबद्ध गर्नुहोस्\",\n\t\"action.align-center-horizontal\": \"तेर्सो रूपमा पङ्क्तिबद्ध गर्नु"
  },
  {
    "path": "frontend/public/baiban/static/translations/no.json",
    "chars": 1954,
    "preview": "{\n\t\"action.copy\": \"Kopier\",\n\t\"action.cut\": \"Klipp ut\",\n\t\"action.delete\": \"Slett\",\n\t\"action.duplicate\": \"Dupliser\",\n\t\"act"
  },
  {
    "path": "frontend/public/baiban/static/translations/pl.json",
    "chars": 3861,
    "preview": "{\n\t\"action.copy-as-json.short\": \"JSON\",\n\t\"action.copy-as-png.short\": \"PNG\",\n\t\"action.copy-as-png\": \"Kopiuj jako PNG\",\n\t\""
  },
  {
    "path": "frontend/public/baiban/static/translations/pt-br.json",
    "chars": 15608,
    "preview": "{\n\t\"action.convert-to-bookmark\": \"Converter em Favorito\",\n\t\"action.convert-to-embed\": \"Converter em Incorporar\",\n\t\"actio"
  },
  {
    "path": "frontend/public/baiban/static/translations/pt-pt.json",
    "chars": 3176,
    "preview": "{\n\t\"action.bring-forward\": \"Mover acima\",\n\t\"action.bring-to-front\": \"Colocar à Frente\",\n\t\"action.copy\": \"Copiar\",\n\t\"acti"
  },
  {
    "path": "frontend/public/baiban/static/translations/ro.json",
    "chars": 17069,
    "preview": "{\n\t\"action.align-bottom\": \"Aliniere jos\",\n\t\"action.align-center-horizontal\": \"Aliniere orizontală\",\n\t\"action.align-cente"
  },
  {
    "path": "frontend/public/baiban/static/translations/ru.json",
    "chars": 16438,
    "preview": "{\n\t\"action.align-bottom\": \"Выровнять по нижнему краю\",\n\t\"action.align-center-horizontal\": \"Выровнять по горизонтали\",\n\t\""
  },
  {
    "path": "frontend/public/baiban/static/translations/sl.json",
    "chars": 16981,
    "preview": "{\n\t\"action.align-bottom\": \"Poravnaj dno\",\n\t\"action.align-center-horizontal\": \"Poravnaj vodoravno\",\n\t\"action.align-center"
  },
  {
    "path": "frontend/public/baiban/static/translations/sv.json",
    "chars": 3589,
    "preview": "{\n\t\"action.bring-forward\": \"Flytta framåt\",\n\t\"action.bring-to-front\": \"Placera längst fram\",\n\t\"action.copy\": \"Kopiera\",\n"
  },
  {
    "path": "frontend/public/baiban/static/translations/te.json",
    "chars": 4497,
    "preview": "{\n\t\"action.align-bottom\": \"అడుగున కుదుర్చు\",\n\t\"action.align-center-horizontal\": \"అడ్డంగా మధ్యలో కుదుర్చు\",\n\t\"action.alig"
  },
  {
    "path": "frontend/public/baiban/static/translations/th.json",
    "chars": 12163,
    "preview": "{\n\t\"action.align-bottom\": \"จัดให้ชิดด้านล่าง\",\n\t\"action.align-center-horizontal\": \"จัดให้กึ่งกลางแนวนอน\",\n\t\"action.align"
  },
  {
    "path": "frontend/public/baiban/static/translations/tr.json",
    "chars": 15695,
    "preview": "{\n\t\"action.align-bottom\": \"Aşağı hizala\",\n\t\"action.align-center-horizontal\": \"Yatay olanak hizala\",\n\t\"action.align-cente"
  },
  {
    "path": "frontend/public/baiban/static/translations/uk.json",
    "chars": 16357,
    "preview": "{\n\t\"action.align-bottom\": \"Вирівняти за нижнім краєм\",\n\t\"action.align-center-horizontal\": \"Вирівняти по горизонталі\",\n\t\""
  },
  {
    "path": "frontend/public/baiban/static/translations/vi.json",
    "chars": 12515,
    "preview": "{\n\t\"action.align-bottom\": \"Căn chỉnh dưới\",\n\t\"action.align-center-horizontal\": \"Căn chỉnh ngang\",\n\t\"action.align-center-"
  },
  {
    "path": "frontend/public/baiban/static/translations/zh-cn.json",
    "chars": 12176,
    "preview": "{\n\t\"action.align-bottom\": \"底端对齐\",\n\t\"action.align-center-horizontal\": \"水平对齐\",\n\t\"action.align-center-horizontal.short\": \"水"
  },
  {
    "path": "frontend/public/baiban/static/translations/zh-tw.json",
    "chars": 10741,
    "preview": "{\n\t\"action.align-bottom\": \"置底\",\n\t\"action.align-center-horizontal\": \"水平置中\",\n\t\"action.align-center-horizontal.short\": \"水平置"
  },
  {
    "path": "frontend/public/bot/chat.json",
    "chars": 2674174,
    "preview": "{\n    \"v\": \"5.7.7\",\n    \"fr\": 30,\n    \"ip\": 0,\n    \"op\": 150,\n    \"w\": 1500,\n    \"h\": 1500,\n    \"nm\": \"chatbot_messenger"
  },
  {
    "path": "frontend/public/bot/search.json",
    "chars": 550794,
    "preview": "{\n    \"nm\": \"size/list\",\n    \"mn\": \"\",\n    \"layers\": [\n        {\n            \"ty\": 4,\n            \"nm\": \"magni_frame\",\n "
  },
  {
    "path": "frontend/public/calculator/css/cal.css",
    "chars": 2391,
    "preview": "/*各界面共用部分开始*/\n* {\n    font-family: \"微软雅黑\";\n}\n\n.standard-main,\n.science-main,\n.programmer-main {\n    margin: 0px;\n}\n\nul {"
  },
  {
    "path": "frontend/public/calculator/index.html",
    "chars": 7345,
    "preview": "<!DOCTYPE html>\n<html>\n\n<head>\n    <title>计算器</title>\n    <meta charset=\"UTF-8\">\n    <link rel=\"stylesheet\" href=\"css/ca"
  },
  {
    "path": "frontend/public/calculator/js/cal.js",
    "chars": 34800,
    "preview": "window.onload = function () {\n    Calculator.initCache();\n    Calculator.initListeners();\n};\n\n//全局计算器对象\nvar Calculator ="
  },
  {
    "path": "frontend/public/docx/assets/index.03fab396.css",
    "chars": 51707,
    "preview": "::-webkit-scrollbar{height:16px;width:16px;overflow:visible}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scroll"
  },
  {
    "path": "frontend/public/docx/assets/index.15480821.css",
    "chars": 43811,
    "preview": "::-webkit-scrollbar{height:16px;width:16px;overflow:visible}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scroll"
  },
  {
    "path": "frontend/public/docx/assets/index.2535d7f3.css",
    "chars": 33136,
    "preview": "::-webkit-scrollbar{height:16px;width:16px;overflow:visible}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scroll"
  },
  {
    "path": "frontend/public/docx/assets/index.2a68c9e8.js",
    "chars": 545481,
    "preview": "var Hs=Object.defineProperty,ys=Object.defineProperties;var Gs=Object.getOwnPropertyDescriptors;var bn=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.30955838.js",
    "chars": 545175,
    "preview": "var Hs=Object.defineProperty,ys=Object.defineProperties;var Gs=Object.getOwnPropertyDescriptors;var bn=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.3842052e.js",
    "chars": 545817,
    "preview": "var Hs=Object.defineProperty,ys=Object.defineProperties;var Gs=Object.getOwnPropertyDescriptors;var bn=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.461a1f59.js",
    "chars": 1865255,
    "preview": "var Tx=Object.defineProperty;var Sx=(t,e,n)=>e in t?Tx(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;v"
  },
  {
    "path": "frontend/public/docx/assets/index.4e9c2fed.js",
    "chars": 545822,
    "preview": "var Hs=Object.defineProperty,ys=Object.defineProperties;var Gs=Object.getOwnPropertyDescriptors;var bn=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.572c8ee8.js",
    "chars": 547679,
    "preview": "var Gs=Object.defineProperty,vs=Object.defineProperties;var Js=Object.getOwnPropertyDescriptors;var xi=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.5f048ec4.js",
    "chars": 544579,
    "preview": "var Hs=Object.defineProperty,ys=Object.defineProperties;var Gs=Object.getOwnPropertyDescriptors;var bn=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.6dcf988b.css",
    "chars": 44672,
    "preview": "::-webkit-scrollbar{height:16px;width:16px;overflow:visible}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scroll"
  },
  {
    "path": "frontend/public/docx/assets/index.77c27592.js",
    "chars": 544627,
    "preview": "var Hs=Object.defineProperty,ys=Object.defineProperties;var Gs=Object.getOwnPropertyDescriptors;var bn=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.82ba8f6a.js",
    "chars": 1535881,
    "preview": "var U1=Object.defineProperty;var W1=(r,e,t)=>e in r?U1(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;v"
  },
  {
    "path": "frontend/public/docx/assets/index.8fae8eed.js",
    "chars": 1865181,
    "preview": "var Tx=Object.defineProperty;var Sx=(t,e,n)=>e in t?Tx(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;v"
  },
  {
    "path": "frontend/public/docx/assets/index.97977da0.js",
    "chars": 544865,
    "preview": "var Hs=Object.defineProperty,ys=Object.defineProperties;var Gs=Object.getOwnPropertyDescriptors;var bn=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.9cb6c062.js",
    "chars": 545611,
    "preview": "var Hs=Object.defineProperty,ys=Object.defineProperties;var Gs=Object.getOwnPropertyDescriptors;var bn=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.af10cfdc.css",
    "chars": 50350,
    "preview": "::-webkit-scrollbar{height:16px;width:16px;overflow:visible}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scroll"
  },
  {
    "path": "frontend/public/docx/assets/index.bae472f7.js",
    "chars": 519631,
    "preview": "var Ps=Object.defineProperty,Ms=Object.defineProperties;var Ts=Object.getOwnPropertyDescriptors;var Pi=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.da267adb.js",
    "chars": 1838059,
    "preview": "const mx=function(){const e=document.createElement(\"link\").relList;if(e&&e.supports&&e.supports(\"modulepreload\"))return;"
  },
  {
    "path": "frontend/public/docx/assets/index.de73f97d.js",
    "chars": 547694,
    "preview": "var Gs=Object.defineProperty,vs=Object.defineProperties;var Js=Object.getOwnPropertyDescriptors;var xi=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/index.ea630926.css",
    "chars": 43831,
    "preview": "::-webkit-scrollbar{height:16px;width:16px;overflow:visible}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scroll"
  },
  {
    "path": "frontend/public/docx/assets/index.ec407d42.css",
    "chars": 50350,
    "preview": "::-webkit-scrollbar{height:16px;width:16px;overflow:visible}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scroll"
  },
  {
    "path": "frontend/public/docx/assets/index.eff96d1a.css",
    "chars": 50350,
    "preview": "::-webkit-scrollbar{height:16px;width:16px;overflow:visible}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scroll"
  },
  {
    "path": "frontend/public/docx/assets/index.f6f10f0f.js",
    "chars": 1838622,
    "preview": "const mx=function(){const e=document.createElement(\"link\").relList;if(e&&e.supports&&e.supports(\"modulepreload\"))return;"
  },
  {
    "path": "frontend/public/docx/assets/vendor.68ee6001.js",
    "chars": 2427088,
    "preview": "var QA=Object.defineProperty,eT=Object.defineProperties;var tT=Object.getOwnPropertyDescriptors;var Kv=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/assets/vendor.d13e5cc9.js",
    "chars": 2416259,
    "preview": "var JA=Object.defineProperty,QA=Object.defineProperties;var eT=Object.getOwnPropertyDescriptors;var Kv=Object.getOwnProp"
  },
  {
    "path": "frontend/public/docx/index.html",
    "chars": 18041,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\" />\n  <link rel=\"icon\" type=\"image/png\" href=\"./assets/f"
  },
  {
    "path": "frontend/public/excel/assets/iconfont/demo.css",
    "chars": 8844,
    "preview": "/* Logo 字体 */\r\n@font-face {\r\n  font-family: \"iconfont logo\";\r\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cih"
  },
  {
    "path": "frontend/public/excel/assets/iconfont/demo_index.html",
    "chars": 99405,
    "preview": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n  <meta charset=\"utf-8\"/>\r\n  <title>IconFont Demo</title>\r\n  <link rel=\"shortcut icon\" "
  },
  {
    "path": "frontend/public/excel/assets/iconfont/iconfont.css",
    "chars": 19900,
    "preview": "@font-face {font-family: \"iconfont-luckysheet\";\r\n  src: url('iconfont.eot?t=1605236775724'); /* IE9 */\r\n  src: url('icon"
  },
  {
    "path": "frontend/public/excel/assets/iconfont/iconfont.js",
    "chars": 93280,
    "preview": "!function(h){var l,a,v,i,t,z,o='<svg><symbol id=\"luckysheet-iconfont-lianjie\" viewBox=\"0 0 1024 1024\"><path d=\"M771.584 "
  },
  {
    "path": "frontend/public/excel/assets/iconfont/iconfont.json",
    "chars": 17756,
    "preview": "{\r\n  \"id\": \"1990368\",\r\n  \"name\": \"lucksheet\",\r\n  \"font_family\": \"iconfont\",\r\n  \"css_prefix_text\": \"luckysheet-iconfont-\""
  },
  {
    "path": "frontend/public/excel/css/luckysheet.css",
    "chars": 145275,
    "preview": ".luckysheet-icon-img-container.iconfont-luckysheet,.luckysheet-submenu-arrow .iconfont-luckysheet{font-size:24px}.luckys"
  },
  {
    "path": "frontend/public/excel/demo.html",
    "chars": 452246,
    "preview": "<!DOCTYPE html>\n<html>\n\n<head lang='zh'>\n    <meta charset='utf-8'>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=e"
  },
  {
    "path": "frontend/public/excel/demoData/chat.js",
    "chars": 35,
    "preview": "export function initChat() {\n    \n}"
  },
  {
    "path": "frontend/public/excel/demoData/demoFeature.js",
    "chars": 1361,
    "preview": "\r\n// Features specially written for demo\r\n\r\n(function () {\r\n\r\n    // language\r\n    function language(params) {\r\n\r\n      "
  },
  {
    "path": "frontend/public/excel/demoData/getTargetData.js",
    "chars": 276619,
    "preview": "export const sourceData2 = `分公司\t中支名称\t业务员代码\t出生日期\t性别\t入司日期\t学历\t销售额\t客户数\r\n福建\t福建泉州\t187565152\t8/12/72\t男\t2007/12/5\t高中\t20163451.32"
  },
  {
    "path": "frontend/public/excel/demoData/sheetCell.js",
    "chars": 133,
    "preview": "window.sheetCell = {\r\n    \"name\": \"单元一\",\r\n    \"config\": {},\r\n    \"scrollLeft\": 0,\r\n    \"scrollTop\": 0\r\n}\r\n// export defa"
  },
  {
    "path": "frontend/public/excel/demoData/sheetChart.js",
    "chars": 86647,
    "preview": "window.sheetChart = {\r\n\t\"name\": \"Chart\",\r\n\t\"color\": \"\",\r\n\t\"status\": 0,\r\n\t\"order\": 8,\r\n\t\"index\": \"Sheet_6az6nei65t1i_1596"
  },
  {
    "path": "frontend/public/excel/demoData/sheetComment.js",
    "chars": 1044,
    "preview": "window.sheetComment = {\r\n\t\"name\": \"Comment\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"columnlen\": {\r\n\t\t\t\"2\": 102\r\n\t\t}\r\n\t},\r\n\t\"in"
  },
  {
    "path": "frontend/public/excel/demoData/sheetConditionFormat.js",
    "chars": 89150,
    "preview": "window.sheetConditionFormat = {\r\n\t\"name\": \"Conditional Format\",\r\n\t\"color\": \"\",\r\n\t\"zoomRatio\":1,\r\n\t\"config\": {\r\n\t\t\"merge\""
  },
  {
    "path": "frontend/public/excel/demoData/sheetDataVerification.js",
    "chars": 20890,
    "preview": "window.sheetDataVerification = {\r\n    \"name\": \"Data Verification\",\r\n    \"index\": \"Sheet_pdolzzie5xwi_1600927444446\",\r\n  "
  },
  {
    "path": "frontend/public/excel/demoData/sheetFormula.js",
    "chars": 87144,
    "preview": " window.sheetFormula = {\r\n\t\"name\": \"Formula\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"merge\": {\r\n\t\t\t\"12_2\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t"
  },
  {
    "path": "frontend/public/excel/demoData/sheetPicture.js",
    "chars": 45004,
    "preview": "window.sheetPicture = {\r\n    \"name\": \"Picture\",\r\n    \"index\": \"Sheet_3e4oe25C757r_1600925108337\",\r\n    \"celldata\": [],\r\n"
  },
  {
    "path": "frontend/public/excel/demoData/sheetPivotTable.js",
    "chars": 2700,
    "preview": "window.sheetPivotTable = {\r\n\t\"name\": \"PivotTable\",\r\n\t\"color\": \"\",\r\n\t\"config\": {},\r\n\t\"index\": \"7\",\r\n\t\"chart\": [],\r\n\t\"stat"
  },
  {
    "path": "frontend/public/excel/demoData/sheetPivotTableData.js",
    "chars": 9445,
    "preview": "window.sheetPivotTableData = {\r\n\t\"name\": \"PivotTableData\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"merge\": {}\r\n\t},\r\n\t\"index\": \""
  },
  {
    "path": "frontend/public/excel/demoData/sheetSparkline.js",
    "chars": 104399,
    "preview": "window.sheetSparkline = {\r\n\t\"name\": \"Sparkline\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"merge\": {\r\n\t\t\t\"1_2\": {\r\n\t\t\t\t\"r\": 1,\r\n\t"
  },
  {
    "path": "frontend/public/excel/demoData/sheetTable.js",
    "chars": 13578,
    "preview": "window.sheetTable = {\r\n\t\"name\": \"Table\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"merge\": {\r\n\t\t\t\"0_1\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": "
  },
  {
    "path": "frontend/public/excel/expendPlugins/chart/chartmix.css",
    "chars": 2750,
    "preview": ".luckysheet-datavisual-quick-menu{width:120px;overflow:auto;margin-top:15px}.luckysheet-datavisual-quick-menu::-webkit-s"
  },
  {
    "path": "frontend/public/excel/expendPlugins/exceljs.js",
    "chars": 947702,
    "preview": "/*! ExcelJS 19-10-2023 */\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else "
  },
  {
    "path": "frontend/public/excel/expendPlugins/export.js",
    "chars": 28007,
    "preview": "function exportExcel(luckysheetObj) {\n    //console.log(luckysheet, 'sheet数组')\n    //console.log(luckysheet[0].dataVerif"
  },
  {
    "path": "frontend/public/excel/expendPlugins/filesaver.js",
    "chars": 3209,
    "preview": "(function (a, b) { if (\"function\" == typeof define && define.amd) define([], b); else if (\"undefined\" != typeof exports)"
  },
  {
    "path": "frontend/public/excel/expendPlugins/luckyexcel.js",
    "chars": 707400,
    "preview": "(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"func"
  },
  {
    "path": "frontend/public/excel/expendPlugins/print/print.css",
    "chars": 826,
    "preview": ".luckysheet-print span[role=\"heading\"] {\r\n    font-size: 30px;\r\n    font-weight: bold;\r\n}\r\n\r\n.luckysheet-print-suggest {"
  },
  {
    "path": "frontend/public/excel/expendPlugins/print/print.js",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "frontend/public/excel/index.html",
    "chars": 5906,
    "preview": "<!DOCTYPE html>\n<html>\n\n<head lang='zh'>\n\t<meta charset='utf-8'>\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" /"
  },
  {
    "path": "frontend/public/excel/luckysheet.umd.js",
    "chars": 3182086,
    "preview": "/*! @preserve\n * luckysheet\n * version: 2.1.13\n * https://github.com/mengshukeji/Luckysheet\n */\nvar luckysheet=(()=>{var"
  },
  {
    "path": "frontend/public/excel/plugins/css/pluginsCss.css",
    "chars": 10498,
    "preview": ".sp-container{position:absolute;top:0;left:0;display:inline-block;z-index:9999994;overflow:hidden}.sp-container.sp-flat{"
  },
  {
    "path": "frontend/public/excel/plugins/js/plugin.js",
    "chars": 528616,
    "preview": "!function(t,e){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=t.document?e(t,!0):function(t){if"
  },
  {
    "path": "frontend/public/excel/plugins/plugins.css",
    "chars": 67680,
    "preview": "/*!\r\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\r\n *  License - http://fontawesome.io/li"
  },
  {
    "path": "frontend/public/font/demo.css",
    "chars": 8305,
    "preview": "/* Logo 字体 */\n@font-face {\n  font-family: \"iconfont logo\";\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.e"
  },
  {
    "path": "frontend/public/font/demo_index.html",
    "chars": 91327,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\"/>\n  <title>iconfont Demo</title>\n  <link rel=\"shortcut icon\" href="
  },
  {
    "path": "frontend/public/font/iconfont.css",
    "chars": 5291,
    "preview": "@font-face {\n  font-family: \"iconfont\"; /* Project id 4412427 */\n  src: url('iconfont.woff2?t=1733206776617') format('wo"
  },
  {
    "path": "frontend/public/font/iconfont.js",
    "chars": 257431,
    "preview": "window._iconfont_svg_string_4412427='<svg><symbol id=\"icon-weixin\" viewBox=\"0 0 1024 1024\"><path d=\"M664.250054 368.5416"
  },
  {
    "path": "frontend/public/font/iconfont.json",
    "chars": 16626,
    "preview": "{\n  \"id\": \"4412427\",\n  \"name\": \"godoos\",\n  \"font_family\": \"iconfont\",\n  \"css_prefix_text\": \"icon-\",\n  \"description\": \"\","
  },
  {
    "path": "frontend/public/gantt/README.md",
    "chars": 1245,
    "preview": "jQueryGantt\r\n===========\r\njQuery Gantt editor has been written by Roberto Bicchierai and Silvia Chelazzi\r\n\r\n\r\n<img src=\""
  },
  {
    "path": "frontend/public/gantt/composer.json",
    "chars": 296,
    "preview": "{\n    \"name\": \"robicch/jquery-gantt\",\n    \"description\": \"Twproject Gantt editor is a free online tool for creating and "
  },
  {
    "path": "frontend/public/gantt/gantt.css",
    "chars": 15183,
    "preview": "\r\nbody{\r\n  /*overflow: hidden;*/\r\n}\r\n\r\n.TWGanttWorkSpace.ganttFullScreen{\r\n  position: fixed;\r\n  top:0;\r\n  left:0;\r\n  bo"
  },
  {
    "path": "frontend/public/gantt/ganttDrawerSVG.js",
    "chars": 37865,
    "preview": "/*\r\n Copyright (c) 2012-2018 Open Lab\r\n Written by Roberto Bicchierai and Silvia Chelazzi http://roberto.open-lab.com\r\n "
  },
  {
    "path": "frontend/public/gantt/ganttGridEditor.js",
    "chars": 25439,
    "preview": "/*\r\n Copyright (c) 2012-2018 Open Lab\r\n Written by Roberto Bicchierai and Silvia Chelazzi http://roberto.open-lab.com\r\n "
  },
  {
    "path": "frontend/public/gantt/ganttMaster.js",
    "chars": 52716,
    "preview": "/*\r\n Copyright (c) 2012-2018 Open Lab\r\n Written by Roberto Bicchierai and Silvia Chelazzi http://roberto.open-lab.com\r\n "
  },
  {
    "path": "frontend/public/gantt/ganttPrint.css",
    "chars": 936,
    "preview": ".noprint {\r\n  display:none !important;\r\n}\r\n\r\nBODY, TBODY {\r\n  font-family: arial;\r\n  font-size: 12px;\r\n  margin: 0;\r\n  c"
  },
  {
    "path": "frontend/public/gantt/ganttTask.js",
    "chars": 38429,
    "preview": "/*\r\n Copyright (c) 2012-2018 Open Lab\r\n Written by Roberto Bicchierai and Silvia Chelazzi http://roberto.open-lab.com\r\n "
  },
  {
    "path": "frontend/public/gantt/ganttTestSuite.js",
    "chars": 47079,
    "preview": "var testCount=0;\nfunction enqueueNewTest() {\n  var test = ganttTestUnits.shift();\n  if (!test)\n    return;\n\n\n  //ci si r"
  },
  {
    "path": "frontend/public/gantt/ganttUtilities.js",
    "chars": 19243,
    "preview": "/*\r\n Copyright (c) 2012-2018 Open Lab\r\n Written by Roberto Bicchierai and Silvia Chelazzi http://roberto.open-lab.com\r\n "
  },
  {
    "path": "frontend/public/gantt/ganttZoom.js",
    "chars": 9942,
    "preview": "/*\n Copyright (c) 2012-2018 Open Lab\n Written by Roberto Bicchierai and Silvia Chelazzi http://roberto.open-lab.com\n Per"
  },
  {
    "path": "frontend/public/gantt/index.html",
    "chars": 45036,
    "preview": "<!DOCTYPE HTML>\r\n<html>\r\n\r\n<head>\r\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=9; IE=8; IE=7; IE=EDGE\" />\r\n  <meta "
  },
  {
    "path": "frontend/public/gantt/libs/date.js",
    "chars": 27610,
    "preview": "/**\n * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)\n * Dual licensed under the MIT and GPL licenses.\n * Thi"
  },
  {
    "path": "frontend/public/gantt/libs/dialogs.js",
    "chars": 12458,
    "preview": "/*\n Copyright (c) 2012-2017 Open Lab\n Permission is hereby granted, free of charge, to any person obtaining\n a copy of t"
  },
  {
    "path": "frontend/public/gantt/libs/forms.js",
    "chars": 19958,
    "preview": "/*\n Copyright (c) 2012-2017 Open Lab\n Permission is hereby granted, free of charge, to any person obtaining\n a copy of t"
  },
  {
    "path": "frontend/public/gantt/libs/i18nJs.js",
    "chars": 6277,
    "preview": "/*\r\n Copyright (c) 2012-2017 Open Lab\r\n Permission is hereby granted, free of charge, to any person obtaining\r\n a copy o"
  },
  {
    "path": "frontend/public/gantt/libs/jquery/JST/jquery.JST.js",
    "chars": 4995,
    "preview": "$.fn.loadTemplates = function() {\n  $.JST.loadTemplates($(this));\n  return this;\n};\n\n$.JST = {\n  _templates: new Object("
  },
  {
    "path": "frontend/public/gantt/libs/jquery/dateField/jquery.dateField.css",
    "chars": 1912,
    "preview": ".calBox {\n  background-color: #999;\n  text-align: center;\n  color: white;\n  width:200px;\n  position:absolute;\n  padding-"
  },
  {
    "path": "frontend/public/gantt/libs/jquery/dateField/jquery.dateField.js",
    "chars": 12193,
    "preview": "/*\n  Copyright (c) 2009 Open Lab\n  Written by Roberto Bicchierai http://roberto.open-lab.com\n  Permission is hereby gran"
  },
  {
    "path": "frontend/public/gantt/libs/jquery/jquery.timers.js",
    "chars": 3182,
    "preview": "jQuery.fn.extend({\n\teveryTime: function(interval, label, fn, times, belay) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.t"
  },
  {
    "path": "frontend/public/gantt/libs/jquery/svg/jquery.svgdom.1.8.js",
    "chars": 12544,
    "preview": "/* http://keith-wood.name/svg.html\n jQuery DOM compatibility for jQuery SVG v1.4.5.\n Written by Keith Wood (kbwood{at}i"
  },
  {
    "path": "frontend/public/gantt/libs/jquery/svg/jquery.svgdom.pack.js",
    "chars": 4087,
    "preview": "/* http://keith-wood.name/svg.html\n   jQuery DOM compatibility for jQuery SVG v1.4.5.\n   Written by Keith Wood (kbwood{a"
  },
  {
    "path": "frontend/public/gantt/libs/jquery/valueSlider/jquery.mb.slider.js",
    "chars": 8541,
    "preview": "/*******************************************************************************\n * jquery.mb.components\n * file: jquery"
  }
]

// ... and 1671 more files (download for full content)

About this extraction

This page contains the full source code of the phpk/godoos GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1871 files (78.1 MB), approximately 20.6M tokens, and a symbol index with 82331 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!