feat(MessageContent): Add Collapsible Citations Display (#4285)

* feat(MessageContent): 添加引用内容折叠功能,优化用户界面交互

* feat(Citations): add hideTitle prop to control title visibility in CitationsList

* feat(Messages): add message update functionality and manage UI state for citations and web search

* fix: web search citation

---------

Co-authored-by: 自由的世界人 <3196812536@qq.com>
This commit is contained in:
Hao He 2025-04-15 22:47:20 +08:00 committed by GitHub
parent a34e10cb0d
commit eb8ee5ec02
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 489 additions and 164 deletions

View File

@ -196,7 +196,7 @@
"tokenx": "^0.4.1", "tokenx": "^0.4.1",
"typescript": "^5.6.2", "typescript": "^5.6.2",
"uuid": "^10.0.0", "uuid": "^10.0.0",
"vite": "^5.0.12" "vite": "6.2.6"
}, },
"resolutions": { "resolutions": {
"pdf-parse@npm:1.1.1": "patch:pdf-parse@npm%3A1.1.1#~/.yarn/patches/pdf-parse-npm-1.1.1-04a6109b2a.patch", "pdf-parse@npm:1.1.1": "patch:pdf-parse@npm%3A1.1.1#~/.yarn/patches/pdf-parse-npm-1.1.1-04a6109b2a.patch",

View File

@ -1,8 +1,6 @@
import { InfoCircleOutlined } from '@ant-design/icons'
import Favicon from '@renderer/components/Icons/FallbackFavicon' import Favicon from '@renderer/components/Icons/FallbackFavicon'
import { HStack } from '@renderer/components/Layout' import { HStack } from '@renderer/components/Layout'
import React from 'react' import React from 'react'
import { useTranslation } from 'react-i18next'
import styled from 'styled-components' import styled from 'styled-components'
interface Citation { interface Citation {
@ -15,19 +13,14 @@ interface Citation {
interface CitationsListProps { interface CitationsListProps {
citations: Citation[] citations: Citation[]
hideTitle?: boolean
} }
const CitationsList: React.FC<CitationsListProps> = ({ citations }) => { const CitationsList: React.FC<CitationsListProps> = ({ citations }) => {
const { t } = useTranslation()
if (!citations || citations.length === 0) return null if (!citations || citations.length === 0) return null
return ( return (
<CitationsContainer className="footnotes"> <CitationsContainer className="footnotes">
<CitationsTitle>
{t('message.citations')}
<InfoCircleOutlined style={{ fontSize: '14px', marginLeft: '4px', opacity: 0.6 }} />
</CitationsTitle>
{citations.map((citation) => ( {citations.map((citation) => (
<HStack key={citation.url || citation.number} style={{ alignItems: 'center', gap: 8 }}> <HStack key={citation.url || citation.number} style={{ alignItems: 'center', gap: 8 }}>
<span style={{ fontSize: 13, color: 'var(--color-text-2)' }}>{citation.number}.</span> <span style={{ fontSize: 13, color: 'var(--color-text-2)' }}>{citation.number}.</span>
@ -57,12 +50,6 @@ const CitationsContainer = styled.div`
} }
` `
const CitationsTitle = styled.div`
font-weight: 500;
margin-bottom: 4px;
color: var(--color-text-1);
`
const CitationLink = styled.a` const CitationLink = styled.a`
font-size: 14px; font-size: 14px;
line-height: 1.6; line-height: 1.6;

View File

@ -47,7 +47,7 @@ const MessageItem: FC<Props> = ({
const { isBubbleStyle } = useMessageStyle() const { isBubbleStyle } = useMessageStyle()
const { showMessageDivider, messageFont, fontSize } = useSettings() const { showMessageDivider, messageFont, fontSize } = useSettings()
const messageContainerRef = useRef<HTMLDivElement>(null) const messageContainerRef = useRef<HTMLDivElement>(null)
// const topic = useTopic(assistant, _topic?.id)
const [contextMenuPosition, setContextMenuPosition] = useState<{ x: number; y: number } | null>(null) const [contextMenuPosition, setContextMenuPosition] = useState<{ x: number; y: number } | null>(null)
const [selectedQuoteText, setSelectedQuoteText] = useState<string>('') const [selectedQuoteText, setSelectedQuoteText] = useState<string>('')
const [selectedText, setSelectedText] = useState<string>('') const [selectedText, setSelectedText] = useState<string>('')

View File

@ -1,4 +1,4 @@
import { SyncOutlined, TranslationOutlined } from '@ant-design/icons' import { DownOutlined, InfoCircleOutlined, SyncOutlined, TranslationOutlined, UpOutlined } from '@ant-design/icons'
import { isOpenAIWebSearch } from '@renderer/config/models' import { isOpenAIWebSearch } from '@renderer/config/models'
import { getModelUniqId } from '@renderer/services/ModelService' import { getModelUniqId } from '@renderer/services/ModelService'
import { Message, Model } from '@renderer/types' import { Message, Model } from '@renderer/types'
@ -7,7 +7,7 @@ import { withMessageThought } from '@renderer/utils/formats'
import { Divider, Flex } from 'antd' import { Divider, Flex } from 'antd'
import { clone } from 'lodash' import { clone } from 'lodash'
import { Search } from 'lucide-react' import { Search } from 'lucide-react'
import React, { Fragment, useMemo } from 'react' import React, { Fragment, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import BarLoader from 'react-spinners/BarLoader' import BarLoader from 'react-spinners/BarLoader'
import BeatLoader from 'react-spinners/BeatLoader' import BeatLoader from 'react-spinners/BeatLoader'
@ -30,6 +30,7 @@ const MessageContent: React.FC<Props> = ({ message: _message, model }) => {
const { t } = useTranslation() const { t } = useTranslation()
const message = withMessageThought(clone(_message)) const message = withMessageThought(clone(_message))
const isWebCitation = model && (isOpenAIWebSearch(model) || model.provider === 'openrouter') const isWebCitation = model && (isOpenAIWebSearch(model) || model.provider === 'openrouter')
const [citationsCollapsed, setCitationsCollapsed] = useState(true)
// HTML实体编码辅助函数 // HTML实体编码辅助函数
const encodeHTML = (str: string) => { const encodeHTML = (str: string) => {
@ -82,6 +83,16 @@ const MessageContent: React.FC<Props> = ({ message: _message, model }) => {
})) }))
}, [message.metadata?.citations, message.metadata?.annotations, model]) }, [message.metadata?.citations, message.metadata?.annotations, model])
// 判断是否有引用内容
const hasCitations = useMemo(() => {
return !!(
(formattedCitations && formattedCitations.length > 0) ||
(message?.metadata?.webSearch && message.status === 'success') ||
(message?.metadata?.webSearchInfo && message.status === 'success') ||
(message?.metadata?.groundingMetadata && message.status === 'success')
)
}, [formattedCitations, message])
// 获取引用数据 // 获取引用数据
const citationsData = useMemo(() => { const citationsData = useMemo(() => {
const searchResults = const searchResults =
@ -220,64 +231,104 @@ const MessageContent: React.FC<Props> = ({ message: _message, model }) => {
)} )}
</Fragment> </Fragment>
)} )}
{message?.metadata?.groundingMetadata && message.status == 'success' && ( {hasCitations && (
<> <CitationsContainer>
<CitationsList <CitationsHeader onClick={() => setCitationsCollapsed(!citationsCollapsed)}>
citations={ <div>
message.metadata.groundingMetadata?.groundingChunks?.map((chunk, index) => ({ {t('message.citations')}
number: index + 1, <InfoCircleOutlined style={{ fontSize: '14px', marginLeft: '4px', opacity: 0.6 }} />
url: chunk?.web?.uri || '', </div>
title: chunk?.web?.title, {citationsCollapsed ? <DownOutlined /> : <UpOutlined />}
showFavicon: false </CitationsHeader>
})) || []
} {!citationsCollapsed && (
/> <CitationsContent>
<SearchEntryPoint {message?.metadata?.groundingMetadata && message.status === 'success' && (
dangerouslySetInnerHTML={{ <>
__html: message.metadata.groundingMetadata?.searchEntryPoint?.renderedContent <CitationsList
? message.metadata.groundingMetadata.searchEntryPoint.renderedContent citations={
.replace(/@media \(prefers-color-scheme: light\)/g, 'body[theme-mode="light"]') message.metadata.groundingMetadata?.groundingChunks?.map((chunk, index) => ({
.replace(/@media \(prefers-color-scheme: dark\)/g, 'body[theme-mode="dark"]') number: index + 1,
: '' url: chunk?.web?.uri || '',
}} title: chunk?.web?.title,
/> showFavicon: false
</> })) || []
)} }
{formattedCitations && ( />
<CitationsList <SearchEntryPoint
citations={formattedCitations.map((citation) => ({ dangerouslySetInnerHTML={{
number: citation.number, __html: message.metadata.groundingMetadata?.searchEntryPoint?.renderedContent
url: citation.url, ? message.metadata.groundingMetadata.searchEntryPoint.renderedContent
hostname: citation.hostname, .replace(/@media \(prefers-color-scheme: light\)/g, 'body[theme-mode="light"]')
showFavicon: isWebCitation .replace(/@media \(prefers-color-scheme: dark\)/g, 'body[theme-mode="dark"]')
}))} : ''
/> }}
)} />
{message?.metadata?.webSearch && message.status === 'success' && ( </>
<CitationsList )}
citations={message.metadata.webSearch.results.map((result, index) => ({ {formattedCitations && (
number: index + 1, <CitationsList
url: result.url, citations={formattedCitations.map((citation) => ({
title: result.title, number: citation.number,
showFavicon: true url: citation.url,
}))} hostname: citation.hostname,
/> showFavicon: isWebCitation
)} }))}
{message?.metadata?.webSearchInfo && message.status === 'success' && ( />
<CitationsList )}
citations={message.metadata.webSearchInfo.map((result, index) => ({ {message?.metadata?.webSearch && message.status === 'success' && (
number: index + 1, <CitationsList
url: result.link || result.url, citations={message.metadata.webSearch.results.map((result, index) => ({
title: result.title, number: index + 1,
showFavicon: true url: result.url,
}))} title: result.title,
/> showFavicon: true
}))}
/>
)}
{message?.metadata?.webSearchInfo && message.status === 'success' && (
<CitationsList
citations={message.metadata.webSearchInfo.map((result, index) => ({
number: index + 1,
url: result.link || result.url,
title: result.title,
showFavicon: true
}))}
/>
)}
</CitationsContent>
)}
</CitationsContainer>
)} )}
<MessageAttachments message={message} /> <MessageAttachments message={message} />
</Fragment> </Fragment>
) )
} }
const CitationsContainer = styled.div`
margin-top: 12px;
border: 1px solid var(--color-border);
border-radius: 8px;
overflow: hidden;
`
const CitationsHeader = styled.div`
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 12px;
background-color: var(--color-background-mute);
cursor: pointer;
&:hover {
background-color: var(--color-border);
}
`
const CitationsContent = styled.div`
padding: 10px;
background-color: var(--color-background-mute);
`
const MessageContentLoading = styled.div` const MessageContentLoading = styled.div`
display: flex; display: flex;
flex-direction: row; flex-direction: row;

475
yarn.lock
View File

@ -1038,6 +1038,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/aix-ppc64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/aix-ppc64@npm:0.25.2"
conditions: os=aix & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/android-arm64@npm:0.21.5": "@esbuild/android-arm64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/android-arm64@npm:0.21.5" resolution: "@esbuild/android-arm64@npm:0.21.5"
@ -1045,6 +1052,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-arm64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/android-arm64@npm:0.25.2"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
"@esbuild/android-arm@npm:0.21.5": "@esbuild/android-arm@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/android-arm@npm:0.21.5" resolution: "@esbuild/android-arm@npm:0.21.5"
@ -1052,6 +1066,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-arm@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/android-arm@npm:0.25.2"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
"@esbuild/android-x64@npm:0.21.5": "@esbuild/android-x64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/android-x64@npm:0.21.5" resolution: "@esbuild/android-x64@npm:0.21.5"
@ -1059,6 +1080,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-x64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/android-x64@npm:0.25.2"
conditions: os=android & cpu=x64
languageName: node
linkType: hard
"@esbuild/darwin-arm64@npm:0.21.5": "@esbuild/darwin-arm64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/darwin-arm64@npm:0.21.5" resolution: "@esbuild/darwin-arm64@npm:0.21.5"
@ -1066,6 +1094,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/darwin-arm64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/darwin-arm64@npm:0.25.2"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@esbuild/darwin-x64@npm:0.21.5": "@esbuild/darwin-x64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/darwin-x64@npm:0.21.5" resolution: "@esbuild/darwin-x64@npm:0.21.5"
@ -1073,6 +1108,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/darwin-x64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/darwin-x64@npm:0.25.2"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@esbuild/freebsd-arm64@npm:0.21.5": "@esbuild/freebsd-arm64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/freebsd-arm64@npm:0.21.5" resolution: "@esbuild/freebsd-arm64@npm:0.21.5"
@ -1080,6 +1122,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/freebsd-arm64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/freebsd-arm64@npm:0.25.2"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/freebsd-x64@npm:0.21.5": "@esbuild/freebsd-x64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/freebsd-x64@npm:0.21.5" resolution: "@esbuild/freebsd-x64@npm:0.21.5"
@ -1087,6 +1136,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/freebsd-x64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/freebsd-x64@npm:0.25.2"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/linux-arm64@npm:0.21.5": "@esbuild/linux-arm64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/linux-arm64@npm:0.21.5" resolution: "@esbuild/linux-arm64@npm:0.21.5"
@ -1094,6 +1150,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-arm64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/linux-arm64@npm:0.25.2"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@esbuild/linux-arm@npm:0.21.5": "@esbuild/linux-arm@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/linux-arm@npm:0.21.5" resolution: "@esbuild/linux-arm@npm:0.21.5"
@ -1101,6 +1164,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-arm@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/linux-arm@npm:0.25.2"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@esbuild/linux-ia32@npm:0.21.5": "@esbuild/linux-ia32@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/linux-ia32@npm:0.21.5" resolution: "@esbuild/linux-ia32@npm:0.21.5"
@ -1108,6 +1178,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-ia32@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/linux-ia32@npm:0.25.2"
conditions: os=linux & cpu=ia32
languageName: node
linkType: hard
"@esbuild/linux-loong64@npm:0.21.5": "@esbuild/linux-loong64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/linux-loong64@npm:0.21.5" resolution: "@esbuild/linux-loong64@npm:0.21.5"
@ -1115,6 +1192,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-loong64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/linux-loong64@npm:0.25.2"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
"@esbuild/linux-mips64el@npm:0.21.5": "@esbuild/linux-mips64el@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/linux-mips64el@npm:0.21.5" resolution: "@esbuild/linux-mips64el@npm:0.21.5"
@ -1122,6 +1206,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-mips64el@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/linux-mips64el@npm:0.25.2"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
"@esbuild/linux-ppc64@npm:0.21.5": "@esbuild/linux-ppc64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/linux-ppc64@npm:0.21.5" resolution: "@esbuild/linux-ppc64@npm:0.21.5"
@ -1129,6 +1220,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-ppc64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/linux-ppc64@npm:0.25.2"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/linux-riscv64@npm:0.21.5": "@esbuild/linux-riscv64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/linux-riscv64@npm:0.21.5" resolution: "@esbuild/linux-riscv64@npm:0.21.5"
@ -1136,6 +1234,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-riscv64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/linux-riscv64@npm:0.25.2"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
"@esbuild/linux-s390x@npm:0.21.5": "@esbuild/linux-s390x@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/linux-s390x@npm:0.21.5" resolution: "@esbuild/linux-s390x@npm:0.21.5"
@ -1143,6 +1248,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-s390x@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/linux-s390x@npm:0.25.2"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
"@esbuild/linux-x64@npm:0.21.5": "@esbuild/linux-x64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/linux-x64@npm:0.21.5" resolution: "@esbuild/linux-x64@npm:0.21.5"
@ -1150,6 +1262,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-x64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/linux-x64@npm:0.25.2"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@esbuild/netbsd-arm64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/netbsd-arm64@npm:0.25.2"
conditions: os=netbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/netbsd-x64@npm:0.21.5": "@esbuild/netbsd-x64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/netbsd-x64@npm:0.21.5" resolution: "@esbuild/netbsd-x64@npm:0.21.5"
@ -1157,6 +1283,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/netbsd-x64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/netbsd-x64@npm:0.25.2"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/openbsd-arm64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/openbsd-arm64@npm:0.25.2"
conditions: os=openbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/openbsd-x64@npm:0.21.5": "@esbuild/openbsd-x64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/openbsd-x64@npm:0.21.5" resolution: "@esbuild/openbsd-x64@npm:0.21.5"
@ -1164,6 +1304,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/openbsd-x64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/openbsd-x64@npm:0.25.2"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/sunos-x64@npm:0.21.5": "@esbuild/sunos-x64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/sunos-x64@npm:0.21.5" resolution: "@esbuild/sunos-x64@npm:0.21.5"
@ -1171,6 +1318,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/sunos-x64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/sunos-x64@npm:0.25.2"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
"@esbuild/win32-arm64@npm:0.21.5": "@esbuild/win32-arm64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/win32-arm64@npm:0.21.5" resolution: "@esbuild/win32-arm64@npm:0.21.5"
@ -1178,6 +1332,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-arm64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/win32-arm64@npm:0.25.2"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@esbuild/win32-ia32@npm:0.21.5": "@esbuild/win32-ia32@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/win32-ia32@npm:0.21.5" resolution: "@esbuild/win32-ia32@npm:0.21.5"
@ -1185,6 +1346,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-ia32@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/win32-ia32@npm:0.25.2"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@esbuild/win32-x64@npm:0.21.5": "@esbuild/win32-x64@npm:0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "@esbuild/win32-x64@npm:0.21.5" resolution: "@esbuild/win32-x64@npm:0.21.5"
@ -1192,6 +1360,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-x64@npm:0.25.2":
version: 0.25.2
resolution: "@esbuild/win32-x64@npm:0.25.2"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0":
version: 4.5.1 version: 4.5.1
resolution: "@eslint-community/eslint-utils@npm:4.5.1" resolution: "@eslint-community/eslint-utils@npm:4.5.1"
@ -2974,135 +3149,142 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-android-arm-eabi@npm:4.36.0": "@rollup/rollup-android-arm-eabi@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-android-arm-eabi@npm:4.36.0" resolution: "@rollup/rollup-android-arm-eabi@npm:4.40.0"
conditions: os=android & cpu=arm conditions: os=android & cpu=arm
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-android-arm64@npm:4.36.0": "@rollup/rollup-android-arm64@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-android-arm64@npm:4.36.0" resolution: "@rollup/rollup-android-arm64@npm:4.40.0"
conditions: os=android & cpu=arm64 conditions: os=android & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-darwin-arm64@npm:4.36.0": "@rollup/rollup-darwin-arm64@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-darwin-arm64@npm:4.36.0" resolution: "@rollup/rollup-darwin-arm64@npm:4.40.0"
conditions: os=darwin & cpu=arm64 conditions: os=darwin & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-darwin-x64@npm:4.36.0": "@rollup/rollup-darwin-x64@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-darwin-x64@npm:4.36.0" resolution: "@rollup/rollup-darwin-x64@npm:4.40.0"
conditions: os=darwin & cpu=x64 conditions: os=darwin & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-freebsd-arm64@npm:4.36.0": "@rollup/rollup-freebsd-arm64@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-freebsd-arm64@npm:4.36.0" resolution: "@rollup/rollup-freebsd-arm64@npm:4.40.0"
conditions: os=freebsd & cpu=arm64 conditions: os=freebsd & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-freebsd-x64@npm:4.36.0": "@rollup/rollup-freebsd-x64@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-freebsd-x64@npm:4.36.0" resolution: "@rollup/rollup-freebsd-x64@npm:4.40.0"
conditions: os=freebsd & cpu=x64 conditions: os=freebsd & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-arm-gnueabihf@npm:4.36.0": "@rollup/rollup-linux-arm-gnueabihf@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.36.0" resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.40.0"
conditions: os=linux & cpu=arm & libc=glibc conditions: os=linux & cpu=arm & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-arm-musleabihf@npm:4.36.0": "@rollup/rollup-linux-arm-musleabihf@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.36.0" resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.40.0"
conditions: os=linux & cpu=arm & libc=musl conditions: os=linux & cpu=arm & libc=musl
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-arm64-gnu@npm:4.36.0": "@rollup/rollup-linux-arm64-gnu@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.36.0" resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.40.0"
conditions: os=linux & cpu=arm64 & libc=glibc conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-arm64-musl@npm:4.36.0": "@rollup/rollup-linux-arm64-musl@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-arm64-musl@npm:4.36.0" resolution: "@rollup/rollup-linux-arm64-musl@npm:4.40.0"
conditions: os=linux & cpu=arm64 & libc=musl conditions: os=linux & cpu=arm64 & libc=musl
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-loongarch64-gnu@npm:4.36.0": "@rollup/rollup-linux-loongarch64-gnu@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.36.0" resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.40.0"
conditions: os=linux & cpu=loong64 & libc=glibc conditions: os=linux & cpu=loong64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-powerpc64le-gnu@npm:4.36.0": "@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.36.0" resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.0"
conditions: os=linux & cpu=ppc64 & libc=glibc conditions: os=linux & cpu=ppc64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-riscv64-gnu@npm:4.36.0": "@rollup/rollup-linux-riscv64-gnu@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.36.0" resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.40.0"
conditions: os=linux & cpu=riscv64 & libc=glibc conditions: os=linux & cpu=riscv64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-s390x-gnu@npm:4.36.0": "@rollup/rollup-linux-riscv64-musl@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.36.0" resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.40.0"
conditions: os=linux & cpu=riscv64 & libc=musl
languageName: node
linkType: hard
"@rollup/rollup-linux-s390x-gnu@npm:4.40.0":
version: 4.40.0
resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.40.0"
conditions: os=linux & cpu=s390x & libc=glibc conditions: os=linux & cpu=s390x & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-x64-gnu@npm:4.36.0": "@rollup/rollup-linux-x64-gnu@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-x64-gnu@npm:4.36.0" resolution: "@rollup/rollup-linux-x64-gnu@npm:4.40.0"
conditions: os=linux & cpu=x64 & libc=glibc conditions: os=linux & cpu=x64 & libc=glibc
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-linux-x64-musl@npm:4.36.0": "@rollup/rollup-linux-x64-musl@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-linux-x64-musl@npm:4.36.0" resolution: "@rollup/rollup-linux-x64-musl@npm:4.40.0"
conditions: os=linux & cpu=x64 & libc=musl conditions: os=linux & cpu=x64 & libc=musl
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-win32-arm64-msvc@npm:4.36.0": "@rollup/rollup-win32-arm64-msvc@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.36.0" resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.40.0"
conditions: os=win32 & cpu=arm64 conditions: os=win32 & cpu=arm64
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-win32-ia32-msvc@npm:4.36.0": "@rollup/rollup-win32-ia32-msvc@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.36.0" resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.40.0"
conditions: os=win32 & cpu=ia32 conditions: os=win32 & cpu=ia32
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/rollup-win32-x64-msvc@npm:4.36.0": "@rollup/rollup-win32-x64-msvc@npm:4.40.0":
version: 4.36.0 version: 4.40.0
resolution: "@rollup/rollup-win32-x64-msvc@npm:4.36.0" resolution: "@rollup/rollup-win32-x64-msvc@npm:4.40.0"
conditions: os=win32 & cpu=x64 conditions: os=win32 & cpu=x64
languageName: node languageName: node
linkType: hard linkType: hard
@ -3440,13 +3622,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": "@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6":
version: 1.0.6 version: 1.0.6
resolution: "@types/estree@npm:1.0.6" resolution: "@types/estree@npm:1.0.6"
checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a
languageName: node languageName: node
linkType: hard linkType: hard
"@types/estree@npm:1.0.7":
version: 1.0.7
resolution: "@types/estree@npm:1.0.7"
checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c
languageName: node
linkType: hard
"@types/fs-extra@npm:9.0.13, @types/fs-extra@npm:^9.0.11": "@types/fs-extra@npm:9.0.13, @types/fs-extra@npm:^9.0.11":
version: 9.0.13 version: 9.0.13
resolution: "@types/fs-extra@npm:9.0.13" resolution: "@types/fs-extra@npm:9.0.13"
@ -4091,7 +4280,7 @@ __metadata:
typescript: "npm:^5.6.2" typescript: "npm:^5.6.2"
undici: "npm:^7.4.0" undici: "npm:^7.4.0"
uuid: "npm:^10.0.0" uuid: "npm:^10.0.0"
vite: "npm:^5.0.12" vite: "npm:6.2.6"
webdav: "npm:^5.8.0" webdav: "npm:^5.8.0"
zipread: "npm:^1.3.3" zipread: "npm:^1.3.3"
languageName: unknown languageName: unknown
@ -6833,7 +7022,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"esbuild@npm:^0.21.3, esbuild@npm:^0.21.5": "esbuild@npm:^0.21.5":
version: 0.21.5 version: 0.21.5
resolution: "esbuild@npm:0.21.5" resolution: "esbuild@npm:0.21.5"
dependencies: dependencies:
@ -6913,6 +7102,92 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"esbuild@npm:^0.25.0":
version: 0.25.2
resolution: "esbuild@npm:0.25.2"
dependencies:
"@esbuild/aix-ppc64": "npm:0.25.2"
"@esbuild/android-arm": "npm:0.25.2"
"@esbuild/android-arm64": "npm:0.25.2"
"@esbuild/android-x64": "npm:0.25.2"
"@esbuild/darwin-arm64": "npm:0.25.2"
"@esbuild/darwin-x64": "npm:0.25.2"
"@esbuild/freebsd-arm64": "npm:0.25.2"
"@esbuild/freebsd-x64": "npm:0.25.2"
"@esbuild/linux-arm": "npm:0.25.2"
"@esbuild/linux-arm64": "npm:0.25.2"
"@esbuild/linux-ia32": "npm:0.25.2"
"@esbuild/linux-loong64": "npm:0.25.2"
"@esbuild/linux-mips64el": "npm:0.25.2"
"@esbuild/linux-ppc64": "npm:0.25.2"
"@esbuild/linux-riscv64": "npm:0.25.2"
"@esbuild/linux-s390x": "npm:0.25.2"
"@esbuild/linux-x64": "npm:0.25.2"
"@esbuild/netbsd-arm64": "npm:0.25.2"
"@esbuild/netbsd-x64": "npm:0.25.2"
"@esbuild/openbsd-arm64": "npm:0.25.2"
"@esbuild/openbsd-x64": "npm:0.25.2"
"@esbuild/sunos-x64": "npm:0.25.2"
"@esbuild/win32-arm64": "npm:0.25.2"
"@esbuild/win32-ia32": "npm:0.25.2"
"@esbuild/win32-x64": "npm:0.25.2"
dependenciesMeta:
"@esbuild/aix-ppc64":
optional: true
"@esbuild/android-arm":
optional: true
"@esbuild/android-arm64":
optional: true
"@esbuild/android-x64":
optional: true
"@esbuild/darwin-arm64":
optional: true
"@esbuild/darwin-x64":
optional: true
"@esbuild/freebsd-arm64":
optional: true
"@esbuild/freebsd-x64":
optional: true
"@esbuild/linux-arm":
optional: true
"@esbuild/linux-arm64":
optional: true
"@esbuild/linux-ia32":
optional: true
"@esbuild/linux-loong64":
optional: true
"@esbuild/linux-mips64el":
optional: true
"@esbuild/linux-ppc64":
optional: true
"@esbuild/linux-riscv64":
optional: true
"@esbuild/linux-s390x":
optional: true
"@esbuild/linux-x64":
optional: true
"@esbuild/netbsd-arm64":
optional: true
"@esbuild/netbsd-x64":
optional: true
"@esbuild/openbsd-arm64":
optional: true
"@esbuild/openbsd-x64":
optional: true
"@esbuild/sunos-x64":
optional: true
"@esbuild/win32-arm64":
optional: true
"@esbuild/win32-ia32":
optional: true
"@esbuild/win32-x64":
optional: true
bin:
esbuild: bin/esbuild
checksum: 10c0/87ce0b78699c4d192b8cf7e9b688e9a0da10e6f58ff85a368bf3044ca1fa95626c98b769b5459352282e0065585b6f994a5e6699af5cccf9d31178960e2b58fd
languageName: node
linkType: hard
"escalade@npm:^3.1.1, escalade@npm:^3.2.0": "escalade@npm:^3.1.1, escalade@npm:^3.2.0":
version: 3.2.0 version: 3.2.0
resolution: "escalade@npm:3.2.0" resolution: "escalade@npm:3.2.0"
@ -13047,7 +13322,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"postcss@npm:^8.4.43": "postcss@npm:^8.5.3":
version: 8.5.3 version: 8.5.3
resolution: "postcss@npm:8.5.3" resolution: "postcss@npm:8.5.3"
dependencies: dependencies:
@ -14634,30 +14909,31 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"rollup@npm:^4.20.0": "rollup@npm:^4.30.1":
version: 4.36.0 version: 4.40.0
resolution: "rollup@npm:4.36.0" resolution: "rollup@npm:4.40.0"
dependencies: dependencies:
"@rollup/rollup-android-arm-eabi": "npm:4.36.0" "@rollup/rollup-android-arm-eabi": "npm:4.40.0"
"@rollup/rollup-android-arm64": "npm:4.36.0" "@rollup/rollup-android-arm64": "npm:4.40.0"
"@rollup/rollup-darwin-arm64": "npm:4.36.0" "@rollup/rollup-darwin-arm64": "npm:4.40.0"
"@rollup/rollup-darwin-x64": "npm:4.36.0" "@rollup/rollup-darwin-x64": "npm:4.40.0"
"@rollup/rollup-freebsd-arm64": "npm:4.36.0" "@rollup/rollup-freebsd-arm64": "npm:4.40.0"
"@rollup/rollup-freebsd-x64": "npm:4.36.0" "@rollup/rollup-freebsd-x64": "npm:4.40.0"
"@rollup/rollup-linux-arm-gnueabihf": "npm:4.36.0" "@rollup/rollup-linux-arm-gnueabihf": "npm:4.40.0"
"@rollup/rollup-linux-arm-musleabihf": "npm:4.36.0" "@rollup/rollup-linux-arm-musleabihf": "npm:4.40.0"
"@rollup/rollup-linux-arm64-gnu": "npm:4.36.0" "@rollup/rollup-linux-arm64-gnu": "npm:4.40.0"
"@rollup/rollup-linux-arm64-musl": "npm:4.36.0" "@rollup/rollup-linux-arm64-musl": "npm:4.40.0"
"@rollup/rollup-linux-loongarch64-gnu": "npm:4.36.0" "@rollup/rollup-linux-loongarch64-gnu": "npm:4.40.0"
"@rollup/rollup-linux-powerpc64le-gnu": "npm:4.36.0" "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.40.0"
"@rollup/rollup-linux-riscv64-gnu": "npm:4.36.0" "@rollup/rollup-linux-riscv64-gnu": "npm:4.40.0"
"@rollup/rollup-linux-s390x-gnu": "npm:4.36.0" "@rollup/rollup-linux-riscv64-musl": "npm:4.40.0"
"@rollup/rollup-linux-x64-gnu": "npm:4.36.0" "@rollup/rollup-linux-s390x-gnu": "npm:4.40.0"
"@rollup/rollup-linux-x64-musl": "npm:4.36.0" "@rollup/rollup-linux-x64-gnu": "npm:4.40.0"
"@rollup/rollup-win32-arm64-msvc": "npm:4.36.0" "@rollup/rollup-linux-x64-musl": "npm:4.40.0"
"@rollup/rollup-win32-ia32-msvc": "npm:4.36.0" "@rollup/rollup-win32-arm64-msvc": "npm:4.40.0"
"@rollup/rollup-win32-x64-msvc": "npm:4.36.0" "@rollup/rollup-win32-ia32-msvc": "npm:4.40.0"
"@types/estree": "npm:1.0.6" "@rollup/rollup-win32-x64-msvc": "npm:4.40.0"
"@types/estree": "npm:1.0.7"
fsevents: "npm:~2.3.2" fsevents: "npm:~2.3.2"
dependenciesMeta: dependenciesMeta:
"@rollup/rollup-android-arm-eabi": "@rollup/rollup-android-arm-eabi":
@ -14686,6 +14962,8 @@ __metadata:
optional: true optional: true
"@rollup/rollup-linux-riscv64-gnu": "@rollup/rollup-linux-riscv64-gnu":
optional: true optional: true
"@rollup/rollup-linux-riscv64-musl":
optional: true
"@rollup/rollup-linux-s390x-gnu": "@rollup/rollup-linux-s390x-gnu":
optional: true optional: true
"@rollup/rollup-linux-x64-gnu": "@rollup/rollup-linux-x64-gnu":
@ -14702,7 +14980,7 @@ __metadata:
optional: true optional: true
bin: bin:
rollup: dist/bin/rollup rollup: dist/bin/rollup
checksum: 10c0/52ad34ba18edb3613253ecbc7db5c8d6067ed103d8786051e96d42bcb383f7473bbda91b25297435b8a531fe308726cf1bb978456b9fcce044e4885510d73252 checksum: 10c0/90aa57487d4a9a7de1a47bf42a6091f83f1cb7fe1814650dfec278ab8ddae5736b86535d4c766493517720f334dfd4aa0635405ca8f4f36ed8d3c0f875f2a801
languageName: node languageName: node
linkType: hard linkType: hard
@ -16627,29 +16905,34 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"vite@npm:^5.0.12": "vite@npm:6.2.6":
version: 5.4.14 version: 6.2.6
resolution: "vite@npm:5.4.14" resolution: "vite@npm:6.2.6"
dependencies: dependencies:
esbuild: "npm:^0.21.3" esbuild: "npm:^0.25.0"
fsevents: "npm:~2.3.3" fsevents: "npm:~2.3.3"
postcss: "npm:^8.4.43" postcss: "npm:^8.5.3"
rollup: "npm:^4.20.0" rollup: "npm:^4.30.1"
peerDependencies: peerDependencies:
"@types/node": ^18.0.0 || >=20.0.0 "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0
jiti: ">=1.21.0"
less: "*" less: "*"
lightningcss: ^1.21.0 lightningcss: ^1.21.0
sass: "*" sass: "*"
sass-embedded: "*" sass-embedded: "*"
stylus: "*" stylus: "*"
sugarss: "*" sugarss: "*"
terser: ^5.4.0 terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
dependenciesMeta: dependenciesMeta:
fsevents: fsevents:
optional: true optional: true
peerDependenciesMeta: peerDependenciesMeta:
"@types/node": "@types/node":
optional: true optional: true
jiti:
optional: true
less: less:
optional: true optional: true
lightningcss: lightningcss:
@ -16664,9 +16947,13 @@ __metadata:
optional: true optional: true
terser: terser:
optional: true optional: true
tsx:
optional: true
yaml:
optional: true
bin: bin:
vite: bin/vite.js vite: bin/vite.js
checksum: 10c0/8842933bd70ca6a98489a0bb9c8464bec373de00f9a97c8c7a4e64b24d15c88bfaa8c1acb38a68c3e5eb49072ffbccb146842c2d4edcdd036a9802964cffe3d1 checksum: 10c0/68a2ed3e61bdd654c59b817b4f3203065241c66d1739faa707499130f3007bc3a666c7a8320a4198e275e62b5e4d34d9b78a6533f69e321d366e76f5093b2071
languageName: node languageName: node
linkType: hard linkType: hard