comfyui-frontend-package 1.37.3__py3-none-any.whl → 1.37.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- comfyui_frontend_package/static/assets/AboutPanel-BwfERTOT.js +2 -0
- comfyui_frontend_package/static/assets/{AboutPanel-6wNn9DuA.js.map → AboutPanel-BwfERTOT.js.map} +1 -1
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-ybC6cXRM.js → AudioPreviewPlayer-DT9nrYD6.js} +2 -2
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-ybC6cXRM.js.map → AudioPreviewPlayer-DT9nrYD6.js.map} +1 -1
- comfyui_frontend_package/static/assets/ComfyQueueButton-DazIfwpa.js +2 -0
- comfyui_frontend_package/static/assets/{ComfyQueueButton-BbIk3ALi.js.map → ComfyQueueButton-DazIfwpa.js.map} +1 -1
- comfyui_frontend_package/static/assets/ExtensionPanel-D539Wx81.js +2 -0
- comfyui_frontend_package/static/assets/{ExtensionPanel-DYw7d35v.js.map → ExtensionPanel-D539Wx81.js.map} +1 -1
- comfyui_frontend_package/static/assets/GraphView-C_FQc1Au.js +16 -0
- comfyui_frontend_package/static/assets/GraphView-C_FQc1Au.js.map +1 -0
- comfyui_frontend_package/static/assets/{GraphView-DwAYVX4H.css → GraphView-Ck9hVEEV.css} +1 -1
- comfyui_frontend_package/static/assets/{KeybindingPanel-D0MD69FX.js → KeybindingPanel-Bj61UMoX.js} +2 -2
- comfyui_frontend_package/static/assets/{KeybindingPanel-D0MD69FX.js.map → KeybindingPanel-Bj61UMoX.js.map} +1 -1
- comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-DyOiHvnA.js +2 -0
- comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-DyOiHvnA.js.map +1 -0
- comfyui_frontend_package/static/assets/LegacyCreditsPanel-BNqPlgUn.js +2 -0
- comfyui_frontend_package/static/assets/{LegacyCreditsPanel-BMvul305.js.map → LegacyCreditsPanel-BNqPlgUn.js.map} +1 -1
- comfyui_frontend_package/static/assets/Load3D-CaNKqgIL.js +2 -0
- comfyui_frontend_package/static/assets/Load3D-CaNKqgIL.js.map +1 -0
- comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-BtNou66j.js → Load3D.vue_vue_type_script_setup_true_lang-gf2aN2_8.js} +2 -2
- comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-BtNou66j.js.map → Load3D.vue_vue_type_script_setup_true_lang-gf2aN2_8.js.map} +1 -1
- comfyui_frontend_package/static/assets/{Media3DBottom-Bk7TM-zH.js → Media3DBottom-D9M9b2ls.js} +2 -2
- comfyui_frontend_package/static/assets/{Media3DBottom-Bk7TM-zH.js.map → Media3DBottom-D9M9b2ls.js.map} +1 -1
- comfyui_frontend_package/static/assets/{Media3DTop-CIsQ4Ccc.js → Media3DTop-B-qNqlQF.js} +2 -2
- comfyui_frontend_package/static/assets/{Media3DTop-CIsQ4Ccc.js.map → Media3DTop-B-qNqlQF.js.map} +1 -1
- comfyui_frontend_package/static/assets/{MediaAudioBottom-CWxtJ5vP.js → MediaAudioBottom-d7EZ2Wx5.js} +2 -2
- comfyui_frontend_package/static/assets/{MediaAudioBottom-CWxtJ5vP.js.map → MediaAudioBottom-d7EZ2Wx5.js.map} +1 -1
- comfyui_frontend_package/static/assets/{MediaImageBottom-OWiMf_6W.js → MediaImageBottom-B-9SOOhn.js} +2 -2
- comfyui_frontend_package/static/assets/{MediaImageBottom-OWiMf_6W.js.map → MediaImageBottom-B-9SOOhn.js.map} +1 -1
- comfyui_frontend_package/static/assets/{MediaTitle.vue_vue_type_script_setup_true_lang-C59zAxW0.js → MediaTitle.vue_vue_type_script_setup_true_lang-DVzYM9UW.js} +2 -2
- comfyui_frontend_package/static/assets/{MediaTitle.vue_vue_type_script_setup_true_lang-C59zAxW0.js.map → MediaTitle.vue_vue_type_script_setup_true_lang-DVzYM9UW.js.map} +1 -1
- comfyui_frontend_package/static/assets/{MediaVideoBottom-OKuLWTbn.js → MediaVideoBottom-D6IR52ja.js} +2 -2
- comfyui_frontend_package/static/assets/{MediaVideoBottom-OKuLWTbn.js.map → MediaVideoBottom-D6IR52ja.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ServerConfigPanel-5RPRkuvl.js → ServerConfigPanel-BBWOQ7ej.js} +2 -2
- comfyui_frontend_package/static/assets/{ServerConfigPanel-5RPRkuvl.js.map → ServerConfigPanel-BBWOQ7ej.js.map} +1 -1
- comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent-CtCWM_jj.js → SubscriptionRequiredDialogContent-oUSDZGJZ.js} +2 -2
- comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent-CtCWM_jj.js.map → SubscriptionRequiredDialogContent-oUSDZGJZ.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserPanel-CrxHTRQZ.js → UserPanel-Do_alb49.js} +2 -2
- comfyui_frontend_package/static/assets/{UserPanel-CrxHTRQZ.js.map → UserPanel-Do_alb49.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserSelectView-tu0lXAri.js → UserSelectView-DVJzD33o.js} +2 -2
- comfyui_frontend_package/static/assets/{UserSelectView-tu0lXAri.js.map → UserSelectView-DVJzD33o.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ValueControlPopover-CgyNfIEw.js → ValueControlPopover-CZIsPw9J.js} +2 -2
- comfyui_frontend_package/static/assets/{ValueControlPopover-CgyNfIEw.js.map → ValueControlPopover-CZIsPw9J.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetAudioUI-CbC597q0.js +2 -0
- comfyui_frontend_package/static/assets/{WidgetAudioUI-BZL35TlT.js.map → WidgetAudioUI-CbC597q0.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetButton-Dkge0J8R.js → WidgetButton-Df2ihQh6.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetButton-Dkge0J8R.js.map → WidgetButton-Df2ihQh6.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetColorPicker-vRHta_Kz.js → WidgetColorPicker-DgI8RjHJ.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetColorPicker-vRHta_Kz.js.map → WidgetColorPicker-DgI8RjHJ.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetGalleria-BoWBT6i_.js → WidgetGalleria-Cyz9lzP-.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetGalleria-BoWBT6i_.js.map → WidgetGalleria-Cyz9lzP-.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetInputNumber-wD2uHC32.js +2 -0
- comfyui_frontend_package/static/assets/WidgetInputNumber-wD2uHC32.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-aeh2Ot2n.js → WidgetInputNumber.vue_vue_type_script_setup_true_lang-XbRdxGIz.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-aeh2Ot2n.js.map → WidgetInputNumber.vue_vue_type_script_setup_true_lang-XbRdxGIz.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetInputText-BRV8PzCv.js → WidgetInputText-BR3C0fCV.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetInputText-BRV8PzCv.js.map → WidgetInputText-BR3C0fCV.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-Dps42A-g.js → WidgetLayoutField.vue_vue_type_script_setup_true_lang-CZj3E4v6.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-Dps42A-g.js.map → WidgetLayoutField.vue_vue_type_script_setup_true_lang-CZj3E4v6.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetLegacy-CkV176Xm.js +2 -0
- comfyui_frontend_package/static/assets/WidgetLegacy-CkV176Xm.js.map +1 -0
- comfyui_frontend_package/static/assets/WidgetMarkdown-rM_UPCA-.js +2 -0
- comfyui_frontend_package/static/assets/{WidgetMarkdown-DIMd79hN.js.map → WidgetMarkdown-rM_UPCA-.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetRecordAudio-DwHSqiBz.js → WidgetRecordAudio-CLpvV8e9.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetRecordAudio-DwHSqiBz.js.map → WidgetRecordAudio-CLpvV8e9.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetSelect-BwcPw-lE.js +2 -0
- comfyui_frontend_package/static/assets/WidgetSelect-BwcPw-lE.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-CMg0GtSC.js → WidgetSelect.vue_vue_type_script_setup_true_lang-CITubFAk.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-CMg0GtSC.js.map → WidgetSelect.vue_vue_type_script_setup_true_lang-CITubFAk.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetTextarea-CZnqW4e_.js → WidgetTextarea-CwUMJ-23.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetTextarea-CZnqW4e_.js.map → WidgetTextarea-CwUMJ-23.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetToggleSwitch-DwYqmS17.js → WidgetToggleSwitch-DqQpfrDq.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetToggleSwitch-DwYqmS17.js.map → WidgetToggleSwitch-DqQpfrDq.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-COy_p9Eh.js → WidgetWithControl.vue_vue_type_script_setup_true_lang-JSl33v3j.js} +3 -3
- comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-COy_p9Eh.js.map → WidgetWithControl.vue_vue_type_script_setup_true_lang-JSl33v3j.js.map} +1 -1
- comfyui_frontend_package/static/assets/{audioService-Bh6LQBV8.js → audioService-DKN4T_Yr.js} +2 -2
- comfyui_frontend_package/static/assets/{audioService-Bh6LQBV8.js.map → audioService-DKN4T_Yr.js.map} +1 -1
- comfyui_frontend_package/static/assets/{audioUtils-DlA-QHPJ.js → audioUtils-WBbpBG9r.js} +2 -2
- comfyui_frontend_package/static/assets/{audioUtils-DlA-QHPJ.js.map → audioUtils-WBbpBG9r.js.map} +1 -1
- comfyui_frontend_package/static/assets/{commands-CHktpNSL.js → commands-CRVPkENB.js} +2 -2
- comfyui_frontend_package/static/assets/commands-CRVPkENB.js.map +1 -0
- comfyui_frontend_package/static/assets/{index-2-qFLlQP.js → index-CuKlxAeN.js} +30 -28
- comfyui_frontend_package/static/assets/index-CuKlxAeN.js.map +1 -0
- comfyui_frontend_package/static/assets/index-Cv1aHIoL.css +1 -0
- comfyui_frontend_package/static/assets/{index-_AAd9eTu.js → index-DEqR9lwu.js} +2 -2
- comfyui_frontend_package/static/assets/{index-_AAd9eTu.js.map → index-DEqR9lwu.js.map} +1 -1
- comfyui_frontend_package/static/assets/index-KizWjI6s.js +5 -0
- comfyui_frontend_package/static/assets/{index-DKofvZ3r.js.map → index-KizWjI6s.js.map} +1 -1
- comfyui_frontend_package/static/assets/{keybindingService-CWbdWLPI.js → keybindingService-O5KDQleT.js} +2 -2
- comfyui_frontend_package/static/assets/{keybindingService-CWbdWLPI.js.map → keybindingService-O5KDQleT.js.map} +1 -1
- comfyui_frontend_package/static/assets/main-10VBfKWj.js +14 -0
- comfyui_frontend_package/static/assets/main-10VBfKWj.js.map +1 -0
- comfyui_frontend_package/static/assets/nodeDefs-D9VHUZJt.js +53 -0
- comfyui_frontend_package/static/assets/nodeDefs-D9VHUZJt.js.map +1 -0
- comfyui_frontend_package/static/assets/{vendor-three-BKWXAgVe.js → vendor-three-29bN5sfh.js} +2 -2
- comfyui_frontend_package/static/assets/{vendor-three-BKWXAgVe.js.map → vendor-three-29bN5sfh.js.map} +1 -1
- comfyui_frontend_package/static/index.html +1 -1
- {comfyui_frontend_package-1.37.3.dist-info → comfyui_frontend_package-1.37.4.dist-info}/METADATA +1 -1
- {comfyui_frontend_package-1.37.3.dist-info → comfyui_frontend_package-1.37.4.dist-info}/RECORD +101 -101
- comfyui_frontend_package/static/assets/AboutPanel-6wNn9DuA.js +0 -2
- comfyui_frontend_package/static/assets/ComfyQueueButton-BbIk3ALi.js +0 -2
- comfyui_frontend_package/static/assets/ExtensionPanel-DYw7d35v.js +0 -2
- comfyui_frontend_package/static/assets/GraphView-CjDjhvN7.js +0 -16
- comfyui_frontend_package/static/assets/GraphView-CjDjhvN7.js.map +0 -1
- comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-CcI-aYhS.js +0 -2
- comfyui_frontend_package/static/assets/LazyImage.vue_vue_type_script_setup_true_lang-CcI-aYhS.js.map +0 -1
- comfyui_frontend_package/static/assets/LegacyCreditsPanel-BMvul305.js +0 -2
- comfyui_frontend_package/static/assets/Load3D-BplYUML3.js +0 -2
- comfyui_frontend_package/static/assets/Load3D-BplYUML3.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetAudioUI-BZL35TlT.js +0 -2
- comfyui_frontend_package/static/assets/WidgetInputNumber-DMqIMaoH.js +0 -2
- comfyui_frontend_package/static/assets/WidgetInputNumber-DMqIMaoH.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetLegacy-BWDBwsli.js +0 -2
- comfyui_frontend_package/static/assets/WidgetLegacy-BWDBwsli.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetMarkdown-DIMd79hN.js +0 -2
- comfyui_frontend_package/static/assets/WidgetSelect-BOvzWMtV.js +0 -2
- comfyui_frontend_package/static/assets/WidgetSelect-BOvzWMtV.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-CHktpNSL.js.map +0 -1
- comfyui_frontend_package/static/assets/index-2-qFLlQP.js.map +0 -1
- comfyui_frontend_package/static/assets/index-571Fkv7y.css +0 -1
- comfyui_frontend_package/static/assets/index-DKofvZ3r.js +0 -5
- comfyui_frontend_package/static/assets/main-DGOENlHZ.js +0 -14
- comfyui_frontend_package/static/assets/main-DGOENlHZ.js.map +0 -1
- comfyui_frontend_package/static/assets/nodeDefs-DtmuHPr3.js +0 -53
- comfyui_frontend_package/static/assets/nodeDefs-DtmuHPr3.js.map +0 -1
- {comfyui_frontend_package-1.37.3.dist-info → comfyui_frontend_package-1.37.4.dist-info}/WHEEL +0 -0
- {comfyui_frontend_package-1.37.3.dist-info → comfyui_frontend_package-1.37.4.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
var at=Object.defineProperty;var u=(o,e)=>at(o,"name",{value:e,configurable:!0});import{q as p,cL as T,cM as Xe,cN as b,ak as C,ao as R,cO as lt,ac as J,aI as ee,cP as dt,cQ as ct,bn as Je,a6 as ut,v as pt,f as S,$ as gt,t as D,o as te,cR as ft,cS as ht,cT as L,cU as P,a_ as mt,cV as be,cW as yt,cX as wt,cY as vt,cZ as bt,c_ as Pe,c$ as oe,d0 as F,d1 as $,ay as de,d2 as Ke,d3 as Nt,d4 as It,d5 as Ct,d6 as W,A as kt,a as E,C as Dt,d7 as xt,d8 as Qe,d9 as _t,au as Tt,az as St,e as Z,da as V,cJ as re,db as Mt,cI as ce,dc as ke,dd as De,de as Et,u as Ze,cH as Ot,df as et,dg as At,R as Le,dh as Pt,c6 as Lt,di as Gt,dj as Wt,dk as Rt,dl as Ft}from"./index-2-qFLlQP.js";import{bz as Ut,cD as Ge,d4 as H,n as xe,eF as Bt}from"./vendor-other-CSX7WseZ.js";import{_ as _e}from"./Load3D.vue_vue_type_script_setup_true_lang-BtNou66j.js";import{g as ue,s as tt}from"./audioUtils-DlA-QHPJ.js";import{u as Q}from"./audioService-Bh6LQBV8.js";import"./vendor-primevue-B6rcS73U.js";import"./vendor-vue-CXt3ZZQ3.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-BKWXAgVe.js";import"./vendor-tiptap-BkFTmTb3.js";class M extends Xe{static{u(this,"ClipspaceDialog")}static items=[];static instance=null;static registerButton(e,t,s){const n=b("button",{type:"button",textContent:e,contextPredicate:t,onclick:s});M.items.push(n)}static invalidatePreview(){if(T.clipspace&&T.clipspace.imgs&&T.clipspace.imgs.length>0){const e=document.getElementById("clipspace_preview");e&&(e.src=T.clipspace.imgs[T.clipspace.selectedIndex].src,e.style.maxHeight="100%",e.style.maxWidth="100%")}}static invalidate(){if(M.instance){const e=M.instance,t=b("div.comfy-modal-content",[e.createImgSettings(),...e.createButtons()]);e.element?(e.element.firstChild&&e.element.removeChild(e.element.firstChild),e.element.appendChild(t)):e.element=b("div.comfy-modal",{parent:document.body},[t]),e.element.children[0].children.length<=1&&e.element.children[0].appendChild(b("p",{},["Unable to find the features to edit content of a format stored in the current Clipspace."])),M.invalidatePreview()}}constructor(){super()}createButtons(){const e=[];for(let t in M.items){const s=M.items[t];(!s.contextPredicate||s.contextPredicate())&&e.push(M.items[t])}return e.push(b("button",{type:"button",textContent:"Close",onclick:u(()=>{this.close()},"onclick")})),e}createImgSettings(){if(T.clipspace?.imgs){const e=[],t=T.clipspace.imgs;for(let d=0;d<t.length;d++)e.push(b("option",{value:d},[`${d}`]));const s=b("select",{id:"clipspace_img_selector",onchange:u(d=>{d.target&&T.clipspace&&(T.clipspace.selectedIndex=d.target.selectedIndex,M.invalidatePreview())},"onchange")},e),n=b("tr",{},[b("td",{},[b("font",{color:"white"},["Select Image"])]),b("td",{},[s])]),i=b("select",{id:"clipspace_img_paste_mode",onchange:u(d=>{d.target&&T.clipspace&&(T.clipspace.img_paste_mode=d.target.value)},"onchange")},[b("option",{value:"selected"},"selected"),b("option",{value:"all"},"all")]);i.value=T.clipspace.img_paste_mode;const r=b("tr",{},[b("td",{},[b("font",{color:"white"},["Paste Mode"])]),b("td",{},[i])]),a=b("td",{align:"center",width:"100px",height:"100px",colSpan:"2"},[b("img",{id:"clipspace_preview",ondragstart:u(()=>!1,"ondragstart")},[])]),l=b("tr",{},[a]);return b("table",{},[n,r,l])}else return[]}createImgPreview(){return T.clipspace?.imgs?b("img",{id:"clipspace_preview",ondragstart:u(()=>!1,"ondragstart")}):[]}show(){M.invalidate(),this.element.style.display="block"}}p.registerExtension({name:"Comfy.Clipspace",init(o){o.openClipspace=function(){M.instance||(M.instance=new M,T.clipspace_invalidate_handler=M.invalidate),T.clipspace?M.instance.show():o.ui.dialog.show("Clipspace is Empty!")}}});window.comfyAPI=window.comfyAPI||{};window.comfyAPI.clipspace=window.comfyAPI.clipspace||{};window.comfyAPI.clipspace.ClipspaceDialog=M;const Vt={name:"Comfy.ContextMenuFilter",init(){const o=C.ContextMenu;C.ContextMenu=function(e,t){const s=new o(e,t);if(t?.className==="dark"&&e?.length>4){const n=document.createElement("input");n.classList.add("comfy-context-menu-filter"),n.placeholder="Filter list",s.root.prepend(n);const i=Array.from(s.root.querySelectorAll(".litemenu-entry"));let r=[...i],a=r.length;requestAnimationFrame(()=>{const d=R.active_canvas.current_node?.widgets?.filter(h=>lt(h)&&h.options.values?.length===e.length).find(h=>h.options.values?.every((m,y)=>m===e[y]))?.value;let c=d?e.findIndex(h=>h===d):0;c<0&&(c=0);let f=r[c];v();function v(){f?.style.setProperty("background-color",""),f?.style.setProperty("color",""),f=r[c],f?.style.setProperty("background-color","#ccc","important"),f?.style.setProperty("color","#000","important")}u(v,"updateSelected");const g=u(()=>{if(s.root.getBoundingClientRect().top<0){const m=1-s.root.getBoundingClientRect().height/s.root.clientHeight,y=s.root.clientHeight*m/2;s.root.style.top=-y+"px"}},"positionList");n.addEventListener("keydown",h=>{switch(h.key){case"ArrowUp":h.preventDefault(),c===0?c=a-1:c--,v();break;case"ArrowRight":h.preventDefault(),c=a-1,v();break;case"ArrowDown":h.preventDefault(),c===a-1?c=0:c++,v();break;case"ArrowLeft":h.preventDefault(),c=0,v();break;case"Enter":f?.click();break;case"Escape":s.close();break}}),n.addEventListener("input",()=>{const h=n.value.toLocaleLowerCase();if(r=i.filter(m=>{const y=!h||m.textContent?.toLocaleLowerCase().includes(h);return m.style.display=y?"block":"none",y}),c=0,r.includes(f)&&(c=r.findIndex(m=>m===f)),a=r.length,v(),t.event){let m=t.event.clientY-10;const y=document.body.getBoundingClientRect(),w=s.root.getBoundingClientRect();y.height&&m>y.height-w.height-10&&(m=Math.max(0,y.height-w.height-10)),s.root.style.top=m+"px",g()}}),requestAnimationFrame(()=>{n.focus(),g()})})}return s},C.ContextMenu.prototype=o.prototype}};p.registerExtension(Vt);function $t(o=[]){if(!this.outputs[0].links?.length||!this.graph)return;const e=[...this.outputs[0].links.map(s=>this.graph.links[s]),...o];let t=this.widgets?.[0].value;for(const s of e){const n=this.graph?.getNodeById(s.target_id),i=n?.inputs[s.target_slot];if(!i){console.warn("Unable to resolve node or input for link",s);continue}const r=i.widget?.name;if(!r){console.warn("Invalid widget or widget name",i.widget);continue}const a=n.widgets?.find(l=>l.name===r);if(!a){console.warn(`Unable to find widget "${r}" on node [${n.id}]`);continue}a.value=t,a.callback?.(a.value,p.canvas,n,p.canvas.graph_mouse,{})}}u($t,"applyToGraph");function zt(){this.applyToGraph=J(this.applyToGraph,$t);const o=this.widgets[0],e=Ut([]);o.options.values=e;const t=u(()=>{e.splice(0,e.length,...this.widgets.filter(n=>n.name.startsWith("option")&&n.value).map(n=>`${n.value}`)),!p.configuringGraph&&(e.includes(`${o.value}`)||(o.value=e[0]??"",o.callback?.(o.value)))},"updateCombo");o.callback=J(o.callback,()=>this.applyToGraph());function s(n){if(!n.widgets)return;const i=n.widgets.length-1;n.addWidget("string",`option${i}`,"",()=>{});const r=n.widgets.at(-1);if(!r)return;let a="";Object.defineProperty(r,"value",{get(){return a},set(l){if(a=l,t(),!n.widgets)return;const d=n.widgets.at(-1);if(d===this){l&&s(n);return}l||n.widgets.at(-2)!==this||d?.value||(n.widgets.pop(),n.computeSize(n.size),this.callback(l))}})}u(s,"addOption"),s(this)}u(zt,"onNodeCreated");p.registerExtension({name:"Comfy.CustomCombo",beforeRegisterNodeDef(o,e){e?.name==="CustomCombo"&&(o.prototype.onNodeCreated=J(o.prototype.onNodeCreated,zt))}});ee().registerExtension({name:"Comfy.DynamicPrompts",nodeCreated(o){if(o.widgets){const e=o.widgets.filter(t=>t.dynamicPrompts);for(const t of e)t.serializeValue=(s,n)=>{if(typeof t.value!="string")return t.value;const i=dt(t.value);return s?.widgets_values&&(s.widgets_values[n]=i),i}}}});p.registerExtension({name:"Comfy.EditAttention",init(){const o=p.ui.settings.addSetting({id:"Comfy.EditAttention.Delta",category:["Comfy","EditTokenWeight","Delta"],name:"Ctrl+up/down precision",type:"slider",attrs:{min:.01,max:.5,step:.01},defaultValue:.05});function e(i,r){const a=parseFloat(i);if(isNaN(a))return i;const l=a+r;return String(Number(l.toFixed(10)))}u(e,"incrementWeight");function t(i,r){let a=r,l=r,d=0,c=0;for(;a>=0&&(a--,!(i[a]==="("&&d===c));)i[a]==="("&&d++,i[a]===")"&&c++;if(a<0)return null;for(d=0,c=0;l<i.length&&!(i[l]===")"&&d===c);)i[l]==="("&&d++,i[l]===")"&&c++,l++;return l===i.length?null:{start:a+1,end:l}}u(t,"findNearestEnclosure");function s(i){const r=/^\((.*)\)$/,a=i.match(r),l=/:([+-]?(\d*\.)?\d+([eE][+-]?\d+)?)/,d=i.match(l);return a&&!d?`(${a[1]}:1.0)`:i}u(s,"addWeightToParentheses");function n(i){const r=i.composedPath()[0],a=parseFloat(o.value);if(r.tagName!=="TEXTAREA"||!(i.key==="ArrowUp"||i.key==="ArrowDown")||!i.ctrlKey&&!i.metaKey)return;i.preventDefault();let l=r.selectionStart,d=r.selectionEnd,c=r.value.substring(l,d);if(!c){const g=t(r.value,l);if(g)l=g.start,d=g.end,c=r.value.substring(l,d);else{const h=" .,\\/!?%^*;:{}=-_`~()\r\n ";for(;!h.includes(r.value[l-1])&&l>0;)l--;for(;!h.includes(r.value[d])&&d<r.value.length;)d++;if(c=r.value.substring(l,d),!c)return}}c[c.length-1]===" "&&(c=c.substring(0,c.length-1),d-=1),r.value[l-1]==="("&&r.value[d]===")"&&(l-=1,d+=1,c=r.value.substring(l,d)),(c[0]!=="("||c[c.length-1]!==")")&&(c=`(${c})`),c=s(c);const f=i.key==="ArrowUp"?a:-a,v=c.replace(/\((.*):([+-]?\d+(?:\.\d+)?)\)/,(g,h,m)=>(m=e(m,f),m==1?h:`(${h}:${m})`));r.setSelectionRange(l,d),document.execCommand("insertText",!1,v),r.setSelectionRange(l,l+v.length)}u(n,"editAttention"),window.addEventListener("keydown",n)}});const jt={validationPathSuffix:"/20250115/cpython-3.10.16+20250115-aarch64-apple-darwin-debug-full.tar.zst.sha256"},me=u(async o=>ct(o)&&await Je().NetWork.canAccessUrl(o),"checkMirrorReachable");(async()=>{if(!ut())return;const o=Je(),e=await o.getElectronVersion(),t=pt(),s=S(),{staticUrls:n,buildDocsUrl:i}=gt(),r=u((a,l)=>{l!==void 0&&a!==l&&o.restartApp("Restart ComfyUI to apply changes.",1500)},"onChangeRestartApp");p.registerExtension({name:"Comfy.ElectronAdapter",settings:[{id:"Comfy-Desktop.AutoUpdate",category:["Comfy-Desktop","General","AutoUpdate"],name:"Automatically check for updates",type:"boolean",defaultValue:!0,onChange:r},{id:"Comfy-Desktop.SendStatistics",category:["Comfy-Desktop","General","Send Statistics"],name:"Send anonymous usage metrics",type:"boolean",defaultValue:!0,onChange:r},{id:"Comfy-Desktop.WindowStyle",category:["Comfy-Desktop","General","Window Style"],name:"Window Style",tooltip:"Custom: Replace the system title bar with ComfyUI's Top menu",type:"combo",experimental:!0,defaultValue:"default",options:["default","custom"],onChange:u((a,l)=>{l&&o.Config.setWindowStyle(a)},"onChange")},{id:"Comfy-Desktop.UV.PythonInstallMirror",name:"Python Install Mirror",tooltip:"Managed Python installations are downloaded from the Astral python-build-standalone project. This variable can be set to a mirror URL to use a different source for Python installations. The provided URL will replace https://github.com/astral-sh/python-build-standalone/releases/download in, e.g., https://github.com/astral-sh/python-build-standalone/releases/download/20240713/cpython-3.12.4%2B20240713-aarch64-apple-darwin-install_only.tar.gz. Distributions can be read from a local directory by using the file:// URL scheme.",type:"url",defaultValue:"",attrs:{validateUrlFn(a){return me(a+jt.validationPathSuffix)}}},{id:"Comfy-Desktop.UV.PypiInstallMirror",name:"Pypi Install Mirror",tooltip:"Default pip install mirror",type:"url",defaultValue:"",attrs:{validateUrlFn:me}},{id:"Comfy-Desktop.UV.TorchInstallMirror",name:"Torch Install Mirror",tooltip:"Pip install mirror for pytorch",type:"url",defaultValue:"",attrs:{validateUrlFn:me}}],commands:[{id:"Comfy-Desktop.Folders.OpenLogsFolder",label:"Open Logs Folder",icon:"pi pi-folder-open",function(){o.openLogsFolder()}},{id:"Comfy-Desktop.Folders.OpenModelsFolder",label:"Open Models Folder",icon:"pi pi-folder-open",function(){o.openModelsFolder()}},{id:"Comfy-Desktop.Folders.OpenOutputsFolder",label:"Open Outputs Folder",icon:"pi pi-folder-open",function(){o.openOutputsFolder()}},{id:"Comfy-Desktop.Folders.OpenInputsFolder",label:"Open Inputs Folder",icon:"pi pi-folder-open",function(){o.openInputsFolder()}},{id:"Comfy-Desktop.Folders.OpenCustomNodesFolder",label:"Open Custom Nodes Folder",icon:"pi pi-folder-open",function(){o.openCustomNodesFolder()}},{id:"Comfy-Desktop.Folders.OpenModelConfig",label:"Open extra_model_paths.yaml",icon:"pi pi-file",function(){o.openModelConfig()}},{id:"Comfy-Desktop.OpenDevTools",label:"Open DevTools",icon:"pi pi-code",function(){o.openDevTools()}},{id:"Comfy-Desktop.OpenUserGuide",label:"Desktop User Guide",icon:"pi pi-book",function(){window.open(i("/installation/desktop",{includeLocale:!0,platform:!0}),"_blank")}},{id:"Comfy-Desktop.CheckForUpdates",label:"Check for Updates",icon:"pi pi-sync",async function(){try{const a=await o.checkForUpdates({disableUpdateReadyAction:!0});if(!a.isUpdateAvailable){s.add({severity:"info",summary:D("desktopUpdate.noUpdateFound"),life:5e3});return}if(await te().confirm({title:D("desktopUpdate.updateFoundTitle",{version:a.version}),message:D("desktopUpdate.updateAvailableMessage"),type:"default"}))try{o.restartAndInstall()}catch(d){Ge.error("Error installing update:",d),s.add({severity:"error",summary:D("g.error"),detail:D("desktopUpdate.errorInstallingUpdate"),life:1e4})}}catch(a){Ge.error("Error checking for updates:",a),s.add({severity:"error",summary:D("g.error"),detail:D("desktopUpdate.errorCheckingUpdate"),life:1e4})}}},{id:"Comfy-Desktop.Reinstall",label:"Reinstall",icon:"pi pi-refresh",async function(){await te().confirm({message:D("desktopMenu.confirmReinstall"),title:D("desktopMenu.reinstall"),type:"reinstall"})&&o.reinstall()}},{id:"Comfy-Desktop.Restart",label:"Restart",icon:"pi pi-refresh",function(){o.restartApp()}},{id:"Comfy-Desktop.Quit",label:"Quit",icon:"pi pi-sign-out",async function(){t.modifiedWorkflows.length>0&&!await te().confirm({message:D("desktopMenu.confirmQuit"),title:D("desktopMenu.quit"),type:"default"})||o.quit()}}],menuCommands:[{path:["Help"],commands:["Comfy-Desktop.OpenUserGuide"]},{path:["Help"],commands:["Comfy-Desktop.OpenDevTools"]},{path:["Help","Open Folder"],commands:["Comfy-Desktop.Folders.OpenLogsFolder","Comfy-Desktop.Folders.OpenModelsFolder","Comfy-Desktop.Folders.OpenOutputsFolder","Comfy-Desktop.Folders.OpenInputsFolder","Comfy-Desktop.Folders.OpenCustomNodesFolder","Comfy-Desktop.Folders.OpenModelConfig"]},{path:["Help"],commands:["Comfy-Desktop.CheckForUpdates","Comfy-Desktop.Reinstall"]}],keybindings:[{commandId:"Workspace.CloseWorkflow",combo:{key:"w",ctrl:!0}}],aboutPageBadges:[{label:"ComfyUI_desktop v"+e,url:n.githubElectron,icon:"pi pi-github"}]})})();class Ht extends ft{static{u(this,"ExecutableGroupNodeChildDTO")}groupNodeHandler;constructor(e,t,s,n,i){super(e,t,s,n),this.groupNodeHandler=i}resolveInput(e){if(this.id.split(":").length>2)throw new Error("Group nodes inside subgraphs are not supported. Please convert the group node to a subgraph instead.");const t=this.node.getInputNode(e);if(!t)return;const s=this.node.getInputLink(e);if(!s)throw new Error("Failed to get input link");const n=String(t.id);let i=this.nodesByExecutionId?.get(n);if(!i){const r=n.split(":").at(-1);r!==void 0&&(i=this.nodesByExecutionId?.get(r))}if(!i)throw new Error(`Failed to get input node ${n} for group node child ${this.id} with slot ${e}`);return{node:i,origin_id:n,origin_slot:s.origin_slot}}}const ye=Symbol();function ot(o,e){if(typeof o=="object"&&typeof e=="object")for(const t in e){const s=e[t];if(typeof s=="object"){let n=o[t];n||(n=o[t]={}),ot(n,e[t])}else o[t]=s}return o}u(ot,"merge");class nt extends ht{static{u(this,"ManageGroupDialog")}tabs;selectedNodeIndex;selectedTab="Inputs";selectedGroup;modifications={};nodeItems;app;groupNodeType;groupNodeDef;groupData;innerNodesList;widgetsPage;inputsPage;outputsPage;draggable;get selectedNodeInnerIndex(){return+this.nodeItems[this.selectedNodeIndex].dataset.nodeindex}constructor(e){super(),this.app=e,this.element=b("dialog.comfy-group-manage",{parent:document.body})}changeTab(e){this.tabs[this.selectedTab].tab.classList.remove("active"),this.tabs[this.selectedTab].page.classList.remove("active"),this.tabs[e].tab.classList.add("active"),this.tabs[e].page.classList.add("active"),this.selectedTab=e}changeNode(e,t){!t&&this.selectedNodeIndex===e||(this.selectedNodeIndex!=null&&this.nodeItems[this.selectedNodeIndex].classList.remove("selected"),this.nodeItems[e].classList.add("selected"),this.selectedNodeIndex=e,!this.buildInputsPage()&&this.selectedTab==="Inputs"&&this.changeTab("Widgets"),!this.buildWidgetsPage()&&this.selectedTab==="Widgets"&&this.changeTab("Outputs"),!this.buildOutputsPage()&&this.selectedTab==="Outputs"&&this.changeTab("Inputs"),this.changeTab(this.selectedTab))}getGroupData(){this.groupNodeType=C.registered_node_types[`${L}${P}`+this.selectedGroup],this.groupNodeDef=this.groupNodeType.nodeData,this.groupData=U.getGroupData(this.groupNodeType)}changeGroup(e,t=!0){this.selectedGroup=e,this.getGroupData();const s=this.groupData.nodeData.nodes;if(this.nodeItems=s.map((i,r)=>b("li.draggable-item",{dataset:{nodeindex:i.index+""},onclick:u(()=>{this.changeNode(r)},"onclick")},[b("span.drag-handle"),b("div",{textContent:i.title??i.type},i.title?b("span",{textContent:i.type}):[])])),this.innerNodesList.replaceChildren(...this.nodeItems),t)this.selectedNodeIndex=null,this.changeNode(0);else{let r=this.draggable.getAllItems().findIndex(a=>a.classList.contains("selected"));r===-1&&(r=this.selectedNodeIndex),this.changeNode(r,!0)}const n=[...s];this.draggable?.dispose(),this.draggable=new mt(this.innerNodesList,"li"),this.draggable.addEventListener("dragend",({detail:{oldPosition:i,newPosition:r}})=>{if(i!==r){n.splice(r,0,n.splice(i,1)[0]);for(let a=0;a<n.length;a++)this.storeModification({nodeIndex:n[a].index,section:ye,prop:"order",value:a})}})}storeModification(e){const{nodeIndex:t,section:s,prop:n,value:i}=e,r=this.modifications[this.selectedGroup]??={},a=r.nodes??={},l=a[t??this.selectedNodeInnerIndex]??={},d=l[s]??={};if(typeof i=="object"){const c=d[n]??={};Object.assign(c,i)}else d[n]=i}getEditElement(e,t,s,n,i,r=!0){s===n&&(s="");const a=this.modifications[this.selectedGroup]?.nodes?.[this.selectedNodeInnerIndex]?.[e]?.[t];return a&&(a.name!=null&&(s=a.name),a.visible!=null&&(i=a.visible)),b("div",[b("input",{value:s,placeholder:n,type:"text",onchange:u(l=>{this.storeModification({section:e,prop:t,value:{name:l.target.value}})},"onchange")}),b("label",{textContent:"Visible"},[b("input",{type:"checkbox",checked:i,disabled:!r,onchange:u(l=>{this.storeModification({section:e,prop:t,value:{visible:!!l.target.checked}})},"onchange")})])])}buildWidgetsPage(){const e=this.groupData.oldToNewWidgetMap[this.selectedNodeInnerIndex],t=Object.keys(e??{}),n=p.rootGraph.extra.groupNodes[this.selectedGroup].config?.[this.selectedNodeInnerIndex]?.input;return this.widgetsPage.replaceChildren(...t.map(i=>this.getEditElement("input",i,e[i],i,n?.[i]?.visible!==!1))),!!t.length}buildInputsPage(){const e=this.groupData.nodeInputs[this.selectedNodeInnerIndex],t=Object.keys(e??{}),n=p.rootGraph.extra.groupNodes[this.selectedGroup].config?.[this.selectedNodeInnerIndex]?.input;return this.inputsPage.replaceChildren(...t.map(i=>{let r=e[i];if(r)return this.getEditElement("input",i,r,i,n?.[i]?.visible!==!1)}).filter(Boolean)),!!t.length}buildOutputsPage(){const e=this.groupData.nodeData.nodes,t=this.groupData.getNodeDef(e[this.selectedNodeInnerIndex]),s=t?.output??[],n=this.groupData.oldToNewOutputMap[this.selectedNodeInnerIndex],r=p.rootGraph.extra.groupNodes[this.selectedGroup].config?.[this.selectedNodeInnerIndex]?.output,l=this.groupData.nodeData.nodes[this.selectedNodeInnerIndex].type!=="PrimitiveNode";return this.outputsPage.replaceChildren(...s.map((d,c)=>{const f=n?.[c],v=t.output_name?.[c]??d;let g=r?.[c]?.name;const h=r?.[c]?.visible||f!=null;return(!g||g===v)&&(g=""),this.getEditElement("output",c,g,v,h,l)}).filter(Boolean)),!!s.length}show(e){const t=Object.keys(p.rootGraph.extra?.groupNodes??{}).sort((i,r)=>i.localeCompare(r));this.innerNodesList=b("ul.comfy-group-manage-list-items"),this.widgetsPage=b("section.comfy-group-manage-node-page"),this.inputsPage=b("section.comfy-group-manage-node-page"),this.outputsPage=b("section.comfy-group-manage-node-page");const s=b("div",[this.widgetsPage,this.inputsPage,this.outputsPage]);this.tabs=[["Inputs",this.inputsPage],["Widgets",this.widgetsPage],["Outputs",this.outputsPage]].reduce((i,[r,a])=>(i[r]={tab:b("a",{onclick:u(()=>{this.changeTab(r)},"onclick"),textContent:r}),page:a},i),{});const n=b("div.comfy-group-manage-outer",[b("header",[b("h2","Group Nodes"),b("select",{onchange:u(i=>{this.changeGroup(i.target.value)},"onchange")},t.map(i=>b("option",{textContent:i,selected:`${L}${P}${i}`===e,value:i})))]),b("main",[b("section.comfy-group-manage-list",this.innerNodesList),b("section.comfy-group-manage-node",[b("header",Object.values(this.tabs).map(i=>i.tab)),s])]),b("footer",[b("button.comfy-btn",{onclick:u(()=>{if(p.rootGraph.nodes.find(r=>r.type===`${L}${P}`+this.selectedGroup)){S().addAlert("This group node is in use in the current workflow, please first remove these.");return}confirm(`Are you sure you want to remove the node: "${this.selectedGroup}"`)&&(delete p.rootGraph.extra.groupNodes[this.selectedGroup],C.unregisterNodeType(`${L}${P}`+this.selectedGroup)),this.show()},"onclick")},"Delete Group Node"),b("button.comfy-btn",{onclick:u(async()=>{let i,r=[];const a={};for(const l in this.modifications){const d=p.rootGraph.extra.groupNodes[l];let c=d.config??={},f=this.modifications[l]?.nodes;if(f){const g=Object.keys(f);if(f[g[0]][ye]){const h=[],m={},y={};for(const w of g){const N=f[w][ye].order;h[N]=d.nodes[+w],m[N]=f[w],h[N].index=N}for(const w of d.links)w[0]!=null&&(w[0]=d.nodes[w[0]].index),w[2]!=null&&(w[2]=d.nodes[w[2]].index);if(d.external)for(const w of d.external)w[0]=d.nodes[w[0]];for(const w of g)c[w]&&(y[d.nodes[w].index]=c[w]),delete c[w];d.nodes=h,f=m,d.config=c=y}ot(c,f)}a[l]=d,i||(i=p.rootGraph.nodes.reduce((g,h)=>(g[h.type]??=[],g[h.type].push(h),g),{}));const v=i[`${L}${P}`+l];v&&r.push(...v)}await Y.registerFromWorkflow(a,{});for(const l of r)l.recreate();this.modifications={},this.app.canvas.setDirty(!0,!0),this.changeGroup(this.selectedGroup,!1)},"onclick")},"Save"),b("button.comfy-btn",{onclick:u(()=>this.element.close(),"onclick")},"Close")])]);this.element.replaceChildren(n),this.changeGroup(e?t.find(i=>`${L}${P}${i}`===e)??t[0]:t[0]),this.element.showModal(),this.element.addEventListener("close",()=>{this.draggable?.dispose(),this.element.remove()})}}window.comfyAPI=window.comfyAPI||{};window.comfyAPI.groupNodeManage=window.comfyAPI.groupNodeManage||{};window.comfyAPI.groupNodeManage.ManageGroupDialog=nt;const qt=new Set(["default","forceInput","defaultInput","control_after_generate","multiline","tooltip","dynamicPrompts"]),We=u(o=>{const e=o.min??-1/0,t=o.max??1/0;return{min:e,max:t}},"getRange"),Yt=u((o,e)=>{const t=o[0],s=o[1]??{},n=e[1]??{},i=We(s),r=We(n);if(i.min>r.max||i.max<r.min)return null;const a=s.step??1,l=n.step??1,d={min:Math.max(i.min,r.min),max:Math.min(i.max,r.max),step:bt(a,l)};return Te([t,{...s,...d}],[t,{...n,...d}])},"mergeNumericInputSpec"),Xt=u((o,e)=>{const t=o[1]??{},s=e[1]??{},n=Pe(o),i=Pe(e),r=H.intersection(n,i);return r.length===0?null:Te(["COMBO",{...t,options:r}],["COMBO",{...s,options:r}])},"mergeComboInputSpec"),Te=u((o,e)=>{const t=be(o),s=o[1]??{},n=e[1]??{};return H.union(H.keys(s),H.keys(n)).filter(a=>!qt.has(a)).every(a=>{const l=s[a],d=n[a];return l===d||H.isNil(l)&&H.isNil(d)})?[t,{...s,...n}]:null},"mergeCommonInputSpec"),Jt=u((o,e)=>{const t=be(o),s=be(e);return t!==s?null:yt(o)||wt(o)?Yt(o,e):vt(o)?Xt(o,e):Te(o,e)},"mergeInputSpec"),Kt=u(o=>o.type==="PrimitiveNode","isPrimitiveNode"),we="Run widget replace on values";class Ne extends de{static{u(this,"PrimitiveNode")}controlValues;lastType;static category;constructor(e){super(e),this.addOutput("connect to widget input","*"),this.serialize_widgets=!0,this.isVirtualNode=!0,(!this.properties||!(we in this.properties))&&this.addProperty(we,!1,"boolean")}applyToGraph(e=[]){if(!this.outputs[0].links?.length||!this.graph)return;const t=[...this.outputs[0].links.map(n=>this.graph.links[n]),...e];let s=this.widgets?.[0].value;s&&this.properties[we]&&(s=Ke(this.graph,s));for(const n of t){const i=this.graph?.getNodeById(n.target_id),r=i?.inputs[n.target_slot];if(!r){console.warn("Unable to resolve node or input for link",n);continue}const a=r.widget?.name;if(!a){console.warn("Invalid widget or widget name",r.widget);continue}const l=i.widgets?.find(d=>d.name===a);if(!l){console.warn(`Unable to find widget "${a}" on node [${i.id}]`);continue}l.value=s,l.callback?.(l.value,p.canvas,i,p.canvas.graph_mouse,{})}}refreshComboInNode(){const e=this.widgets?.[0];e?.type==="combo"&&(e.options.values=this.outputs[0].widget[F]()[0],e.options.values.includes(e.value)||(e.value=e.options.values[0],e.callback(e.value)))}onAfterGraphConfigured(){if(this.outputs[0].links?.length&&!this.widgets?.length){if(this.#e(),this.widgets&&this.widgets_values)for(let e=0;e<this.widgets_values.length;e++){const t=this.widgets[e];t&&(t.value=this.widgets_values[e])}this.#t()}}onConnectionsChange(e,t,s){if(p.configuringGraph)return;const n=this.outputs[0].links;s?n?.length&&!this.widgets?.length&&this.#e():(this.#t(),n?.length||this.onLastDisconnect())}onConnectOutput(e,t,s,n,i){if(!s.widget&&!(s.type in $))return!1;if(this.outputs[e].links?.length){const r=this.#o(s);return r&&this.applyToGraph([{target_id:n.id,target_slot:i}]),r}return!0}#e(e){if(!this.outputs[0].links||!this.graph){this.onLastDisconnect();return}const t=this.outputs[0].links[0],s=this.graph.links[t];if(!s)return;const n=this.graph.getNodeById(s.target_id);if(!n||!n.inputs)return;const i=n.inputs[s.target_slot];if(!i)return;let r;if(i.widget)r=i.widget;else{if(!(i.type in $))return;r={name:i.name,[F]:()=>[i.type,{}]}}const a=r[F]?.();if(!a)return;const{type:l}=Zt(a);this.outputs[0].type=l,this.outputs[0].name=l,this.outputs[0].widget=r,this.#i(r[oe]??a,n,r.name,e)}#i(e,t,s,n){let i=e[0];i instanceof Array&&(i="COMBO");const[r,a]=this.size;let l;if(Nt(i)?l=($[i](this,"value",e,p)||{}).widget:l=this.addWidget(i,"value",null,()=>{},{}),t?.widgets&&l){const c=t.widgets.find(f=>f.name===s);c&&(l.value=c.value)}if(!e?.[1]?.control_after_generate&&(l.type==="number"||l.type==="combo")){let c=this.widgets_values?.[1];c||(c="fixed"),It(this,l,c,void 0,e),this.widgets?.[1]&&(l.linkedWidgets=[this.widgets[1]]);let f=this.widgets_values?.[2];f&&this.widgets&&this.widgets.length===3&&(this.widgets[2].value=f)}const d=this.controlValues;if(this.widgets&&this.lastType===this.widgets[0]?.type&&d?.length===this.widgets.length-1)for(let c=0;c<d.length;c++)this.widgets[c+1].value=d[c];if(l.callback=J(l.callback,()=>{this.applyToGraph()}),this.setSize([Math.max(this.size[0],r),Math.max(this.size[1],a)]),!n){const c=this.computeSize();this.size[0]<c[0]&&(this.size[0]=c[0]),this.size[1]<c[1]&&(this.size[1]=c[1]),requestAnimationFrame(()=>{this.onResize?.(this.size)})}}recreateWidget(){const e=this.widgets?.map(t=>t.value);if(this.#n(),this.#e(!0),e?.length&&this.widgets)for(let t=0;t<this.widgets.length;t++)this.widgets[t].value=e[t];return this.widgets?.[0]}#t(){const e=this.outputs[0],t=e.links??[],s=!!e.widget?.[oe];if(s&&delete e.widget?.[oe],t?.length<2&&s){t.length&&this.recreateWidget();return}const n=e.widget?.[F]?.();if(!(!n||!(n[0]==="INT"||n[0]==="FLOAT")||!this.graph))for(const r of t){const a=this.graph.links[r];if(!a)continue;const l=this.graph.getNodeById(a.target_id);if(!l)continue;const d=l.inputs[a.target_slot];this.#o(d,s)}}#o(e,t){const s=this.outputs?.[0],n=e.widget?.[F]?.();return n?!!ae.call(this,s,n,t,this.recreateWidget):!1}#n(){if(this.widgets){for(const e of this.widgets)e.onRemove&&e.onRemove();this.controlValues=[],this.lastType=this.widgets[0]?.type;for(let e=1;e<this.widgets.length;e++)this.controlValues.push(this.widgets[e].value);setTimeout(()=>{delete this.lastType,delete this.controlValues},15),this.widgets.length=0}}onLastDisconnect(){this.outputs[0].type="*",this.outputs[0].name="connect to widget input",delete this.outputs[0].widget,this.#n()}}function Se(o){return o.widget?.[oe]??o.widget?.[F]?.()??["*",{}]}u(Se,"getWidgetConfig");function Re(o){const{nodeData:e}=this.constructor;return e?.input?.required?.[o]??e?.input?.optional?.[o]}u(Re,"getConfig");function Qt(o,e){return console.warn("Please remove call to convertToInput. Widget to socket conversion is no longer necessary, as they co-exist now."),o.inputs.find(t=>t.widget?.name===e.name)}u(Qt,"convertToInput");function Zt(o){let e=o[0];return e instanceof Array&&(e="COMBO"),{type:e}}u(Zt,"getWidgetType");function Ie(o,e){if(!o.widget||(e?o.widget[F]=()=>e:delete o.widget,!(o instanceof Ct)))return;const t=o.node.graph;if(!t)return;const s=t.links[o.link??-1];if(!s)return;const n=t.getNodeById(s.origin_id);!n||!Kt(n)||(e?n.recreateWidget():p.configuringGraph||(n.disconnectOutput(0),n.onLastDisconnect()))}u(Ie,"setWidgetConfig");function ae(o,e,t,s,n){n||(n=Se(o));const i=Jt(n,e);if(i||t){i&&(o.widget[oe]=i);const r=s?.call(this);if(r){const a=r.options.min,l=r.options.max;a!=null&&r.value<a&&(r.value=a),l!=null&&r.value>l&&(r.value=l),r.callback(r.value)}}return{customConfig:i?.[1]??{}}}u(ae,"mergeIfValid");p.registerExtension({name:"Comfy.WidgetInputs",async beforeRegisterNodeDef(o,e,t){o.prototype.convertWidgetToInput=function(){return console.warn("Please remove call to convertWidgetToInput. Widget to socket conversion is no longer necessary, as they co-exist now."),!1},o.prototype.onGraphConfigured=J(o.prototype.onGraphConfigured,function(){if(this.inputs){this.widgets??=[];for(const n of this.inputs)if(n.widget){const i=n.widget.name;n.widget[F]||(n.widget[F]=()=>Re.call(this,i)),this.widgets?.find(a=>a.name===i)||this.removeInput(this.inputs.findIndex(a=>a===n))}}}),o.prototype.onConfigure=J(o.prototype.onConfigure,function(){if(!t.configuringGraph&&this.inputs){for(const n of this.inputs)if(n.widget&&!n.widget[F]){const i=n.widget.name;n.widget[F]=()=>Re.call(this,i)}}});const s=o.prototype.onInputDblClick;o.prototype.onInputDblClick=function(...[n,...i]){const r=s?.apply(this,[n,...i]),a=this.inputs[n];if(!a.widget&&!(a.type in $)&&!(a.widget?.[F]?.()?.[0]instanceof Array))return r;const l=C.createNode("PrimitiveNode"),d=t.canvas.graph;if(!l||!d)return r;d?.add(l);const c=[this.pos[0]-l.size[0]-30,this.pos[1]];for(;d.getNodeOnPos(c[0],c[1],d.nodes);)c[1]+=C.NODE_TITLE_HEIGHT;return l.pos=c,l.connect(0,this,n),l.title=a.name,r}},registerCustomNodes(){C.registerNodeType("PrimitiveNode",Object.assign(Ne,{title:"Primitive"})),Ne.category="utils"}});window.comfyAPI=window.comfyAPI||{};window.comfyAPI.widgetInputs=window.comfyAPI.widgetInputs||{};window.comfyAPI.widgetInputs.PrimitiveNode=Ne;window.comfyAPI.widgetInputs.getWidgetConfig=Se;window.comfyAPI.widgetInputs.convertToInput=Qt;window.comfyAPI.widgetInputs.setWidgetConfig=Ie;window.comfyAPI.widgetInputs.mergeIfValid=ae;const q={InUse:{Free:0,Registered:1,InWorkflow:2},isInUseGroupNode(o){const e=`${L}${P}${o}`;return p.rootGraph.extra?.groupNodes?.[o]?p.rootGraph.nodes.find(t=>t.type===e)?q.InUse.InWorkflow:q.InUse.Registered:q.InUse.Free},storeGroupNode(o,e){let t=p.rootGraph.extra;t||(p.rootGraph.extra=t={});let s=t.groupNodes;s||(t.groupNodes=s={}),s[o]=e}};class Fe{static{u(this,"GroupNodeBuilder")}nodes;nodeData;constructor(e){this.nodes=e}async build(){const e=await this.getName();if(e)return this.sortNodes(),this.nodeData=this.getNodeData(),q.storeGroupNode(e,this.nodeData),{name:e,nodeData:this.nodeData}}async getName(){const e=await te().prompt({title:D("groupNode.create"),message:D("groupNode.enterName"),defaultValue:""});if(!e)return;switch(q.isInUseGroupNode(e)){case q.InUse.InWorkflow:S().addAlert("An in use group node with this name already exists embedded in this workflow, please remove any instances or use a new name.");return;case q.InUse.Registered:if(!confirm("A group node with this name already exists embedded in this workflow, are you sure you want to overwrite it?"))return;break}return e}sortNodes(){const e=p.rootGraph.computeExecutionOrder(!1);this.nodes=this.nodes.map(t=>({index:e.indexOf(t),node:t})).sort((t,s)=>t.index-s.index||t.node.id-s.node.id).map(({node:t})=>t)}getNodeData(){const e=u(s=>{for(const n of s.links){const r=p.rootGraph.getNodeById(n[4]).outputs[n[1]].type;n.push(r)}},"storeLinkTypes"),t=u(s=>{s.external=[];for(let n=0;n<this.nodes.length;n++){const i=this.nodes[n];if(i.outputs?.length)for(let r=0;r<i.outputs.length;r++){let a=!1;const l=i.outputs[r];let d=l.type;if(l.links?.length){for(const c of l.links){const f=p.rootGraph.links[c];if(f&&(d==="*"&&(d=f.type),!p.canvas.selected_nodes[f.target_id])){a=!0;break}}a&&s.external.push([n,r,d])}}}},"storeExternalLinks");{const s=_t(this.nodes,p.canvas?.graph),n=JSON.parse(s);return e(n),t(n),n}}}class Y{static{u(this,"GroupNodeConfig")}name;nodeData;inputCount;oldToNewOutputMap;newToOldOutputMap;oldToNewInputMap;oldToNewWidgetMap;newToOldWidgetMap;primitiveDefs;widgetToPrimitive;primitiveToWidget;nodeInputs;outputVisibility;nodeDef;inputs;linksFrom;linksTo;externalFrom;constructor(e,t){this.name=e,this.nodeData=t,this.getLinks(),this.inputCount=0,this.oldToNewOutputMap={},this.newToOldOutputMap={},this.oldToNewInputMap={},this.oldToNewWidgetMap={},this.newToOldWidgetMap={},this.primitiveDefs={},this.widgetToPrimitive={},this.primitiveToWidget={},this.nodeInputs={},this.outputVisibility=[]}async registerType(e=L){this.nodeDef={output:[],output_name:[],output_is_list:[],output_is_hidden:[],name:e+P+this.name,display_name:this.name,category:"group nodes"+(P+e),input:{required:{}},description:`Group node combining ${this.nodeData.nodes.map(n=>n.type).join(", ")}`,python_module:"custom_nodes."+this.name,[W]:this},this.inputs=[];const t={},s={};for(let n=0;n<this.nodeData.nodes.length;n++){const i=this.nodeData.nodes[n];i.index=n,this.processNode(i,t,s)}for(const n of this.#e)n();this.#e=null,await p.registerNodeDef(`${L}${P}`+this.name,this.nodeDef),Dt().addNodeDef(this.nodeDef)}getLinks(){this.linksFrom={},this.linksTo={},this.externalFrom={};for(const e of this.nodeData.links){const[t,s,n,i]=e;t!=null&&(this.linksFrom[t]||(this.linksFrom[t]={}),this.linksFrom[t][s]||(this.linksFrom[t][s]=[]),this.linksFrom[t][s].push(e),this.linksTo[n]||(this.linksTo[n]={}),this.linksTo[n][i]=e)}if(this.nodeData.external)for(const e of this.nodeData.external)this.externalFrom[e[0]]?this.externalFrom[e[0]][e[1]]=e[2]:this.externalFrom[e[0]]={[e[1]]:e[2]}}processNode(e,t,s){const n=this.getNodeDef(e);if(!n)return;const i={...n.input?.required,...n.input?.optional};this.inputs.push(this.processNodeInputs(e,t,i)),n.output?.length&&this.processNodeOutputs(e,s,n)}getNodeDef(e){const t=ne[e.type];if(t)return t;const s=this.linksFrom[e.index];if(e.type==="PrimitiveNode"){if(!s)return;let n=s[0][0][5];if(n==="COMBO"){const r=e.outputs[0].widget.name,a=this.nodeData.nodes[s[0][0][2]].type,l=ne[a];n=(l.input.required[r]??l.input.optional[r])[0]}return this.primitiveDefs[e.index]={input:{required:{value:[n,{}]}},output:[n],output_name:[],output_is_list:[]}}else if(e.type==="Reroute"){const n=this.linksTo[e.index];if(n&&s&&!this.externalFrom[e.index]?.[0])return null;let i={},r="*";if(s)for(const[,,a,l]of s[0]){const d=this.nodeData.nodes[a],c=d.inputs[l];if(r==="*"&&(r=c.type),c.widget){const f=ne[d.type],v=f.input.required[c.widget.name]??f.input.optional[c.widget.name],g=[v[0],i];i=ae({widget:g},v,!1,null,g)?.customConfig??i}}else if(n){const[a,l]=n[0];r=this.nodeData.nodes[a].outputs[l].type}else{for(const a of this.nodeData.links)if(a[2]===e.index){r=a[5];break}if(r==="*"){const a=this.externalFrom[e.index]?.[0];a&&(r=a)}}return i.forceInput=!0,{input:{required:{[r]:[r,i]}},output:[r],output_name:[],output_is_list:[]}}console.warn("Skipping virtual node "+e.type+" when building group node "+this.name)}getInputConfig(e,t,s,n,i){const r=this.nodeData.config?.[e.index]?.input?.[t];let a=r?.name??e.inputs?.find(c=>c.name===t)?.label??t,l=a,d="";return(e.type==="PrimitiveNode"&&e.title||a in s)&&(d=`${e.title??e.type} `,l=a=`${d}${t}`,a in s&&(a=`${d}${s[a]} ${t}`)),s[l]=(s[l]??1)+1,(t==="seed"||t==="noise_seed")&&(i||(i={}),i.control_after_generate=`${d}control_after_generate`),n[0]==="IMAGEUPLOAD"&&(i||(i={}),i.widget=this.oldToNewWidgetMap[e.index]?.[n[1]?.widget??"image"]??"image"),i&&(n=[n[0],{...n[1],...i}]),{name:a,config:n,customConfig:r}}processWidgetInputs(e,t,s,n){const i=[],r=new Map,a=this.oldToNewWidgetMap[t.index]={};for(const l of s)if(xt().inputIsWidget(e[l])){const d=t.inputs?.findIndex(c=>c.name===l&&c.widget?.name===l);if(d>-1)r.set(d,l),a[l]=null;else{const{name:c,config:f}=this.getInputConfig(t,l,n,e[l]);this.nodeDef.input.required[c]=f,a[l]=c,this.newToOldWidgetMap[c]={node:t,inputName:l}}}else i.push(l);return{converted:r,slots:i}}checkPrimitiveConnection(e,t,s){if(this.nodeData.nodes[e[0]].type==="PrimitiveNode"){const[i,r,a,l]=e,d=this.primitiveDefs[i],c=s[t],f=d.input.required.value,g=ae({widget:f},c,!1,null,f);f[1]=g?.customConfig??s[t][1]?{...s[t][1]}:{};let h=this.oldToNewWidgetMap[i].value;h=h.substr(0,h.length-6),f[1].control_after_generate=!0,f[1].control_prefix=h;let m=this.widgetToPrimitive[a];m||(m=this.widgetToPrimitive[a]={}),m[t]&&m[t].push(i),m[t]=i;let y=this.primitiveToWidget[i];y||(y=this.primitiveToWidget[i]=[]),y.push({nodeId:a,inputName:t})}}processInputSlots(e,t,s,n,i,r){this.nodeInputs[t.index]={};for(let a=0;a<s.length;a++){const l=s[a];if(n[a]){this.checkPrimitiveConnection(n[a],l,e);continue}const{name:d,config:c,customConfig:f}=this.getInputConfig(t,l,r,e[l]);this.nodeInputs[t.index][l]=d,f?.visible!==!1&&(this.nodeDef.input.required[d]=c,i[a]=this.inputCount++)}}processConvertedWidgets(e,t,s,n,i,r,a){const l=[...n.keys()].sort().map(d=>n.get(d));for(let d=0;d<l.length;d++){const c=l[d];if(i[s.length+d]){this.checkPrimitiveConnection(i[s.length+d],c,e);continue}const{name:f,config:v}=this.getInputConfig(t,c,a,e[c],{defaultInput:!0});this.nodeDef.input.required[f]=v,this.newToOldWidgetMap[f]={node:t,inputName:c},this.oldToNewWidgetMap[t.index]||(this.oldToNewWidgetMap[t.index]={}),this.oldToNewWidgetMap[t.index][c]=f,r[s.length+d]=this.inputCount++}}#e=[];processNodeInputs(e,t,s){const n=[],i=Object.keys(s);if(!i.length)return;const{converted:r,slots:a}=this.processWidgetInputs(s,e,i,t),l=this.linksTo[e.index]??{},d=this.oldToNewInputMap[e.index]={};return this.processInputSlots(s,e,a,l,d,t),this.#e.push(()=>this.processConvertedWidgets(s,e,a,r,l,d,t)),n}processNodeOutputs(e,t,s){const n=this.oldToNewOutputMap[e.index]={};for(let i=0;i<s.output.length;i++){const a=this.linksFrom[e.index]?.[i]&&!this.externalFrom[e.index]?.[i],l=this.nodeData.config?.[e.index]?.output?.[i],d=l?.visible??!a;if(this.outputVisibility.push(d),!d)continue;n[i]=this.nodeDef.output.length,this.newToOldOutputMap[this.nodeDef.output.length]={node:e,slot:i},this.nodeDef.output.push(s.output[i]),this.nodeDef.output_is_list.push(s.output_is_list[i]);let c=l?.name;if(!c){c=s.output_name?.[i]??s.output[i];const v=e.outputs.find(g=>g.name===c);v?.label&&(c=v.label)}let f=c;if(f in t){const v=`${e.title??e.type} `;f=`${v}${c}`,f in t&&(f=`${v}${e.index} ${c}`)}t[f]=1,this.nodeDef.output_name.push(f)}}static async registerFromWorkflow(e,t){for(const s in e){const n=e[s];let i=!1;for(const a of n.nodes)a.type in C.registered_node_types||(t.push({type:a.type,hint:` (In group node '${L}${P}${s}')`}),t.push({type:`${L}${P}`+s,action:{text:"Remove from workflow",callback:u(l=>{delete e[s],l.target.textContent="Removed",l.target.style.pointerEvents="none",l.target.style.opacity=.7},"callback")}}),i=!0);if(i)continue;await new Y(s,n).registerType()}}}class U{static{u(this,"GroupNodeHandler")}node;groupData;innerNodes;constructor(e){this.node=e,this.groupData=e.constructor?.nodeData?.[W],this.node.setInnerNodes=g=>{this.innerNodes=g;for(let h=0;h<this.innerNodes.length;h++){const m=this.innerNodes[h];m.graph??=this.node.graph;for(const y of m.widgets??[])y.type==="converted-widget"&&(y.serializeValue=y.origSerializeValue);m.index=h,m.getInputNode=y=>{const w=this.groupData.oldToNewInputMap[m.index]?.[y];if(w!=null)return this.node.getInputNode(w);const N=this.groupData.linksTo[m.index]?.[y];if(!N)return null;const I=g[N[0]];return I.type==="PrimitiveNode"?null:I},m.getInputLink=y=>{const w=this.groupData.oldToNewInputMap[m.index]?.[y];if(w!=null){const I=this.node.inputs[w].link;let k=p.rootGraph.links[I];return k={...k,target_id:m.id,target_slot:+y},k}let N=this.groupData.linksTo[m.index]?.[y];return N?(N={origin_id:g[N[0]].id,origin_slot:N[1],target_id:m.id,target_slot:+y},N):null}}},this.node.updateLink=g=>{g={...g};const h=this.groupData.newToOldOutputMap[g.origin_slot];let m=this.innerNodes[h.node.index],y;for(;m?.type==="Reroute";)y=m.getInputLink(0),m=m.getInputNode(0);return m?y&&U.isGroupNode(m)?m.updateLink(y):(g.origin_id=m.id,g.origin_slot=y?.origin_slot??h.slot,g):null},this.node.getInnerNodes=(g,h=[],m=[],y=new Set)=>{if(y.has(this.node))throw new Error("RecursionError: while flattening subgraph");y.add(this.node),this.innerNodes||this.node.setInnerNodes(this.groupData.nodeData.nodes.map((I,k)=>{const x=C.createNode(I.type);return x.configure(I),x.id=`${this.node.id}:${k}`,x.graph=this.node.graph,x})),this.updateInnerWidgets();const w=[...h,this.node.id],N=this.node.graph?.getNodeById(h.at(-1))??void 0;for(const I of this.innerNodes){I.graph??=this.node.graph;const k=String(I.id);I.id=k.split(":").at(-1);const x=new Ht(I,w,g,N);I.id=k,x.groupNodeHandler=this,m.push(x)}return m},this.node.recreate=async()=>{const g=this.node.id,h=this.node.size,m=this.node.convertToNodes(),y=C.createNode(this.node.type);y.id=g,y.setInnerNodes(m),y[W].populateWidgets(),p.rootGraph.add(y),y.setSize([Math.max(y.size[0],h[0]),Math.max(y.size[1],h[1])]);const N=new Fe(m).getNodeData();return y[W].groupData.nodeData.links=N.links,y[W].replaceNodes(m),y},this.node.convertToNodes=()=>{const g=u(()=>{const y={...this.groupData.nodeData};y.nodes=[...y.nodes];const w=this.node.getInnerNodes();let N=[];for(let A=0;A<y.nodes.length;A++){let X=w?.[A]?.id;X==null||isNaN(X)?X=void 0:N.push(X),y.nodes[A]={...y.nodes[A],id:X}}Qe(JSON.stringify(y),p.canvas);const[I,k]=this.node.pos;let x,_;const O=N.length?N:Object.keys(p.canvas.selected_nodes),j=[];for(let A=0;A<O.length;A++){const X=O[A],z=p.rootGraph.getNodeById(X),Ee=w[A];if(j.push(z),(_==null||z.pos[0]<_)&&(_=z.pos[0]),(x==null||z.pos[1]<x)&&(x=z.pos[1]),!z.widgets)continue;const ge=this.groupData.oldToNewWidgetMap[Ee.index];if(ge){const rt=Object.keys(ge);for(const Oe of rt){const Ae=ge[Oe];if(!Ae)continue;const fe=this.node.widgets.findIndex(B=>B.name===Ae);if(fe!==-1)if(Ee.type==="PrimitiveNode")for(let B=0;B<z.widgets.length;B++)z.widgets[B].value=this.node.widgets[fe+B].value;else{const B=this.node.widgets[fe],he=z.widgets.find(K=>K.name===Oe);if(!he)continue;he.value=B.value;for(let K=0;K<B.linkedWidgets?.length;K++)he.linkedWidgets[K].value=B.linkedWidgets[K].value}}}}for(const A of j)A.pos[0]-=_-I,A.pos[1]-=x-k;return{newNodes:j,selectedIds:O}},"addInnerNodes"),h=u(y=>{for(const w in this.groupData.oldToNewInputMap){const N=y[w],I=p.rootGraph.getNodeById(N),k=this.groupData.oldToNewInputMap[w];for(const x in k){const _=k[x];if(_==null)continue;const O=e.inputs[_];if(O.link==null)continue;const j=p.rootGraph.links[O.link];if(!j)continue;p.rootGraph.getNodeById(j.origin_id).connect(j.origin_slot,I,+x)}}},"reconnectInputs"),m=u(y=>{for(let w=0;w<e.outputs?.length;w++){const N=e.outputs[w];if(!N.links)continue;const I=[...N.links];for(const k of I){const x=this.groupData.newToOldOutputMap[w],_=p.rootGraph.links[k],O=p.rootGraph.getNodeById(_.target_id);p.rootGraph.getNodeById(y[x.node.index]).connect(x.slot,O,_.target_slot)}}},"reconnectOutputs");p.canvas.emitBeforeChange();try{const{newNodes:y,selectedIds:w}=g();return h(w),m(w),p.rootGraph.remove(this.node),y}finally{p.canvas.emitAfterChange()}};const t=this.node.getExtraMenuOptions;this.node.getExtraMenuOptions=function(g,h){t?.apply(this,arguments);let m=h.findIndex(y=>y?.content==="Outputs");m===-1?m=h.length:m++,h.splice(m,0,null,{content:"Convert to nodes",callback:u(()=>this.convertToNodes(),"callback")},{content:"Manage Group Node",callback:u(()=>Ce(this.type),"callback")})};const s=this.node.onDrawTitleBox;this.node.onDrawTitleBox=function(g,h){s?.apply(this,arguments);const m=g.fillStyle;g.beginPath(),g.rect(11,-h+11,2,2),g.rect(14,-h+11,2,2),g.rect(17,-h+11,2,2),g.rect(11,-h+14,2,2),g.rect(14,-h+14,2,2),g.rect(17,-h+14,2,2),g.rect(11,-h+17,2,2),g.rect(14,-h+17,2,2),g.rect(17,-h+17,2,2),g.fillStyle=this.boxcolor||C.NODE_DEFAULT_BOXCOLOR,g.fill(),g.fillStyle=m};const n=e.onDrawForeground,i=this.groupData.nodeData;e.onDrawForeground=function(g){n?.apply?.(this,arguments);const h=kt().nodeProgressStates[this.id];if(h&&h.state==="running"&&this.runningInternalNodeId!==null){const m=i.nodes[this.runningInternalNodeId];if(!m)return;const y=`Running ${m.title||m.type} (${this.runningInternalNodeId}/${i.nodes.length})`;g.save(),g.font="12px sans-serif";const w=g.measureText(y);g.fillStyle=e.boxcolor||C.NODE_DEFAULT_BOXCOLOR,g.beginPath(),g.roundRect(0,-C.NODE_TITLE_HEIGHT-20,w.width+12,20,5),g.fill(),g.fillStyle="#fff",g.fillText(y,6,-C.NODE_TITLE_HEIGHT-6),g.restore()}};const r=this.node.onExecutionStart;this.node.onExecutionStart=function(){return this.resetExecution=!0,r?.apply(this,arguments)};const a=this,l=this.node.onNodeCreated;this.node.onNodeCreated=function(){if(!this.widgets)return;const g=a.groupData.nodeData.config;if(g)for(const h in g){const m=g[h]?.input;for(const y in m){if(m[y].visible!==!1)continue;const w=a.groupData.oldToNewWidgetMap[h][y],N=this.widgets.find(I=>I.name===w);N&&(N.type="hidden",N.computeSize=()=>[0,-4])}}return l?.apply(this,arguments)};function d(g,h,m){const y=u(({detail:w})=>{const N=h(w);if(!N||p.rootGraph.getNodeById(N))return;const k=this.innerNodes?.findIndex(x=>x.id==N);k>-1&&(this.node.runningInternalNodeId=k,E.dispatchCustomEvent(g,m(w,`${this.node.id}`,this.node)))},"handler");return E.addEventListener(g,y),y}u(d,"handleEvent");const c=d.call(this,"executing",g=>g,(g,h)=>h),f=d.call(this,"executed",g=>g?.display_node||g?.node,(g,h,m)=>({...g,node:h,display_node:h,merge:!m.resetExecution})),v=e.onRemoved;this.node.onRemoved=function(){v?.apply(this,arguments),E.removeEventListener("executing",c),E.removeEventListener("executed",f)},this.node.refreshComboInNode=g=>{for(const h in this.groupData.newToOldWidgetMap){const m=this.node.widgets.find(y=>y.name===h);if(m?.type==="combo"){const y=this.groupData.newToOldWidgetMap[h],w=g[y.node.type],N=w?.input?.required?.[y.inputName]??w?.input?.optional?.[y.inputName];if(!N)continue;m.options.values=N[0],y.inputName!=="image"&&!m.options.values.includes(m.value)&&(m.value=m.options.values[0],m.callback(m.value))}}}}updateInnerWidgets(){for(const e in this.groupData.newToOldWidgetMap){const t=this.node.widgets.find(a=>a.name===e);if(!t)continue;const s=t.value,n=this.groupData.newToOldWidgetMap[e];let i=this.innerNodes[n.node.index];if(i.type==="PrimitiveNode"){i.primitiveValue=s;const a=this.groupData.primitiveToWidget[n.node.index];for(const l of a??[]){const c=this.innerNodes[l.nodeId].widgets.find(f=>f.name===l.inputName);c&&(c.value=s)}continue}else if(i.type==="Reroute"){const a=this.groupData.linksFrom[n.node.index];if(a)for(const[l,,d,c]of a[0]){const f=this.innerNodes[d],v=f.inputs[c];if(v.widget){const g=f.widgets?.find(h=>h.name===v.widget.name);g&&(g.value=s)}}}const r=i.widgets?.find(a=>a.name===n.inputName);r&&(r.value=s)}}populatePrimitive(e,t,s){const n=this.groupData.widgetToPrimitive[t]?.[s];if(n==null)return;const i=this.groupData.oldToNewWidgetMap[n].value,r=this.node.widgets.findIndex(a=>a.name===i);if(r>-1){const a=this.innerNodes[n];let l=a.widgets.length;l-1!==this.node.widgets[r].linkedWidgets?.length&&(l=1);for(let d=0;d<l;d++)this.node.widgets[r+d].value=a.widgets[d].value}return!0}populateReroute(e,t,s){if(e.type!=="Reroute")return;const n=this.groupData.linksFrom[t]?.[0]?.[0];if(!n)return;const[,,i,r]=n,a=this.groupData.nodeData.nodes[i],l=a.inputs;if(!l?.[r]?.widget)return;const c=l.length-(a.widgets_values?.length??0),f=a.widgets_values?.[r-c];if(f==null)return;const v=Object.values(s)[0],g=this.node.widgets.find(h=>h.name===v);g&&(g.value=f)}populateWidgets(){if(this.node.widgets)for(let e=0;e<this.groupData.nodeData.nodes.length;e++){const t=this.groupData.nodeData.nodes[e],s=this.groupData.oldToNewWidgetMap[e]??{},n=Object.keys(s);if(!t.widgets_values?.length){this.populateReroute(t,e,s);continue}let i=0;for(let r=0;r<n.length;r++){const a=n[r],l=s[a],d=this.node.widgets.findIndex(f=>f.name===l),c=this.node.widgets[d];if(this.populatePrimitive(t,e,a)||d===-1){const f=this.innerNodes[e].widgets?.find(v=>v.name===a);i+=f?.linkedWidgets?.length??0}if(d!==-1){c.value=t.widgets_values[r+i];for(let f=0;f<c.linkedWidgets?.length;f++)this.node.widgets[d+f+1].value=t.widgets_values[r+ ++i]}}}}replaceNodes(e){let t,s;for(let n=0;n<e.length;n++){const i=e[n];(s==null||i.pos[0]<s)&&(s=i.pos[0]),(t==null||i.pos[1]<t)&&(t=i.pos[1]),this.linkOutputs(i,n),p.rootGraph.remove(i),i.id=`${this.node.id}:${n}`}this.linkInputs(),this.node.pos=[s,t]}linkOutputs(e,t){if(e.outputs)for(const s of e.outputs){if(!s.links)continue;const n=[...s.links];for(const i of n){const r=p.rootGraph.links[i];if(!r)continue;const a=p.rootGraph.getNodeById(r.target_id),l=this.groupData.oldToNewOutputMap[t]?.[r.origin_slot];l!=null&&this.node.connect(l,a,r.target_slot)}}}linkInputs(){for(const e of this.groupData.nodeData.links??[]){const[,t,s,n,i]=e,r=p.rootGraph.getNodeById(i);r&&r.connect(t,this.node.id,this.groupData.oldToNewInputMap[s][n])}}static getGroupData(e){return(e.nodeData??e.constructor?.nodeData)?.[W]}static isGroupNode(e){return!!e.constructor?.nodeData?.[W]}static async fromNodes(e){const t=new Fe(e),s=await t.build();if(!s)return;const{name:n,nodeData:i}=s;await new Y(n,i).registerType();const a=C.createNode(`${L}${P}${n}`);return a.setInnerNodes(t.nodes),a[W].populateWidgets(),p.rootGraph.add(a),a[W].replaceNodes(t.nodes),a}}const eo=u(o=>{for(const e of o)typeof e.type=="string"&&e.type.startsWith("workflow/")&&(e.type=e.type.replace(/^workflow\//,`${L}${P}`))},"replaceLegacySeparators");async function ve(){const o=Object.values(p.canvas.selected_nodes??{});if(o.length===0)throw new Error("No nodes selected");if(o.length===1)throw new Error("Please select multiple nodes to convert to group node");for(const e of o){if(e instanceof Tt)throw new Error("Selected nodes contain a subgraph node");if(U.isGroupNode(e))throw new Error("Selected nodes contain a group node")}return await U.fromNodes(o)}u(ve,"convertSelectedNodesToGroupNode");const Ue=u(o=>o.length<2||!!o.find(e=>U.isGroupNode(e)),"convertDisabled");function to(){const o=Object.values(p.canvas.selected_nodes??{});for(const e of o)U.isGroupNode(e)&&e.convertToNodes?.()}u(to,"ungroupSelectedGroupNodes");function Ce(o){new nt(p).show(o)}u(Ce,"manageGroupNodes");const oo="Comfy.GroupNode";let ne;const no={name:oo,commands:[{id:"Comfy.GroupNode.ConvertSelectedNodesToGroupNode",label:"Convert selected nodes to group node",icon:"pi pi-sitemap",versionAdded:"1.3.17",function:u(()=>ve(),"function")},{id:"Comfy.GroupNode.UngroupSelectedGroupNodes",label:"Ungroup selected group nodes",icon:"pi pi-sitemap",versionAdded:"1.3.17",function:u(()=>to(),"function")},{id:"Comfy.GroupNode.ManageGroupNodes",label:"Manage group nodes",icon:"pi pi-cog",versionAdded:"1.3.17",function:u((...o)=>Ce(o[0]),"function")}],keybindings:[{commandId:"Comfy.GroupNode.ConvertSelectedNodesToGroupNode",combo:{alt:!0,key:"g"}},{commandId:"Comfy.GroupNode.UngroupSelectedGroupNodes",combo:{alt:!0,shift:!0,key:"G"}}],getCanvasMenuItems(o){const e=[],t=Object.values(o.selected_nodes??{}),s=!Ue(t);e.push({content:"Convert to Group Node (Deprecated)",disabled:!s,callback:u(()=>ve(),"callback")});const n=o.graph?.extra?.groupNodes,i=!n||!Object.keys(n).length;return e.push({content:"Manage Group Nodes",disabled:i,callback:u(()=>Ce(),"callback")}),e},getNodeMenuItems(o){if(U.isGroupNode(o))return[];const e=Object.values(p.canvas.selected_nodes??{});return[{content:"Convert to Group Node (Deprecated)",disabled:!!Ue(e),callback:u(()=>ve(),"callback")}]},async beforeConfigureGraph(o,e){const t=o?.extra?.groupNodes;t&&(eo(o.nodes),await Y.registerFromWorkflow(t,e))},addCustomNodeDefs(o){ne=o},nodeCreated(o){U.isGroupNode(o)&&(o[W]=new U(o),o.title&&o[W]?.groupData?.nodeData&&q.storeGroupNode(o.title,o[W].groupData.nodeData))},async refreshComboInNodes(o){Object.assign(ne,o);const e=p.rootGraph.extra?.groupNodes;e&&await Y.registerFromWorkflow(e,{})}};p.registerExtension(no);window.comfyAPI=window.comfyAPI||{};window.comfyAPI.groupNode=window.comfyAPI.groupNode||{};window.comfyAPI.groupNode.GroupNodeConfig=Y;window.comfyAPI.groupNode.GroupNodeHandler=U;function G(o,e){o.mode=e,o.graph?.change()}u(G,"setNodeMode");function Be(o,e){const t=Z().get("Comfy.GroupSelectedNodes.Padding");o.resizeTo([...o.children,...e],t)}u(Be,"addNodesToGroup");const io={name:"Comfy.GroupOptions",getCanvasMenuItems(o){const e=[],t=o.graph.getGroupOnPos(o.graph_mouse[0],o.graph_mouse[1]);if(!t)return o.selectedItems.size>0&&e.push({content:"Add Group For Selected Nodes",callback:u(()=>{const i=new St;Be(i,o.selectedItems),o.graph.add(i),o.graph.change(),i.recomputeInsideNodes()},"callback")}),e;t.recomputeInsideNodes();const s=t.nodes;if(e.push({content:"Add Selected Nodes To Group",disabled:!o.selectedItems?.size,callback:u(()=>{Be(t,o.selectedItems),o.graph.change()},"callback")}),s.length===0)return e;e.push(null);let n=!0;for(let i=1;i<s.length;i++)if(s[i].mode!==s[0].mode){n=!1;break}if(e.push({content:"Fit Group To Nodes",callback:u(()=>{t.recomputeInsideNodes();const i=Z().get("Comfy.GroupSelectedNodes.Padding");t.resizeTo(t.children,i),o.graph.change()},"callback")}),e.push({content:"Select Nodes",callback:u(()=>{o.selectNodes(s),o.graph.change(),o.canvas.focus()},"callback")}),n)switch(s[0].mode){case 0:e.push({content:"Set Group Nodes to Never",callback:u(()=>{for(const r of s)G(r,2)},"callback")}),e.push({content:"Bypass Group Nodes",callback:u(()=>{for(const r of s)G(r,4)},"callback")});break;case 2:e.push({content:"Set Group Nodes to Always",callback:u(()=>{for(const r of s)G(r,0)},"callback")}),e.push({content:"Bypass Group Nodes",callback:u(()=>{for(const r of s)G(r,4)},"callback")});break;case 4:e.push({content:"Set Group Nodes to Always",callback:u(()=>{for(const r of s)G(r,0)},"callback")}),e.push({content:"Set Group Nodes to Never",callback:u(()=>{for(const r of s)G(r,2)},"callback")});break;default:e.push({content:"Set Group Nodes to Always",callback:u(()=>{for(const r of s)G(r,0)},"callback")}),e.push({content:"Set Group Nodes to Never",callback:u(()=>{for(const r of s)G(r,2)},"callback")}),e.push({content:"Bypass Group Nodes",callback:u(()=>{for(const r of s)G(r,4)},"callback")});break}else e.push({content:"Set Group Nodes to Always",callback:u(()=>{for(const i of s)G(i,0)},"callback")}),e.push({content:"Set Group Nodes to Never",callback:u(()=>{for(const i of s)G(i,2)},"callback")}),e.push({content:"Bypass Group Nodes",callback:u(()=>{for(const i of s)G(i,4)},"callback")});return e}};p.registerExtension(io);ee().registerExtension({name:"Comfy.ImageCompare",async nodeCreated(o){if(o.constructor.comfyClass!=="ImageCompare")return;const[e,t]=o.size;o.setSize([Math.max(e,400),Math.max(t,350)]);const s=o.onExecuted;o.onExecuted=function(n){s?.call(this,n);const i=n.a_images,r=n.b_images,a=p.getRandParam(),l=i&&i.length>0?E.apiURL(`/view?${new URLSearchParams(i[0])}${a}`):"",d=r&&r.length>0?E.apiURL(`/view?${new URLSearchParams(r[0])}${a}`):"",c=o.widgets?.find(f=>f.type==="imagecompare");c&&(c.value={before:l,after:d},c.callback?.(c.value))}}});const so=[{label:"GLB",value:"glb"},{label:"OBJ",value:"obj"},{label:"STL",value:"stl"}];function pe(o){return[null,{content:"Save",has_submenu:!0,callback:u((e,t,s,n)=>{const i=so.map(r=>({content:r.label,callback:u(()=>{(async()=>{try{await o.exportModel(r.value),S().add({severity:"success",summary:D("toastMessages.exportSuccess",{format:r.label})})}catch(a){console.error("Export failed:",a),S().addAlert(D("toastMessages.failedToExportModel",{format:r.label}))}})()},"callback")}));new C.ContextMenu(i,{event:s,parentMenu:n})},"callback")}]}u(pe,"createExportMenuItems");window.comfyAPI=window.comfyAPI||{};window.comfyAPI.exportMenuHelper=window.comfyAPI.exportMenuHelper||{};window.comfyAPI.exportMenuHelper.createExportMenuItems=pe;class Me{static{u(this,"Load3DConfiguration")}constructor(e,t){this.load3d=e,this.properties=t}configureForSaveMesh(e,t){this.setupModelHandlingForSaveMesh(t,e),this.setupDefaultProperties()}configure(e){this.setupModelHandling(e.modelWidget,e.loadFolder,e.cameraState),this.setupTargetSize(e.width,e.height),this.setupDefaultProperties(e.bgImagePath)}setupTargetSize(e,t){e&&t&&(this.load3d.setTargetSize(e.value,t.value),e.callback=s=>{this.load3d.setTargetSize(s,t.value)},t.callback=s=>{this.load3d.setTargetSize(e.value,s)})}setupModelHandlingForSaveMesh(e,t){const s=this.createModelUpdateHandler(t);e&&s(e)}setupModelHandling(e,t,s){const n=this.createModelUpdateHandler(t,s);e.value&&n(e.value);const i=e.callback;let r=e.value;Object.defineProperty(e,"value",{get(){return r},set(a){r=a,e.callback&&a!==void 0&&a!==""&&e.callback(a)},enumerable:!0,configurable:!0}),e.callback=a=>{n(a),i&&i(a)}}setupDefaultProperties(e){const t=this.loadSceneConfig();this.applySceneConfig(t,e);const s=this.loadCameraConfig();this.applyCameraConfig(s);const n=this.loadLightConfig();this.applyLightConfig(n)}loadSceneConfig(){return this.properties&&"Scene Config"in this.properties?this.properties["Scene Config"]:{showGrid:Z().get("Comfy.Load3D.ShowGrid"),backgroundColor:"#"+Z().get("Comfy.Load3D.BackgroundColor"),backgroundImage:""}}loadCameraConfig(){return this.properties&&"Camera Config"in this.properties?this.properties["Camera Config"]:{cameraType:Z().get("Comfy.Load3D.CameraType"),fov:35}}loadLightConfig(){return this.properties&&"Light Config"in this.properties?this.properties["Light Config"]:{intensity:Z().get("Comfy.Load3D.LightIntensity")}}loadModelConfig(){return this.properties&&"Model Config"in this.properties?this.properties["Model Config"]:{upDirection:"original",materialMode:"original"}}applySceneConfig(e,t){if(this.load3d.toggleGrid(e.showGrid),this.load3d.setBackgroundColor(e.backgroundColor),e.backgroundImage){if(t&&t!=e.backgroundImage)return;this.load3d.setBackgroundImage(e.backgroundImage),e.backgroundRenderMode&&this.load3d.setBackgroundRenderMode(e.backgroundRenderMode)}}applyCameraConfig(e){this.load3d.toggleCamera(e.cameraType),this.load3d.setFOV(e.fov),e.state&&this.load3d.setCameraState(e.state)}applyLightConfig(e){this.load3d.setLightIntensity(e.intensity)}applyModelConfig(e){this.load3d.setUpDirection(e.upDirection),this.load3d.setMaterialMode(e.materialMode)}createModelUpdateHandler(e,t){let s=!0;return async n=>{if(!n)return;const i=n;this.setResourceFolder(i);const r=E.apiURL(V.getResourceURL(...V.splitFilePath(i),e));await this.load3d.loadModel(r,i);const a=this.loadModelConfig();if(this.applyModelConfig(a),s&&t){try{this.load3d.setCameraState(t)}catch(l){console.warn("Failed to restore camera state:",l)}s=!1}}}setResourceFolder(e){const t=e.split("/").filter(i=>i.trim());if(t.length<=2)return;const n=t.slice(1,-1).join("/");n&&this.properties&&(this.properties["Resource Folder"]=n)}}const ro={name:"image",type:"Load3D",isPreview:!1},Ve={name:"image",type:"Preview3D",isPreview:!0};async function ao(o,e){if(!o?.length)return;const t=e.widgets?.find(s=>s.name==="model_file");try{const s=e.properties["Resource Folder"]||"",n=s.trim()?`3d/${s.trim()}`:"3d",i=await V.uploadFile(o[0],n);if(!i){S().addAlert(D("toastMessages.fileUploadFailed"));return}const r=E.apiURL(V.getResourceURL(...V.splitFilePath(i),"input"));re(e).waitForLoad3d(a=>{try{a.loadModel(r)}catch{S().addAlert(D("toastMessages.failedToLoadModel"))}}),i&&t&&(t.options?.values?.includes(i)||t.options?.values?.push(i),t.value=i)}catch(s){console.error("Model upload failed:",s),S().addAlert(D("toastMessages.fileUploadFailed"))}}u(ao,"handleModelUpload");async function lo(o,e){if(o?.length)try{const t=e.properties["Resource Folder"]||"",s=t.trim()?`3d/${t.trim()}`:"3d";await V.uploadMultipleFiles(o,s)}catch(t){console.error("Extra resources upload failed:",t),S().addAlert(D("toastMessages.extraResourcesUploadFailed"))}}u(lo,"handleResourcesUpload");function $e(o,e=!1){const t=document.createElement("input");return t.type="file",t.accept=o,t.multiple=e,t.style.display="none",t}u($e,"createFileInput");ee().registerExtension({name:"Comfy.Load3D",settings:[{id:"Comfy.Load3D.ShowGrid",category:["3D","Scene","Initial Grid Visibility"],name:"Initial Grid Visibility",tooltip:"Controls whether the grid is visible by default when a new 3D widget is created. This default can still be toggled individually for each widget after creation.",type:"boolean",defaultValue:!0,experimental:!0},{id:"Comfy.Load3D.BackgroundColor",category:["3D","Scene","Initial Background Color"],name:"Initial Background Color",tooltip:"Controls the default background color of the 3D scene. This setting determines the background appearance when a new 3D widget is created, but can be adjusted individually for each widget after creation.",type:"color",defaultValue:"282828",experimental:!0},{id:"Comfy.Load3D.CameraType",category:["3D","Camera","Initial Camera Type"],name:"Initial Camera Type",tooltip:"Controls whether the camera is perspective or orthographic by default when a new 3D widget is created. This default can still be toggled individually for each widget after creation.",type:"combo",options:["perspective","orthographic"],defaultValue:"perspective",experimental:!0},{id:"Comfy.Load3D.LightIntensity",category:["3D","Light","Initial Light Intensity"],name:"Initial Light Intensity",tooltip:"Sets the default brightness level of lighting in the 3D scene. This value determines how intensely lights illuminate objects when a new 3D widget is created, but can be adjusted individually for each widget after creation.",type:"number",defaultValue:3,experimental:!0},{id:"Comfy.Load3D.LightIntensityMaximum",category:["3D","Light","Light Intensity Maximum"],name:"Light Intensity Maximum",tooltip:"Sets the maximum allowable light intensity value for 3D scenes. This defines the upper brightness limit that can be set when adjusting lighting in any 3D widget.",type:"number",defaultValue:10,experimental:!0},{id:"Comfy.Load3D.LightIntensityMinimum",category:["3D","Light","Light Intensity Minimum"],name:"Light Intensity Minimum",tooltip:"Sets the minimum allowable light intensity value for 3D scenes. This defines the lower brightness limit that can be set when adjusting lighting in any 3D widget.",type:"number",defaultValue:1,experimental:!0},{id:"Comfy.Load3D.LightAdjustmentIncrement",category:["3D","Light","Light Adjustment Increment"],name:"Light Adjustment Increment",tooltip:"Controls the increment size when adjusting light intensity in 3D scenes. A smaller step value allows for finer control over lighting adjustments, while a larger value results in more noticeable changes per adjustment.",type:"slider",attrs:{min:.1,max:1,step:.1},defaultValue:.5,experimental:!0},{id:"Comfy.Load3D.3DViewerEnable",category:["3D","3DViewer","Enable"],name:"Enable 3D Viewer (Beta)",tooltip:"Enables the 3D Viewer (Beta) for selected nodes. This feature allows you to visualize and interact with 3D models directly within the full size 3d viewer.",type:"boolean",defaultValue:!1,experimental:!0},{id:"Comfy.Load3D.PLYEngine",category:["3D","PLY","PLY Engine"],name:"PLY Engine",tooltip:'Select the engine for loading PLY files. "threejs" uses the native Three.js PLYLoader (best for mesh PLY files). "fastply" uses an optimized loader for ASCII point cloud PLY files. "sparkjs" uses Spark.js for 3D Gaussian Splatting PLY files.',type:"combo",options:["threejs","fastply","sparkjs"],defaultValue:"threejs",experimental:!0}],commands:[{id:"Comfy.3DViewer.Open3DViewer",icon:"pi pi-pencil",label:"Open 3D Viewer (Beta) for Selected Node",function:u(()=>{const o=p.canvas.selected_nodes;if(!o||Object.keys(o).length!==1)return;const e=o[Object.keys(o)[0]];if(!Et(e))return;T.copyToClipspace(e),T.clipspace_return_node=e;const t={node:e};Ze().showDialog({key:"global-load3d-viewer",title:D("load3d.viewer.title"),component:Ot,props:t,dialogComponentProps:{style:"width: 80vw; height: 80vh;",maximizable:!0,onClose:u(async()=>{await ce().handleViewerClose(t.node)},"onClose")}})},"function")}],getCustomWidgets(){return{LOAD_3D(o){const e=$e(".gltf,.glb,.obj,.fbx,.stl,.ply,.spz,.splat,.ksplat",!1);o.properties["Resource Folder"]="",e.onchange=async()=>{await ao(e.files,o)},o.addWidget("button","upload 3d model","upload3dmodel",()=>{e.click()});const t=$e("*",!0);t.onchange=async()=>{await lo(t.files,o),t.value=""},o.addWidget("button","upload extra resources","uploadExtraResources",()=>{t.click()}),o.addWidget("button","clear","clear",()=>{re(o).waitForLoad3d(i=>{i.clearModel()});const n=o.widgets?.find(i=>i.name==="model_file");n&&(n.value="")});const s=new ke({node:o,name:"image",component:_e,inputSpec:ro,options:{}});return s.type="load3D",De(o,s),{widget:s}}}},getNodeMenuItems(o){if(o.constructor.comfyClass!=="Load3D")return[];const e=ce().getLoad3d(o);return e?e.isSplatModel()?[]:pe(e):[]},async nodeCreated(o){if(o.constructor.comfyClass!=="Load3D")return;const[e,t]=o.size;o.setSize([Math.max(e,300),Math.max(t,600)]),await xe(),re(o).waitForLoad3d(s=>{const i=o.properties["Camera Config"]?.state,r=new Me(s,o.properties),a=o.widgets?.find(f=>f.name==="model_file"),l=o.widgets?.find(f=>f.name==="width"),d=o.widgets?.find(f=>f.name==="height"),c=o.widgets?.find(f=>f.name==="image");if(a&&l&&d&&c){const f={loadFolder:"input",modelWidget:a,cameraState:i,width:l,height:d};r.configure(f),c.serializeValue=async()=>{const v=Mt.get(o);if(!v)return console.error("No load3d instance found for node"),null;const g=o.properties["Camera Config"]||{cameraType:v.getCurrentCameraType(),fov:v.cameraManager.perspectiveCamera.fov};g.state=v.getCameraState(),o.properties["Camera Config"]=g,v.stopRecording();const{scene:h,mask:m,normal:y}=await v.captureScene(l.value,d.value),[w,N,I]=await Promise.all([V.uploadTempImage(h,"scene"),V.uploadTempImage(m,"scene_mask"),V.uploadTempImage(y,"scene_normal")]);v.handleResize();const k={image:`threed/${w.name} [temp]`,mask:`threed/${N.name} [temp]`,normal:`threed/${I.name} [temp]`,camera_info:o.properties["Camera Config"]?.state||null,recording:""},x=v.getRecordingData();if(x){const[_]=await Promise.all([V.uploadTempImage(x,"recording","mp4")]);k.recording=`threed/${_.name} [temp]`}return k}}})}});ee().registerExtension({name:"Comfy.Preview3D",async beforeRegisterNodeDef(o,e){e.name==="Preview3D"&&(e.input.required.image=["PREVIEW_3D"])},getNodeMenuItems(o){if(o.constructor.comfyClass!=="Preview3D")return[];const e=ce().getLoad3d(o);return e?e.isSplatModel()?[]:pe(e):[]},getCustomWidgets(){return{PREVIEW_3D(o){const e=new ke({node:o,name:Ve.name,component:_e,inputSpec:Ve,options:{}});return e.type="load3D",De(o,e),{widget:e}}}},async nodeCreated(o){if(o.constructor.comfyClass!=="Preview3D")return;const[e,t]=o.size;o.setSize([Math.max(e,400),Math.max(t,550)]),await xe();const s=o.onExecuted;re(o).waitForLoad3d(n=>{const i=new Me(n,o.properties),r=o.widgets?.find(a=>a.name==="model_file");if(r){const a=o.properties["Last Time Model File"];if(a){r.value=a;const d=o.properties["Camera Config"]?.state,c={loadFolder:"output",modelWidget:r,cameraState:d};i.configure(c)}o.onExecuted=function(l){s?.apply(this,arguments);let d=l.result[0];if(!d){const g=D("toastMessages.unableToGetModelFilePath");console.error(g),S().addAlert(g)}let c=l.result[1],f=l.result[2];r.value=d.replaceAll("\\","/"),o.properties["Last Time Model File"]=r.value;const v={loadFolder:"output",modelWidget:r,cameraState:c,bgImagePath:f};i.configure(v),f&&n.setBackgroundImage(f)}}})}});function it(o){if(!o){console.error("[MaskEditor] No node provided");return}if(!o.imgs?.length&&o.previewMediaType!=="image"){console.error("[MaskEditor] Node has no images");return}At().openMaskEditor(o)}u(it,"openMaskEditor");function co(){const o=T.clipspace_return_node;if(!o){console.error("[MaskEditor] No clipspace_return_node found");return}it(o)}u(co,"openMaskEditorFromClipspace");function st(){return Ze().isDialogOpen("global-mask-editor")}u(st,"isOpened");const ze=u(async o=>{if(!st())return;const e=et(),t=e.brushSettings.size,s=o(t);e.setBrushSize(s)},"changeBrushSize");p.registerExtension({name:"Comfy.MaskEditor",settings:[{id:"Comfy.MaskEditor.BrushAdjustmentSpeed",category:["Mask Editor","BrushAdjustment","Sensitivity"],name:"Brush adjustment speed multiplier",tooltip:"Controls how quickly the brush size and hardness change when adjusting. Higher values mean faster changes.",type:"slider",attrs:{min:.1,max:2,step:.1},defaultValue:1,versionAdded:"1.0.0"},{id:"Comfy.MaskEditor.UseDominantAxis",category:["Mask Editor","BrushAdjustment","UseDominantAxis"],name:"Lock brush adjustment to dominant axis",tooltip:"When enabled, brush adjustments will only affect size OR hardness based on which direction you move more",type:"boolean",defaultValue:!0}],commands:[{id:"Comfy.MaskEditor.OpenMaskEditor",icon:"pi pi-pencil",label:"Open Mask Editor for Selected Node",function:u(()=>{const o=p.canvas.selected_nodes;if(!o||Object.keys(o).length!==1)return;const e=o[Object.keys(o)[0]];it(e)},"function")},{id:"Comfy.MaskEditor.BrushSize.Increase",icon:"pi pi-plus-circle",label:"Increase Brush Size in MaskEditor",function:u(()=>ze(o=>H.clamp(o+2,1,250)),"function")},{id:"Comfy.MaskEditor.BrushSize.Decrease",icon:"pi pi-minus-circle",label:"Decrease Brush Size in MaskEditor",function:u(()=>ze(o=>H.clamp(o-2,1,250)),"function")},{id:"Comfy.MaskEditor.ColorPicker",icon:"pi pi-palette",label:"Open Color Picker in MaskEditor",function:u(()=>{if(!st())return;et().colorInput?.click()},"function")}],init(){T.open_maskeditor=co,console.warn("[MaskEditor] ComfyApp.open_maskeditor is deprecated. Plugins should migrate to using the command system or direct node context menu integration.")}});const uo="Comfy.NodeTemplates",je="comfy.templates.json";class po extends Xe{static{u(this,"ManageTemplates")}templates;draggedEl;saveVisualCue;emptyImg;importInput;constructor(){super(),this.load().then(e=>{this.templates=e}),this.element.classList.add("comfy-manage-templates"),this.draggedEl=null,this.saveVisualCue=null,this.emptyImg=new Image,this.emptyImg.src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=",this.importInput=b("input",{type:"file",accept:".json",multiple:!0,style:{display:"none"},parent:document.body,onchange:u(()=>this.importAll(),"onchange")})}createButtons(){const e=super.createButtons();return e[0].textContent="Close",e[0].onclick=()=>{clearTimeout(this.saveVisualCue),this.close()},e.unshift(b("button",{type:"button",textContent:"Export",onclick:u(()=>this.exportAll(),"onclick")})),e.unshift(b("button",{type:"button",textContent:"Import",onclick:u(()=>{this.importInput.click()},"onclick")})),e}async load(){let e=[];const t=await E.getUserData(je);if(t.status===200)try{e=await t.json()}catch{}else t.status!==404&&console.error(t.status+" "+t.statusText);return e??[]}async store(){const e=JSON.stringify(this.templates,void 0,4);try{await E.storeUserData(je,e,{stringify:!1})}catch(t){console.error(t),S().addAlert(t.message)}}async importAll(){for(const e of this.importInput.files)if(e.type==="application/json"||e.name.endsWith(".json")){const t=new FileReader;t.onload=async()=>{const s=JSON.parse(t.result);if(s?.templates){for(const n of s.templates)n?.name&&n?.data&&this.templates.push(n);await this.store()}},await t.readAsText(e)}this.importInput.value=null,this.close()}exportAll(){if(this.templates.length==0){S().addAlert(D("toastMessages.noTemplatesToExport"));return}const e=JSON.stringify({templates:this.templates},null,2),t=new Blob([e],{type:"application/json"});Le("node_templates.json",t)}show(){super.show(b("div",{},this.templates.flatMap((e,t)=>{let s;return[b("div",{dataset:{id:t.toString()},className:"templateManagerRow",style:{display:"grid",gridTemplateColumns:"1fr auto",border:"1px dashed transparent",gap:"5px",backgroundColor:"var(--comfy-menu-bg)"},ondragstart:u(n=>{this.draggedEl=n.currentTarget,n.currentTarget.style.opacity="0.6",n.currentTarget.style.border="1px dashed yellow",n.dataTransfer.effectAllowed="move",n.dataTransfer.setDragImage(this.emptyImg,0,0)},"ondragstart"),ondragend:u(n=>{n.target.style.opacity="1",n.currentTarget.style.border="1px dashed transparent",n.currentTarget.removeAttribute("draggable"),this.element.querySelectorAll(".templateManagerRow").forEach((i,r)=>{var a=Number.parseInt(i.dataset.id);i==this.draggedEl&&a!=r&&this.templates.splice(r,0,this.templates.splice(a,1)[0]),i.dataset.id=r.toString()}),this.store()},"ondragend"),ondragover:u(n=>{if(n.preventDefault(),n.currentTarget==this.draggedEl)return;let i=n.currentTarget.getBoundingClientRect();n.clientY>i.top+i.height/2?n.currentTarget.parentNode.insertBefore(this.draggedEl,n.currentTarget.nextSibling):n.currentTarget.parentNode.insertBefore(this.draggedEl,n.currentTarget)},"ondragover")},[b("label",{textContent:"Name: ",style:{cursor:"grab"},onmousedown:u(n=>{n.target.localName=="label"&&(n.currentTarget.parentNode.draggable="true")},"onmousedown")},[b("input",{value:e.name,dataset:{name:e.name},style:{transitionProperty:"background-color",transitionDuration:"0s"},onchange:u(n=>{clearTimeout(this.saveVisualCue);var i=n.target,r=i.parentNode.parentNode;this.templates[r.dataset.id].name=i.value.trim()||"untitled",this.store(),i.style.backgroundColor="rgb(40, 95, 40)",i.style.transitionDuration="0s",this.saveVisualCue=setTimeout(function(){i.style.transitionDuration=".7s",i.style.backgroundColor="var(--comfy-input-bg)"},15)},"onchange"),onkeypress:u(n=>{var i=n.target;clearTimeout(this.saveVisualCue),i.style.transitionDuration="0s",i.style.backgroundColor="var(--comfy-input-bg)"},"onkeypress"),$:u(n=>s=n,"$")})]),b("div",{},[b("button",{textContent:"Export",style:{fontSize:"12px",fontWeight:"normal"},onclick:u(()=>{const n=JSON.stringify({templates:[e]},null,2),i=new Blob([n],{type:"application/json"}),r=(s.value||e.name)+".json";Le(r,i)},"onclick")}),b("button",{textContent:"Delete",style:{fontSize:"12px",color:"red",fontWeight:"normal"},onclick:u(n=>{const i=n.target.parentNode.parentNode;i.parentNode.removeChild(i),this.templates.splice(i.dataset.id*1,1),this.store();var r=this;setTimeout(function(){r.element.querySelectorAll(".templateManagerRow").forEach((a,l)=>{a.dataset.id=l.toString()})},0)},"onclick")})])])]})))}}const le=new po,He=u(async o=>{const e=localStorage.getItem("litegrapheditor_clipboard");await o(),localStorage.setItem("litegrapheditor_clipboard",e)},"clipboardAction"),go={name:uo,getCanvasMenuItems(o){const e=[];e.push(null),e.push({content:"Save Selected as Template",disabled:!Object.keys(p.canvas.selected_nodes||{}).length,callback:u(async()=>{const s=await te().prompt({title:D("nodeTemplates.saveAsTemplate"),message:D("nodeTemplates.enterName"),defaultValue:""});s?.trim()&&He(()=>{p.canvas.copyToClipboard();let n=localStorage.getItem("litegrapheditor_clipboard");n=JSON.parse(n||"{}");const i=Object.keys(p.canvas.selected_nodes);for(let r=0;r<i.length;r++){const a=p.canvas.graph?.getNodeById(i[r]),l=a?.constructor.nodeData;let d=U.getGroupData(a);if(d){if(d=d.nodeData,n.groupNodes||(n.groupNodes={}),l==null)throw new TypeError("nodeData is not set");n.groupNodes[l.name]=d,n.nodes[r].type=l.name}}le.templates.push({name:s,data:JSON.stringify(n)}),le.store()})},"callback")});const t=le.templates.map(s=>({content:s.name,callback:u(()=>{He(async()=>{const n=JSON.parse(s.data);await Y.registerFromWorkflow(n.groupNodes,{}),n.reroutes?(localStorage.setItem("litegrapheditor_clipboard",s.data),p.canvas.pasteFromClipboard()):Qe(s.data,p.canvas)})},"callback")}));return t.push(null,{content:"Manage",callback:u(()=>le.show(),"callback")}),e.push({content:"Node Templates",submenu:{options:t}}),e}};p.registerExtension(go);p.registerExtension({name:"Comfy.NoteNode",registerCustomNodes(){class o extends de{static{u(this,"NoteNode")}static category;static collapsable;static title_mode;groupcolor=R.node_colors.yellow.groupcolor;isVirtualNode;constructor(s){super(s),this.color=R.node_colors.yellow.color,this.bgcolor=R.node_colors.yellow.bgcolor,this.properties||(this.properties={text:""}),$.STRING(this,"text",["STRING",{default:this.properties.text,multiline:!0}],p),this.serialize_widgets=!0,this.isVirtualNode=!0}}C.registerNodeType("Note",Object.assign(o,{title_mode:C.NORMAL_TITLE,title:"Note",collapsable:!0})),o.category="utils";class e extends de{static{u(this,"MarkdownNoteNode")}static title="Markdown Note";groupcolor=R.node_colors.yellow.groupcolor;constructor(s){super(s),this.color=R.node_colors.yellow.color,this.bgcolor=R.node_colors.yellow.bgcolor,this.properties||(this.properties={text:""}),$.MARKDOWN(this,"text",["STRING",{default:this.properties.text}],p),this.serialize_widgets=!0,this.isVirtualNode=!0}}C.registerNodeType("MarkdownNote",e),e.category="utils"}});ee().registerExtension({name:"Comfy.PreviewAny",async beforeRegisterNodeDef(o,e){if(e.name==="PreviewAny"){const t=o.prototype.onNodeCreated;o.prototype.onNodeCreated=function(){t&&t.apply(this,[]);const n=$.MARKDOWN(this,"preview",["MARKDOWN",{}],p).widget,i=$.STRING(this,"preview",["STRING",{multiline:!0}],p).widget,r=$.BOOLEAN(this,"previewMode",["BOOLEAN",{label_on:"Markdown",label_off:"Plaintext",default:!1}],p);r.widget.callback=a=>{n.hidden=!a,n.options.hidden=!a,i.hidden=a,i.options.hidden=a},n.hidden=!0,n.options.hidden=!0,n.options.read_only=!0,n.element.readOnly=!0,n.element.disabled=!0,n.serialize=!1,i.hidden=!1,i.options.hidden=!1,i.options.read_only=!0,i.element.readOnly=!0,i.element.disabled=!0,i.serialize=!1};const s=o.prototype.onExecuted;o.prototype.onExecuted=function(n){s?.apply(this,[n]);const i=this.widgets?.filter(r=>r.name==="preview")??[];for(const r of i){const a=n.text??"";r.value=Array.isArray(a)?a[0]??"":a}}}}});p.registerExtension({name:"Comfy.RerouteNode",registerCustomNodes(o){class e extends de{static{u(this,"RerouteNode")}static category;static defaultVisibility=!1;constructor(s){super(s??""),this.properties||(this.properties={}),this.properties.showOutputText=e.defaultVisibility,this.properties.horizontal=!1,this.addInput("","*"),this.addOutput(this.properties.showOutputText?"*":"","*"),this.isVirtualNode=!0}onAfterGraphConfigured(){requestAnimationFrame(()=>{this.onConnectionsChange(C.INPUT,void 0,!0)})}clone(){const s=super.clone();return s&&(s.removeOutput(0),s.addOutput(this.properties.showOutputText?"*":"","*"),s.setSize(s.computeSize()),s)}onConnectionsChange(s,n,i){const{graph:r}=this;if(!r||o.configuringGraph)return;if(i&&s===C.OUTPUT&&new Set(this.outputs[0].links?.map(N=>r.links[N]?.type)?.filter(N=>N&&N!=="*")??[]).size>1){const N=[];for(const I of this.outputs[0].links??[]){const k=r.links[I];N.push(k)}N.pop();for(const I of N)r.getNodeById(I.target_id)?.disconnectInput(I.target_slot)}let a=this,l=[],d=null,c=null;for(;a;){l.unshift(a);const w=a.inputs[0].link;if(w!==null){const N=r.links[w];if(!N)return;const I=r.getNodeById(N.origin_id);if(!I)return;if(I instanceof e)I===this?(a.disconnectInput(N.target_slot),a=null):a=I;else{c=a,d=I.outputs[N.origin_slot]?.type??null;break}}else{a=null;break}}const f=[this];let v=null;for(;f.length;){a=f.pop();const w=a.outputs?.[0]?.links??[];for(const N of w){const I=r.links[N];if(!I)continue;const k=r.getNodeById(I.target_id);if(k)if(k instanceof e)f.push(k),l.push(k);else{const x=k.inputs[I.target_slot],_=x.type,O=!d||!_||C.isValidConnection(d,_);if(!O){k.disconnectInput(I.target_slot);continue}k.onConnectionsChange?.(C.INPUT,I.target_slot,O,I,x),v=k.inputs[I.target_slot].type}}}const g=d||v||"*",h=R.link_type_colors[g];let m,y;for(const w of l){w.outputs[0].type=d||"*",w.__outputType=g,w.outputs[0].name=w.properties.showOutputText?`${g}`:"",w.setSize(w.computeSize());for(const N of w.outputs[0].links||[]){const I=r.links[N];if(!I||(I.color=h,o.configuringGraph))continue;const k=r.getNodeById(I.target_id);if(!k)continue;const x=k.inputs?.[I.target_slot];if(x?.widget){const _=Se(x);m||(m=_[1]??{},y=_[0]);const O=ae(x,[_[0],m]);O.customConfig&&(m=O.customConfig)}}}for(const w of l)m&&v?(w.inputs[0].widget={name:"value"},Ie(w.inputs[0],[y??`${g}`,m])):Ie(w.inputs[0],void 0);if(c?.inputs?.[0]?.link){const w=r.links[c.inputs[0].link];w&&(w.color=h)}}getExtraMenuOptions(s,n){return n.unshift({content:(this.properties.showOutputText?"Hide":"Show")+" Type",callback:u(()=>{this.properties.showOutputText=!this.properties.showOutputText,this.properties.showOutputText?this.outputs[0].name=`${this.__outputType||this.outputs[0].type}`:this.outputs[0].name="",this.setSize(this.computeSize()),o.canvas.setDirty(!0,!0)},"callback")},{content:(e.defaultVisibility?"Hide":"Show")+" Type By Default",callback:u(()=>{e.setDefaultTextVisibility(!e.defaultVisibility)},"callback")}),[]}computeSize(){return[this.properties.showOutputText&&this.outputs&&this.outputs.length?Math.max(75,C.NODE_TEXT_SIZE*this.outputs[0].name.length*.6+40):75,26]}static setDefaultTextVisibility(s){e.defaultVisibility=s,s?localStorage["Comfy.RerouteNode.DefaultVisibility"]="true":delete localStorage["Comfy.RerouteNode.DefaultVisibility"]}}e.setDefaultTextVisibility(!!localStorage["Comfy.RerouteNode.DefaultVisibility"]),C.registerNodeType("Reroute",Object.assign(e,{title_mode:C.NO_TITLE,title:"Reroute",collapsable:!1})),e.category="utils"}});const fo=new Set(["SaveImage","SaveVideo","SaveAnimatedWEBP","SaveWEBM","SaveAudio","SaveGLB","SaveAnimatedPNG","CLIPSave","VAESave","ModelSave","LoraSave","SaveLatent"]);p.registerExtension({name:"Comfy.SaveImageExtraOutput",async beforeRegisterNodeDef(o,e,t){if(fo.has(e.name)){const s=o.prototype.onNodeCreated;o.prototype.onNodeCreated=function(){const n=s?s.apply(this,arguments):void 0,i=this.widgets.find(r=>r.name==="filename_prefix");return i.serializeValue=()=>Ke(t.graph,i.value),n}}else{const s=o.prototype.onNodeCreated;o.prototype.onNodeCreated=function(){const n=s?s.apply(this,arguments):void 0;return(!this.properties||!("Node name for S&R"in this.properties))&&this.addProperty("Node name for S&R",this.constructor.type,"string"),n}}}});const qe={name:"image",type:"Preview3D",isPreview:!0};ee().registerExtension({name:"Comfy.SaveGLB",async beforeRegisterNodeDef(o,e){e.name==="SaveGLB"&&(e.input.required.image=["PREVIEW_3D"])},getCustomWidgets(){return{PREVIEW_3D(o){const e=new ke({node:o,name:qe.name,component:_e,inputSpec:qe,options:{}});return e.type="load3D",De(o,e),{widget:e}}}},getNodeMenuItems(o){if(o.constructor.comfyClass!=="SaveGLB")return[];const e=ce().getLoad3d(o);return e?e.isSplatModel()?[]:pe(e):[]},async nodeCreated(o){if(o.constructor.comfyClass!=="SaveGLB")return;const[e,t]=o.size;o.setSize([Math.max(e,400),Math.max(t,550)]),await xe();const s=o.onExecuted;o.onExecuted=function(n){s?.apply(this,arguments);const i=n["3d"][0];re(o).waitForLoad3d(r=>{const a=o.widgets?.find(l=>l.name==="image");if(r&&a){const l=i.subfolder+"/"+i.filename;a.value=l,new Me(r,o.properties).configureForSaveMesh(i.type,l)}})}}});function ho(o,e){const t=e.selectedItems;if(t.size<=1)return;const s=Pt(t,10);if(!s)return;const[n,i,r,a]=s;o.save();const l=2/e.ds.scale;o.lineWidth=l,o.strokeStyle=getComputedStyle(document.documentElement).getPropertyValue("--border-color").trim()||"#ffffff66";const d=5/e.ds.scale;o.setLineDash([d,d]),o.beginPath(),o.roundRect(n,i,r,a,8/e.ds.scale),o.stroke(),o.restore()}u(ho,"drawSelectionBorder");const mo={name:"Comfy.SelectionBorder",async init(){const o=p.canvas.onDrawForeground;p.canvas.onDrawForeground=function(e,t){o?.call(this,e,t),ho(e,p.canvas)}}};p.registerExtension(mo);let ie=!1,se=0;p.registerExtension({name:"Comfy.SimpleTouchSupport",setup(){let o=null,e=null,t=null,s=null;function n(a){return Math.hypot(a.touches[0].clientX-a.touches[1].clientX,a.touches[0].clientY-a.touches[1].clientY)}u(n,"getMultiTouchPos");function i(a){return{clientX:(a.touches[0].clientX+a.touches[1].clientX)/2,clientY:(a.touches[0].clientY+a.touches[1].clientY)/2}}u(i,"getMultiTouchCenter"),p.canvasEl.parentElement?.addEventListener("touchstart",a=>{se+=a.changedTouches.length,t=null,s=null,a.touches?.length===1?(e=new Date,t=a.touches[0]):(e=null,a.touches?.length===2&&(s=p.canvas.ds.scale,t=i(a),o=n(a),p.canvas.pointer.isDown=!1))},!0),p.canvasEl.parentElement?.addEventListener("touchend",a=>{if(se-=a.changedTouches.length,a.touches?.length!==1&&(ie=!1),e&&!a.touches?.length){if(new Date().getTime()-e.getTime()>600&&a.target===p.canvasEl){const l={button:2,clientX:a.changedTouches[0].clientX,clientY:a.changedTouches[0].clientY,pointerId:1,isPrimary:!0};p.canvasEl.dispatchEvent(new PointerEvent("pointerdown",l)),setTimeout(()=>{p.canvasEl.dispatchEvent(new PointerEvent("pointerup",l))}),a.preventDefault()}e=null}});const r=u(()=>{se=0,ie=!1,e=null,t=null,s=null,o=null},"resetTouchState");document.addEventListener("visibilitychange",()=>{document.hidden&&r()}),p.canvasEl.parentElement?.addEventListener("touchcancel",r),p.canvasEl.parentElement?.addEventListener("touchmove",a=>{if(e&&t&&a.touches?.length===1){const c=a.touches[0],f=c.clientX-t.clientX,v=c.clientY-t.clientY;f*f+v*v>30&&(e=null)}if(a.touches?.length===2&&t&&!a.ctrlKey&&!a.shiftKey){a.preventDefault(),p.canvas.pointer.isDown=!1,ie=!0,C.closeAllContextMenus(window),p.canvas.search_box?.close();const c=n(a),f=i(a);if(s===null||o===null)return;let v=s*c/o;const g=(f.clientX-t.clientX)/v,h=(f.clientY-t.clientY)/v;v<p.canvas.ds.min_scale?v=p.canvas.ds.min_scale:v>p.canvas.ds.max_scale&&(v=p.canvas.ds.max_scale);const m=p.canvas.ds.scale;p.canvas.ds.scale=v,Math.abs(p.canvas.ds.scale-1)<.01&&(p.canvas.ds.scale=1);const y=p.canvas.ds.scale,w=u(N=>[f.clientX/N-p.canvas.ds.offset[0],f.clientY/N-p.canvas.ds.offset[1]],"convertScaleToOffset");var l=w(m),d=w(y);p.canvas.ds.offset[0]+=g+d[0]-l[0],p.canvas.ds.offset[1]+=h+d[1]-l[1],t.clientX=f.clientX,t.clientY=f.clientY,p.canvas.setDirty(!0,!0)}},!0)}});const yo=R.prototype.processMouseDown;R.prototype.processMouseDown=function(o){if(!(ie||se))return p.canvas.pointer.isDown=!1,yo.apply(this,[o])};const wo=R.prototype.processMouseMove;R.prototype.processMouseMove=function(o){if(!(ie||se>1))return wo.apply(this,[o])};p.registerExtension({name:"Comfy.SlotDefaults",suggestionsNumber:null,init(){C.search_filter_enabled=!0,C.middle_click_slot_add_default_node=!0,this.suggestionsNumber=p.ui.settings.addSetting({id:"Comfy.NodeSuggestions.number",category:["Comfy","Node Search Box","NodeSuggestions"],name:"Number of nodes suggestions",tooltip:"Only for litegraph searchbox/context menu",type:"slider",attrs:{min:1,max:100,step:1},defaultValue:5,onChange:u(o=>{this.setDefaults(o)},"onChange")})},slot_types_default_out:{},slot_types_default_in:{},async beforeRegisterNodeDef(o,e){var t=e.name;const s=e.input?.required;for(const d in s){var n=s[d];if(typeof n[0]!="string")continue;var i=n[0];if(i in $){var r=n[1];if(!r?.forceInput)continue}if(i in this.slot_types_default_out||(this.slot_types_default_out[i]=["Reroute"]),this.slot_types_default_out[i].includes(t))continue;this.slot_types_default_out[i].push(t);const c=i.toLocaleLowerCase();c in C.registered_slot_in_types||(C.registered_slot_in_types[c]={nodes:[]}),C.registered_slot_in_types[c].nodes.push(o.comfyClass)}var a=e.output??[];for(const d of a){const c=d;c in this.slot_types_default_in||(this.slot_types_default_in[c]=["Reroute"]),!this.slot_types_default_in[c].includes(t)&&(this.slot_types_default_in[c].push(t),c in C.registered_slot_out_types||(C.registered_slot_out_types[c]={nodes:[]}),C.registered_slot_out_types[c].nodes.push(o.comfyClass),C.slot_types_out.includes(c)||C.slot_types_out.push(c))}var l=this.suggestionsNumber.value;this.setDefaults(l)},setDefaults(o){C.slot_types_default_out={},C.slot_types_default_in={};for(const e in this.slot_types_default_out)C.slot_types_default_out[e]=this.slot_types_default_out[e].slice(0,o);for(const e in this.slot_types_default_in)C.slot_types_default_in[e]=this.slot_types_default_in[e].slice(0,o)}});async function vo(o,e,t,s,n=!1){try{const i=new FormData;i.append("image",t),n&&i.append("subfolder","pasted");const r=await E.fetchApi("/upload/image",{method:"POST",body:i});if(r.status===200){const a=await r.json();let l=a.name;a.subfolder&&(l=a.subfolder+"/"+l),o.options.values.includes(l)||o.options.values.push(l),s&&(e.element.src=E.apiURL(ue(...tt(l))),o.value=l,o.callback?.(l))}else S().addAlert(r.status+" - "+r.statusText)}catch(i){S().addAlert(i)}}u(vo,"uploadFile");p.registerExtension({name:"Comfy.AudioWidget",async beforeRegisterNodeDef(o,e){["LoadAudio","SaveAudio","PreviewAudio","SaveAudioMP3","SaveAudioOpus"].includes(o.prototype.comfyClass)&&(e.input.required.audioUI=["AUDIO_UI",{}])},getCustomWidgets(){return{AUDIO_UI(o,e){const t=document.createElement("audio");t.controls=!0,t.classList.add("comfy-audio"),t.setAttribute("name","media");const s=o.addDOMWidget(e,"audioUI",t);s.serialize=!1;const{nodeData:n}=o.constructor;if(n==null)throw new TypeError("nodeData is null");if(n.output_node){s.element.classList.add("empty-audio-widget");const r=o.onExecuted;o.onExecuted=function(a){r?.apply(this,arguments);const l=a.audio;if(!l)return;const d=l[0];s.element.src=E.apiURL(ue(d.subfolder,d.filename,d.type)),s.element.classList.remove("empty-audio-widget")}}return s.onRemove=J(s.onRemove,()=>{s.element&&(s.element.pause(),s.element.src="",s.element.remove())}),{widget:s}}}},onNodeOutputsUpdated(o){for(const[e,t]of Object.entries(o))if("audio"in t){const s=Lt(p.rootGraph,e);if(!s)continue;const n=s.widgets.find(r=>r.name==="audioUI"),i=t.audio[0];n.element.src=E.apiURL(ue(i.subfolder,i.filename,i.type)),n.element.classList.remove("empty-audio-widget")}}});p.registerExtension({name:"Comfy.UploadAudio",async beforeRegisterNodeDef(o,e){e?.input?.required?.audio?.[1]?.audio_upload===!0&&(e.input.required.upload=["AUDIOUPLOAD",{}])},getCustomWidgets(){return{AUDIOUPLOAD(o,e){const t=o.widgets.find(c=>c.name==="audio"),s=o.widgets.find(c=>c.name==="audioUI");s.options.canvasOnly=!0;const n=u(()=>{typeof t.value=="string"&&(s.element.src=E.apiURL(ue(...tt(t.value))))},"onAudioWidgetUpdate");t.value&&n(),t.callback=n;const i=o.onGraphConfigured;o.onGraphConfigured=function(){i?.apply(this,arguments),t.value&&n()};const r=u(async c=>(c?.length&&vo(t,s,c[0],!0),c),"handleUpload"),a=u(c=>c.type.startsWith("audio/"),"isAudioFile"),{openFileSelection:l}=Gt(o,{accept:"audio/*",onSelect:r}),d=o.addWidget("button",e,"",l,{serialize:!1,canvasOnly:!0});return d.label=D("g.choose_file_to_upload"),Wt(o,{fileFilter:a,onDrop:r}),Rt(o,{fileFilter:a,onPaste:r}),o.previewMediaType="audio",{widget:d}}}}});p.registerExtension({name:"Comfy.RecordAudio",getCustomWidgets(){return{AUDIO_RECORD(o,e){const t=document.createElement("audio");t.controls=!0,t.classList.add("comfy-audio"),t.setAttribute("name","media");const s=o.addDOMWidget(e,"audioUI",t);s.options.canvasOnly=!1;let n=null,i=!1,r=[],a=null,l=null,d=null,c=null;s.serializeValue=async()=>{i&&n&&(d=new Promise(h=>{c=h}),n.stop(),await d);const v=s.element.src;if(!v)return S().addAlert(D("g.noAudioRecorded")),"";const g=await fetch(v).then(h=>h.blob());return await Q().convertBlobToFileAndSubmit(g)},l=o.addWidget("button",e,"",async()=>{if(i)n&&i&&n.stop();else try{a=await navigator.mediaDevices.getUserMedia({audio:!0}),n=new Bt(a,{mimeType:"audio/wav"}),r=[],n.ondataavailable=v=>{r.push(v.data)},n.onstop=async()=>{const v=new Blob(r,{type:"audio/wav"});Q().stopAllTracks(a),s.element.src&&s.element.src.startsWith("blob:")&&URL.revokeObjectURL(s.element.src),s.element.src=URL.createObjectURL(v),i=!1,l&&(l.label=D("g.startRecording")),c&&(c(),c=null,d=null)},n.onerror=v=>{console.error("MediaRecorder error:",v),Q().stopAllTracks(a),i=!1,l&&(l.label=D("g.startRecording")),c&&(c(),c=null,d=null)},n.start(),i=!0,l&&(l.label=D("g.stopRecording"))}catch(v){if(console.error("Error accessing microphone:",v),S().addAlert(D("g.micPermissionDenied")),n)try{n.stop()}catch{}Q().stopAllTracks(a),a=null,i=!1,l&&(l.label=D("g.startRecording"))}},{serialize:!1,canvasOnly:!1}),l.label=D("g.startRecording"),l.type="audiorecord";const f=o.onRemoved;return o.onRemoved=function(){i&&n&&n.stop(),Q().stopAllTracks(a),s.element.src?.startsWith("blob:")&&URL.revokeObjectURL(s.element.src),f?.call(this)},{widget:l}}}},async nodeCreated(o){o.constructor.comfyClass==="RecordAudio"&&await Q().registerWavEncoder()}});const bo=u(o=>{const[e,t]=o;return t?(t.image_upload===!0||t.video_upload===!0||t.animated_image_upload===!0)&&(Ft(o)||e==="COMBO"):!1},"isMediaUploadComboInput"),No=u((o,e)=>["IMAGEUPLOAD",{...e[1],imageInputName:o}],"createUploadInput");p.registerExtension({name:"Comfy.UploadImage",beforeRegisterNodeDef(o,e){const{input:t}=e??{},{required:s}=t??{};if(!s)return;const n=Object.entries(s).find(([i,r])=>bo(r));if(n){const[i,r]=n;s.upload=No(i,r)}}});const Ye=Symbol();p.registerExtension({name:"Comfy.WebcamCapture",getCustomWidgets(){return{WEBCAM(o,e){let t;o[Ye]=new Promise(r=>t=r);const s=document.createElement("div");s.style.background="rgba(0,0,0,0.25)",s.style.textAlign="center";const n=document.createElement("video");return n.style.height=n.style.width="100%",u(async()=>{try{const r=await navigator.mediaDevices.getUserMedia({video:!0,audio:!1});s.replaceChildren(n),setTimeout(()=>t(n),500),n.addEventListener("loadedmetadata",()=>t(n),!1),n.srcObject=r,n.play()}catch(r){const a=document.createElement("div");a.style.color="red",a.style.overflow="auto",a.style.maxHeight="100%",a.style.whiteSpace="pre-wrap",window.isSecureContext?a.textContent=`Unable to load webcam, please ensure access is granted:
|
|
2
|
-
`+r.message:a.textContent=`Unable to load webcam. A secure context is required, if you are not accessing ComfyUI on localhost (127.0.0.1) you will have to enable TLS (https)
|
|
3
|
-
|
|
4
|
-
`+r.message,s.replaceChildren(a)}},"loadVideo")(),{widget:o.addDOMWidget(e,"WEBCAM",s)}}}},nodeCreated(o){if(o.type,o.constructor.comfyClass!=="WebcamCapture")return;let e;const t=o.widgets.find(d=>d.name==="image"),s=o.widgets.find(d=>d.name==="width"),n=o.widgets.find(d=>d.name==="height"),i=o.widgets.find(d=>d.name==="capture_on_queue"),r=document.createElement("canvas"),a=u(()=>{r.width=s.value,r.height=n.value,r.getContext("2d").drawImage(e,0,0,s.value,n.value);const c=r.toDataURL("image/png"),f=new Image;f.onload=()=>{o.imgs=[f],p.canvas.setDirty(!0)},f.src=c},"capture"),l=o.addWidget("button","waiting for camera...","capture",a,{canvasOnly:!0});l.disabled=!0,l.serializeValue=()=>{},t.serializeValue=async()=>{if(i.value)a();else if(!o.imgs?.length){const h="No webcam image captured";throw S().addAlert(h),new Error(h)}const d=await new Promise(h=>r.toBlob(h)),c=`${+new Date}.png`,f=new File([d],c),v=new FormData;v.append("image",f),v.append("subfolder","webcam"),v.append("type","temp");const g=await E.fetchApi("/upload/image",{method:"POST",body:v});if(g.status!==200){const h=`Error uploading camera image: ${g.status} - ${g.statusText}`;throw S().addAlert(h),new Error(h)}return`webcam/${c} [temp]`},o[Ye].then(d=>{e=d,s.value||(s.value=e.videoWidth||640,n.value=e.videoHeight||480),l.disabled=!1,l.label=D("g.capture")})}});
|
|
5
|
-
//# sourceMappingURL=index-DKofvZ3r.js.map
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
const e={user:"用户",currentUser:"当前用户",empty:"空",noWorkflowsFound:"未找到工作流。",comingSoon:"即将推出",download:"下载",downloadImage:"下载图片",downloadVideo:"下载视频",editOrMaskImage:"编辑或遮罩图片",editImage:"编辑图片",deleteImage:"删除图片",deleteAudioFile:"删除音频文件",removeImage:"移除图片",removeVideo:"移除视频",chart:"图表",chartLowercase:"图表",file:"文件",selectedFile:"已选文件",none:"无",markdown:"markdown",content:"内容",audioProgress:"音频进度",viewImageOfTotal:"查看第 {index} 张图片,共 {total} 张",viewVideoOfTotal:"查看第 {index} 个视频,共 {total} 个",imagePreview:"图片预览 - 使用方向键切换图片",videoPreview:"视频预览 - 使用方向键切换视频",galleryImage:"图库图片",galleryThumbnail:"图库缩略图",errorLoadingImage:"图片加载出错",errorLoadingVideo:"视频加载出错",failedToDownloadImage:"图片下载失败",failedToDownloadVideo:"视频下载失败",calculatingDimensions:"正在计算尺寸",import:"导入",loadAllFolders:"加载所有文件夹",logoAlt:"ComfyUI 标志",comfyOrgLogoAlt:"ComfyOrg 徽标",comfy:"舒适",refresh:"刷新",refreshNode:"刷新节点",vitePreloadErrorTitle:"新版本可用",vitePreloadErrorMessage:`应用已发布新版本。是否立即重新加载?
|
|
2
|
-
如果不重新加载,应用的某些功能可能无法正常工作。
|
|
3
|
-
您可以先拒绝,保存进度后再重新加载。`,terminal:"终端",logs:"日志",videoFailedToLoad:"视频加载失败",audioFailedToLoad:"音频加载失败",liveSamplingPreview:"实时采样预览",extensionName:"扩展名称",reloadToApplyChanges:"重新加载以应用更改",insert:"插入",systemInfo:"系统信息",devices:"设备",about:"关于",add:"添加",confirm:"确认",confirmed:"已确认",reset:"重置",resetAll:"重置所有",clearFilters:"清除筛选",resetAllKeybindingsTooltip:"将所有键绑定重置为默认",customizeFolder:"自定义文件夹",icon:"图标",color:"颜色",error:"错误",resizeFromBottomRight:"从右下角调整大小",resizeFromTopRight:"从右上角调整大小",resizeFromBottomLeft:"从左下角调整大小",resizeFromTopLeft:"从左上角调整大小",info:"节点信息",bookmark:"保存到库",moreOptions:"更多选项",more:"更多",loading:"加载中",loadingPanel:"正在加载{panel}面板...",preview:"预览",addNodeFilterCondition:"添加节点筛选条件",architecture:"架构",author:"作者",usageHint:"使用提示",triggerPhrase:"触发短语",findIssues:"查找问题",reportIssue:"发送报告",reportIssueTooltip:"向 Comfy Org 提交错误报告",reportSent:"报告已提交",copyToClipboard:"复制到剪贴板",openNewIssue:"打开新问题",showReport:"显示报告",imageFailedToLoad:"图像加载失败",reconnecting:"重新连接中",reconnected:"已重新连接",delete:"删除",rename:"重命名",save:"保存",saving:"正在保存",no:"否",cancel:"取消",close:"关闭",or:"或",pressKeysForNewBinding:"按下按键设置新绑定",defaultBanner:"默认横幅",enableOrDisablePack:"启用或禁用包",openManager:"打开管理器",graphNavigation:"图形导航",dropYourFileOr:"拖放您的文件或",back:"返回",next:"下一个",submit:"提交",install:"安装",installing:"正在安装",overwrite:"覆盖",customize:"自定义",experimental:"测试版",deprecated:"已弃用",loadWorkflow:"加载工作流",goToNode:"转到节点",setAsBackground:"设为背景",customBackground:"自定义背景",settings:"设置",searchWorkflows:"搜索工作流",searchSettings:"搜索设置",searchNodes:"搜索节点",searchModels:"搜索模型",searchKeybindings:"搜索快捷键",searchExtensions:"搜索扩展",search:"搜索",searchPlaceholder:"搜索占位符",noResultsFound:"未找到结果",noResults:"无结果",searchFailedMessage:"我们找不到任何与您的搜索匹配的设置。请尝试调整您的搜索词。",noTasksFound:"未找到任务",noTasksFoundMessage:"队列中没有任务。",newFolder:"新文件夹",enableAll:"启用全部",disableAll:"禁用全部",enableSelected:"启用选中项",disableSelected:"禁用选中项",disableThirdParty:"禁用第三方",core:"核心",custom:"自定义",command:"指令",keybinding:"按键绑定",upload:"上传",export:"导出",workflow:"工作流",success:"成功",ok:"确定",feedback:"反馈",continue:"继续",control_after_generate:"生成后控制",control_before_generate:"生成前控制",choose_file_to_upload:"选择要上传的文件",capture:"捕获",nodes:"节点",community:"社区",all:"全部",versionMismatchWarning:"版本兼容性警告",versionMismatchWarningMessage:"{warning}:{detail} 请参阅 https://docs.comfy.org/installation/update_comfyui#common-update-issues 以取得更新说明。",frontendOutdated:"前端版本 {frontendVersion} 已过时。后端需要 {requiredVersion} 或更高版本。",frontendNewer:"前端版本 {frontendVersion} 可能与后端版本 {backendVersion} 不相容。",updateFrontend:"更新前端",dismiss:"关闭",update:"更新",updated:"已更新",resultsCount:"找到 {count} 个结果",status:"状态",description:"描述",warning:"警告",name:"名称",category:"类别",sort:"排序",source:"来源",filter:"过滤",apply:"应用",enabled:"已启用",installed:"已安装",restart:"重新启动",missing:"缺失",inProgress:"进行中",completed:"已完成",interrupted:"已中断",queued:"已执行",running:"正在运行",failed:"失败",cancelled:"已取消",job:"任务",untitled:"无标题",emDash:"-",enabling:"启用中",disabling:"禁用中",updating:"更新中",migrate:"迁移",updateAvailable:"有更新可用",login:"登录",learnMore:"了解更多",amount:"数量",unknownError:"未知错误",title:"标题",edit:"编辑",copy:"复制",copyJobId:"复制队列 ID",copied:"已复制",relativeTime:{now:"刚才",yearsAgo:"{count}年 前",monthsAgo:"{count}月 前",weeksAgo:"{count}周 前",daysAgo:"{count}天 前",hoursAgo:"{count}时 前",minutesAgo:"{count}分 前"},jobIdCopied:"队列 ID 已复制到剪贴板",failedToCopyJobId:"未能复制队列 ID",imageUrl:"图片网址",clear:"清除",clearAll:"全部清除",copyURL:"复制链接",releaseTitle:"{package} {version} 发布",itemSelected:"已选择 {selectedCount} 项",itemsSelected:"已选择 {selectedCount} 项",multiSelectDropdown:"多选下拉框",singleSelectDropdown:"单选下拉框",progressCountOf:"共",keybindingAlreadyExists:"快捷键已存在",commandProhibited:"命令 {command} 被禁止。请联系管理员了解更多信息。",startRecording:"开始录音",stopRecording:"停止录音",micPermissionDenied:"麦克风权限被拒绝",noAudioRecorded:"未录制音频",nodesRunning:"节点正在运行",duplicate:"复制",itemsCopiedToClipboard:"已复制到剪贴板",selectItemsToCopy:"选择复制",nothingToCopy:"没有可以复制的内容",selectItemsToDuplicate:"选择复制",nothingToDuplicate:"Nothing to duplicate",selectItemsToDelete:"选择删除",nothingToDelete:"没有可以删除的内容",batchRename:"批量重命名",enterBaseName:"输入基础名称",enterNewName:"输入新名称",selectItemsToRename:"选择重命名",nothingToRename:"没有可以重命名的内容",moreWorkflows:"更多工作流",seeTutorial:"查看教程",nodeRenderError:"节点渲染错误",nodeContentError:"节点内容错误",nodeHeaderError:"节点标题错误",nodeSlotsError:"节点插槽错误",nodeWidgetsError:"节点控件错误",frameNodes:"框选节点",listening:"正在监听...",ready:"就绪",playPause:"开启/暂停",playRecording:"播放录音",playing:"播放中",stopPlayback:"停止播放",playbackSpeed:"播放速度",volume:"音量",halfSpeed:"0.5倍","1x":"1倍","2x":"2倍",beta:"测试版",profile:"档案",noItems:"无项目"},o={title:"自定义节点管理器",legacyMenuNotAvailable:"传统管理器菜单不可用,已切换为新管理器菜单。",legacyManagerUI:"使用传统界面",legacyManagerUIDescription:"如需使用传统管理器界面,请以 --enable-manager-legacy-ui 参数启动 ComfyUI",failed:"失败 ({count})",failedToInstall:"安装失败",installError:"安装错误",importFailedGenericError:"软件包导入失败。请查看控制台获取更多信息。",noNodesFound:"未找到节点",noNodesFoundDescription:"无法解析包的节点,或者该包仅为前端扩展,没有任何节点。",installationQueue:"安装队列",changingVersion:"将版本从 {from} 更改为 {to}",dependencies:"依赖关系",inWorkflow:"在工作流中",infoPanelEmpty:"点击一个项目查看信息",applyChanges:"应用更改",restartToApplyChanges:"要应用更改,请重新启动ComfyUI",clickToFinishSetup:"点击",toFinishSetup:"以完成设置",restartingBackend:"正在重启后端以应用更改...",extensionsSuccessfullyInstalled:"扩展已成功安装并可使用!",installingDependencies:"正在安装依赖项...",loadingVersions:"正在加载版本...",selectVersion:"选择版本",downloads:"下载",repository:"仓库",uninstall:"卸载",uninstalling:"正在卸载",update:"更新",tryUpdate:"尝试更新",tryUpdateTooltip:"从库中拉取更新。测试版本可能有无法自动检测到更新。",uninstallSelected:"卸载所选",updateSelected:"更新所选",updateAll:"全部更新",updatingAllPacks:"更新所有包",disabledNodesWontUpdate:"已禁用的节点不会被更新",enablePackToChangeVersion:"启用此包以更改版本",license:"许可证",nightlyVersion:"每夜",latestVersion:"最新",createdBy:"创建者",totalNodes:"节点总数",discoverCommunityContent:"发现社区制作的节点包,扩展等等...",errorConnecting:"连接到Comfy节点注册表时出错。",noResultsFound:"未找到符合您搜索的结果。",tryDifferentSearch:"请尝试不同的搜索查询。",tryAgainLater:"请稍后再试。",gettingInfo:"正在获取信息...",nodePack:"节点包",searchPlaceholder:"搜索",version:"版本",lastUpdated:"最后更新",noDescription:"无可用描述",installSelected:"安装选定",installAllMissingNodes:"安装所有缺失节点",allMissingNodesInstalled:"所有缺失节点已成功安装",packsSelected:"选定的包",mixedSelectionMessage:"无法对混合选择执行批量操作",notAvailable:"不可用",status:{active:"活跃",pending:"待定",flagged:"已标记",deleted:"已删除",banned:"已禁止",unknown:"未知",conflicting:"冲突",importFailed:"安装错误"},sort:{downloads:"最受欢迎",publisher:"出版商",created:"最新",updated:"最近更新"},filter:{nodePack:"节点包",enabled:"已启用",disabled:"已禁用"},conflicts:{title:"检测到节点包问题!",description:"我们检测到您的部分扩展与新版 ComfyUI 存在冲突。更新后,依赖这些扩展的工作流可能会被破坏。",info:"如果继续更新,冲突的扩展将被自动禁用。您可以随时在 ComfyUI 管理器中查看和管理它们。",extensionAtRisk:"有风险的扩展",conflicts:"冲突",importFailedExtensions:"导入失败的扩展",conflictInfoTitle:"为什么会发生这种情况?",installAnyway:"仍然安装",enableAnyway:"仍然启用",understood:"我已了解",warningBanner:{title:"部分扩展因与当前环境不兼容而被禁用",message:"这些扩展需要与您当前环境不同版本的系统包。安装它们可能会覆盖核心依赖,并影响其他扩展或工作流。",button:"了解更多..."},conflictMessages:{comfyui_version:"ComfyUI 版本不匹配(当前:{current},要求:{required})",frontend_version:"前端版本不匹配(当前:{current},要求:{required})",os:"操作系统不受支持(当前:{current},要求:{required})",accelerator:"GPU/加速器不受支持(可用:{current},要求:{required})",generic:"兼容性问题(当前:{current},要求:{required})",banned:"该软件包因安全原因被禁用",pending:"安全验证待定 - 无法验证兼容性",import_failed:"导入失败"},warningTooltip:"该软件包可能与您当前的环境存在兼容性问题"}},t={helpFix:"帮助修复这个"},i={noColor:"无色",default:"默认",blue:"蓝色",green:"绿色",red:"红色",pink:"粉色",yellow:"黄色",brown:"棕色",pale_blue:"淡蓝色",cyan:"青色",purple:"紫色",black:"黑色",custom:"自定义"},a={Inputs:"输入",Outputs:"输出",Properties:"属性","Properties Panel":"属性面板",Title:"标题",Mode:"模式",Resize:"调整大小",Collapse:"折叠",Expand:"展开",Pin:"固定",Unpin:"取消固定",Clone:"克隆",Remove:"删除",Colors:"颜色",Shapes:"形状",Bypass:"绕过","Copy (Clipspace)":"复制 (Clipspace)","Add Node":"添加节点","Add Group":"添加组","Convert to Group Node":"转换为组节点","Convert to Group Node (Deprecated)":"转换为组节点(已弃用)","Manage Group Nodes":"管理组节点","Add Group For Selected Nodes":"为选定节点添加组","Save Selected as Template":"将选定节点另存为模板","Node Templates":"节点模板",Manage:"管理",Search:"搜索","Open in Mask Editor":"用遮罩编辑器打开","Open Image":"打开图像","Copy Image":"复制图像","Save Image":"保存图像",Rename:"重命名",RenameWidget:"重命名组件",Copy:"复制",Duplicate:"复制",Paste:"站贴","Node Info":"节点信息","Adjust Size":"调整尺寸","Minimize Node":"最小化节点","Expand Node":"展开节点",Shape:"形状",Color:"颜色","Add Subgraph to Library":"添加子工作流到节点库","Unpack Subgraph":"解包子工作流","Edit Subgraph Widgets":"编辑子工作流组件","Convert to Subgraph":"转换为子工作流","Align Selected To":"对齐选中项到","Distribute Nodes":"分布节点","Remove Bypass":"删除所有忽略节点","Run Branch":"运行支流节点",Delete:"删除",Top:"顶部",Bottom:"底部",Left:"左侧",Right:"右侧",Horizontal:"水平",Vertical:"竖直",new:"新",deprecated:"弃用",Extensions:"扩展"},n={bookmark:"书签",folder:"文件夹",star:"星星",heart:"心",file:"文件",inbox:"收件箱",box:"盒子",briefcase:"公文包","exclamation-triangle":"警告"},r={title:"欢迎使用 ComfyUI",getStarted:"开始使用"},s={newUser:"新用户",enterUsername:"输入用户名",existingUser:"用户已存在",selectUser:"选择用户",next:"下一步"},l={title:"您的设备不受支持",message:"仅支持以下设备:",illustrationAlt:"Sad girl illustration",learnMore:"了解更多",reportIssue:"报告问题",supportedDevices:{macos:"MacOS (M1 或更高版本)",windows:"Windows (支持 CUDA 的 Nvidia GPU)"},continue:"继续",continueTooltip:"我确定我的设备是受支持的"},d={title:"下载 git",message:"无法找到 git。正常操作需要一个可用的 git 副本。",instructions:"请下载并安装适合您操作系统的最新版本。下面的下载 git 按钮将打开 git-scm.com 下载页面。",warning:"如果您确定不需要安装 git,或者已经安装了 git,您可以点击跳过以绕过此检查。当前不支持在没有可用 git 副本的情况下运行 ComfyUI。",gitWebsite:"下载 git",skip:"跳过"},c={installLocation:"安装位置",migration:"迁移",desktopSettings:"桌面设置",chooseInstallationLocation:"选择安装位置",gpuPicker:{title:"选择您的硬件配置",recommended:"推荐",nvidiaSubtitle:"NVIDIA CUDA",cpuSubtitle:"CPU模式",manualSubtitle:"手动设置",appleMetalDescription:"利用您的Mac GPU以获得更快速度和更佳体验",nvidiaDescription:"使用NVIDIA GPU和CUDA加速以获得最佳性能。",cpuDescription:"当GPU加速不可用时,使用CPU模式以获得兼容性",manualDescription:"为高级配置或不受支持的硬件手动配置ComfyUI"},locationPicker:{title:"选择ComfyUI的安装位置",subtitle:"选择一个文件夹用于存放ComfyUI文件。我们也会自动在此处设置Python。",pathPlaceholder:"/Users/username/Documents/ComfyUI",migrationPathPlaceholder:"选择已有的ComfyUI安装(可选)",migrateFromExisting:"从现有安装迁移",migrateDescription:"从之前的ComfyUI安装复制或链接您的模型、自定义节点和配置。",chooseDownloadServers:"手动选择下载服务器",downloadServersDescription:"根据您的位置选择用于下载Python、PyPI包和PyTorch的特定镜像服务器。"},systemLocations:"系统位置",failedToSelectDirectory:"选择目录失败",pathValidationFailed:"路径验证失败",pathExists:"目录已存在 - 请确保您已备份全部数据",cannotWrite:"无法写入所选路径。",insufficientFreeSpace:"空间不足 - 最小可用空间",isOneDrive:"在OneDrive中安装可能会导致问题。强烈建议在非OneDrive位置安装。",insideAppInstallDir:"该文件夹位于 ComfyUI Desktop 应用程序包中,程序更新时会删除该文件夹。选择安装文件夹之外的目录,例如 Documents/ComfyUI。",insideUpdaterCache:"该文件夹位于 ComfyUI 更新缓存中,程序更新时会清除该缓存。为您的数据选择一个不同的位置。",nonDefaultDrive:"请在您的系统驱动器上安装ComfyUI(例如C:\\)。具有不同文件系统的驱动器可能会导致不可预测的问题。安装后,模型和其他文件可以存储在其他驱动器上。",parentMissing:"路径不存在 - 请先创建包含该路径的目录",unhandledError:"未知错误",installLocationDescription:"选择 ComfyUI 用户数据的存放目录。将安装一个 Python 环境到所选位置。请确保所选磁盘有足够的空间(约 15GB)。",installLocationTooltip:`ComfyUI 的用户数据目录。存储:
|
|
4
|
-
- Python 环境
|
|
5
|
-
- 模型
|
|
6
|
-
- 自定义节点
|
|
7
|
-
`,appDataLocationTooltip:`ComfyUI 的应用数据目录。存储:
|
|
8
|
-
- 日志
|
|
9
|
-
- 服务器配置`,appPathLocationTooltip:"ComfyUI 的应用资产目录。存储 ComfyUI 代码和资产",migrateFromExistingInstallation:"从现有安装迁移",migrationSourcePathDescription:"如果您已有现有的ComfyUI安装,我们可以复制/链接您现有的用户文件和模型到新的安装。您现有的ComfyUI安装将不会受到影响。",selectItemsToMigrate:"选择要迁移的项目",migrationOptional:"迁移是可选的。如果您之前没有安装过 ComfyUI,可以跳过此步骤。",desktopAppSettings:"桌面应用设置",desktopAppSettingsDescription:"配置 ComfyUI 在桌面上的行为。您可以稍后更改这些设置。",gpu:"GPU",gpuSelection:{selectGpu:"选择 GPU",selectGpuDescription:"选择你拥有的 GPU 类型",cpuMode:"CPU 模式",cpuModeDescription:"CPU 模式仅适用于开发者和极少数特殊情况。",cpuModeDescription2:"如果你不完全确定你需要这个,忽略该选项并在上面选择你的 GPU。",enableCpuMode:"启用 CPU 模式",nvidiaDescription:"NVIDIA 设备直接支持使用 pytorch CUDA 构建。",mpsDescription:"Apple Metal Performance Shaders 使用 pytorch nightly 支持。",customSkipsPython:"此选项跳过正常的 python 设置。",customComfyNeedsPython:"在 python 完成设置前,ComfyUI 将无法工作",customManualVenv:"手动配置 python 虚拟环境",customInstallRequirements:"安装所有需求和依赖项(例如:自定义 torch)",customMayNotWork:"完全不支持,可能无法工作"},manualConfiguration:{title:"手动配置",requirements:"依赖项",createVenv:"您需要在以下目录中创建虚拟环境",virtualEnvironmentPath:"虚拟环境路径",restartWhenFinished:"配置虚拟环境完成后,请重新启动ComfyUI。"},settings:{autoUpdate:"自动更新",allowMetrics:"使用情况指标",errorUpdatingConsent:"更新同意错误",errorUpdatingConsentDetail:"无法更新度量同意设置",autoUpdateDescription:"更新可用时自动更新。您将在安装更新之前收到通知。",allowMetricsDescription:"通过发送匿名使用情况指标来帮助改进ComfyUI。不会收集任何个人信息或工作流内容。",learnMoreAboutData:"了解更多关于数据收集的信息",dataCollectionDialog:{title:"关于数据收集",whatWeCollect:"我们收集的内容:",whatWeDoNotCollect:"我们不收集的内容:",collect:{errorReports:"错误报告和堆栈跟踪",systemInfo:"硬件,操作系统类型和应用版本",userJourneyEvents:"用户旅程事件"},doNotCollect:{personalInformation:"个人信息",fileSystemInformation:"文件系统信息",workflowContents:"工作流内容",customNodeConfigurations:"自定义节点配置"},viewFullPolicy:"查看完整政策"},pythonMirrorPlaceholder:"输入Python镜像URL",pypiMirrorPlaceholder:"输入PyPI镜像URL",checkingMirrors:"正在检查到Python镜像的网络访问...",mirrorsReachable:"到Python镜像的网络访问良好",mirrorsUnreachable:"对某些python镜像的网络访问不佳",mirrorSettings:"镜像设置"},customNodes:"自定义节点",customNodesDescription:"引用现有 ComfyUI 安装的自定义节点文件并安装其依赖项。",helpImprove:"请帮助我们改进ComfyUI",moreInfo:"有关更多信息,请阅读我们的",privacyPolicy:"隐私政策",metricsEnabled:"启用度量",metricsDisabled:"禁用度量",updateConsent:"您之前选择了报告崩溃。我们现在正在跟踪基于事件的度量,以帮助识别错误并改进应用程序。我们不收集任何个人可识别信息。"},u={initialising:"正在初始化..."},p={title:"启动 ComfyUI",troubleshoot:"故障排除",reportIssue:"报告问题",openLogs:"打开日志",showTerminal:"显示终端",copySelectionTooltip:"复制所选内容",copyAllTooltip:"全部复制",errorMessage:"无法启动 ComfyUI 桌面版",installation:{title:"正在安装 ComfyUI"},process:{"initial-state":"加载中...","python-setup":"正在设置 Python 环境...","starting-server":"正在启动 ComfyUI 服务器...",ready:"完成中...",error:"无法启动 ComfyUI 桌面版"}},m={modifiedConfigs:"您已修改以下服务器配置。重启以应用更改。",revertChanges:"撤销更改",restart:"重启",restartRequiredToastSummary:"需要重启",restartRequiredToastDetail:"重启软件应用设置。"},g={default:"默认",round:"圆角",CARD:"卡片",circle:"圆形",arrow:"箭头",box:"方框"},f={themeToggle:"切换主题",helpCenter:"帮助中心",logout:"登出",queue:"队列",nodeLibrary:"节点库",workflows:"工作流",templates:"模板",assets:"资产",mediaAssets:{title:"媒体资产",sortNewestFirst:"最新",sortOldestFirst:"最旧",sortLongestFirst:"生成时间(最慢)",sortFastestFirst:"生成时间(最快)",filterImage:"图像",filterVideo:"视频",filterAudio:"音频",filter3D:"3D"},backToAssets:"返回所有资产",searchAssets:"搜索资产",labels:{queue:"队列",nodes:"节点",models:"模型",assets:"资产",workflows:"工作流",templates:"模板",console:"控制台",menu:"菜单",imported:"已导入",generated:"已生成"},noFilesFound:"未找到文件",noImportedFiles:"未找到导入的文件",noGeneratedFiles:"未找到生成的文件",noFilesFoundMessage:"上传文件或生成内容以在此处查看",browseTemplates:"浏览示例模板",openWorkflow:"在本地文件系统中打开工作流",newBlankWorkflow:"创建空白工作流",nodeLibraryTab:{groupBy:"分组方式",sortMode:"排序模式",resetView:"重置视图为默认",groupStrategies:{category:"类别",categoryDesc:"按节点类别分组",module:"模块",moduleDesc:"按模块来源分组",source:"来源",sourceDesc:"按来源类型分组(核心,自定义,API)"},sortBy:{original:"原始顺序",originalDesc:"保持原始顺序",alphabetical:"字母顺序",alphabeticalDesc:"在分组内按字母顺序排序"}},modelLibrary:"模型库",downloads:"下载",queueProgressOverlay:{title:"队列进度",total:"全部:{percent}",colonPercent:":{percent}",currentNode:"当前节点:",viewAllJobs:"查看全部任务",running:"运行中",preview:"预览",interruptAll:"中断全部正在运行的任务",moreOptions:"更多设置",showAssets:"显示资产",showAssetsPanel:"显示资产面板",queuedSuffix:"已执行",clearQueued:"清除已执行",clearHistory:"清除任务记录",filterJobs:"筛选任务",filterBy:"筛选方式",filterAllWorkflows:"全部工作流",filterCurrentWorkflow:"当前工作流",sortJobs:"排序任务",sortBy:"排序方式",activeJobsSuffix:"活跃任务",jobQueue:"任务队列",expandCollapsedQueue:"展开任务队列",viewJobHistory:"查看任务记录",noActiveJobs:"无活跃任务",stubClipTextEncode:"CLIP文本编码:",jobsCompleted:"{count} 任务完成 | {count} 任务完成",jobsFailed:"{count} 任务失败 | {count} 任务失败",cancelJobTooltip:"取消任务",clearQueueTooltip:"清理队列",clearHistoryDialogTitle:"确定要清除任务记录?",clearHistoryDialogDescription:"以下所有已完成或失败的任务将从队列面板中删除。",clearHistoryDialogAssetsNote:"这些任务生成的资产不会被删除,并且始终可以在资产面板中查看。"},workflowTab:{confirmDeleteTitle:"删除工作流?",confirmDelete:"您确定要删除此工作流吗?",deleted:"工作流已删除",deleteFailedTitle:"删除失败",deleteFailed:"尝试删除工作流失败。",dirtyCloseTitle:"保存更改?",dirtyClose:"以下文件已被更改。您想在关闭之前保存它们吗?",dirtyCloseHint:"按住 Shift 关闭而不提示",confirmOverwriteTitle:"覆盖现有文件?",confirmOverwrite:"下面的文件已经存在。您想要覆盖它吗?",workflowTreeType:{browse:"浏览",bookmarks:"书签",open:"打开"}}},h={feedback:"提交反馈",docs:"文档",github:"Github",help:"帮助和支持",managerExtension:"管理扩展",more:"更多...",whatsNew:"新功能?",clickToLearnMore:"点击了解更多 →",loadingReleases:"加载发布信息...",recentReleases:"最近发布",noRecentReleases:"没有最近的发布",updateAvailable:"更新",desktopUserGuide:"桌面端用户指南",openDevTools:"打开开发者工具",reinstall:"重新安装",updateComfyUI:"更新 ComfyUI",updateComfyUIStarted:"更新开始",updateComfyUIStartedDetail:"正在更新 ComfyUI,请稍等...",updateComfyUISuccess:"更新完成",updateComfyUISuccessDetail:"ComfyUI 已更新,正在重启...",updateComfyUIFailed:"更新 ComfyUI 失败,请重试。"},y={newVersionAvailable:"新版本可用!",whatsNew:"新功能?",skip:"跳过",update:"更新",description:"在此更新中尝试最新的改进和功能。"},C={hideMenu:"隐藏菜单",showMenu:"显示菜单",batchCount:"批次数量",batchCountTooltip:"工作流生成次数",autoQueue:"自动执行",disabled:"禁用",disabledTooltip:"工作流将不会自动执行",instant:"实时",instantTooltip:"工作流将会在生成完成后立即执行",onChange:"更改时",onChangeTooltip:"一旦进行更改,工作流将添加到执行队列",runWorkflow:"运行工作流(Shift排在前面)",runWorkflowFront:"运行工作流(排在前面)",runWorkflowDisabled:"工作流包含不支持的节点(已用红色突出显示)。删除这些节点以运行工作流。",run:"运行",execute:"执行",interrupt:"取消当前任务",refresh:"刷新节点",clipspace:"打开剪贴板",resetView:"重置视图",clear:"清空工作流",toggleBottomPanel:"底部面板",theme:"主题",dark:"深色",light:"淺色",manageExtensions:"管理扩展功能",customNodesManager:"自定义节点管理器",settings:"设定",help:"说明",queue:"队列面板"},I={duplicateTab:"复制标签",closeTab:"关闭标签",closeTabsToLeft:"关闭左侧标签",closeTabsToRight:"关闭右侧标签",closeOtherTabs:"关闭其他标签",addToBookmarks:"添加到书签",removeFromBookmarks:"从书签中移除"},T={title:"从模板开始",loadingMore:"正在加载更多模板...",searchPlaceholder:"搜索模板...",category:{"ComfyUI Examples":"ComfyUI示例","Custom Nodes":"自定义节点",Basics:"基础",GettingStarted:"入门",Flux:"Flux",ControlNet:"ControlNet",Upscaling:"图像放大",Video:"视频生成",Image:"图像生成","Area Composition":"区域合成","3D":"3D",Audio:"音频生成",LLMs:"LLMs","Image API":"图像 API","Video API":"视频 API","LLM API":"LLM API",All:"所有模板",Extensions:"扩展","Partner Nodes":"合作伙伴节点","Generation Type":"生成类型"},categories:"分类",resetFilters:"清除筛选",sorting:"排序方式",activeFilters:"筛选条件:",loading:"正在加载模板...",noResults:"未找到模板",noResultsHint:"请尝试调整搜索或筛选条件",allTemplates:"全部模板",modelFilter:"模型筛选",useCaseFilter:"使用例",licenseFilter:"许可证",modelsSelected:"已选 {count} 个模型",useCasesSelected:"已选 {count} 个用例",runsOnSelected:"{count} 次运行",runsOnFilter:"运行于",resultsCount:"显示 {count} / 共 {total} 个模板",sort:{recommended:"推荐",alphabetical:"A → Z",newest:"最新",searchPlaceholder:"搜索...",vramLowToHigh:"VRAM 使用量(从低到高)",modelSizeLowToHigh:"模型大小(从低到高)",default:"默认"},error:{templateNotFound:'未找到模板 "{templateName}"'}},w={sort:{searchPlaceholder:"搜索中..."}},b={zoomIn:"放大",zoomOut:"缩小",resetView:"重置视图",fitView:"适应视图",selectMode:"选择模式",panMode:"平移模式",toggleMinimap:"切换小地图",select:"选择",hand:"拖拽",zoomOptions:"缩放选项",focusMode:"专注模式",hideLinks:"隐藏链接",showLinks:"显示链接",toggleLinkVisibility:"切换链接可见性"},S={label:"缩放控制",zoomToFit:"适合画面",showMinimap:"显示小地图",hideMinimap:"隐藏小地图"},D={create:"创建组节点",enterName:"输入名称"},A={saveAsTemplate:"另存为模板",enterName:"输入名称"},P={exportWorkflow:"导出工作流",enterFilename:"输入文件名",saveWorkflow:"保存工作流"},M={confirmDeleteTitle:"删除子工作流?",confirmDelete:"此操作将永久从您的库中移除该子工作流",saveBlueprint:"保存子工作流到节点库",overwriteBlueprintTitle:"覆盖现有子工作流?",overwriteBlueprint:"保存将用您的更改覆盖当前子工作流",blueprintName:"子工作流名称",promoteOutsideSubgraph:"不在子工作流中时无法提升小部件",publish:"发布子工作流",publishSuccess:"已保存到节点库",publishSuccessMessage:"您可以在节点库的“子工作流蓝图”下找到您的子工作流蓝图",loadFailure:"加载子工作流蓝图失败",shown:"节点上显示",showAll:"全部显示",hidden:"隐藏/嵌套参数",hideAll:"全部隐藏",showRecommended:"显示推荐控件"},k={inProgress:"进行中",pause:"暂停下载",paused:"已暂停",resume:"恢复下载",cancel:"取消下载",cancelled:"已取消"},v={title:"遮罩编辑器",invert:"反转",clear:"清除",undo:"撤回",redo:"重做",clickToResetZoom:"点击重置缩放",brushSettings:"笔刷设置",brushShape:"笔刷形状",colorSelector:"色彩选取",thickness:"厚度",opacity:"不透明度",hardness:"硬度",stepSize:"间距",smoothingPrecision:"预测平滑",resetToDefault:"重置为默认",paintBucketSettings:"填充设置",tolerance:"阈值",fillOpacity:"填充不透明度",colorSelectSettings:"色彩选取设置",selectionOpacity:"选取不透明度",livePreview:"实时预览",applyToWholeImage:"应用到图像整体",method:"方法",stopAtMask:"遇到遮罩时停止",maskTolerance:"遮罩阈值",layers:"图层",maskLayer:"遮罩层",maskOpacity:"遮罩不透明度",imageLayer:"图像层",maskBlendingOptions:"遮罩混合设置",paintLayer:"绘画层",baseImageLayer:"基础图像层",activateLayer:"活跃层",baseLayerPreview:"基础图像层预览",black:"黑",white:"白",negative:"负面"},U={runWorkflow:"运行工作流",runWorkflowFront:"运行工作流(队列前端)",run:"运行",execute:"执行",interrupt:"取消当前运行",refresh:"刷新节点定义",clipspace:"打开 Clipspace",resetView:"重置画布视图",clear:"清空工作流",toggleBottomPanel:"切换底部面板",theme:"主题",dark:"深色",light:"浅色",manageExtensions:"管理扩展",settings:"设置",help:"帮助",queue:"队列面板"},L={initializingAlmostReady:"初始化中 - 即将完成",inQueue:"正在执行...",jobAddedToQueue:"任务添加到队列",completedIn:"{duration} 后完成",jobMenu:{openAsWorkflowNewTab:"在新标签页中读取工作流",openWorkflowNewTab:"在新标签页中打开工作流",copyJobId:"复制任务ID",cancelJob:"取消任务",inspectAsset:"查看资产",addToCurrentWorkflow:"添加到当前工作流",download:"下载",exportWorkflow:"导出工作流",delete:"删除",deleteAsset:"删除资产",removeJob:"移除任务",copyErrorMessage:"复制报错信息",reportError:"反馈报错"},jobList:{undated:"无日期",sortMostRecent:"最新",sortTotalGenerationTime:"生成时间(最慢)",sortComputeHoursUsed:"计算用时(最先)"},jobDetails:{header:"任务细节",workflow:"工作流",jobId:"任务ID",queuedAt:"执行于",queuePosition:"队列位置",timeElapsed:"耗时",estimatedStartIn:"预计开始于",estimatedFinishIn:"预计完成于",generatedOn:"生成于",totalGenerationTime:"总生成时间",computeHoursUsed:"计算耗时",failedAfter:"失败于",errorMessage:"报错信息",report:"反馈",queuePositionValue:"在您前方有 ~{count} 个任务 | 在您前方有 ~{count} 个任务",eta:{seconds:"~{count} 秒 | ~{count} 秒",secondsRange:"~{lo}-{hi} 秒",minutes:"~{count} 分钟 | ~{count} 分钟",minutesRange:"~{lo}-{hi} 分钟"}}},N={File:"文件",Edit:"编辑",View:"视图",Help:"帮助","Check for Updates":"检查更新","Open Custom Nodes Folder":"打开自定义节点文件夹","Open Inputs Folder":"打开输入文件夹","Open Logs Folder":"打开日志文件夹","Open extra_model_paths_yaml":"打开 extra_model_paths.yaml","Open Models Folder":"打开模型文件夹","Open Outputs Folder":"打开输出文件夹","Open DevTools":"打开开发者工具","Desktop User Guide":"桌面端用户手册",Quit:"退出",Reinstall:"重装",Restart:"重启","Open 3D Viewer (Beta) for Selected Node":"为选中节点打开3D查看器(测试版)","Experimental: Browse Model Assets":"实验性:浏览模型资产","Browse Templates":"浏览模板","Delete Selected Items":"删除选定的项目","Zoom to fit":"缩放以适应","Lock Canvas":"锁定画布","Move Selected Nodes Down":"下移所选节点","Move Selected Nodes Left":"左移所选节点","Move Selected Nodes Right":"右移所选节点","Move Selected Nodes Up":"上移所选节点","Reset View":"重置视图","Resize Selected Nodes":"调整选定节点的大小","Node Links":"节点连接","Canvas Toggle Lock":"切换视图锁定",Minimap:"小地图","Pin/Unpin Selected Items":"固定/取消固定选定项目","Bypass/Unbypass Selected Nodes":"忽略/取消忽略选定节点","Collapse/Expand Selected Nodes":"折叠/展开选定节点","Mute/Unmute Selected Nodes":"静音/取消静音选定节点","Pin/Unpin Selected Nodes":"固定/取消固定选定节点","Unlock Canvas":"解除锁定画布","Zoom In":"放大画面","Zoom Out":"缩小画面","Clear Pending Tasks":"清除待处理任务","Clear Workflow":"清除工作流","Contact Support":"联系支持","Show Model Selector (Dev)":"显示模型选择器(开发用)","Duplicate Current Workflow":"复制当前工作流",Export:"导出","Export (API)":"导出 (API)","Convert Selection to Subgraph":"将选中内容转换为子工作流","Edit Subgraph Widgets":"编辑子工作流组件","Exit Subgraph":"退出子工作流","Fit Group To Contents":"适应组内容","Group Selected Nodes":"将选中节点转换为组节点","Toggle promotion of hovered widget":"切换悬停小部件的提升","Unpack the selected Subgraph":"解包选中子工作流","Convert selected nodes to group node":"将选中节点转换为组节点","Manage group nodes":"管理组节点","Ungroup selected group nodes":"解散选中组节点","About ComfyUI":"关于ComfyUI","Comfy-Org Discord":"Comfy-Org Discord","ComfyUI Docs":"ComfyUI 文档","ComfyUI Forum":"ComfyUI 论坛","ComfyUI Issues":"ComfyUI 问题",Interrupt:"中断","Load Default Workflow":"加载默认工作流","Custom Nodes Manager":"自定义节点管理器","Custom Nodes (Legacy)":"自定义节点(旧版)","Manager Menu (Legacy)":"管理菜单(旧版)","Install Missing Custom Nodes":"安装缺失的自定义节点","Check for Custom Node Updates":"检查自定义节点更新","Toggle the Custom Nodes Manager Progress Bar":"切换自定义节点管理器进度条","Decrease Brush Size in MaskEditor":"在 MaskEditor 中减小笔刷大小","Increase Brush Size in MaskEditor":"在 MaskEditor 中增大笔刷大小","Open Mask Editor for Selected Node":"为选中节点打开 Mask 编辑器","Unload Models":"卸载模型","Unload Models and Execution Cache":"卸载模型和执行缓存",New:"新建",Clipspace:"剪贴空间",Manager:"管理器",Open:"打开",Publish:"发布","Queue Prompt":"执行提示词","Queue Prompt (Front)":"执行提示词 (优先执行)","Queue Selected Output Nodes":"将所选输出节点加入队列",Redo:"重做","Refresh Node Definitions":"刷新节点定义",Save:"保存","Save As":"另存为","Show Settings Dialog":"显示设置对话框","Experimental: Enable AssetAPI":"实验性:启用 AssetAPI","Canvas Performance":"画布性能","Help Center":"帮助中心","toggle linear mode":"切换线性模式","Toggle Theme (Dark/Light)":"切换主题(暗/亮)",Undo:"撤销","Open Sign In Dialog":"打开登录对话框","Sign Out":"退出登录","Experimental: Enable Nodes 2_0":"实验性:启用 Nodes 2.0","Close Current Workflow":"关闭当前工作流","Next Opened Workflow":"下一个打开的工作流","Previous Opened Workflow":"上一个打开的工作流","Toggle Search Box":"切换搜索框","Bottom Panel":"底部面板","Show Keybindings Dialog":"显示快捷键对话框","Toggle Terminal Bottom Panel":"切换终端底部面板","Toggle Logs Bottom Panel":"切换日志底部面板","Toggle Essential Bottom Panel":"切换基础底部面板","Toggle View Controls Bottom Panel":"切换视图控制底部面板","Focus Mode":"专注模式",Assets:"资产","Model Library":"模型库","Node Library":"节点库",Workflows:"工作流"},E={reinstall:"重新安装",confirmReinstall:"这将清除您的 extra_models_config.yaml 文件,并重新开始安装。您确定吗?",quit:"退出",confirmQuit:"有未保存的工作流开启;任何未保存的更改都将丢失。忽略此警告并退出?"},R={"Comfy-Desktop":"Comfy桌面版",General:"常规",Appearance:"外观",ColorPalette:"色彩主题",Comfy:"Comfy",Workflow:"工作流",DevMode:"开发模式",LiteGraph:"画面","Node Widget":"节点组件",Node:"节点",Extension:"扩展",Canvas:"画布",Link:"连线",Group:"组",Menu:"菜单",Keybinding:"快捷键",LinkRelease:"释放链接",Graph:"画面",Locale:"区域设置","Mask Editor":"遮罩编辑器",BrushAdjustment:"画笔调整",ModelLibrary:"模型库",NodeLibrary:"节点库","Node Search Box":"节点搜索框",Pointer:"指针",Queue:"队列",QueueButton:"执行按钮",RerouteBeta:"转接点 Beta",Server:"服务器",Settings:"设置",Sidebar:"侧边栏","Tree Explorer":"树形浏览器",Validation:"验证",Window:"窗口","Server-Config":"服务器配置",About:"关于",EditTokenWeight:"编辑令牌权重",CustomColorPalettes:"自定义色彩主题",UV:"UV",ContextMenu:"上下文菜单",Reroute:"重新路由","Load 3D":"加载3D",Camera:"相机",Scene:"场景","3D":"3D",Light:"光照",User:"用户",Credits:"积分","API Nodes":"API 节点","Notification Preferences":"通知偏好","3DViewer":"3D查看器","Canvas Navigation":"画布导航",PlanCredits:"计划与积分","Vue Nodes":"Nodes 2.0",VueNodes:"Nodes 2.0","Nodes 2_0":"Nodes 2.0",Execution:"执行",PLY:"PLY"},F={listen:{name:"主机:要监听的IP地址"},port:{name:"端口:要监听的端口"},"tls-keyfile":{name:"TLS 密钥文件:HTTPS 的 TLS 密钥文件路径"},"tls-certfile":{name:"TLS 证书文件:HTTPS 的 TLS 证书文件路径"},"enable-cors-header":{name:'启用 CORS header:使用 "*" 代表所有来源或指定域名'},"max-upload-size":{name:"最大上传大小 (MB)"},"cuda-device":{name:"要使用的 CUDA 设备索引"},"cuda-malloc":{name:"使用 CUDA malloc 进行内存分配"},"global-precision":{name:"全局浮点精度",tooltip:"全局浮点精度"},"unet-precision":{name:"UNET 精度",tooltip:"UNET 精度"},"vae-precision":{name:"VAE 精度",tooltip:"VAE 精度"},"cpu-vae":{name:"在 CPU 上运行 VAE"},"text-encoder-precision":{name:"文本编码器精度",tooltip:"文本编码器精度"},"force-channels-last":{name:"强制使用 channels-last 内存格式"},directml:{name:"DirectML 设备索引"},"disable-ipex-optimize":{name:"禁用 IPEX 优化"},"preview-method":{name:"用于潜空间预览的方法"},"preview-size":{name:"预览图像的大小"},"cache-classic":{name:"使用经典缓存系统"},"cache-lru":{name:"使用 LRU 缓存,最多缓存 N 个节点结果。",tooltip:"可能会使用更多的 RAM/VRAM。"},"cross-attention-method":{name:"交叉注意力方法"},"disable-xformers":{name:"禁用 xFormers 优化"},"force-upcast-attention":{name:"强制 upcast-attention"},"dont-upcast-attention":{name:"不使用 upcast-attention"},"vram-management":{name:"VRAM 管理模式"},"reserve-vram":{name:"保留 VRAM (GB)",tooltip:"设置您希望为操作系统/其他软件保留的 VRAM (GB)。默认会根据系统类型保留一定数量。"},"default-hashing-function":{name:"模型文件的默认哈希函数"},"disable-smart-memory":{name:"禁用智能内存管理",tooltip:"强制 ComfyUI 在可以时将模型从 VRAM 移出到常规 RAM。"},deterministic:{name:"使 pytorch 在可以时使用较慢的确定性算法。",tooltip:"请注意,这可能不会在所有情况下使图像具有确定性。"},fast:{name:"启用一些未经测试且可能降低质量的优化。"},"dont-print-server":{name:"不将服务器输出打印到控制台。"},"disable-metadata":{name:"禁用在文件中保存提示元数据。"},"enable-manager-legacy-ui":{name:"使用旧版管理器UI",tooltip:"是用旧版 ComfyUI-Manager UI。"},"disable-all-custom-nodes":{name:"禁用加载所有自定义节点。"},"log-level":{name:"日志详细级别"},"input-directory":{name:"输入目录"},"output-directory":{name:"输出目录"}},x={Network:"网络",CUDA:"CUDA",Inference:"推理",Memory:"内存",Preview:"预览",Cache:"缓存",Attention:"注意力",General:"常规",Directories:"目录"},O={_for_testing:"_用于测试",custom_sampling:"自定义采样",noise:"噪波",dataset:"dataset",text:"文本",image:"图像",sampling:"采样",schedulers:"调度器",audio:"音频",conditioning:"条件",loaders:"加载器",guiders:"引导器","api node":"api 节点",video:"视频",ByteDance:"字节跳动",preprocessors:"预处理器",utils:"工具",string:"字符串",advanced:"高级",guidance:"引导",model_merging:"模型合并",model_patches:"模型微调",chroma_radiance:"chroma_radiance",attention_experiments:"注意力实验",flux:"Flux",kandinsky5:"kandinsky5",hooks:"约束",combine:"组合","cond single":"条件单",context:"上下文",controlnet:"ControlNet",inpaint:"局部重绘",scheduling:"调度",create:"创建",mask:"遮罩",deprecated:"已弃用",debug:"调试",model:"模型",latent:"Latent","3d":"3d",ltxv:"LTXV",qwen:"Qwen千问",sd3:"SD3",unet:"U-Net",sigmas:"Sigmas",BFL:"BFL",Gemini:"Gemini",video_models:"视频模型",gligen:"GLIGEN",sd:"sd",Ideogram:"Ideogram",postprocessing:"后处理",transform:"变换",batch:"批处理",upscaling:"放大",instructpix2pix:"InstructPix2Pix",compositing:"合成",Kling:"Kling",samplers:"采样器",operations:"操作",training:"训练",lotus:"lotus",LTXV:"LTXV",Luma:"Luma",MiniMax:"MiniMax",model_specific:"模型特定","Moonvalley Marey":"Moonvalley Marey",OpenAI:"OpenAI",Sora:"Sora","cond pair":"条件对",photomaker:"PhotoMaker",PixVerse:"PixVerse",primitive:"基础",Recraft:"Recraft",edit_models:"编辑模型",Rodin:"Rodin",Runway:"Runway",animation:"动画",api:"API",save:"保存",upscale_diffusion:"放大扩散",clip:"CLIP","Stability AI":"Stability AI",stable_cascade:"StableCascade","3d_models":"3D模型",style_model:"风格模型",Topaz:"Topaz",Tripo:"Tripo",Veo:"Veo",Vidu:"Vidu","":"",camera:"相机",Wan:"Wan万相",zimage:"zimage"},_={"*":"*",AUDIO:"音频",AUDIO_ENCODER:"音频编码器",AUDIO_ENCODER_OUTPUT:"音频编码器输出",AUDIO_RECORD:"音频录制",BOOLEAN:"布尔",CAMERA_CONTROL:"相机控制",CLIP:"CLIP",CLIP_VISION:"CLIP视觉",CLIP_VISION_OUTPUT:"CLIP视觉输出",COMBO:"组合",CONDITIONING:"条件",CONTROL_NET:"ControlNet",FLOAT:"浮点",FLOATS:"浮点组",GEMINI_INPUT_FILES:"GEMINI 输入文件",GLIGEN:"GLIGEN",GUIDER:"引导器",HOOK_KEYFRAMES:"约束关键帧",HOOKS:"约束",IMAGE:"图像",INT:"整数",LATENT:"Latent",LATENT_OPERATION:"Latent操作",LATENT_UPSCALE_MODEL:"LATENT_UPSCALE_MODEL",LOAD_3D:"加载3D",LOAD3D_CAMERA:"加载3D相机",LORA_MODEL:"LORA模型",LOSS_MAP:"损失图",LUMA_CONCEPTS:"Luma 概念",LUMA_REF:"Luma 参考",MASK:"遮罩",MESH:"网格",MODEL:"模型",MODEL_PATCH:"模型补丁",MODEL_TASK_ID:"模型任务ID",NOISE:"噪波",OPENAI_CHAT_CONFIG:"OpenAI对话文件",OPENAI_INPUT_FILES:"OpenAI输入文件",PHOTOMAKER:"PhotoMaker",PIXVERSE_TEMPLATE:"Pixverse 模板",RECRAFT_COLOR:"Recraft 颜色",RECRAFT_CONTROLS:"Recraft 控件",RECRAFT_V3_STYLE:"Recraft V3 风格",RETARGET_TASK_ID:"重定向任务ID",RIG_TASK_ID:"RIG_TASK_ID",SAMPLER:"采样器",SIGMAS:"Sigmas",STRING:"字符串",STYLE_MODEL:"风格模型",SVG:"SVG",TIMESTEPS_RANGE:"时间间隔范围",TRACKS:"TRACKS",UPSCALE_MODEL:"放大模型",VAE:"VAE",VIDEO:"视频",VOXEL:"体素",WAN_CAMERA_EMBEDDING:"WAN 摄像头嵌入",WEBCAM:"摄像头"},B={title:"维护",allOk:"未检测到任何问题。",status:"状态",detected:"检测到",refreshing:"刷新中",None:"无",OK:"确定",Skipped:"跳过",showManual:"显示维护任务",confirmTitle:"你确定吗?",terminalDefaultMessage:"当你运行一个故障排除命令时,任何输出都会在这里显示。",consoleLogs:"控制台日志",error:{toastTitle:"任务错误",taskFailed:"任务运行失败。",cannotContinue:"无法继续 - 仍有错误",defaultDescription:"运行维护任务时发生错误。"},unsafeMigration:{title:"检测到安装路径不安全",generic:"您当前的 ComfyUI 基本路径所在的位置可能会在更新期间被删除或修改。为避免数据丢失,请将其移至安全文件夹。",appInstallDir:"您当前的 ComfyUI 基本路径位于 ComfyUI Desktop 应用程序包中,程序更新时会删除该文件夹。选择安装文件夹之外的目录,例如 Documents/ComfyUI。",updaterCache:"您当前的 ComfyUI 基本路径位于 ComfyUI 更新缓存中,程序更新时会清除该缓存。为您的数据选择一个不同的位置。",oneDrive:"您当前的 ComfyUI 基本路径在 OneDrive上,这可能会导致同步问题和意外的数据丢失。选择一个不受 OneDrive 管理的本地文件夹。",action:'使用下方的 "基本路径" 维护将路径移动到安全位置。'}},V={doNotAskAgain:"不再显示此消息",missingModels:"缺少模型",missingModelsMessage:"加载工作流时,未找到以下模型"},G={title:"版本相容性警告",frontendOutdated:"前端版本 {frontendVersion} 已过时。后端需要 {requiredVersion} 版或更高版本。",frontendNewer:"前端版本 {frontendVersion} 可能与后端版本 {backendVersion} 不相容。",updateFrontend:"更新前端",dismiss:"关闭"},W={outdatedVersion:"这个工作流由新版 ComfyUI({version})创建,部分节点可能无法正常运行。",outdatedVersionGeneric:"这个工作流由新版 ComfyUI 创建,部分节点可能无法正常运行。",coreNodesFromVersion:"核心节点来源于 {version} 版本。"},q={defaultTitle:"发生错误",loadWorkflowTitle:"由于重新加载工作流数据出错,加载被中止",noStackTrace:"无可用堆栈跟踪",extensionFileHint:"这可能是由于以下脚本",promptExecutionError:"提示执行失败"},H={title:"使用API节点需要登录",message:"此工作流包含API节点,需要您登录账户才能运行。"},z={title:"API节点",costPerRun:"每次运行的成本",totalCost:"总成本"},K={title:"正在更新ComfyUI桌面",description:"ComfyUI桌面正在安装新的依赖项。这可能需要几分钟的时间。",terminalDefaultMessage:"更新过程中的任何控制台输出都将在这里显示。",updateFoundTitle:"找到更新 (v{version})",updateAvailableMessage:"有可用的更新。您现在要重启并更新吗?",noUpdateFound:"未发现更新",errorCheckingUpdate:"检查更新时出错",errorInstallingUpdate:"安装更新时出错"},j={successMessage:"已复制到剪贴板",errorMessage:"复制到剪贴板失败",errorNotSupported:"您的浏览器不支持剪贴板API"},Q={noImages:"没有可以对比的图像"},J={switchCamera:"切换摄影机类型",showGrid:"显示网格",backgroundColor:"背景颜色",lightIntensity:"光照强度",fov:"视场",previewOutput:"预览输出",uploadBackgroundImage:"上传背景图片",removeBackgroundImage:"移除背景图片",tiledMode:"分快",panoramaMode:"全景",loadingModel:"正在加载3D模型...",upDirection:"上方向",materialMode:"材质模式",scene:"场景",model:"模型",camera:"摄影机",light:"灯光",switchingMaterialMode:"切换材质模式中...",edgeThreshold:"边缘阈值",export:"导出",exportModel:"导出模型",exportingModel:"正在导出模型...",reloadingModel:"正在重新加载模型...",uploadTexture:"上传纹理",applyingTexture:"应用纹理中...",materialModes:{normal:"法线",wireframe:"线框",original:"原始",pointCloud:"点云",depth:"深度",lineart:"线稿"},upDirections:{original:"原始"},startRecording:"开始录制",stopRecording:"停止录制",exportRecording:"导出录制",clearRecording:"清除录制",resizeNodeMatchOutput:"调整节点以匹配输出",loadingBackgroundImage:"正在加载背景图像",cameraType:{perspective:"透视",orthographic:"正交"},viewer:{title:"3D 查看器(测试版)",apply:"应用",cancel:"取消",cameraType:"相机类型",sceneSettings:"场景设置",cameraSettings:"相机设置",lightSettings:"灯光设置",exportSettings:"导出设置",modelSettings:"模型设置"},openIn3DViewer:"在 3D 查看器中打开",dropToLoad:"拖放 3D 模型以加载",unsupportedFileType:"不支持的文件类型(支持 .gltf、.glb、.obj、.fbx、.stl)",uploadingModel:"正在上传3D模型..."},Y={nothingToQueue:"没有可加入队列的内容",pleaseSelectOutputNodes:"请选择输出节点",failedToQueue:"排队失败",failedExecutionPathResolution:"无法解析所选节点的路径",no3dScene:"没有3D场景可以应用纹理",failedToApplyTexture:"应用纹理失败",no3dSceneToExport:"没有3D场景可以导出",failedToExportModel:"无法将模型导出为 {format}",exportSuccess:"成功将模型导出为 {format}",fileLoadError:"无法在 {fileName} 中找到工作流",dropFileError:"无法处理掉落的项目:{error}",interrupted:"执行已被中断",pendingTasksDeleted:"待处理任务已删除",nothingToGroup:"没有可分组的内容",pleaseSelectNodesToGroup:"请选取节点(或其他组)以创建分组",emptyCanvas:"画布为空",fileUploadFailed:"文件上传失败",unableToGetModelFilePath:"无法获取模型文件路径",couldNotDetermineFileType:"无法确定文件类型",errorLoadingModel:"加载模型出错",failedToDownloadFile:"文件下载失败",updateRequested:"已请求更新",nodeDefinitionsUpdated:"节点定义已更新",errorSaveSetting:"保存设置 {id} 出错:{err}",errorCopyImage:"复制图片出错:{error}",noTemplatesToExport:"没有模板可以导出",failedToFetchLogs:"无法获取服务器日志",migrateToLitegraphReroute:"将来的版本中将删除重定向节点。点击以迁移到litegraph-native重定向。",legacyMaskEditorDeprecated:"旧版遮罩编辑器已弃用,即将删除。",userNotAuthenticated:"用户未认证",failedToFetchBalance:"获取余额失败:{error}",failedToCreateCustomer:"创建客户失败:{error}",failedToInitiateCreditPurchase:"发起积分购买失败:{error}",failedToAccessBillingPortal:"访问账单门户失败:{error}",failedToPurchaseCredits:"购买积分失败:{error}",failedToFetchSubscription:"获取订阅状态失败:{error}",failedToInitiateSubscription:"订阅启动失败:{error}",unauthorizedDomain:"您的域名 {domain} 未被授权使用此服务。请联系 {email} 将您的域名添加到白名单。",useApiKeyTip:"提示:无法正常登录?请使用 Comfy API Key 选项。",nothingSelected:"未选择任何内容",cannotCreateSubgraph:"无法创建子工作流",failedToConvertToSubgraph:"无法将项目转换为子工作流",failedToInitializeLoad3dViewer:"初始化3D查看器失败",failedToLoadBackgroundImage:"无法加载背景图片",failedToLoadModel:"无法加载3D模型",modelLoadedSuccessfully:"3D模型加载成功",failedToUpdateBackgroundColor:"更新背景色失败",failedToToggleGrid:"切换网格失败",failedToToggleCamera:"切换镜头失败",failedToUpdateFOV:"更新FOV失败",failedToUpdateLightIntensity:"更新光照强度失败",failedToUpdateBackgroundImage:"更新背景图像失败",failedToUpdateUpDirection:"更新向上轴失败",failedToUpdateMaterialMode:"更新材质模式失败",failedToUpdateEdgeThreshold:"更新边缘阈值失败",failedToUploadBackgroundImage:"上传背景图像失败",failedToUpdateBackgroundRenderMode:"切换背景模式到 {mode} 失败"},Z={render:"节点渲染错误",content:"节点内容错误",header:"节点头错误",slots:"节点接口错误",widgets:"节点组件错误"},X={apiKey:{title:"API 密钥",label:"API 密钥",description:"使用您的 Comfy API 密钥以启用 API 节点",placeholder:"请输入您的 API 密钥",error:"无效的 API 密钥",storageFailed:"API 密钥存储失败",storageFailedDetail:"请重试。",stored:"API 密钥已存储",storedDetail:"您的 API 密钥已成功存储",cleared:"API 密钥已清除",clearedDetail:"您的 API 密钥已成功清除",invalid:"无效的 API 密钥",invalidDetail:"请输入有效的 API 密钥",helpText:"需要 API 密钥?",generateKey:"在这里获取",whitelistInfo:"关于非白名单网站"},login:{title:"登录您的账户",useApiKey:"Comfy API 密钥",signInOrSignUp:"登录 / 注册",forgotPasswordError:"发送重置密码邮件失败",passwordResetSent:"重置密码邮件已发送",passwordResetSentDetail:"请查收您的电子邮件,点击链接重置密码。",newUser:"新用户?",userAvatar:"用户头像",signUp:"注册",emailLabel:"电子邮件",emailPlaceholder:"输入您的电子邮件",passwordLabel:"密码",passwordPlaceholder:"输入您的密码",confirmPasswordLabel:"确认密码",confirmPasswordPlaceholder:"再次输入相同的密码",forgotPassword:"忘记密码?",passwordResetInstructions:"请输入您的电子邮件地址,我们将向您发送重置密码的链接。",sendResetLink:"发送重置链接",backToLogin:"返回登录",didntReceiveEmail:"没有收到邮件?请联系我们:",passwordResetError:"发送密码重置邮件失败。请重试。",loginButton:"登录",orContinueWith:"或者继续使用",loginWithGoogle:"使用Google登录",loginWithGithub:"使用Github登录",termsText:"点击“下一步”或“注册”即表示您同意我们的",termsLink:"使用条款",andText:"和",privacyLink:"隐私政策",success:"登录成功",failed:"登录失败",insecureContextWarning:"此连接不安全(HTTP)—如果继续登录,您的凭据可能会被攻击者拦截。",questionsContactPrefix:"有疑问?请联系我们:",noAssociatedUser:"所提供的 API 密钥未关联任何 Comfy 用户"},signup:{title:"创建一个账户",alreadyHaveAccount:"已经有账户了?",emailLabel:"电子邮件",emailPlaceholder:"输入您的电子邮件",passwordLabel:"密码",passwordPlaceholder:"输入新密码",signUpButton:"注册",signIn:"登录",signUpWithGoogle:"使用Google注册",signUpWithGithub:"使用Github注册",regionRestrictionChina:"根据当地法规要求,我们暂时无法为中国地区的用户提供服务。",personalDataConsentLabel:"我同意处理我的个人数据。"},signOut:{signOut:"退出登录",success:"成功退出登录",successDetail:"您已成功退出账户。"},passwordUpdate:{success:"密码已更新",successDetail:"您的密码已成功更新"},errors:{"auth/invalid-email":"请输入有效的电子邮件地址。","auth/user-disabled":"此账户已被禁用。请联系客服。","auth/user-not-found":"未找到使用此电子邮件的账户。您想要创建一个新账户吗?","auth/wrong-password":"您输入的密码不正确,请重试。","auth/email-already-in-use":"已存在使用此电子邮件的账户。请尝试登录。","auth/weak-password":"密码强度太弱。请使用至少6个字符的更强密码。","auth/too-many-requests":"登录尝试次数过多。请稍等片刻再试。","auth/operation-not-allowed":"此登录方法目前不受支持。","auth/invalid-credential":"登录凭据无效。请检查您的邮箱和密码。","auth/network-request-failed":"网络错误。请检查您的连接并重试。","auth/popup-closed-by-user":"登录已取消。请重试。","auth/cancelled-popup-request":"登录已取消。请重试。"},deleteAccount:{deleteAccount:"删除账户",confirmTitle:"删除账户",confirmMessage:"您确定要删除您的账户吗?此操作无法撤销,并且会永久删除您的所有数据。",confirm:"删除账户",cancel:"取消",success:"账户已删除",successDetail:"您的账户已成功删除。"},reauthRequired:{title:"需要重新认证",message:"出于安全原因,此操作需要您重新登录。是否继续?",confirm:"重新登录",cancel:"取消"},loginButton:{tooltipHelp:"登录以使用“API 节点”",tooltipLearnMore:"了解更多..."}},$={invalidEmail:"无效的电子邮件地址",required:"必填",minLength:"必须至少有{length}个字符",maxLength:"不能超过{length}个字符",prefix:"必须以 {prefix} 开头",descriptionRequired:"描述是必填的",length:"必须为{length}个字符",password:{requirements:"密码要求",minLength:"必须在8到32个字符之间",uppercase:"必须包含至少一个大写字母",lowercase:"必须包含至少一个小写字母",number:"必须包含至少一个数字",special:"必须包含至少一个特殊字符",match:"密码必须匹配"},personalDataConsentRequired:"您必须同意处理您的个人数据。"},ee={activity:"活动",credits:"积分",yourCreditBalance:"您的积分余额",purchaseCredits:"购买积分",invoiceHistory:"发票历史",apiPricing:"API 价格",faqs:"常见问题",messageSupport:"联系客服",lastUpdated:"最近更新",topUp:{insufficientTitle:"积分不足",insufficientMessage:"您的积分不足,无法运行此工作流。",quickPurchase:"快速购买",maxAmount:"(最高 $1,000 美元)",buyNow:"立即购买",seeDetails:"查看详情",topUp:"充值",addMoreCredits:"获取更多积分",addMoreCreditsToRun:"获取更多积分来运行",insufficientWorkflowMessage:"您的积分不足以运行该工作流。",creditsDescription:"该工作流需要积分运行。",howManyCredits:"您想要多少积分?",videosEstimate:"~{count} 个视频*",templateNote:"*使用 Wan Fun Control 模板生成",buy:"购买",purchaseError:"购买失败",purchaseErrorDetail:"购买积分失败:{error}",unknownError:"发生未知错误"},creditsAvailable:"积分可用",refreshes:"于 {date} 刷新",eventType:"事件类型",details:"详情",time:"时间",additionalInfo:"附加信息",model:"模型",added:"已添加",accountInitialized:"账户已初始化",unified:{message:"积分已合并",tooltip:`我们统一了 Comfy 的支付方式。现在全部使用 Comfy 积分 :
|
|
10
|
-
- 合作节点(API节点)
|
|
11
|
-
- Cloud 工作流
|
|
12
|
-
|
|
13
|
-
您现有的合作伙伴节点积分将自动转换为 Comfy 积分。`}},oe={title:"订阅",titleUnsubscribed:"订阅 Comfy Cloud",comfyCloud:"Comfy 云",comfyCloudLogo:"Comfy Cloud Logo",beta:"测试版",perMonth:"美元 / 月",usdPerMonth:"USD / mo",renewsDate:"将于 {date} 续订",expiresDate:"于 {date} 过期",manageSubscription:"管理订阅",partnerNodesBalance:'"合作伙伴节点"积分余额',partnerNodesDescription:"用于运行商业/专有模型",totalCredits:"总积分",viewUsageHistory:"查看使用历史",addApiCredits:"添加API额度",addCredits:"添加积分",monthlyCreditsRollover:"这些积分将结转到下个月",monthlyBonusDescription:"每月积分奖励",prepaidDescription:"预付款额度",prepaidCreditsInfo:"单独购买且不会过期的积分",creditsRemainingThisMonth:"本月剩余积分",creditsRemainingThisYear:"今年剩余积分",creditsYouveAdded:"你获得的积分",monthlyCreditsInfo:"积分每月刷新,不会保留",viewMoreDetailsPlans:"查看有关订阅和定价的更多信息",nextBillingCycle:"下一个计费周期",yourPlanIncludes:"您的计划包括:",viewMoreDetails:"查看更多详情",learnMore:"了解更多",billedMonthly:"每月付款",billedYearly:"{total} 每年付款",monthly:"月度",yearly:"年度",tierNameYearly:"{name} 年度",messageSupport:"消息支持",invoiceHistory:"发票历史",benefits:{benefit1:"合作伙伴节点的月度积分 — 按需充值",benefit2:"每个队列最长运行 30 分钟"},yearlyDiscount:"20% 减免",tiers:{founder:{name:"Founder's Edition"},standard:{name:"Standard"},creator:{name:"Creator"},pro:{name:"Pro"}},required:{title:"订阅",waitingForSubscription:"请在新标签页中完成订阅。我们会自动检测到您已完成!",subscribe:"订阅"},subscribeToRun:"订阅",subscribeToRunFull:"订阅 Run",subscribeNow:"立即订阅",subscribeToComfyCloud:"订阅 Comfy Cloud",description:"选择最适合您的订阅计划",haveQuestions:"对企业级有疑问?",contactUs:"联系我们",viewEnterprise:"查看企业",partnerNodesCredits:"合作伙伴节点积分",plansAndPricing:"订阅和定价",managePlan:"管理订阅",upgrade:"升级",mostPopular:"最受欢迎",currentPlan:"当前订阅计划",subscribeTo:"订阅 {plan}",monthlyCreditsLabel:"每月积分",yearlyCreditsLabel:"总共年度积分",maxDurationLabel:"运行单个工作流的最大时长",gpuLabel:"RTX 6000 Pro (96GB VRAM)",addCreditsLabel:"随时获取更多积分",customLoRAsLabel:"导入您的 Lora",videoEstimateLabel:"可使用 Wan Fun Control 模板生成 5 秒视频的数量",videoEstimateHelp:"这是什么?",videoEstimateExplanation:"这些预估基于 Wan Fun Control 生成 5 秒视频。",videoEstimateTryTemplate:"试试 Wan Fun Control template →",upgradePlan:"升级订阅",upgradeTo:"升级到 {plan}",changeTo:"更改为 {plan}",maxDuration:{standard:"30 分钟",creator:"30 分钟",pro:"1 小时",founder:"30 分钟"}},te={title:"我的用户设置",accountSettings:"用户设置",name:"名称",email:"电子邮件",provider:"登录方式",notSet:"未设置",updatePassword:"更新密码"},ie={executeButton:{tooltip:"执行到选定的输出节点(用橙色边框高亮显示)",disabledTooltip:"未选择输出节点"},"Set Group Nodes to Never":"将分组节点设置为从不","Bypass Group Nodes":"绕过分组节点","Set Group Nodes to Always":"将分组节点设置为始终"},ae={selectModel:"选择模型",uploadSelect:{placeholder:"请选择...",placeholderImage:"请选择图片...",placeholderAudio:"请选择音频...",placeholderVideo:"请选择视频...",placeholderModel:"请选择模型...",placeholderUnknown:"请选择媒体..."},valueControl:{header:{prefix:"自动更新该值",after:"之后",before:"之前",postfix:"正在运行工作流:"},linkToGlobal:"连接到",linkToGlobalSeed:"全局值",linkToGlobalDesc:"唯一值连接到全局值控制设置",randomize:"随机值",randomizeDesc:"每次运行后随机化该值",increment:"递增值",incrementDesc:"数值+1或切换到下一个选项",decrement:"递减值",decrementDesc:"数值-1或切换到上一个选项",fixed:"固定值",fixedDesc:"数值不变",editSettings:"改变控制设置"}},ne={dropPrompt:"将文件拖到此处或",browseFiles:"浏览文件"},re={inputs:"输入",outputs:"输出",type:"类型",moreHelp:"如需更多帮助,请访问",documentationPage:"文档页面",loadError:"加载帮助失败:{error}"},se={learnMore:"了解更多",later:"Later",noReleaseNotes:"暂无更新说明。"},le={duplicate:"复制",clearWorkflow:"清除工作流",deleteWorkflow:"删除工作流",deleteBlueprint:"删除蓝图",enterNewName:"输入新名称",missingNodesWarning:"工作流包含不支持的节点(红色突出显示)。"},de={shortcuts:"快捷键",essentials:"常用",viewControls:"视图控制",manageShortcuts:"管理快捷键",noKeybinding:"无快捷键",keyboardShortcuts:"键盘快捷键",subcategories:{workflow:"工作流",node:"节点",queue:"队列",view:"视图",panelControls:"面板控制"}},ce={nodeColors:"节点颜色",showLinks:"显示连接",showGroups:"显示框架/分组",renderBypassState:"渲染绕过状态",renderErrorState:"渲染错误状态"},ue={survey:{title:"云调研",placeholder:"调查问题占位符",steps:{familiarity:"你对 ComfyUI 有多熟悉?",purpose:"您将主要使用 ComfyUI 做什么?",industry:"您的主要行业是什么?",making:"你打算做什么?"},questions:{familiarity:"你对 ComfyUI 有多熟悉?",purpose:"您主要将使用 ComfyUI 做什么?",industry:"您的主要行业是什么?",making:"你打算做什么?"},options:{familiarity:{new:"ComfyUI 新手(从未使用过)",starting:"刚刚开始(正在学习教程)",basics:"熟练掌握基础知识",advanced:"高级用户(自定义工作流)",expert:"专家(帮助他人)"},purpose:{personal:"个人项目 / 爱好",community:"社区贡献(节点、工作流等)",client:"客户工作(自由职业)",inhouse:"我自己的工作场所(内部)",research:"学术研究"},industry:{film_tv_animation:"电影、电视与动画",gaming:"游戏",marketing:"营销与广告",architecture:"架构",product_design:"产品与平面设计",fine_art:"美术与插画",software:"软件与技术",education:"教育",other:"其他",otherPlaceholder:"请指定"},making:{images:"图片",video:"视频与动画","3d":"3D 资产",audio:"音频 / 音乐",custom_nodes:"自定义节点和工作流"}}},forgotPassword:{title:"忘记密码",instructions:"请输入您的电子邮件地址,我们将向您发送重置密码的链接。",emailLabel:"电子邮件",emailPlaceholder:"输入您的邮箱",sendResetLink:"发送重置链接",backToLogin:"返回登录",didntReceiveEmail:"没有收到邮件?请联系我们:",passwordResetSent:"密码重置邮件已发送",passwordResetError:"发送密码重置邮件失败,请重试。",emailRequired:"邮箱为必填项"},privateBeta:{title:"云服务目前处于内测阶段",desc:"登录以加入等候名单。轮到您时我们会通知您。已经收到通知?登录开始使用 Cloud。"},start:{title:"几秒内开始创作",desc:"无需任何设置。可在任何设备上使用。",explain:"一次生成多个输出。轻松分享工作流。",learnAboutButton:"了解云服务",wantToRun:"想在本机运行 ComfyUI 吗?",download:"下载 ComfyUI"},checkingStatus:"正在检查您的账户状态...",retrying:"正在重试...",retry:"重试",authTimeout:{title:"连接时间过长",message:"我们无法连接到 ComfyUI 云端服务。这可能是由于网络连接缓慢或临时服务问题导致的。",restart:"退出并重试",troubleshooting:"常见原因:",causes:["Corporate firewall or proxy blocking authentication services","VPN or network restrictions","Browser extensions interfering with requests","Regional network limitations","Try a different browser or network"],technicalDetails:"技术细节",helpText:"需要帮助?联系",supportLink:"支持"}},pe="需要帮助?",me="几秒钟内开始创作",ge="无需任何设置。可在任何设备上使用。",fe="一次性生成多个输出。轻松分享工作流。",he="了解云服务",ye="想在本地运行 ComfyUI 吗?",Ce="下载 ComfyUI",Ie="有问题?联系我们",Te="这里",we="抱歉,请联系客服",be="云服务目前处于内测阶段",Se="登录以加入等候名单。轮到您时我们会通知您。已经收到通知?登录开始使用 Cloud。",De="忘记密码",Ae="请输入您的电子邮件地址,我们将向您发送重置密码的链接。",Pe="电子邮件",Me="输入您的邮箱",ke="发送重置链接",ve="返回登录",Ue="没有收到邮件?",Le="邮箱是必填项",Ne="密码重置邮件已发送",Ee="发送密码重置邮件失败",Re="你对 ComfyUI 有多熟悉?",Fe="您将主要使用 ComfyUI 做什么?",xe="您的主要行业是什么?",Oe="你打算做什么?",_e={allCategory:"全部{category}",allModels:"全部模型",assetCollection:"资产合集",assets:"资产",baseModels:"基础模型",browseAssets:"浏览资产",checkpoints:"模型",civitaiLinkExample:'<strong>案例:</strong> <a href="https://civitai.com/api/download/models/833921?type=Model&format=SafeTensor" target="_blank" class="text-muted-foreground">https://civitai.com/api/download/models/833921?type=Model&format=SafeTensor</a>',civitaiLinkExampleStrong:"案例:",civitaiLinkExampleUrl:"https://civitai.com/models/10706/luisap-z-image-and-qwen-pixel-art-refiner?modelVersionId=2225295",civitaiLinkLabel:'Civitai 模型 <span class="font-bold italic">download</span> link',civitaiLinkLabelDownload:"下载",civitaiLinkPlaceholder:"粘贴链接到此",confirmModelDetails:"确认模型信息",connectionError:"请检查您的网络连接后重试",errorFileTooLarge:"允许执行文件的文件大小限制",errorFormatNotAllowed:"仅允许 SafeTensor 格式",errorModelTypeNotSupported:"不支持该类型的模型",errorUnknown:"发生了意外错误",errorUnsafePickleScan:"CivitAI 在该文件中检测到不安全代码",errorUnsafeVirusScan:"CivitAI 在该文件中检测到木马或可疑文件",errorUploadFailed:"导入资产失败,请重试。",failedToCreateNode:"创建节点失败。请重试或查看控制台获取详细信息。",fileFormats:"文件格式",fileName:"文件名",fileSize:"文件大小",filterBy:"筛选方式",findInLibrary:"模型在模型库的{type}区里",finish:"完成",genericLinkPlaceholder:"粘贴链接到这",jobId:"任务ID",loadingModels:"正在加载{type}...",maxFileSize:"最大文件大小:{size}",maxFileSizeValue:"1 GB",modelAssociatedWithLink:"您提供的链接的模型:",modelName:"模型名",modelNamePlaceholder:"输入该模型的名称",modelTypeSelectorLabel:"这是什么类型的模型?",modelTypeSelectorPlaceholder:"选择模型类型",modelUploaded:"模型导入成功!🎉",noAssetsFound:"未找到资产",noModelsInFolder:"此文件夹中没有可用的{type}",notSureLeaveAsIs:"不确定?那就放着不管吧",onlyCivitaiUrlsSupported:"仅支持 Civitai 链接",ownership:"所属",ownershipAll:"全部",ownershipMyModels:"我的模型",ownershipPublicModels:"公共模型",providerCivitai:"Civitai",providerHuggingFace:"Hugging Face",noValidSourceDetected:"检测不到有效的导入源",selectFrameworks:"选择框架",selectModelType:"选择模型类型",selectProjects:"选择项目",sortAZ:"A-Z",sortBy:"排序方式",sortingType:"排序类型",sortPopular:"最受欢迎",sortRecent:"最近",sortZA:"Z-A",tags:"标签",tagsHelp:"按逗号区分标签",tagsPlaceholder:"例如:模型, checkpoint",tryAdjustingFilters:"请尝试调整搜索或筛选条件",unknown:"未知",unsupportedUrlSource:"仅支持来自 {sources} URL 的模型",upgradeFeatureDescription:"该功能仅 Creator 和 Pro 订阅计划可用",upgradeToUnlockFeature:"升级订阅解锁该功能",upload:"导入",uploadFailed:"导入失败",uploadingModel:"正在导入模型...",uploadModel:"导入模型",uploadModelDescription1:"粘贴 Civitai 模型下载链接,将其添加到库中。",uploadModelDescription1Generic:"站贴模型下载链接,将其添加到模型库中。",uploadModelDescription2:'目前仅支持 <a href="https://civitai.com" target="_blank" class="text-muted-foreground">https://civitai.com</a> 链接。',uploadModelDescription2Link:"https://civitai.com/models",uploadModelDescription2Generic:"仅支持来自以下提供服务的 URL :",uploadModelDescription3:"最大文件大小:<strong>1 GB</strong>",uploadModelFailedToRetrieveMetadata:"检索元数据失败。请检查连接并重试。",uploadModelFromCivitai:"从 Civitai 导入模型",uploadModelGeneric:"导入模型",uploadModelHelpFooterText:"需要查找 URL 的帮助吗?点击下面的教程视频。",uploadModelHelpVideo:"上传模型视频",uploadModelHowDoIFindThis:"如何找到这个?",uploadSuccess:"模型导入成功!",ariaLabel:{assetCard:"{name} - {type}资产",loadingAsset:"正在加载资产"},media:{threeDModelPlaceholder:"3D 模型",audioPlaceholder:"音频"},deletion:{header:"删除该模型?",body:"从资产库永久移除这个模型。",inProgress:"正在删除 {assetName}...",complete:"{assetName} 已经删除。",failed:"{assetName} 无法删除。"},rename:{failed:"无法重命名资产。"}},Be={deleteAssetTitle:"删除此资产?",deleteAssetDescription:"此资产将被永久删除。",deleteSelectedTitle:"删除所选资产?",deleteSelectedDescription:"{count} 项资产将被永久删除。",assetDeletedSuccessfully:"资产删除成功",deletingImportedFilesCloudOnly:"删除导入文件仅支持云版本",failedToDeleteAsset:"删除资产失败",actions:{inspect:"查看资产",more:"更多设置",seeMoreOutputs:"查看更多输出",addToWorkflow:"添加到当前工作流",download:"下载",openWorkflow:"在新标签页中读取工作流",exportWorkflow:"导出工作流",copyJobId:"复制任务ID",delete:"删除"},jobIdToast:{jobIdCopied:"任务 ID 已复制到剪贴板",jobIdCopyFailed:"复制队列 ID 失败",copied:"已复制",error:"错误"},selection:{selectedCount:"已选择资产:{count}",deselectAll:"取消全选",downloadSelected:"下载",deleteSelected:"删除",downloadStarted:"正在下载 {count} 个文件...",downloadsStarted:"开始下载 {count} 个文件",assetsDeletedSuccessfully:"已成功删除 {count} 个资产",failedToDeleteAssets:"未能删除所选资产",partialDeleteSuccess:"{succeeded} 删除成功, {failed} 失败"},noJobIdFound:"该资产不包含任务ID",unsupportedFileType:"加载节点不支持该类型文件",nodeTypeNotFound:"节点类型 {nodeType} 不存在",failedToCreateNode:"创建节点失败",nodeAddedToWorkflow:"{nodeType} 节点已添加到工作流",noWorkflowDataFound:"该资产不包含工作流数据",workflowOpenedInNewTab:"工作流已在新标签页中打开",failedToExportWorkflow:"工作流导出失败",workflowExportedSuccessfully:"工作流导出成功!"},Ve={dockToTop:"停靠到顶部",feedback:"反馈",feedbackTooltip:"反馈"},Ge={"":{title:"无效对话框",message:"提供的对话 ID 无效。",buttons:{Close:"关闭"}}},We={title:"介绍 Nodes 2.0",desc:"– 更灵活的工作流,强力的新组件,为拓展性而生",tryItOut:"试试看"},qe={message:"是否偏好经典节点设计?",button:"打开设置"},He={message:"在主菜单中随时切换回 Nodes 2.0"},ze={share:"分享",openWorkflow:"打开工作流"},Ke={cloud:{title:"Comfy Cloud 目前不支持这些节点",description:"该工作流包含 Comfy Cloud 目前不支持的节点",priorityMessage:"我们已经标记这些节点,将会优先支持它们。",replacementInstruction:"同时,如果可能的话,将这些节点(红色突出显示)替换为已经支持的节点,或者尝试不同的工作流。",learnMore:"查看更多",gotIt:"好的"},oss:{title:"该工作流含有缺失节点",description:"该工作流包含您未安装的自定义节点",replacementInstruction:"安装这些节点后运行此工作流,或者用已安装的节点替换它们。缺失的节点在画布上以红色突出显示。"}},je={togglePanel:"开关属性面板",noSelection:"选择一个节点查看其属性信息。",title:"无选中节点 | 选中了 1 个节点 | 选中了 {count} 个节点",parameters:"参数",info:"信息",color:"节点颜色",pinned:"顶固",bypass:"忽略",normal:"正常",mute:"禁用",inputs:"输入",inputsNone:"无输入",inputsNoneTooltip:"节点没有输入",properties:"属性",nodeState:"节点状态",settings:"设置"},Qe={recentReleases:"最近发布",helpCenterMenu:"帮助中心菜单"},Je={g:e,manager:o,issueReport:t,color:i,contextMenu:a,icon:n,welcome:r,userSelect:s,notSupported:l,downloadGit:d,install:c,desktopStart:u,serverStart:p,serverConfig:m,shape:g,sideToolbar:f,helpCenter:h,releaseToast:y,menu:C,tabMenu:I,templateWorkflows:T,templateWidgets:w,graphCanvasMenu:b,zoomControls:S,groupNode:D,nodeTemplates:A,workflowService:P,subgraphStore:M,electronFileDownload:k,maskEditor:v,commands:U,queue:L,menuLabels:N,desktopMenu:E,settingsCategories:R,serverConfigItems:F,serverConfigCategories:x,nodeCategories:O,dataTypes:_,maintenance:B,missingModelsDialog:V,versionMismatchWarning:G,loadWorkflowWarning:W,errorDialog:q,apiNodesSignInDialog:H,apiNodesCostBreakdown:z,desktopUpdate:K,clipboard:j,imageCompare:Q,load3d:J,toastMessages:Y,nodeErrors:Z,auth:X,validation:$,credits:ee,subscription:oe,userSettings:te,selectionToolbox:ie,widgets:ae,widgetFileUpload:ne,nodeHelpPage:re,whatsNewPopup:se,breadcrumbsMenu:le,shortcuts:de,minimap:ce,cloudOnboarding:ue,cloudFooter_needHelp:pe,cloudStart_title:me,cloudStart_desc:ge,cloudStart_explain:fe,cloudStart_learnAboutButton:he,cloudStart_wantToRun:ye,cloudStart_download:Ce,cloudWaitlist_questionsText:Ie,cloudWaitlist_contactLink:Te,cloudSorryContactSupport_title:we,cloudPrivateBeta_title:be,cloudPrivateBeta_desc:Se,cloudForgotPassword_title:De,cloudForgotPassword_instructions:Ae,cloudForgotPassword_emailLabel:Pe,cloudForgotPassword_emailPlaceholder:Me,cloudForgotPassword_sendResetLink:ke,cloudForgotPassword_backToLogin:ve,cloudForgotPassword_didntReceiveEmail:Ue,cloudForgotPassword_emailRequired:Le,cloudForgotPassword_passwordResetSent:Ne,cloudForgotPassword_passwordResetError:Ee,cloudSurvey_steps_familiarity:Re,cloudSurvey_steps_purpose:Fe,cloudSurvey_steps_industry:xe,cloudSurvey_steps_making:Oe,assetBrowser:_e,mediaAsset:Be,actionbar:Ve,desktopDialogs:Ge,vueNodesBanner:We,vueNodesMigration:qe,vueNodesMigrationMainMenu:He,linearMode:ze,missingNodes:Ke,rightSidePanel:je,help:Qe};export{Ve as actionbar,z as apiNodesCostBreakdown,H as apiNodesSignInDialog,_e as assetBrowser,X as auth,le as breadcrumbsMenu,j as clipboard,pe as cloudFooter_needHelp,ve as cloudForgotPassword_backToLogin,Ue as cloudForgotPassword_didntReceiveEmail,Pe as cloudForgotPassword_emailLabel,Me as cloudForgotPassword_emailPlaceholder,Le as cloudForgotPassword_emailRequired,Ae as cloudForgotPassword_instructions,Ee as cloudForgotPassword_passwordResetError,Ne as cloudForgotPassword_passwordResetSent,ke as cloudForgotPassword_sendResetLink,De as cloudForgotPassword_title,ue as cloudOnboarding,Se as cloudPrivateBeta_desc,be as cloudPrivateBeta_title,we as cloudSorryContactSupport_title,ge as cloudStart_desc,Ce as cloudStart_download,fe as cloudStart_explain,he as cloudStart_learnAboutButton,me as cloudStart_title,ye as cloudStart_wantToRun,Re as cloudSurvey_steps_familiarity,xe as cloudSurvey_steps_industry,Oe as cloudSurvey_steps_making,Fe as cloudSurvey_steps_purpose,Te as cloudWaitlist_contactLink,Ie as cloudWaitlist_questionsText,i as color,U as commands,a as contextMenu,ee as credits,_ as dataTypes,Je as default,Ge as desktopDialogs,E as desktopMenu,u as desktopStart,K as desktopUpdate,d as downloadGit,k as electronFileDownload,q as errorDialog,e as g,b as graphCanvasMenu,D as groupNode,Qe as help,h as helpCenter,n as icon,Q as imageCompare,c as install,t as issueReport,ze as linearMode,J as load3d,W as loadWorkflowWarning,B as maintenance,o as manager,v as maskEditor,Be as mediaAsset,C as menu,N as menuLabels,ce as minimap,V as missingModelsDialog,Ke as missingNodes,O as nodeCategories,Z as nodeErrors,re as nodeHelpPage,A as nodeTemplates,l as notSupported,L as queue,y as releaseToast,je as rightSidePanel,ie as selectionToolbox,m as serverConfig,x as serverConfigCategories,F as serverConfigItems,p as serverStart,R as settingsCategories,g as shape,de as shortcuts,f as sideToolbar,M as subgraphStore,oe as subscription,I as tabMenu,w as templateWidgets,T as templateWorkflows,Y as toastMessages,s as userSelect,te as userSettings,$ as validation,G as versionMismatchWarning,We as vueNodesBanner,qe as vueNodesMigration,He as vueNodesMigrationMainMenu,r as welcome,se as whatsNewPopup,ne as widgetFileUpload,ae as widgets,P as workflowService,S as zoomControls};
|
|
14
|
-
//# sourceMappingURL=main-DGOENlHZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main-DGOENlHZ.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|