2 lines
19 KiB
JavaScript
2 lines
19 KiB
JavaScript
import{i as ue,r as i,j as e}from"./router-zNjPR4CY.js";import{aG as ve,a4 as w,B as o,S as oe,C as y,f as k,T as we,O as ye,P as $,R as z,b as G,d as Y,e as q,D as ke,i as _e,j as be,k as Ce,l as Se,a5 as Ae,L as _,X as A,a6 as E,Y as P,I as Pe,a3 as Te}from"./index-CuOHsLf7.js";import{B as u}from"./badge-CDs67obV.js";import{C as X}from"./checkbox-DWiVrbnx.js";import{R as De,a as le}from"./radio-group-BBkaGEpR.js";import{S as Ie,a as Le,b as Re,c as Fe,d as Be}from"./select-DGqIoF9r.js";import{S as c}from"./skeleton-CXI2IV_v.js";import{A as Ee,a as Oe,b as He,c as Ke}from"./accordion-BDNDahhI.js";import{T as ce,a as re,b as O,c as f,d as ne,e as g}from"./table-DFeDhBY_.js";import{S as Me}from"./separator-B_DSOSdz.js";import{g as Ue,b as Ve,a as $e,t as ze,d as Ge,f as Ye,r as qe}from"./pack-api-NsQx-ed4.js";import{P as J,g as ie,a1 as Xe,ad as Je,aH as te,b5 as de,am as Qe,t as H,ak as K,al as M,s as We,L as xe,ai as me,b as T,y as Ze,T as he,V as es}from"./icons-DTcdLw9j.js";import"./misc-BwRzHX8c.js";import"./radix-C-ZuImoP.js";import"./utils-DjBw3JGv.js";const ss={utils:"通用工具",utils_small:"轻量工具",tool_use:"工具调用",replyer:"回复生成",planner:"规划推理",vlm:"视觉模型",voice:"语音处理",embedding:"向量嵌入",lpmm_entity_extract:"实体提取",lpmm_rdf_build:"RDF构建",lpmm_qa:"问答模型"};function us(){const{packId:m}=ve.useParams(),b=ue(),[a,n]=i.useState(null),[D,t]=i.useState(!0),[h,j]=i.useState(!1),[r,p]=i.useState(!1),[I,v]=i.useState(!1),[L,R]=i.useState(1),[C,Q]=i.useState(null),[l,x]=i.useState(!1),[N,W]=i.useState(!1),[U,je]=i.useState({apply_providers:!0,apply_models:!0,apply_task_config:!0,task_mode:"append",selected_providers:void 0,selected_models:void 0,selected_tasks:void 0}),[Z,ee]=i.useState({}),[V,se]=i.useState({}),F=Ue(),ae=i.useCallback(async()=>{if(m){t(!0);try{const s=await Ve(m);n(s);const d=await $e(m,F);j(d)}catch(s){console.error("加载 Pack 失败:",s),w({title:"加载模板失败",variant:"destructive"})}finally{t(!1)}}},[m,F]);i.useEffect(()=>{ae()},[ae]);const pe=async()=>{if(!(!m||r)){p(!0);try{const s=await ze(m,F);j(s.liked),a&&n({...a,likes:s.likes})}catch(s){console.error("点赞失败:",s),w({title:"点赞失败",variant:"destructive"})}finally{p(!1)}}},Ne=async()=>{if(a){v(!0),R(1),x(!0);try{const s=await Ge(a);Q(s);const d={};for(const B of s.existing_providers)d[B.pack_provider.name]=B.local_providers[0].name;ee(d);const S={};for(const B of s.new_providers)S[B.name]="";se(S)}catch(s){console.error("检测冲突失败:",s),w({title:"检测配置冲突失败",variant:"destructive"}),v(!1)}finally{x(!1)}}},fe=async()=>{if(a){if(U.apply_providers&&C){for(const s of C.new_providers)if(!V[s.name]){w({title:`请填写提供商 "${s.name}" 的 API Key`,variant:"destructive"});return}}W(!0);try{await Ye(a,U,Z,V),await qe(a.id,F),n({...a,downloads:a.downloads+1}),w({title:"配置模板应用成功!"}),v(!1)}catch(s){console.error("应用 Pack 失败:",s),w({title:s instanceof Error?s.message:"应用配置失败",variant:"destructive"})}finally{W(!1)}}},ge=s=>new Date(s).toLocaleDateString("zh-CN",{year:"numeric",month:"long",day:"numeric"});return D?e.jsx(ls,{}):a?e.jsx("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:e.jsx(oe,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsxs(o,{variant:"ghost",size:"sm",onClick:()=>b({to:"/config/pack-market"}),className:"gap-2",children:[e.jsx(ie,{className:"w-4 h-4"}),"返回市场"]}),e.jsxs("div",{className:"flex flex-col md:flex-row gap-6",children:[e.jsxs("div",{className:"flex-1 space-y-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(J,{className:"w-10 h-10 text-primary mt-1"}),e.jsxs("div",{children:[e.jsxs("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[a.name,e.jsxs(u,{variant:"secondary",children:["v",a.version]})]}),e.jsx("p",{className:"text-muted-foreground mt-1",children:a.description})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-4 text-sm text-muted-foreground",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Xe,{className:"w-4 h-4"}),a.author]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Je,{className:"w-4 h-4"}),ge(a.created_at)]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(te,{className:"w-4 h-4"}),a.downloads," 次下载"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(de,{className:`w-4 h-4 ${h?"fill-red-500 text-red-500":""}`}),a.likes," 赞"]})]}),a.tags&&a.tags.length>0&&e.jsx("div",{className:"flex flex-wrap gap-2",children:a.tags.map(s=>e.jsxs(u,{variant:"outline",children:[e.jsx(Qe,{className:"w-3 h-3 mr-1"}),s]},s))})]}),e.jsxs("div",{className:"flex flex-col gap-2 min-w-[160px]",children:[e.jsxs(o,{size:"lg",onClick:Ne,children:[e.jsx(te,{className:"w-4 h-4 mr-2"}),"应用模板"]}),e.jsxs(o,{variant:"outline",onClick:pe,disabled:r,className:h?"text-red-500 border-red-200":"",children:[e.jsx(de,{className:`w-4 h-4 mr-2 ${h?"fill-current":""}`}),h?"已点赞":"点赞"]})]})]}),e.jsx(Me,{}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsx(y,{children:e.jsxs(k,{className:"flex items-center gap-3 py-4",children:[e.jsx(H,{className:"w-8 h-8 text-blue-500 flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xl font-bold",children:a.providers.length}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"API 提供商"})]})]})}),e.jsx(y,{children:e.jsxs(k,{className:"flex items-center gap-3 py-4",children:[e.jsx(K,{className:"w-8 h-8 text-green-500 flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xl font-bold",children:a.models.length}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"模型配置"})]})]})}),e.jsx(y,{children:e.jsxs(k,{className:"flex items-center gap-3 py-4",children:[e.jsx(M,{className:"w-8 h-8 text-purple-500 flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xl font-bold",children:Object.keys(a.task_config).length}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"任务配置"})]})]})})]}),e.jsxs(we,{defaultValue:"providers",className:"space-y-4",children:[e.jsxs(ye,{className:"w-full sm:w-auto grid grid-cols-3 sm:flex",children:[e.jsxs($,{value:"providers",className:"gap-1 sm:gap-2",children:[e.jsx(H,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"提供商"}),e.jsx("span",{className:"sm:hidden",children:"提供商"}),e.jsxs("span",{className:"hidden sm:inline",children:["(",a.providers.length,")"]})]}),e.jsxs($,{value:"models",className:"gap-1 sm:gap-2",children:[e.jsx(K,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"模型"}),e.jsx("span",{className:"sm:hidden",children:"模型"}),e.jsxs("span",{className:"hidden sm:inline",children:["(",a.models.length,")"]})]}),e.jsxs($,{value:"tasks",className:"gap-1 sm:gap-2",children:[e.jsx(M,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline",children:"任务配置"}),e.jsx("span",{className:"sm:hidden",children:"任务"}),e.jsxs("span",{className:"hidden sm:inline",children:["(",Object.keys(a.task_config).length,")"]})]})]}),e.jsx(z,{value:"providers",children:e.jsxs(y,{children:[e.jsxs(G,{children:[e.jsx(Y,{children:"API 提供商"}),e.jsx(q,{children:"模板中包含的 API 提供商配置(不含 API Key)"})]}),e.jsx(k,{children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(ce,{"aria-label":"API 提供商配置列表",children:[e.jsx(re,{children:e.jsxs(O,{children:[e.jsx(f,{children:"名称"}),e.jsx(f,{children:"Base URL"}),e.jsx(f,{children:"类型"})]})}),e.jsx(ne,{children:a.providers.map(s=>e.jsxs(O,{children:[e.jsx(g,{className:"font-medium whitespace-nowrap",children:s.name}),e.jsx(g,{className:"text-muted-foreground font-mono text-sm max-w-[200px] truncate",children:s.base_url}),e.jsx(g,{children:e.jsx(u,{variant:"outline",children:s.client_type})})]},s.name))})]})})})]})}),e.jsx(z,{value:"models",children:e.jsxs(y,{children:[e.jsxs(G,{children:[e.jsx(Y,{children:"模型配置"}),e.jsx(q,{children:"模板中包含的模型配置"})]}),e.jsx(k,{children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(ce,{"aria-label":"模型配置列表",children:[e.jsx(re,{children:e.jsxs(O,{children:[e.jsx(f,{children:"模型名称"}),e.jsx(f,{children:"标识符"}),e.jsx(f,{children:"提供商"}),e.jsx(f,{className:"text-right",children:"价格 (入/出)"})]})}),e.jsx(ne,{children:a.models.map(s=>e.jsxs(O,{children:[e.jsx(g,{className:"font-medium whitespace-nowrap",children:s.name}),e.jsx(g,{className:"text-muted-foreground font-mono text-sm max-w-[150px] truncate",children:s.model_identifier}),e.jsx(g,{className:"whitespace-nowrap",children:s.api_provider}),e.jsxs(g,{className:"text-right text-muted-foreground whitespace-nowrap",children:["¥",s.price_in," / ¥",s.price_out]})]},s.name))})]})})})]})}),e.jsx(z,{value:"tasks",children:e.jsxs(y,{children:[e.jsxs(G,{children:[e.jsx(Y,{children:"任务配置"}),e.jsx(q,{children:"模板中各任务类型的模型分配"})]}),e.jsx(k,{children:e.jsx(Ee,{type:"multiple",className:"w-full",children:Object.entries(a.task_config).map(([s,d])=>e.jsxs(Oe,{value:s,children:[e.jsx(He,{children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(We,{className:"w-4 h-4"}),ss[s]||s,e.jsxs(u,{variant:"secondary",className:"ml-2",children:[d.model_list.length," 个模型"]})]})}),e.jsx(Ke,{children:e.jsxs("div",{className:"space-y-2 pl-6",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:"分配的模型:"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:d.model_list.map(S=>e.jsx(u,{variant:"outline",children:S},S))}),d.temperature!==void 0&&e.jsxs("div",{className:"text-sm",children:["Temperature: ",e.jsx("span",{className:"font-mono",children:d.temperature})]}),d.max_tokens!==void 0&&e.jsxs("div",{className:"text-sm",children:["Max Tokens: ",e.jsx("span",{className:"font-mono",children:d.max_tokens})]})]})})]},s))})})]})})]}),e.jsx(as,{open:I,onOpenChange:v,pack:a,step:L,setStep:R,conflicts:C,detectingConflicts:l,applying:N,options:U,setOptions:je,_providerMapping:Z,_setProviderMapping:ee,newProviderApiKeys:V,setNewProviderApiKeys:se,onApply:fe})]})})}):e.jsxs("div",{className:"text-center py-12",children:[e.jsx(J,{className:"w-16 h-16 mx-auto mb-4 opacity-50"}),e.jsx("h2",{className:"text-xl font-semibold",children:"模板不存在"}),e.jsx("p",{className:"text-muted-foreground mt-2",children:"该配置模板可能已被删除或尚未通过审核"}),e.jsxs(o,{className:"mt-4",onClick:()=>b({to:"/config/pack-market"}),children:[e.jsx(ie,{className:"w-4 h-4 mr-2"}),"返回市场"]})]})}function as({open:m,onOpenChange:b,pack:a,step:n,setStep:D,conflicts:t,detectingConflicts:h,applying:j,options:r,setOptions:p,_providerMapping:I,_setProviderMapping:v,newProviderApiKeys:L,setNewProviderApiKeys:R,onApply:C}){return e.jsx(ke,{open:m,onOpenChange:b,children:e.jsxs(_e,{className:"max-w-2xl",confirmOnEnter:!0,children:[e.jsxs(be,{children:[e.jsxs(Ce,{className:"flex items-center gap-2",children:[e.jsx(J,{className:"w-5 h-5"}),"应用配置模板"]}),e.jsxs(Se,{children:["步骤 ",n," / ",3,":",n===1&&"选择要应用的内容",n===2&&"配置提供商映射",n===3&&"确认并应用"]})]}),e.jsx(Ae,{children:h?e.jsxs("div",{className:"py-8 text-center",children:[e.jsx(xe,{className:"w-8 h-8 mx-auto animate-spin text-primary"}),e.jsx("p",{className:"mt-4 text-muted-foreground",children:"正在检测配置冲突..."})]}):e.jsxs(e.Fragment,{children:[n===1&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(X,{id:"apply_providers",checked:r.apply_providers,onCheckedChange:l=>p({...r,apply_providers:l})}),e.jsxs(_,{htmlFor:"apply_providers",className:"flex items-center gap-2",children:[e.jsx(H,{className:"w-4 h-4"}),"应用提供商配置 (",a.providers.length," 个)"]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(X,{id:"apply_models",checked:r.apply_models,onCheckedChange:l=>p({...r,apply_models:l})}),e.jsxs(_,{htmlFor:"apply_models",className:"flex items-center gap-2",children:[e.jsx(K,{className:"w-4 h-4"}),"应用模型配置 (",a.models.length," 个)"]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(X,{id:"apply_task_config",checked:r.apply_task_config,onCheckedChange:l=>p({...r,apply_task_config:l})}),e.jsxs(_,{htmlFor:"apply_task_config",className:"flex items-center gap-2",children:[e.jsx(M,{className:"w-4 h-4"}),"应用任务配置 (",Object.keys(a.task_config).length," 个)"]})]})]}),r.apply_task_config&&e.jsxs("div",{className:"pl-6 space-y-2 border-l-2 border-muted",children:[e.jsx(_,{className:"text-sm font-medium",children:"任务配置应用模式"}),e.jsxs(De,{value:r.task_mode,onValueChange:l=>p({...r,task_mode:l}),children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(le,{value:"append",id:"mode_append"}),e.jsx(_,{htmlFor:"mode_append",className:"font-normal",children:"追加模式 - 将模板中的模型添加到现有配置"})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(le,{value:"replace",id:"mode_replace"}),e.jsx(_,{htmlFor:"mode_replace",className:"font-normal",children:"替换模式 - 用模板配置完全替换现有配置"})]})]})]})]}),n===2&&t&&e.jsxs("div",{className:"space-y-4",children:[r.apply_providers&&t.existing_providers.length>0&&e.jsxs("div",{className:"space-y-3",children:[e.jsxs(A,{children:[e.jsx(me,{className:"h-4 w-4"}),e.jsx(E,{children:"发现已有的提供商"}),e.jsx(P,{children:"以下提供商的 URL 与您本地配置中的提供商匹配,将自动使用本地提供商:"})]}),e.jsx("div",{className:"space-y-2",children:t.existing_providers.map(({pack_provider:l,local_providers:x})=>e.jsxs("div",{className:"flex items-center gap-2 p-3 bg-muted rounded-lg",children:[e.jsx(T,{className:"w-4 h-4 text-green-500 flex-shrink-0"}),e.jsx("span",{className:"font-medium flex-shrink-0",children:l.name}),e.jsx(Ze,{className:"w-4 h-4 text-muted-foreground flex-shrink-0"}),x.length===1?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-muted-foreground",children:x[0].name}),e.jsx(u,{variant:"outline",className:"ml-auto",children:"URL 匹配"})]}):e.jsxs(e.Fragment,{children:[e.jsxs(Ie,{value:I[l.name]||x[0].name,onValueChange:N=>v({...I,[l.name]:N}),children:[e.jsx(Le,{className:"w-[200px]",children:e.jsx(Re,{})}),e.jsx(Fe,{children:x.map(N=>e.jsx(Be,{value:N.name,children:N.name},N.name))})]}),e.jsxs(u,{variant:"outline",className:"ml-auto",children:[x.length," 个匹配"]})]})]},l.name))})]}),r.apply_providers&&t.new_providers.length>0&&e.jsxs("div",{className:"space-y-3",children:[e.jsxs(A,{variant:"destructive",children:[e.jsx(he,{className:"h-4 w-4"}),e.jsx(E,{children:"需要配置 API Key"}),e.jsx(P,{children:"以下提供商在您的本地配置中不存在,需要填写 API Key:"})]}),e.jsx("div",{className:"space-y-4",children:t.new_providers.map(l=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(es,{className:"w-4 h-4 text-amber-500"}),e.jsx("span",{className:"font-medium",children:l.name}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:["(",l.base_url,")"]})]}),e.jsx(Pe,{type:"password",placeholder:`输入 ${l.name} 的 API Key`,value:L[l.name]||"",onChange:x=>R({...L,[l.name]:x.target.value})})]},l.name))})]}),(!r.apply_providers||t.existing_providers.length===0&&t.new_providers.length===0)&&e.jsxs(A,{children:[e.jsx(T,{className:"h-4 w-4"}),e.jsx(E,{children:"无需配置"}),e.jsx(P,{children:"模板中没有提供商配置,或您选择不应用提供商。"})]})]}),n===3&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs(A,{children:[e.jsx(me,{className:"h-4 w-4"}),e.jsx(E,{children:"确认应用"}),e.jsx(P,{children:"请确认以下将要应用的内容:"})]}),e.jsxs("div",{className:"space-y-2",children:[r.apply_providers&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(T,{className:"w-4 h-4 text-green-500"}),e.jsx(H,{className:"w-4 h-4"}),e.jsxs("span",{children:["应用 ",a.providers.length," 个提供商配置"]})]}),r.apply_models&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(T,{className:"w-4 h-4 text-green-500"}),e.jsx(K,{className:"w-4 h-4"}),e.jsxs("span",{children:["应用 ",a.models.length," 个模型配置"]})]}),r.apply_task_config&&e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(T,{className:"w-4 h-4 text-green-500"}),e.jsx(M,{className:"w-4 h-4"}),e.jsxs("span",{children:[r.task_mode==="append"?"追加":"替换"," ",Object.keys(a.task_config).length," 个任务配置"]})]})]}),t&&t.new_providers.length>0&&e.jsxs(A,{variant:"destructive",children:[e.jsx(he,{className:"h-4 w-4"}),e.jsxs(P,{children:["将添加 ",t.new_providers.length," 个新提供商,请确保已填写正确的 API Key。"]})]})]})]})}),e.jsxs(Te,{className:"flex justify-between",children:[e.jsx("div",{children:n>1&&!h&&e.jsx(o,{variant:"outline",onClick:()=>D(n-1),disabled:j,children:"上一步"})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(o,{variant:"outline",onClick:()=>b(!1),disabled:j,children:"取消"}),n<3?e.jsx(o,{"data-dialog-action":"confirm",onClick:()=>D(n+1),disabled:h,children:"下一步"}):e.jsxs(o,{"data-dialog-action":"confirm",onClick:C,disabled:j,children:[j&&e.jsx(xe,{className:"w-4 h-4 mr-2 animate-spin"}),"应用模板"]})]})]})]})})}function ls(){return e.jsx("div",{className:"h-[calc(100vh-4rem)] flex flex-col p-4 sm:p-6",children:e.jsx(oe,{className:"flex-1",children:e.jsxs("div",{className:"space-y-4 sm:space-y-6",children:[e.jsx(c,{className:"h-9 w-24"}),e.jsxs("div",{className:"flex flex-col md:flex-row gap-6",children:[e.jsxs("div",{className:"flex-1 space-y-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(c,{className:"w-10 h-10"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx(c,{className:"h-8 w-2/3"}),e.jsx(c,{className:"h-4 w-full"})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-4",children:[e.jsx(c,{className:"h-4 w-24"}),e.jsx(c,{className:"h-4 w-32"}),e.jsx(c,{className:"h-4 w-28"}),e.jsx(c,{className:"h-4 w-20"})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(c,{className:"h-6 w-20"}),e.jsx(c,{className:"h-6 w-24"}),e.jsx(c,{className:"h-6 w-16"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2 min-w-[160px]",children:[e.jsx(c,{className:"h-10 w-full"}),e.jsx(c,{className:"h-10 w-full"})]})]}),e.jsx(c,{className:"h-px w-full"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[e.jsx(c,{className:"h-24"}),e.jsx(c,{className:"h-24"}),e.jsx(c,{className:"h-24"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx(c,{className:"h-10 w-32"}),e.jsx(c,{className:"h-10 w-32"}),e.jsx(c,{className:"h-10 w-32"})]}),e.jsx(c,{className:"h-96 w-full"})]})]})})})}export{us as default};
|