Eji-Sensei14 commited on
Commit
c6535db
·
verified ·
1 Parent(s): 9190001

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +614 -0
  2. custom_nodes/ComfyLiterals/.gitignore +2 -0
  3. custom_nodes/ComfyLiterals/README.md +2 -0
  4. custom_nodes/ComfyLiterals/__init__.py +21 -0
  5. custom_nodes/ComfyLiterals/__pycache__/__init__.cpython-312.pyc +0 -0
  6. custom_nodes/ComfyLiterals/__pycache__/nodes.cpython-312.pyc +0 -0
  7. custom_nodes/ComfyLiterals/__pycache__/operations.cpython-312.pyc +0 -0
  8. custom_nodes/ComfyLiterals/__pycache__/startup_utils.cpython-312.pyc +0 -0
  9. custom_nodes/ComfyLiterals/js/operation-node.js +83 -0
  10. custom_nodes/ComfyLiterals/nodes.py +136 -0
  11. custom_nodes/ComfyLiterals/operations.py +54 -0
  12. custom_nodes/ComfyLiterals/startup_utils.py +29 -0
  13. custom_nodes/ComfyMath/.gitignore +1 -0
  14. custom_nodes/ComfyMath/LICENSE +201 -0
  15. custom_nodes/ComfyMath/README.md +19 -0
  16. custom_nodes/ComfyMath/__init__.py +29 -0
  17. custom_nodes/ComfyMath/__pycache__/__init__.cpython-312.pyc +0 -0
  18. custom_nodes/ComfyMath/pyproject.toml +19 -0
  19. custom_nodes/ComfyMath/requirements.txt +1 -0
  20. custom_nodes/ComfyMath/src/comfymath/__init__.py +0 -0
  21. custom_nodes/ComfyMath/src/comfymath/__pycache__/__init__.cpython-312.pyc +0 -0
  22. custom_nodes/ComfyMath/src/comfymath/__pycache__/bool.cpython-312.pyc +0 -0
  23. custom_nodes/ComfyMath/src/comfymath/__pycache__/control.cpython-312.pyc +0 -0
  24. custom_nodes/ComfyMath/src/comfymath/__pycache__/convert.cpython-312.pyc +0 -0
  25. custom_nodes/ComfyMath/src/comfymath/__pycache__/float.cpython-312.pyc +0 -0
  26. custom_nodes/ComfyMath/src/comfymath/__pycache__/graphics.cpython-312.pyc +0 -0
  27. custom_nodes/ComfyMath/src/comfymath/__pycache__/int.cpython-312.pyc +0 -0
  28. custom_nodes/ComfyMath/src/comfymath/__pycache__/number.cpython-312.pyc +0 -0
  29. custom_nodes/ComfyMath/src/comfymath/__pycache__/types.cpython-312.pyc +0 -0
  30. custom_nodes/ComfyMath/src/comfymath/__pycache__/vec.cpython-312.pyc +0 -0
  31. custom_nodes/ComfyMath/src/comfymath/bool.py +59 -0
  32. custom_nodes/ComfyMath/src/comfymath/control.py +3 -0
  33. custom_nodes/ComfyMath/src/comfymath/convert.py +273 -0
  34. custom_nodes/ComfyMath/src/comfymath/float.py +159 -0
  35. custom_nodes/ComfyMath/src/comfymath/graphics.py +153 -0
  36. custom_nodes/ComfyMath/src/comfymath/int.py +129 -0
  37. custom_nodes/ComfyMath/src/comfymath/number.py +94 -0
  38. custom_nodes/ComfyMath/src/comfymath/py.typed +0 -0
  39. custom_nodes/ComfyMath/src/comfymath/types.py +16 -0
  40. custom_nodes/ComfyMath/src/comfymath/vec.py +500 -0
  41. custom_nodes/ComfyUI-Detail-Daemon/.gitignore +162 -0
  42. custom_nodes/ComfyUI-Detail-Daemon/DetailDaemonIcon.jpg +3 -0
  43. custom_nodes/ComfyUI-Detail-Daemon/LICENSE +21 -0
  44. custom_nodes/ComfyUI-Detail-Daemon/README.md +85 -0
  45. custom_nodes/ComfyUI-Detail-Daemon/__init__.py +20 -0
  46. custom_nodes/ComfyUI-Detail-Daemon/__pycache__/__init__.cpython-312.pyc +0 -0
  47. custom_nodes/ComfyUI-Detail-Daemon/__pycache__/detail_daemon_node.cpython-312.pyc +0 -0
  48. custom_nodes/ComfyUI-Detail-Daemon/detail_daemon_node.py +520 -0
  49. custom_nodes/ComfyUI-Detail-Daemon/example_workflows/Comparing Detailers.json +1646 -0
  50. custom_nodes/ComfyUI-Detail-Daemon/example_workflows/Flux img2img-DetailDaemon.json +848 -0
.gitattributes CHANGED
@@ -35,3 +35,617 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  dev/ltx-2-3-22b-dev-Q4_K_M.gguf filter=lfs diff=lfs merge=lfs -text
37
  ComfyUI-WanAnimatePreprocess/example.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  dev/ltx-2-3-22b-dev-Q4_K_M.gguf filter=lfs diff=lfs merge=lfs -text
37
  ComfyUI-WanAnimatePreprocess/example.png filter=lfs diff=lfs merge=lfs -text
38
+ custom_nodes/ComfyUI-Detail-Daemon/DetailDaemonIcon.jpg filter=lfs diff=lfs merge=lfs -text
39
+ custom_nodes/ComfyUI-Easy-Use/py/modules/brushnet/__pycache__/unet_2d_blocks.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
40
+ custom_nodes/ComfyUI-Easy-Use/py/modules/kolors/chatglm/tokenizer/vocab.txt filter=lfs diff=lfs merge=lfs -text
41
+ custom_nodes/ComfyUI-Easy-Use/resources/OpenSans-Medium.ttf filter=lfs diff=lfs merge=lfs -text
42
+ custom_nodes/ComfyUI-Easy-Use/resources/wenquan.ttf filter=lfs diff=lfs merge=lfs -text
43
+ custom_nodes/ComfyUI-FSampler/article[[:space:]]fsampler.jpg filter=lfs diff=lfs merge=lfs -text
44
+ custom_nodes/ComfyUI-FSampler/nodes.jpg filter=lfs diff=lfs merge=lfs -text
45
+ custom_nodes/ComfyUI-Frame-Interpolation/All_in_one_v1_3.png filter=lfs diff=lfs merge=lfs -text
46
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/anime0.png filter=lfs diff=lfs merge=lfs -text
47
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/anime1.png filter=lfs diff=lfs merge=lfs -text
48
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/bocchi0.jpg filter=lfs diff=lfs merge=lfs -text
49
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/bocchi1.jpg filter=lfs diff=lfs merge=lfs -text
50
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/real0.png filter=lfs diff=lfs merge=lfs -text
51
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/real1.png filter=lfs diff=lfs merge=lfs -text
52
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/rick/00003.png filter=lfs diff=lfs merge=lfs -text
53
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/rick/00004.png filter=lfs diff=lfs merge=lfs -text
54
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/rick/00005.png filter=lfs diff=lfs merge=lfs -text
55
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/violet0.png filter=lfs diff=lfs merge=lfs -text
56
+ custom_nodes/ComfyUI-Frame-Interpolation/demo_frames/violet1.png filter=lfs diff=lfs merge=lfs -text
57
+ custom_nodes/ComfyUI-Frame-Interpolation/example.png filter=lfs diff=lfs merge=lfs -text
58
+ custom_nodes/ComfyUI-Frame-Interpolation/interpolation_schedule.png filter=lfs diff=lfs merge=lfs -text
59
+ custom_nodes/ComfyUI-Frame-Interpolation/test_vfi_schedule.gif filter=lfs diff=lfs merge=lfs -text
60
+ custom_nodes/ComfyUI-Impact-Pack/example_workflows/2-MaskDetailer.jpg filter=lfs diff=lfs merge=lfs -text
61
+ custom_nodes/ComfyUI-Impact-Pack/example_workflows/4-MakeTileSEGS-Upscale.jpg filter=lfs diff=lfs merge=lfs -text
62
+ custom_nodes/ComfyUI-Impact-Pack/example_workflows/5-prompt-per-tile.jpg filter=lfs diff=lfs merge=lfs -text
63
+ custom_nodes/ComfyUI-Impact-Pack/example_workflows/6-DetailerWildcard.jpg filter=lfs diff=lfs merge=lfs -text
64
+ custom_nodes/ComfyUI-Impact-Pack/modules/impact/__pycache__/core.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
65
+ custom_nodes/ComfyUI-Impact-Pack/modules/impact/__pycache__/impact_pack.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
66
+ custom_nodes/ComfyUI-Impact-Pack/troubleshooting/black1.png filter=lfs diff=lfs merge=lfs -text
67
+ custom_nodes/ComfyUI-Impact-Pack/troubleshooting/black2.png filter=lfs diff=lfs merge=lfs -text
68
+ custom_nodes/ComfyUI-KJNodes/docs/images/2024-04-03_20_49_29-ComfyUI.png filter=lfs diff=lfs merge=lfs -text
69
+ custom_nodes/ComfyUI-KJNodes/fonts/FreeMono.ttf filter=lfs diff=lfs merge=lfs -text
70
+ custom_nodes/ComfyUI-KJNodes/fonts/FreeMonoBoldOblique.otf filter=lfs diff=lfs merge=lfs -text
71
+ custom_nodes/ComfyUI-KJNodes/fonts/TTNorms-Black.otf filter=lfs diff=lfs merge=lfs -text
72
+ custom_nodes/ComfyUI-KJNodes/nodes/__pycache__/image_nodes.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
73
+ custom_nodes/ComfyUI-KJNodes/nodes/__pycache__/ltxv_nodes.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
74
+ custom_nodes/ComfyUI-KJNodes/nodes/__pycache__/model_optimization_nodes.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
75
+ custom_nodes/ComfyUI-KJNodes/nodes/__pycache__/nodes.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
76
+ custom_nodes/ComfyUI-LTXVideo/example_workflows/assets/base[[:space:]]model[[:space:]]image.png filter=lfs diff=lfs merge=lfs -text
77
+ custom_nodes/ComfyUI-LTXVideo/example_workflows/assets/buildings[[:space:]]ff.png filter=lfs diff=lfs merge=lfs -text
78
+ custom_nodes/ComfyUI-LTXVideo/example_workflows/assets/buildings.mp4 filter=lfs diff=lfs merge=lfs -text
79
+ custom_nodes/ComfyUI-LTXVideo/example_workflows/assets/distilled[[:space:]]image.png filter=lfs diff=lfs merge=lfs -text
80
+ custom_nodes/ComfyUI-LTXVideo/example_workflows/assets/hdr_input_video.mp4 filter=lfs diff=lfs merge=lfs -text
81
+ custom_nodes/ComfyUI-LTXVideo/example_workflows/assets/lipdub_input.mp4 filter=lfs diff=lfs merge=lfs -text
82
+ custom_nodes/ComfyUI-LTXVideo/example_workflows/assets/motion_track_input.jpg filter=lfs diff=lfs merge=lfs -text
83
+ custom_nodes/ComfyUI-LTXVideo/gemma_configs/tokenizer.json filter=lfs diff=lfs merge=lfs -text
84
+ custom_nodes/ComfyUI-Manager/glob/__pycache__/manager_core.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
85
+ custom_nodes/ComfyUI-Manager/glob/__pycache__/manager_server.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
86
+ custom_nodes/ComfyUI-RMBG/__pycache__/AILab_ImageMaskTools.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
87
+ custom_nodes/ComfyUI-RMBG/example_workflows/V3.0.0_nodes.jpg filter=lfs diff=lfs merge=lfs -text
88
+ custom_nodes/ComfyUI-RMBG/example_workflows/YOLO_Node.jpg filter=lfs diff=lfs merge=lfs -text
89
+ custom_nodes/ComfyUI-RMBG/example_workflows/florence2_node.jpg filter=lfs diff=lfs merge=lfs -text
90
+ custom_nodes/ComfyUI-RMBG/models/sam3/perflib/tests/assets/masks.tiff filter=lfs diff=lfs merge=lfs -text
91
+ custom_nodes/ComfyUI-RMBG/py/__pycache__/AILab_ImageMaskTools.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
92
+ custom_nodes/ComfyUI-TeaCache/assets/compare_flux.png filter=lfs diff=lfs merge=lfs -text
93
+ custom_nodes/ComfyUI-TeaCache/assets/compare_flux_kontext.png filter=lfs diff=lfs merge=lfs -text
94
+ custom_nodes/ComfyUI-TeaCache/assets/compare_hidream_i1_dev.png filter=lfs diff=lfs merge=lfs -text
95
+ custom_nodes/ComfyUI-TeaCache/assets/compare_hidream_i1_fast.png filter=lfs diff=lfs merge=lfs -text
96
+ custom_nodes/ComfyUI-TeaCache/assets/compare_hidream_i1_full.png filter=lfs diff=lfs merge=lfs -text
97
+ custom_nodes/ComfyUI-TeaCache/assets/compare_lumina_image_2.png filter=lfs diff=lfs merge=lfs -text
98
+ custom_nodes/ComfyUI-TeaCache/assets/compare_pulid_flux.png filter=lfs diff=lfs merge=lfs -text
99
+ custom_nodes/ComfyUI-TeaCache/assets/fennec_girl_sing.png filter=lfs diff=lfs merge=lfs -text
100
+ custom_nodes/ComfyUI-TeaCache/assets/flux_dev_example.png filter=lfs diff=lfs merge=lfs -text
101
+ custom_nodes/ComfyUI-VAE-Utils/assets/cover.png filter=lfs diff=lfs merge=lfs -text
102
+ custom_nodes/ComfyUI-VAE-Utils/workflow/workflow_wan_t2i_upscale2x.png filter=lfs diff=lfs merge=lfs -text
103
+ custom_nodes/ComfyUI-VibeVoice/example_workflows/VibeVoice_example.png filter=lfs diff=lfs merge=lfs -text
104
+ custom_nodes/ComfyUI-WanAnimatePreprocess/example.png filter=lfs diff=lfs merge=lfs -text
105
+ custom_nodes/ComfyUI-WanVideoWrapper/__pycache__/nodes.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
106
+ custom_nodes/ComfyUI-WanVideoWrapper/__pycache__/nodes_model_loading.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
107
+ custom_nodes/ComfyUI-WanVideoWrapper/__pycache__/nodes_sampler.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
108
+ custom_nodes/ComfyUI-WanVideoWrapper/configs/T5_tokenizer/tokenizer.json filter=lfs diff=lfs merge=lfs -text
109
+ custom_nodes/ComfyUI-WanVideoWrapper/example_workflows/example_inputs/MTV_crafter_example_pose.mp4 filter=lfs diff=lfs merge=lfs -text
110
+ custom_nodes/ComfyUI-WanVideoWrapper/example_workflows/example_inputs/env.png filter=lfs diff=lfs merge=lfs -text
111
+ custom_nodes/ComfyUI-WanVideoWrapper/example_workflows/example_inputs/human.png filter=lfs diff=lfs merge=lfs -text
112
+ custom_nodes/ComfyUI-WanVideoWrapper/example_workflows/example_inputs/jeep.mp4 filter=lfs diff=lfs merge=lfs -text
113
+ custom_nodes/ComfyUI-WanVideoWrapper/example_workflows/example_inputs/wolf_interpolated.mp4 filter=lfs diff=lfs merge=lfs -text
114
+ custom_nodes/ComfyUI-WanVideoWrapper/example_workflows/example_inputs/woman.jpg filter=lfs diff=lfs merge=lfs -text
115
+ custom_nodes/ComfyUI-WanVideoWrapper/example_workflows/example_inputs/woman.wav filter=lfs diff=lfs merge=lfs -text
116
+ custom_nodes/ComfyUI-WanVideoWrapper/wanvideo/modules/__pycache__/model.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
117
+ custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/AlumniSansCollegiateOne-Regular.ttf filter=lfs diff=lfs merge=lfs -text
118
+ custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Caveat-VariableFont_wght.ttf filter=lfs diff=lfs merge=lfs -text
119
+ custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/NotoSansArabic-Regular.ttf filter=lfs diff=lfs merge=lfs -text
120
+ custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/Roboto-Regular.ttf filter=lfs diff=lfs merge=lfs -text
121
+ custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/YoungSerif-Regular.ttf filter=lfs diff=lfs merge=lfs -text
122
+ custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/comic.ttf filter=lfs diff=lfs merge=lfs -text
123
+ custom_nodes/ComfyUI_Comfyroll_CustomNodes/fonts/impact.ttf filter=lfs diff=lfs merge=lfs -text
124
+ custom_nodes/ComfyUI_JPS-Nodes/__pycache__/jps_nodes.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
125
+ custom_nodes/ComfyUI_LayerStyle/font/Alibaba-PuHuiTi-Heavy.ttf filter=lfs diff=lfs merge=lfs -text
126
+ custom_nodes/ComfyUI_LayerStyle/image/add_grain_example.jpg filter=lfs diff=lfs merge=lfs -text
127
+ custom_nodes/ComfyUI_LayerStyle/image/auto_adjust_example.jpg filter=lfs diff=lfs merge=lfs -text
128
+ custom_nodes/ComfyUI_LayerStyle/image/auto_adjust_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
129
+ custom_nodes/ComfyUI_LayerStyle/image/auto_brightness_example.jpg filter=lfs diff=lfs merge=lfs -text
130
+ custom_nodes/ComfyUI_LayerStyle/image/ben_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
131
+ custom_nodes/ComfyUI_LayerStyle/image/ben_ultra_node.jpg filter=lfs diff=lfs merge=lfs -text
132
+ custom_nodes/ComfyUI_LayerStyle/image/blend_mode_result.jpg filter=lfs diff=lfs merge=lfs -text
133
+ custom_nodes/ComfyUI_LayerStyle/image/blend_mode_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
134
+ custom_nodes/ComfyUI_LayerStyle/image/blendif_mask_example.jpg filter=lfs diff=lfs merge=lfs -text
135
+ custom_nodes/ComfyUI_LayerStyle/image/channel_shake_example.jpg filter=lfs diff=lfs merge=lfs -text
136
+ custom_nodes/ComfyUI_LayerStyle/image/chioce_text_preset_node.jpg filter=lfs diff=lfs merge=lfs -text
137
+ custom_nodes/ComfyUI_LayerStyle/image/choice_text_preset_example.jpg filter=lfs diff=lfs merge=lfs -text
138
+ custom_nodes/ComfyUI_LayerStyle/image/color_adapter_example.jpg filter=lfs diff=lfs merge=lfs -text
139
+ custom_nodes/ComfyUI_LayerStyle/image/color_balance_example.jpg filter=lfs diff=lfs merge=lfs -text
140
+ custom_nodes/ComfyUI_LayerStyle/image/color_image_example.jpg filter=lfs diff=lfs merge=lfs -text
141
+ custom_nodes/ComfyUI_LayerStyle/image/color_negative_example.jpg filter=lfs diff=lfs merge=lfs -text
142
+ custom_nodes/ComfyUI_LayerStyle/image/color_of_shadow_and_highlight_example.jpg filter=lfs diff=lfs merge=lfs -text
143
+ custom_nodes/ComfyUI_LayerStyle/image/color_of_shadow_and_highlight_node.jpg filter=lfs diff=lfs merge=lfs -text
144
+ custom_nodes/ComfyUI_LayerStyle/image/color_overlay_example.jpg filter=lfs diff=lfs merge=lfs -text
145
+ custom_nodes/ComfyUI_LayerStyle/image/color_temperature_example.jpg filter=lfs diff=lfs merge=lfs -text
146
+ custom_nodes/ComfyUI_LayerStyle/image/colormap_result.jpg filter=lfs diff=lfs merge=lfs -text
147
+ custom_nodes/ComfyUI_LayerStyle/image/corp_by_mask_example.jpg filter=lfs diff=lfs merge=lfs -text
148
+ custom_nodes/ComfyUI_LayerStyle/image/corp_by_mask_node.jpg filter=lfs diff=lfs merge=lfs -text
149
+ custom_nodes/ComfyUI_LayerStyle/image/create_gradient_mask_example.jpg filter=lfs diff=lfs merge=lfs -text
150
+ custom_nodes/ComfyUI_LayerStyle/image/create_gradient_mask_example2.jpg filter=lfs diff=lfs merge=lfs -text
151
+ custom_nodes/ComfyUI_LayerStyle/image/data_nodes_example.jpg filter=lfs diff=lfs merge=lfs -text
152
+ custom_nodes/ComfyUI_LayerStyle/image/distort_displace_example.jpg filter=lfs diff=lfs merge=lfs -text
153
+ custom_nodes/ComfyUI_LayerStyle/image/distort_displace_node.jpg filter=lfs diff=lfs merge=lfs -text
154
+ custom_nodes/ComfyUI_LayerStyle/image/draw_rounded_rectangle_node.jpg filter=lfs diff=lfs merge=lfs -text
155
+ custom_nodes/ComfyUI_LayerStyle/image/drop_shadow_example.jpg filter=lfs diff=lfs merge=lfs -text
156
+ custom_nodes/ComfyUI_LayerStyle/image/exposure_example.jpg filter=lfs diff=lfs merge=lfs -text
157
+ custom_nodes/ComfyUI_LayerStyle/image/extend_canvas_example.jpg filter=lfs diff=lfs merge=lfs -text
158
+ custom_nodes/ComfyUI_LayerStyle/image/extend_canvas_node.jpg filter=lfs diff=lfs merge=lfs -text
159
+ custom_nodes/ComfyUI_LayerStyle/image/film_example.jpg filter=lfs diff=lfs merge=lfs -text
160
+ custom_nodes/ComfyUI_LayerStyle/image/film_node.jpg filter=lfs diff=lfs merge=lfs -text
161
+ custom_nodes/ComfyUI_LayerStyle/image/flux_kontext_image_scale_node_example.jpg filter=lfs diff=lfs merge=lfs -text
162
+ custom_nodes/ComfyUI_LayerStyle/image/gaussian_blur_example.jpg filter=lfs diff=lfs merge=lfs -text
163
+ custom_nodes/ComfyUI_LayerStyle/image/get_main_color_and_color_name_example.jpg filter=lfs diff=lfs merge=lfs -text
164
+ custom_nodes/ComfyUI_LayerStyle/image/get_main_color_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
165
+ custom_nodes/ComfyUI_LayerStyle/image/get_main_colors_example.jpg filter=lfs diff=lfs merge=lfs -text
166
+ custom_nodes/ComfyUI_LayerStyle/image/gradient_image_example.jpg filter=lfs diff=lfs merge=lfs -text
167
+ custom_nodes/ComfyUI_LayerStyle/image/gradient_overlay_example.jpg filter=lfs diff=lfs merge=lfs -text
168
+ custom_nodes/ComfyUI_LayerStyle/image/halftone_example.jpg filter=lfs diff=lfs merge=lfs -text
169
+ custom_nodes/ComfyUI_LayerStyle/image/halftone_node.jpg filter=lfs diff=lfs merge=lfs -text
170
+ custom_nodes/ComfyUI_LayerStyle/image/hdr_effects_example.jpg filter=lfs diff=lfs merge=lfs -text
171
+ custom_nodes/ComfyUI_LayerStyle/image/hl_frequency_detail_restore_example.jpg filter=lfs diff=lfs merge=lfs -text
172
+ custom_nodes/ComfyUI_LayerStyle/image/icmask_example.jpg filter=lfs diff=lfs merge=lfs -text
173
+ custom_nodes/ComfyUI_LayerStyle/image/if_example.jpg filter=lfs diff=lfs merge=lfs -text
174
+ custom_nodes/ComfyUI_LayerStyle/image/image_auto_crop_example.jpg filter=lfs diff=lfs merge=lfs -text
175
+ custom_nodes/ComfyUI_LayerStyle/image/image_auto_crop_node.jpg filter=lfs diff=lfs merge=lfs -text
176
+ custom_nodes/ComfyUI_LayerStyle/image/image_auto_crop_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
177
+ custom_nodes/ComfyUI_LayerStyle/image/image_auto_crop_v3_node.jpg filter=lfs diff=lfs merge=lfs -text
178
+ custom_nodes/ComfyUI_LayerStyle/image/image_blend_advance_example.jpg filter=lfs diff=lfs merge=lfs -text
179
+ custom_nodes/ComfyUI_LayerStyle/image/image_blend_advance_node.jpg filter=lfs diff=lfs merge=lfs -text
180
+ custom_nodes/ComfyUI_LayerStyle/image/image_blend_example.jpg filter=lfs diff=lfs merge=lfs -text
181
+ custom_nodes/ComfyUI_LayerStyle/image/image_channel_merge_example.jpg filter=lfs diff=lfs merge=lfs -text
182
+ custom_nodes/ComfyUI_LayerStyle/image/image_channel_split_example.jpg filter=lfs diff=lfs merge=lfs -text
183
+ custom_nodes/ComfyUI_LayerStyle/image/image_composite_handle_mask_example.jpg filter=lfs diff=lfs merge=lfs -text
184
+ custom_nodes/ComfyUI_LayerStyle/image/image_composite_handle_mask_node.jpg filter=lfs diff=lfs merge=lfs -text
185
+ custom_nodes/ComfyUI_LayerStyle/image/image_hub_example.jpg filter=lfs diff=lfs merge=lfs -text
186
+ custom_nodes/ComfyUI_LayerStyle/image/image_hub_node.jpg filter=lfs diff=lfs merge=lfs -text
187
+ custom_nodes/ComfyUI_LayerStyle/image/image_mask_scale_as_example.jpg filter=lfs diff=lfs merge=lfs -text
188
+ custom_nodes/ComfyUI_LayerStyle/image/image_mask_scale_as_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
189
+ custom_nodes/ComfyUI_LayerStyle/image/image_mask_scale_as_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
190
+ custom_nodes/ComfyUI_LayerStyle/image/image_reel_composit_node.jpg filter=lfs diff=lfs merge=lfs -text
191
+ custom_nodes/ComfyUI_LayerStyle/image/image_reel_example.jpg filter=lfs diff=lfs merge=lfs -text
192
+ custom_nodes/ComfyUI_LayerStyle/image/image_remove_alpha_example.jpg filter=lfs diff=lfs merge=lfs -text
193
+ custom_nodes/ComfyUI_LayerStyle/image/image_scale_by_aspect_ratio_example.jpg filter=lfs diff=lfs merge=lfs -text
194
+ custom_nodes/ComfyUI_LayerStyle/image/image_scale_restore_example.jpg filter=lfs diff=lfs merge=lfs -text
195
+ custom_nodes/ComfyUI_LayerStyle/image/image_shift_example.jpg filter=lfs diff=lfs merge=lfs -text
196
+ custom_nodes/ComfyUI_LayerStyle/image/image_shift_node.jpg filter=lfs diff=lfs merge=lfs -text
197
+ custom_nodes/ComfyUI_LayerStyle/image/image_tagger_save_example.jpg filter=lfs diff=lfs merge=lfs -text
198
+ custom_nodes/ComfyUI_LayerStyle/image/image_tagger_save_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
199
+ custom_nodes/ComfyUI_LayerStyle/image/image_to_mask_example.jpg filter=lfs diff=lfs merge=lfs -text
200
+ custom_nodes/ComfyUI_LayerStyle/image/inner_glow_example.jpg filter=lfs diff=lfs merge=lfs -text
201
+ custom_nodes/ComfyUI_LayerStyle/image/inner_shadow_example.jpg filter=lfs diff=lfs merge=lfs -text
202
+ custom_nodes/ComfyUI_LayerStyle/image/layer_image_transform_example.jpg filter=lfs diff=lfs merge=lfs -text
203
+ custom_nodes/ComfyUI_LayerStyle/image/layer_image_transform_node.jpg filter=lfs diff=lfs merge=lfs -text
204
+ custom_nodes/ComfyUI_LayerStyle/image/layer_mask_transform_node.jpg filter=lfs diff=lfs merge=lfs -text
205
+ custom_nodes/ComfyUI_LayerStyle/image/layercolor_nodes.jpg filter=lfs diff=lfs merge=lfs -text
206
+ custom_nodes/ComfyUI_LayerStyle/image/layercolor_title.jpg filter=lfs diff=lfs merge=lfs -text
207
+ custom_nodes/ComfyUI_LayerStyle/image/layerfilter_nodes.jpg filter=lfs diff=lfs merge=lfs -text
208
+ custom_nodes/ComfyUI_LayerStyle/image/layermask_nodes.jpg filter=lfs diff=lfs merge=lfs -text
209
+ custom_nodes/ComfyUI_LayerStyle/image/layerstyle_nodes.jpg filter=lfs diff=lfs merge=lfs -text
210
+ custom_nodes/ComfyUI_LayerStyle/image/layerstyle_title.jpg filter=lfs diff=lfs merge=lfs -text
211
+ custom_nodes/ComfyUI_LayerStyle/image/layerutility_nodes.jpg filter=lfs diff=lfs merge=lfs -text
212
+ custom_nodes/ComfyUI_LayerStyle/image/levels_example.jpg filter=lfs diff=lfs merge=lfs -text
213
+ custom_nodes/ComfyUI_LayerStyle/image/light_leak_example.jpg filter=lfs diff=lfs merge=lfs -text
214
+ custom_nodes/ComfyUI_LayerStyle/image/lut_apply_example.jpg filter=lfs diff=lfs merge=lfs -text
215
+ custom_nodes/ComfyUI_LayerStyle/image/mask_box_detect_example.jpg filter=lfs diff=lfs merge=lfs -text
216
+ custom_nodes/ComfyUI_LayerStyle/image/mask_box_extend_example.jpg filter=lfs diff=lfs merge=lfs -text
217
+ custom_nodes/ComfyUI_LayerStyle/image/mask_box_extend_node.jpg filter=lfs diff=lfs merge=lfs -text
218
+ custom_nodes/ComfyUI_LayerStyle/image/mask_by_color_example.jpg filter=lfs diff=lfs merge=lfs -text
219
+ custom_nodes/ComfyUI_LayerStyle/image/mask_edge_compare.jpg filter=lfs diff=lfs merge=lfs -text
220
+ custom_nodes/ComfyUI_LayerStyle/image/mask_edge_shrink_example.jpg filter=lfs diff=lfs merge=lfs -text
221
+ custom_nodes/ComfyUI_LayerStyle/image/mask_edge_shrink_node.jpg filter=lfs diff=lfs merge=lfs -text
222
+ custom_nodes/ComfyUI_LayerStyle/image/mask_edge_ultra_detail_example.jpg filter=lfs diff=lfs merge=lfs -text
223
+ custom_nodes/ComfyUI_LayerStyle/image/mask_edge_ultra_detail_node.jpg filter=lfs diff=lfs merge=lfs -text
224
+ custom_nodes/ComfyUI_LayerStyle/image/mask_edge_ultra_detail_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
225
+ custom_nodes/ComfyUI_LayerStyle/image/mask_edge_ultra_detail_v3_example.jpg filter=lfs diff=lfs merge=lfs -text
226
+ custom_nodes/ComfyUI_LayerStyle/image/mask_edge_ultra_detail_v3_node.jpg filter=lfs diff=lfs merge=lfs -text
227
+ custom_nodes/ComfyUI_LayerStyle/image/mask_gradient_example.jpg filter=lfs diff=lfs merge=lfs -text
228
+ custom_nodes/ComfyUI_LayerStyle/image/mask_grow_example.jpg filter=lfs diff=lfs merge=lfs -text
229
+ custom_nodes/ComfyUI_LayerStyle/image/mask_invert.jpg filter=lfs diff=lfs merge=lfs -text
230
+ custom_nodes/ComfyUI_LayerStyle/image/mask_motion_blur_example.jpg filter=lfs diff=lfs merge=lfs -text
231
+ custom_nodes/ComfyUI_LayerStyle/image/mask_stroke_example.jpg filter=lfs diff=lfs merge=lfs -text
232
+ custom_nodes/ComfyUI_LayerStyle/image/menu_layer_utility.jpg filter=lfs diff=lfs merge=lfs -text
233
+ custom_nodes/ComfyUI_LayerStyle/image/name_to_color_example.jpg filter=lfs diff=lfs merge=lfs -text
234
+ custom_nodes/ComfyUI_LayerStyle/image/name_to_color_node.jpg filter=lfs diff=lfs merge=lfs -text
235
+ custom_nodes/ComfyUI_LayerStyle/image/outer_glow_example.jpg filter=lfs diff=lfs merge=lfs -text
236
+ custom_nodes/ComfyUI_LayerStyle/image/pixel_spread_example.jpg filter=lfs diff=lfs merge=lfs -text
237
+ custom_nodes/ComfyUI_LayerStyle/image/purge_vram_example.jpg filter=lfs diff=lfs merge=lfs -text
238
+ custom_nodes/ComfyUI_LayerStyle/image/queue_stop_example.jpg filter=lfs diff=lfs merge=lfs -text
239
+ custom_nodes/ComfyUI_LayerStyle/image/random_generator_example.jpg filter=lfs diff=lfs merge=lfs -text
240
+ custom_nodes/ComfyUI_LayerStyle/image/random_generator_node.jpg filter=lfs diff=lfs merge=lfs -text
241
+ custom_nodes/ComfyUI_LayerStyle/image/random_generator_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
242
+ custom_nodes/ComfyUI_LayerStyle/image/rembg_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
243
+ custom_nodes/ComfyUI_LayerStyle/image/rounded_rectangle_example.jpg filter=lfs diff=lfs merge=lfs -text
244
+ custom_nodes/ComfyUI_LayerStyle/image/rounded_rectangle_node.jpg filter=lfs diff=lfs merge=lfs -text
245
+ custom_nodes/ComfyUI_LayerStyle/image/segformer_clothes_example.jpg filter=lfs diff=lfs merge=lfs -text
246
+ custom_nodes/ComfyUI_LayerStyle/image/segformer_clothes_pipeline_node.jpg filter=lfs diff=lfs merge=lfs -text
247
+ custom_nodes/ComfyUI_LayerStyle/image/segformer_clothes_setting_node.jpg filter=lfs diff=lfs merge=lfs -text
248
+ custom_nodes/ComfyUI_LayerStyle/image/segformer_fashion_example.jpg filter=lfs diff=lfs merge=lfs -text
249
+ custom_nodes/ComfyUI_LayerStyle/image/segformer_fashion_pipeline_node.jpg filter=lfs diff=lfs merge=lfs -text
250
+ custom_nodes/ComfyUI_LayerStyle/image/segformer_fashion_setting_node.jpg filter=lfs diff=lfs merge=lfs -text
251
+ custom_nodes/ComfyUI_LayerStyle/image/segformer_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
252
+ custom_nodes/ComfyUI_LayerStyle/image/segformer_ultra_node.jpg filter=lfs diff=lfs merge=lfs -text
253
+ custom_nodes/ComfyUI_LayerStyle/image/segfromer_ultra_v3_node.jpg filter=lfs diff=lfs merge=lfs -text
254
+ custom_nodes/ComfyUI_LayerStyle/image/segment_anything_ultra_compare.jpg filter=lfs diff=lfs merge=lfs -text
255
+ custom_nodes/ComfyUI_LayerStyle/image/segment_anything_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
256
+ custom_nodes/ComfyUI_LayerStyle/image/segment_anything_ultra_node.jpg filter=lfs diff=lfs merge=lfs -text
257
+ custom_nodes/ComfyUI_LayerStyle/image/segment_anything_ultra_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
258
+ custom_nodes/ComfyUI_LayerStyle/image/shadow_and_highlight_mask_example.jpg filter=lfs diff=lfs merge=lfs -text
259
+ custom_nodes/ComfyUI_LayerStyle/image/sharp_and_soft_example.jpg filter=lfs diff=lfs merge=lfs -text
260
+ custom_nodes/ComfyUI_LayerStyle/image/simple_text_image_example.jpg filter=lfs diff=lfs merge=lfs -text
261
+ custom_nodes/ComfyUI_LayerStyle/image/simple_text_image_node.jpg filter=lfs diff=lfs merge=lfs -text
262
+ custom_nodes/ComfyUI_LayerStyle/image/skin_beauty_example.jpg filter=lfs diff=lfs merge=lfs -text
263
+ custom_nodes/ComfyUI_LayerStyle/image/soft_light_example.jpg filter=lfs diff=lfs merge=lfs -text
264
+ custom_nodes/ComfyUI_LayerStyle/image/string_condition_example.jpg filter=lfs diff=lfs merge=lfs -text
265
+ custom_nodes/ComfyUI_LayerStyle/image/stroke_example.jpg filter=lfs diff=lfs merge=lfs -text
266
+ custom_nodes/ComfyUI_LayerStyle/image/switch_case_example.jpg filter=lfs diff=lfs merge=lfs -text
267
+ custom_nodes/ComfyUI_LayerStyle/image/text_image_example.jpg filter=lfs diff=lfs merge=lfs -text
268
+ custom_nodes/ComfyUI_LayerStyle/image/text_image_node.jpg filter=lfs diff=lfs merge=lfs -text
269
+ custom_nodes/ComfyUI_LayerStyle/image/text_image_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
270
+ custom_nodes/ComfyUI_LayerStyle/image/text_join_example.jpg filter=lfs diff=lfs merge=lfs -text
271
+ custom_nodes/ComfyUI_LayerStyle/image/text_preseter_node.jpg filter=lfs diff=lfs merge=lfs -text
272
+ custom_nodes/ComfyUI_LayerStyle/image/title.jpg filter=lfs diff=lfs merge=lfs -text
273
+ custom_nodes/ComfyUI_LayerStyle/image/ultra_nodes.jpg filter=lfs diff=lfs merge=lfs -text
274
+ custom_nodes/ComfyUI_LayerStyle/image/ultra_v2_nodes_example.jpg filter=lfs diff=lfs merge=lfs -text
275
+ custom_nodes/ComfyUI_LayerStyle/image/vqa_prompt_example.jpg filter=lfs diff=lfs merge=lfs -text
276
+ custom_nodes/ComfyUI_LayerStyle/image/vqa_prompt_node.jpg filter=lfs diff=lfs merge=lfs -text
277
+ custom_nodes/ComfyUI_LayerStyle/image/water_color_example.jpg filter=lfs diff=lfs merge=lfs -text
278
+ custom_nodes/ComfyUI_LayerStyle/image/xy2percent_example.jpg filter=lfs diff=lfs merge=lfs -text
279
+ custom_nodes/ComfyUI_LayerStyle/py/__pycache__/color_name.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
280
+ custom_nodes/ComfyUI_LayerStyle/py/__pycache__/imagefunc.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
281
+ custom_nodes/ComfyUI_LayerStyle/workflow/1280x720_seven_person.jpg filter=lfs diff=lfs merge=lfs -text
282
+ custom_nodes/ComfyUI_LayerStyle/workflow/1280x720car.jpg filter=lfs diff=lfs merge=lfs -text
283
+ custom_nodes/ComfyUI_LayerStyle/workflow/1280x768_city.png filter=lfs diff=lfs merge=lfs -text
284
+ custom_nodes/ComfyUI_LayerStyle/workflow/1344x768_beach.png filter=lfs diff=lfs merge=lfs -text
285
+ custom_nodes/ComfyUI_LayerStyle/workflow/1344x768_girl2.png filter=lfs diff=lfs merge=lfs -text
286
+ custom_nodes/ComfyUI_LayerStyle/workflow/1344x768_hair.png filter=lfs diff=lfs merge=lfs -text
287
+ custom_nodes/ComfyUI_LayerStyle/workflow/1344x768_redcar.png filter=lfs diff=lfs merge=lfs -text
288
+ custom_nodes/ComfyUI_LayerStyle/workflow/1920x1080table.png filter=lfs diff=lfs merge=lfs -text
289
+ custom_nodes/ComfyUI_LayerStyle/workflow/3840x2160car.jpg filter=lfs diff=lfs merge=lfs -text
290
+ custom_nodes/ComfyUI_LayerStyle/workflow/512x512.png filter=lfs diff=lfs merge=lfs -text
291
+ custom_nodes/ComfyUI_LayerStyle/workflow/768x1344_beach.png filter=lfs diff=lfs merge=lfs -text
292
+ custom_nodes/ComfyUI_LayerStyle/workflow/768x1344_dress.png filter=lfs diff=lfs merge=lfs -text
293
+ custom_nodes/ComfyUI_LayerStyle/workflow/fox_512x512.png filter=lfs diff=lfs merge=lfs -text
294
+ custom_nodes/ComfyUI_LayerStyle/workflow/girl_dino_1024.png filter=lfs diff=lfs merge=lfs -text
295
+ custom_nodes/ComfyUI_LayerStyle/workflow/plaid.jpg filter=lfs diff=lfs merge=lfs -text
296
+ custom_nodes/ComfyUI_LayerStyle/workflow/red_dress-trimap.jpg filter=lfs diff=lfs merge=lfs -text
297
+ custom_nodes/ComfyUI_LayerStyle/workflow/red_dress.jpg filter=lfs diff=lfs merge=lfs -text
298
+ custom_nodes/ComfyUI_LayerStyle_Advance/face_landmarker/face_landmarker.task filter=lfs diff=lfs merge=lfs -text
299
+ custom_nodes/ComfyUI_LayerStyle_Advance/font/Alibaba-PuHuiTi-Heavy.ttf filter=lfs diff=lfs merge=lfs -text
300
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/birefnet_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
301
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/birefnet_ultra_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
302
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/birefnet_ultra_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
303
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/blend_mode_result.jpg filter=lfs diff=lfs merge=lfs -text
304
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/blend_mode_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
305
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/collage_example.jpg filter=lfs diff=lfs merge=lfs -text
306
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/collage_node.jpg filter=lfs diff=lfs merge=lfs -text
307
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/data_nodes_example.jpg filter=lfs diff=lfs merge=lfs -text
308
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/deepseek_api_example.jpg filter=lfs diff=lfs merge=lfs -text
309
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/deepseek_api_node.jpg filter=lfs diff=lfs merge=lfs -text
310
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/deepseek_api_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
311
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/draw_bbox_mask_example.jpg filter=lfs diff=lfs merge=lfs -text
312
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/draw_bbox_mask_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
313
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/draw_bbox_mask_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
314
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/evf_sam_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
315
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/evf_sam_ultra_node.jpg filter=lfs diff=lfs merge=lfs -text
316
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/florence2_image2prompt_example.jpg filter=lfs diff=lfs merge=lfs -text
317
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/florence2_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
318
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/gemini_example.jpg filter=lfs diff=lfs merge=lfs -text
319
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/gemini_image_edit_example.jpg filter=lfs diff=lfs merge=lfs -text
320
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/gemini_image_edit_node.jpg filter=lfs diff=lfs merge=lfs -text
321
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/gemini_node.jpg filter=lfs diff=lfs merge=lfs -text
322
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/gemini_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
323
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/gemini_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
324
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/get_color_tone_example.jpg filter=lfs diff=lfs merge=lfs -text
325
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/get_color_tone_v2_example.jpg filter=lfs diff=lfs merge=lfs -text
326
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/human_parts_node.jpg filter=lfs diff=lfs merge=lfs -text
327
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/human_parts_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
328
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/image_auto_crop_example.jpg filter=lfs diff=lfs merge=lfs -text
329
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/image_auto_crop_node.jpg filter=lfs diff=lfs merge=lfs -text
330
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/image_auto_crop_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
331
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/image_auto_crop_v3_node.jpg filter=lfs diff=lfs merge=lfs -text
332
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/image_reward_filter_example.jpg filter=lfs diff=lfs merge=lfs -text
333
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/jimeng_image_to_image_api_example.jpg filter=lfs diff=lfs merge=lfs -text
334
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/jimeng_image_to_image_api_node.jpg filter=lfs diff=lfs merge=lfs -text
335
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/joycaption2_example.jpg filter=lfs diff=lfs merge=lfs -text
336
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/joycaption2_extra_options_node.jpg filter=lfs diff=lfs merge=lfs -text
337
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/joycaption2_node.jpg filter=lfs diff=lfs merge=lfs -text
338
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/joycaption_beta1_example.jpg filter=lfs diff=lfs merge=lfs -text
339
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/joycaption_beta1_extra_options_node.jpg filter=lfs diff=lfs merge=lfs -text
340
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/joycaption_beta_1_node.jpg filter=lfs diff=lfs merge=lfs -text
341
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/lama_example.jpg filter=lfs diff=lfs merge=lfs -text
342
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/light_leak_example.jpg filter=lfs diff=lfs merge=lfs -text
343
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/llama_vision_example.jpg filter=lfs diff=lfs merge=lfs -text
344
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/llama_vision_node.jpg filter=lfs diff=lfs merge=lfs -text
345
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/load_image_example.jpg filter=lfs diff=lfs merge=lfs -text
346
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/load_image_example_psd_file.jpg filter=lfs diff=lfs merge=lfs -text
347
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/load_joycaption_beta1_model_node.jpg filter=lfs diff=lfs merge=lfs -text
348
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/load_segmentanything_model_node.jpg filter=lfs diff=lfs merge=lfs -text
349
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/mask_by_different_example.jpg filter=lfs diff=lfs merge=lfs -text
350
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/mask_by_different_node.jpg filter=lfs diff=lfs merge=lfs -text
351
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/object_detector_gemini_example.jpg filter=lfs diff=lfs merge=lfs -text
352
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/object_detector_yolo_world_node.jpg filter=lfs diff=lfs merge=lfs -text
353
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/outer_glow_example.jpg filter=lfs diff=lfs merge=lfs -text
354
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/person_mask_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
355
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/person_mask_ultra_node.jpg filter=lfs diff=lfs merge=lfs -text
356
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/phi_prompt_example.jpg filter=lfs diff=lfs merge=lfs -text
357
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/phi_prompt_node.jpg filter=lfs diff=lfs merge=lfs -text
358
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/prompt_embellish_example.jpg filter=lfs diff=lfs merge=lfs -text
359
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/prompt_tagger_example.jpg filter=lfs diff=lfs merge=lfs -text
360
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/prompt_tagger_example1.jpg filter=lfs diff=lfs merge=lfs -text
361
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/qwen_image2prompt_example.jpg filter=lfs diff=lfs merge=lfs -text
362
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/sam2_example.jpg filter=lfs diff=lfs merge=lfs -text
363
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/sam2_ultra_node.jpg filter=lfs diff=lfs merge=lfs -text
364
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/sam2_ultra_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
365
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/sam2_video_ultra_node.jpg filter=lfs diff=lfs merge=lfs -text
366
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/saveimage_plus_example.jpg filter=lfs diff=lfs merge=lfs -text
367
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/saveimage_plus_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
368
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/sd3_negative_conditioning_example.jpg filter=lfs diff=lfs merge=lfs -text
369
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/sd3_negative_conditioning_node_note.jpg filter=lfs diff=lfs merge=lfs -text
370
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/segment_anything_ultra_compare.jpg filter=lfs diff=lfs merge=lfs -text
371
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/segment_anything_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
372
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/segment_anything_ultra_node.jpg filter=lfs diff=lfs merge=lfs -text
373
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/segment_anything_ultra_v2_node.jpg filter=lfs diff=lfs merge=lfs -text
374
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/segment_anything_ultra_v3_example.jpg filter=lfs diff=lfs merge=lfs -text
375
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/segment_anything_ultra_v3_node.jpg filter=lfs diff=lfs merge=lfs -text
376
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/smollm2_example.jpg filter=lfs diff=lfs merge=lfs -text
377
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/smollm2_node.jpg filter=lfs diff=lfs merge=lfs -text
378
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/smolvlm_example.jpg filter=lfs diff=lfs merge=lfs -text
379
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/transparent_background_ultra_example.jpg filter=lfs diff=lfs merge=lfs -text
380
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/ultra_v2_nodes_example.jpg filter=lfs diff=lfs merge=lfs -text
381
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/userprompt_generator_txt2img_with_reference_node.jpg filter=lfs diff=lfs merge=lfs -text
382
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/water_color_example.jpg filter=lfs diff=lfs merge=lfs -text
383
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/watermark_example.jpg filter=lfs diff=lfs merge=lfs -text
384
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/yolov8_detect_example.jpg filter=lfs diff=lfs merge=lfs -text
385
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/zhipuglm4_example.jpg filter=lfs diff=lfs merge=lfs -text
386
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/zhipuglm4_node.jpg filter=lfs diff=lfs merge=lfs -text
387
+ custom_nodes/ComfyUI_LayerStyle_Advance/image/zhipuglm4v_node.jpg filter=lfs diff=lfs merge=lfs -text
388
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/__pycache__/imagefunc.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
389
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-Black-jiII8dog.woff2 filter=lfs diff=lfs merge=lfs -text
390
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-BlackItalic-1413vuen.woff2 filter=lfs diff=lfs merge=lfs -text
391
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-Bold-srYz_-1B.woff2 filter=lfs diff=lfs merge=lfs -text
392
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-BoldItalic-dE_gZyur.woff2 filter=lfs diff=lfs merge=lfs -text
393
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-ExtraBold-TduDdwUu.woff2 filter=lfs diff=lfs merge=lfs -text
394
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-ExtraBoldItalic-BJafRE5I.woff2 filter=lfs diff=lfs merge=lfs -text
395
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-ExtraLight-w5HAp5iF.woff2 filter=lfs diff=lfs merge=lfs -text
396
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-ExtraLightItalic-ZptecSuc.woff2 filter=lfs diff=lfs merge=lfs -text
397
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-Italic-f6M78thn.woff2 filter=lfs diff=lfs merge=lfs -text
398
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-Light-DFhX0qo-.woff2 filter=lfs diff=lfs merge=lfs -text
399
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-LightItalic-fu56_DRc.woff2 filter=lfs diff=lfs merge=lfs -text
400
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-Medium-dDRaJ8tM.woff2 filter=lfs diff=lfs merge=lfs -text
401
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-MediumItalic-zr3roggP.woff2 filter=lfs diff=lfs merge=lfs -text
402
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-Regular-dEFHw1tF.woff2 filter=lfs diff=lfs merge=lfs -text
403
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-SemiBold-PyS8DO2L.woff2 filter=lfs diff=lfs merge=lfs -text
404
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-SemiBoldItalic-uIDb7hsH.woff2 filter=lfs diff=lfs merge=lfs -text
405
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-Thin-eKObIkJC.woff2 filter=lfs diff=lfs merge=lfs -text
406
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/Inter-ThinItalic-L6uBn3RP.woff2 filter=lfs diff=lfs merge=lfs -text
407
+ custom_nodes/ComfyUI_LayerStyle_Advance/py/iopaint/web_app/assets/kofi_button_black-XI_Dr2zg.png filter=lfs diff=lfs merge=lfs -text
408
+ custom_nodes/ComfyUI_LayerStyle_Advance/whl/hydra_core-1.3.2-py3-none-any.whl filter=lfs diff=lfs merge=lfs -text
409
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/1280x720_seven_person.jpg filter=lfs diff=lfs merge=lfs -text
410
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/1280x720car.jpg filter=lfs diff=lfs merge=lfs -text
411
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/1280x768_city.png filter=lfs diff=lfs merge=lfs -text
412
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/1344x768_beach.png filter=lfs diff=lfs merge=lfs -text
413
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/1344x768_girl2.png filter=lfs diff=lfs merge=lfs -text
414
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/1344x768_hair.png filter=lfs diff=lfs merge=lfs -text
415
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/1344x768_redcar.png filter=lfs diff=lfs merge=lfs -text
416
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/1920x1080table.png filter=lfs diff=lfs merge=lfs -text
417
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/3840x2160car.jpg filter=lfs diff=lfs merge=lfs -text
418
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/512x512.png filter=lfs diff=lfs merge=lfs -text
419
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/768x1344_beach.png filter=lfs diff=lfs merge=lfs -text
420
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/768x1344_dress.png filter=lfs diff=lfs merge=lfs -text
421
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/fox_512x512.png filter=lfs diff=lfs merge=lfs -text
422
+ custom_nodes/ComfyUI_LayerStyle_Advance/workflow/girl_dino_1024.png filter=lfs diff=lfs merge=lfs -text
423
+ custom_nodes/ComfyUI_UltimateSDUpscale/example_workflows/basic-usdu.jpg filter=lfs diff=lfs merge=lfs -text
424
+ custom_nodes/RES4LYF/__pycache__/sigmas.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
425
+ custom_nodes/RES4LYF/__pycache__/style_transfer.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
426
+ custom_nodes/RES4LYF/beta/__pycache__/rk_guide_func_beta.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
427
+ custom_nodes/RES4LYF/beta/__pycache__/rk_sampler_beta.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
428
+ custom_nodes/RES4LYF/beta/__pycache__/samplers.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
429
+ custom_nodes/RES4LYF/beta/__pycache__/samplers_extensions.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
430
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/1.png filter=lfs diff=lfs merge=lfs -text
431
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/10.jpg filter=lfs diff=lfs merge=lfs -text
432
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/11.jpg filter=lfs diff=lfs merge=lfs -text
433
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/2.webp filter=lfs diff=lfs merge=lfs -text
434
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/3.jpg filter=lfs diff=lfs merge=lfs -text
435
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/4.jpg filter=lfs diff=lfs merge=lfs -text
436
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/5.jpeg filter=lfs diff=lfs merge=lfs -text
437
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/6.webp filter=lfs diff=lfs merge=lfs -text
438
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/7.jpg filter=lfs diff=lfs merge=lfs -text
439
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/8.jpg filter=lfs diff=lfs merge=lfs -text
440
+ custom_nodes/RES4LYF/example_workflows/blur_killing_style_guides/9.jpg filter=lfs diff=lfs merge=lfs -text
441
+ custom_nodes/RES4LYF/example_workflows/chroma[[:space:]]regional[[:space:]]antiblur[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
442
+ custom_nodes/RES4LYF/example_workflows/chroma[[:space:]]regional[[:space:]]antiblur.jpg filter=lfs diff=lfs merge=lfs -text
443
+ custom_nodes/RES4LYF/example_workflows/chroma[[:space:]]txt2img[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
444
+ custom_nodes/RES4LYF/example_workflows/comparison[[:space:]]ksampler[[:space:]]vs[[:space:]]csksampler[[:space:]]chain[[:space:]]workflows.jpg filter=lfs diff=lfs merge=lfs -text
445
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]faceswap[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
446
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]faceswap[[:space:]]sync[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
447
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]faceswap[[:space:]]sync[[:space:]]pulid[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
448
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]faceswap.jpg filter=lfs diff=lfs merge=lfs -text
449
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]inpaint[[:space:]]area[[:space:]](source[[:space:]]image).jpg filter=lfs diff=lfs merge=lfs -text
450
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]inpaint[[:space:]]area[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
451
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]inpaint[[:space:]]area.jpg filter=lfs diff=lfs merge=lfs -text
452
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]inpaint[[:space:]]bongmath.jpg filter=lfs diff=lfs merge=lfs -text
453
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]inpainting[[:space:]]input.jpg filter=lfs diff=lfs merge=lfs -text
454
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]inpainting.png filter=lfs diff=lfs merge=lfs -text
455
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]antiblur[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
456
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]antiblur.jpg filter=lfs diff=lfs merge=lfs -text
457
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]redux[[:space:]](2[[:space:]]zone)[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
458
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]redux[[:space:]](2[[:space:]]zone).jpg filter=lfs diff=lfs merge=lfs -text
459
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]redux[[:space:]](3[[:space:]]zone)[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
460
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]redux[[:space:]](3[[:space:]]zone).jpg filter=lfs diff=lfs merge=lfs -text
461
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]redux[[:space:]](3[[:space:]]zone,[[:space:]]nested)[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
462
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]redux[[:space:]](3[[:space:]]zone,[[:space:]]nested).jpg filter=lfs diff=lfs merge=lfs -text
463
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]redux[[:space:]](3[[:space:]]zone,[[:space:]]overlapping)[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
464
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]regional[[:space:]]redux[[:space:]](3[[:space:]]zone,[[:space:]]overlapping).jpg filter=lfs diff=lfs merge=lfs -text
465
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]style[[:space:]]antiblur[[:space:]](input).jpg filter=lfs diff=lfs merge=lfs -text
466
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]style[[:space:]]antiblur[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
467
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]style[[:space:]]antiblur.jpg filter=lfs diff=lfs merge=lfs -text
468
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]style[[:space:]]transfer[[:space:]]gguf[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
469
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]style[[:space:]]transfer[[:space:]]gguf.jpg filter=lfs diff=lfs merge=lfs -text
470
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]upscale[[:space:]]thumbnail[[:space:]]large[[:space:]](input).png filter=lfs diff=lfs merge=lfs -text
471
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]upscale[[:space:]]thumbnail[[:space:]]large[[:space:]]multistage.jpg filter=lfs diff=lfs merge=lfs -text
472
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]upscale[[:space:]]thumbnail[[:space:]]large.jpg filter=lfs diff=lfs merge=lfs -text
473
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]upscale[[:space:]]thumbnail[[:space:]]widescreen[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
474
+ custom_nodes/RES4LYF/example_workflows/flux[[:space:]]upscale[[:space:]]thumbnail[[:space:]]widescreen.jpg filter=lfs diff=lfs merge=lfs -text
475
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]data[[:space:]]projection[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
476
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]data[[:space:]]projection.jpg filter=lfs diff=lfs merge=lfs -text
477
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]epsilon[[:space:]]projection[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
478
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]epsilon[[:space:]]projection.jpg filter=lfs diff=lfs merge=lfs -text
479
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]flow[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
480
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]flow.jpg filter=lfs diff=lfs merge=lfs -text
481
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]fully_pseudoimplicit[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
482
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]fully_pseudoimplicit.jpg filter=lfs diff=lfs merge=lfs -text
483
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]lure[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
484
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]lure.jpg filter=lfs diff=lfs merge=lfs -text
485
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]pseudoimplicit[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
486
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]guide[[:space:]]pseudoimplicit.jpg filter=lfs diff=lfs merge=lfs -text
487
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]hires[[:space:]]fix[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
488
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]hires[[:space:]]fix.jpg filter=lfs diff=lfs merge=lfs -text
489
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]regional[[:space:]]3[[:space:]]zones.jpg filter=lfs diff=lfs merge=lfs -text
490
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]regional[[:space:]]3[[:space:]]zones.png filter=lfs diff=lfs merge=lfs -text
491
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]regional[[:space:]]antiblur[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
492
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]regional[[:space:]]antiblur.jpg filter=lfs diff=lfs merge=lfs -text
493
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]antiblur[[:space:]](input).jpg filter=lfs diff=lfs merge=lfs -text
494
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]antiblur[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
495
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]antiblur.jpg filter=lfs diff=lfs merge=lfs -text
496
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer[[:space:]](input).png filter=lfs diff=lfs merge=lfs -text
497
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer[[:space:]](style[[:space:]]reference).png filter=lfs diff=lfs merge=lfs -text
498
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer[[:space:]]txt2img[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
499
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer[[:space:]]txt2img.jpg filter=lfs diff=lfs merge=lfs -text
500
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer[[:space:]]v2[[:space:]](bypassed[[:space:]]style[[:space:]]node).jpg filter=lfs diff=lfs merge=lfs -text
501
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer[[:space:]]v2[[:space:]](style).jpg filter=lfs diff=lfs merge=lfs -text
502
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer[[:space:]]v2[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
503
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer[[:space:]]v2.jpg filter=lfs diff=lfs merge=lfs -text
504
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer.jpg filter=lfs diff=lfs merge=lfs -text
505
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]style[[:space:]]transfer.png filter=lfs diff=lfs merge=lfs -text
506
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]txt2img[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
507
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]txt2img.jpg filter=lfs diff=lfs merge=lfs -text
508
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]unsampling[[:space:]]30[[:space:]]steps[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
509
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]unsampling[[:space:]]30[[:space:]]steps.jpg filter=lfs diff=lfs merge=lfs -text
510
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]unsampling[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
511
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]unsampling[[:space:]]data[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
512
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]unsampling[[:space:]]data.jpg filter=lfs diff=lfs merge=lfs -text
513
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]unsampling[[:space:]]pseudoimplicit[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
514
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]unsampling[[:space:]]pseudoimplicit.jpg filter=lfs diff=lfs merge=lfs -text
515
+ custom_nodes/RES4LYF/example_workflows/hidream[[:space:]]unsampling.jpg filter=lfs diff=lfs merge=lfs -text
516
+ custom_nodes/RES4LYF/example_workflows/intro[[:space:]]to[[:space:]]clownsampling.jpg filter=lfs diff=lfs merge=lfs -text
517
+ custom_nodes/RES4LYF/example_workflows/sd35[[:space:]]medium[[:space:]]unsampling[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
518
+ custom_nodes/RES4LYF/example_workflows/sd35[[:space:]]medium[[:space:]]unsampling[[:space:]]data[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
519
+ custom_nodes/RES4LYF/example_workflows/sd35[[:space:]]medium[[:space:]]unsampling[[:space:]]data.jpg filter=lfs diff=lfs merge=lfs -text
520
+ custom_nodes/RES4LYF/example_workflows/sd35[[:space:]]medium[[:space:]]unsampling[[:space:]]input.jpg filter=lfs diff=lfs merge=lfs -text
521
+ custom_nodes/RES4LYF/example_workflows/sd35[[:space:]]medium[[:space:]]unsampling.jpg filter=lfs diff=lfs merge=lfs -text
522
+ custom_nodes/RES4LYF/example_workflows/sdxl[[:space:]]inpainting[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
523
+ custom_nodes/RES4LYF/example_workflows/sdxl[[:space:]]inpainting[[:space:]]input.png filter=lfs diff=lfs merge=lfs -text
524
+ custom_nodes/RES4LYF/example_workflows/sdxl[[:space:]]inpainting.jpg filter=lfs diff=lfs merge=lfs -text
525
+ custom_nodes/RES4LYF/example_workflows/sdxl[[:space:]]regional[[:space:]]antiblur[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
526
+ custom_nodes/RES4LYF/example_workflows/sdxl[[:space:]]regional[[:space:]]antiblur.jpg filter=lfs diff=lfs merge=lfs -text
527
+ custom_nodes/RES4LYF/example_workflows/sdxl[[:space:]]style[[:space:]]transfer[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
528
+ custom_nodes/RES4LYF/example_workflows/sdxl[[:space:]]style[[:space:]]transfer.jpg filter=lfs diff=lfs merge=lfs -text
529
+ custom_nodes/RES4LYF/example_workflows/style[[:space:]]transfer[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
530
+ custom_nodes/RES4LYF/example_workflows/ultracascade[[:space:]]txt2img[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
531
+ custom_nodes/RES4LYF/example_workflows/ultracascade[[:space:]]txt2img[[:space:]]style[[:space:]]transfer[[:space:]](guide).jpg filter=lfs diff=lfs merge=lfs -text
532
+ custom_nodes/RES4LYF/example_workflows/ultracascade[[:space:]]txt2img[[:space:]]style[[:space:]]transfer[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
533
+ custom_nodes/RES4LYF/example_workflows/ultracascade[[:space:]]txt2img[[:space:]]style[[:space:]]transfer.jpg filter=lfs diff=lfs merge=lfs -text
534
+ custom_nodes/RES4LYF/example_workflows/ultracascade[[:space:]]txt2img.jpg filter=lfs diff=lfs merge=lfs -text
535
+ custom_nodes/RES4LYF/example_workflows/wan[[:space:]]img2vid[[:space:]]720p[[:space:]](fp8[[:space:]]fast)[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
536
+ custom_nodes/RES4LYF/example_workflows/wan[[:space:]]img2vid[[:space:]]720p[[:space:]](fp8[[:space:]]fast).jpg filter=lfs diff=lfs merge=lfs -text
537
+ custom_nodes/RES4LYF/example_workflows/wan[[:space:]]txt2img[[:space:]](fp8[[:space:]]fast)[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
538
+ custom_nodes/RES4LYF/example_workflows/wan[[:space:]]txt2img[[:space:]](fp8[[:space:]]fast).jpg filter=lfs diff=lfs merge=lfs -text
539
+ custom_nodes/RES4LYF/example_workflows/wan[[:space:]]vid2vid[[:space:]]WF.jpg filter=lfs diff=lfs merge=lfs -text
540
+ custom_nodes/RES4LYF/example_workflows/wan[[:space:]]vid2vid.jpg filter=lfs diff=lfs merge=lfs -text
541
+ custom_nodes/RES4LYF/example_workflows/wan[[:space:]]vid2vid.webp filter=lfs diff=lfs merge=lfs -text
542
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]dual[[:space:]]guided[[:space:]]masked[[:space:]]unsampling[[:space:]]SD35M[[:space:]]input1.png filter=lfs diff=lfs merge=lfs -text
543
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]dual[[:space:]]guided[[:space:]]masked[[:space:]]unsampling[[:space:]]SD35M[[:space:]]input2.png filter=lfs diff=lfs merge=lfs -text
544
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]dual[[:space:]]guided[[:space:]]masked[[:space:]]unsampling[[:space:]]SD35M[[:space:]]mask.png filter=lfs diff=lfs merge=lfs -text
545
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]dual[[:space:]]guided[[:space:]]masked[[:space:]]unsampling[[:space:]]SD35M[[:space:]]output.png filter=lfs diff=lfs merge=lfs -text
546
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]dual[[:space:]]guided[[:space:]]masked[[:space:]]unsampling[[:space:]]SD35M.png filter=lfs diff=lfs merge=lfs -text
547
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]guided[[:space:]]unsampling[[:space:]]SD35M[[:space:]]input.png filter=lfs diff=lfs merge=lfs -text
548
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]guided[[:space:]]unsampling[[:space:]]SD35M[[:space:]]output.png filter=lfs diff=lfs merge=lfs -text
549
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]guided[[:space:]]unsampling[[:space:]]SD35M.png filter=lfs diff=lfs merge=lfs -text
550
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]unsampling[[:space:]]SD35L[[:space:]]input.png filter=lfs diff=lfs merge=lfs -text
551
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]unsampling[[:space:]]SD35L[[:space:]]output.png filter=lfs diff=lfs merge=lfs -text
552
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]unsampling[[:space:]]SD35L.png filter=lfs diff=lfs merge=lfs -text
553
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]unsampling[[:space:]]SDXL[[:space:]]input.png filter=lfs diff=lfs merge=lfs -text
554
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]unsampling[[:space:]]SDXL[[:space:]]output.png filter=lfs diff=lfs merge=lfs -text
555
+ custom_nodes/RES4LYF/workflows/img2img[[:space:]]unsampling[[:space:]]SDXL.png filter=lfs diff=lfs merge=lfs -text
556
+ custom_nodes/RES4LYF/workflows/inpainting[[:space:]]WF[[:space:]]flux.png filter=lfs diff=lfs merge=lfs -text
557
+ custom_nodes/RES4LYF/workflows/inpainting[[:space:]]flux.png filter=lfs diff=lfs merge=lfs -text
558
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]SD35M[[:space:]]output.png filter=lfs diff=lfs merge=lfs -text
559
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]SD35M.png filter=lfs diff=lfs merge=lfs -text
560
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]WF[[:space:]]flux.png filter=lfs diff=lfs merge=lfs -text
561
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]dual[[:space:]]guides[[:space:]]masked[[:space:]]WF[[:space:]]flux.png filter=lfs diff=lfs merge=lfs -text
562
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]dual[[:space:]]guides[[:space:]]masked[[:space:]]flux.png filter=lfs diff=lfs merge=lfs -text
563
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]dual[[:space:]]guides[[:space:]]with[[:space:]]mask[[:space:]]SD35M[[:space:]]input1.png filter=lfs diff=lfs merge=lfs -text
564
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]dual[[:space:]]guides[[:space:]]with[[:space:]]mask[[:space:]]SD35M[[:space:]]input2.png filter=lfs diff=lfs merge=lfs -text
565
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]dual[[:space:]]guides[[:space:]]with[[:space:]]mask[[:space:]]SD35M[[:space:]]mask.png filter=lfs diff=lfs merge=lfs -text
566
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]dual[[:space:]]guides[[:space:]]with[[:space:]]mask[[:space:]]SD35M[[:space:]]output.png filter=lfs diff=lfs merge=lfs -text
567
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]dual[[:space:]]guides[[:space:]]with[[:space:]]mask[[:space:]]SD35M.png filter=lfs diff=lfs merge=lfs -text
568
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]flux.png filter=lfs diff=lfs merge=lfs -text
569
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]guided[[:space:]]SD35M[[:space:]]input.png filter=lfs diff=lfs merge=lfs -text
570
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]guided[[:space:]]SD35M[[:space:]]output.png filter=lfs diff=lfs merge=lfs -text
571
+ custom_nodes/RES4LYF/workflows/txt2img[[:space:]]guided[[:space:]]SD35M.png filter=lfs diff=lfs merge=lfs -text
572
+ custom_nodes/cg-image-picker/docs/Screenshot[[:space:]]both.png filter=lfs diff=lfs merge=lfs -text
573
+ custom_nodes/cg-image-picker/docs/Screenshot.png filter=lfs diff=lfs merge=lfs -text
574
+ custom_nodes/cg-image-picker/docs/both.png filter=lfs diff=lfs merge=lfs -text
575
+ custom_nodes/cg-image-picker/docs/dog.png filter=lfs diff=lfs merge=lfs -text
576
+ custom_nodes/cg-image-picker/docs/fabric-screen.png filter=lfs diff=lfs merge=lfs -text
577
+ custom_nodes/cg-image-picker/docs/fabric.png filter=lfs diff=lfs merge=lfs -text
578
+ custom_nodes/cg-use-everywhere/docs/simple-example-image.png filter=lfs diff=lfs merge=lfs -text
579
+ custom_nodes/cg-use-everywhere/docs/simple-example.png filter=lfs diff=lfs merge=lfs -text
580
+ custom_nodes/cg-use-everywhere/tests/compare.png filter=lfs diff=lfs merge=lfs -text
581
+ custom_nodes/cg-use-everywhere/tests/test.png filter=lfs diff=lfs merge=lfs -text
582
+ custom_nodes/cg-use-everywhere/tests/test2.png filter=lfs diff=lfs merge=lfs -text
583
+ custom_nodes/comfy-plasma/images/brown_node.png filter=lfs diff=lfs merge=lfs -text
584
+ custom_nodes/comfy-plasma/images/example.png filter=lfs diff=lfs merge=lfs -text
585
+ custom_nodes/comfy-plasma/images/example_latent_setup.png filter=lfs diff=lfs merge=lfs -text
586
+ custom_nodes/comfy-plasma/images/example_plasma_setup.png filter=lfs diff=lfs merge=lfs -text
587
+ custom_nodes/comfy-plasma/images/greyscale_node.png filter=lfs diff=lfs merge=lfs -text
588
+ custom_nodes/comfy-plasma/images/pink_node.png filter=lfs diff=lfs merge=lfs -text
589
+ custom_nodes/comfy-plasma/images/random_node.png filter=lfs diff=lfs merge=lfs -text
590
+ custom_nodes/comfyui_controlnet_aux/NotoSans-Regular.ttf filter=lfs diff=lfs merge=lfs -text
591
+ custom_nodes/comfyui_controlnet_aux/examples/CNAuxBanner.jpg filter=lfs diff=lfs merge=lfs -text
592
+ custom_nodes/comfyui_controlnet_aux/examples/ExecuteAll.png filter=lfs diff=lfs merge=lfs -text
593
+ custom_nodes/comfyui_controlnet_aux/examples/ExecuteAll1.jpg filter=lfs diff=lfs merge=lfs -text
594
+ custom_nodes/comfyui_controlnet_aux/examples/ExecuteAll2.jpg filter=lfs diff=lfs merge=lfs -text
595
+ custom_nodes/comfyui_controlnet_aux/examples/comfyui-controlnet-aux-logo.png filter=lfs diff=lfs merge=lfs -text
596
+ custom_nodes/comfyui_controlnet_aux/examples/example_animal_pose.png filter=lfs diff=lfs merge=lfs -text
597
+ custom_nodes/comfyui_controlnet_aux/examples/example_anime_face_segmentor.png filter=lfs diff=lfs merge=lfs -text
598
+ custom_nodes/comfyui_controlnet_aux/examples/example_anyline.png filter=lfs diff=lfs merge=lfs -text
599
+ custom_nodes/comfyui_controlnet_aux/examples/example_densepose.png filter=lfs diff=lfs merge=lfs -text
600
+ custom_nodes/comfyui_controlnet_aux/examples/example_depth_anything.png filter=lfs diff=lfs merge=lfs -text
601
+ custom_nodes/comfyui_controlnet_aux/examples/example_depth_anything_v2.png filter=lfs diff=lfs merge=lfs -text
602
+ custom_nodes/comfyui_controlnet_aux/examples/example_dsine.png filter=lfs diff=lfs merge=lfs -text
603
+ custom_nodes/comfyui_controlnet_aux/examples/example_marigold.png filter=lfs diff=lfs merge=lfs -text
604
+ custom_nodes/comfyui_controlnet_aux/examples/example_marigold_flat.jpg filter=lfs diff=lfs merge=lfs -text
605
+ custom_nodes/comfyui_controlnet_aux/examples/example_mesh_graphormer.png filter=lfs diff=lfs merge=lfs -text
606
+ custom_nodes/comfyui_controlnet_aux/examples/example_metric3d.png filter=lfs diff=lfs merge=lfs -text
607
+ custom_nodes/comfyui_controlnet_aux/examples/example_recolor.png filter=lfs diff=lfs merge=lfs -text
608
+ custom_nodes/comfyui_controlnet_aux/examples/example_save_kps.png filter=lfs diff=lfs merge=lfs -text
609
+ custom_nodes/comfyui_controlnet_aux/examples/example_teed.png filter=lfs diff=lfs merge=lfs -text
610
+ custom_nodes/comfyui_controlnet_aux/examples/example_torchscript.png filter=lfs diff=lfs merge=lfs -text
611
+ custom_nodes/comfyui_controlnet_aux/examples/example_unimatch.png filter=lfs diff=lfs merge=lfs -text
612
+ custom_nodes/comfyui_controlnet_aux/src/custom_controlnet_aux/mesh_graphormer/hand_landmarker.task filter=lfs diff=lfs merge=lfs -text
613
+ custom_nodes/comfyui_controlnet_aux/tests/pose.png filter=lfs diff=lfs merge=lfs -text
614
+ custom_nodes/mikey_nodes/HaldCLUT/Agfa[[:space:]]Vista[[:space:]]200.png filter=lfs diff=lfs merge=lfs -text
615
+ custom_nodes/mikey_nodes/HaldCLUT/Anime.png filter=lfs diff=lfs merge=lfs -text
616
+ custom_nodes/mikey_nodes/HaldCLUT/CandleLight.png filter=lfs diff=lfs merge=lfs -text
617
+ custom_nodes/mikey_nodes/HaldCLUT/ColorNegative.png filter=lfs diff=lfs merge=lfs -text
618
+ custom_nodes/mikey_nodes/HaldCLUT/Fuji[[:space:]]Velvia[[:space:]]50.png filter=lfs diff=lfs merge=lfs -text
619
+ custom_nodes/mikey_nodes/HaldCLUT/Ilford[[:space:]]HP5.png filter=lfs diff=lfs merge=lfs -text
620
+ custom_nodes/mikey_nodes/HaldCLUT/Kodak[[:space:]]ColorPlus[[:space:]]200.png filter=lfs diff=lfs merge=lfs -text
621
+ custom_nodes/mikey_nodes/HaldCLUT/Kodak[[:space:]]Ektachrome[[:space:]]100.png filter=lfs diff=lfs merge=lfs -text
622
+ custom_nodes/mikey_nodes/HaldCLUT/Kodak[[:space:]]Gold[[:space:]]200.png filter=lfs diff=lfs merge=lfs -text
623
+ custom_nodes/mikey_nodes/HaldCLUT/Kodak[[:space:]]Kodachrome[[:space:]]64.png filter=lfs diff=lfs merge=lfs -text
624
+ custom_nodes/mikey_nodes/HaldCLUT/Kodak[[:space:]]TRI-X[[:space:]]400.png filter=lfs diff=lfs merge=lfs -text
625
+ custom_nodes/mikey_nodes/HaldCLUT/TealMagentaGold.png filter=lfs diff=lfs merge=lfs -text
626
+ custom_nodes/mikey_nodes/HaldCLUT/broadcast.png filter=lfs diff=lfs merge=lfs -text
627
+ custom_nodes/mikey_nodes/HaldCLUT/bw.png filter=lfs diff=lfs merge=lfs -text
628
+ custom_nodes/mikey_nodes/HaldCLUT/clipped.png filter=lfs diff=lfs merge=lfs -text
629
+ custom_nodes/mikey_nodes/HaldCLUT/dd.png filter=lfs diff=lfs merge=lfs -text
630
+ custom_nodes/mikey_nodes/HaldCLUT/h8.png filter=lfs diff=lfs merge=lfs -text
631
+ custom_nodes/mikey_nodes/HaldCLUT/lit.png filter=lfs diff=lfs merge=lfs -text
632
+ custom_nodes/mikey_nodes/HaldCLUT/modern.png filter=lfs diff=lfs merge=lfs -text
633
+ custom_nodes/mikey_nodes/HaldCLUT/preset.png filter=lfs diff=lfs merge=lfs -text
634
+ custom_nodes/mikey_nodes/HaldCLUT/retro.png filter=lfs diff=lfs merge=lfs -text
635
+ custom_nodes/mikey_nodes/__pycache__/mikey_nodes.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
636
+ custom_nodes/mikey_nodes/noise.png filter=lfs diff=lfs merge=lfs -text
637
+ custom_nodes/mikey_nodes/noise_bw.png filter=lfs diff=lfs merge=lfs -text
638
+ custom_nodes/rgthree-comfy/docs/rgthree_advanced.png filter=lfs diff=lfs merge=lfs -text
639
+ custom_nodes/rgthree-comfy/docs/rgthree_advanced_metadata.png filter=lfs diff=lfs merge=lfs -text
640
+ custom_nodes/rgthree-comfy/docs/rgthree_context.png filter=lfs diff=lfs merge=lfs -text
641
+ custom_nodes/rgthree-comfy/docs/rgthree_context_metadata.png filter=lfs diff=lfs merge=lfs -text
642
+ custom_nodes/was-node-suite-comfyui/__pycache__/WAS_Node_Suite.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
643
+ custom_nodes/was-node-suite-comfyui/repos/SAM/assets/masks1.png filter=lfs diff=lfs merge=lfs -text
644
+ custom_nodes/was-node-suite-comfyui/repos/SAM/assets/masks2.jpg filter=lfs diff=lfs merge=lfs -text
645
+ custom_nodes/was-node-suite-comfyui/repos/SAM/assets/minidemo.gif filter=lfs diff=lfs merge=lfs -text
646
+ custom_nodes/was-node-suite-comfyui/repos/SAM/assets/model_diagram.png filter=lfs diff=lfs merge=lfs -text
647
+ custom_nodes/was-node-suite-comfyui/repos/SAM/assets/notebook1.png filter=lfs diff=lfs merge=lfs -text
648
+ custom_nodes/was-node-suite-comfyui/repos/SAM/assets/notebook2.png filter=lfs diff=lfs merge=lfs -text
649
+ custom_nodes/was-node-suite-comfyui/repos/SAM/demo/src/assets/data/dogs.jpg filter=lfs diff=lfs merge=lfs -text
650
+ custom_nodes/was-node-suite-comfyui/repos/SAM/notebooks/images/groceries.jpg filter=lfs diff=lfs merge=lfs -text
651
+ custom_nodes/was-node-suite-comfyui/repos/SAM/notebooks/images/truck.jpg filter=lfs diff=lfs merge=lfs -text
custom_nodes/ComfyLiterals/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+
2
+ __pycache__/
custom_nodes/ComfyLiterals/README.md ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # ComfyLiterals
2
+ ![CleanShot 2023-07-22 at 00 13 13](https://github.com/M1kep/ComfyLiterals/assets/2661819/c8bdc4f0-8cf3-4403-be96-34db357520b0)
custom_nodes/ComfyLiterals/__init__.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from .nodes import IntLiteral, FloatLiteral, StringLiteral, CheckpointListLiteral, LoraListLiteral
2
+ from .operations import Operation
3
+ from .startup_utils import symlink_web_dir
4
+
5
+ NODE_CLASS_MAPPINGS = {
6
+ "Int": IntLiteral,
7
+ "Float": FloatLiteral,
8
+ "String": StringLiteral,
9
+ "KepStringLiteral": StringLiteral,
10
+ "Operation": Operation,
11
+ "Checkpoint": CheckpointListLiteral,
12
+ "Lora": LoraListLiteral,
13
+ }
14
+
15
+ NODE_DISPLAY_NAME_MAPPINGS = {
16
+ "KepStringLiteral": "String",
17
+ }
18
+
19
+ EXTENSION_NAME = "ComfyLiterals"
20
+
21
+ symlink_web_dir("js", EXTENSION_NAME)
custom_nodes/ComfyLiterals/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (664 Bytes). View file
 
custom_nodes/ComfyLiterals/__pycache__/nodes.cpython-312.pyc ADDED
Binary file (4.92 kB). View file
 
custom_nodes/ComfyLiterals/__pycache__/operations.cpython-312.pyc ADDED
Binary file (2.67 kB). View file
 
custom_nodes/ComfyLiterals/__pycache__/startup_utils.cpython-312.pyc ADDED
Binary file (1.94 kB). View file
 
custom_nodes/ComfyLiterals/js/operation-node.js ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import {app} from "/scripts/app.js";
2
+
3
+ app.registerExtension({
4
+ name: "ComfyLiterals.OperationNode",
5
+ nodeCreated(node, app) {
6
+ if (node['comfyClass'] === 'Operation') {
7
+ const onAdded = node.onAdded
8
+ node.onAdded = function (graph) {
9
+ console.log("OperationNode onAdded")
10
+ const firstCallbackResp = onAdded ? onAdded.apply(this, arguments) : undefined;
11
+
12
+ /**
13
+ * @type {Record<string, INodeInputSlot>}
14
+ */
15
+ const inputCache = {
16
+ "A": node.inputs[1],
17
+ "B": node.inputs[3]
18
+ }
19
+
20
+ if (this.widgets_values) {
21
+ const aType = this.widgets_values[0]
22
+ const bType = this.widgets_values[1]
23
+
24
+ // [IntA, FloatA, IntB, FloatB]
25
+ const aIdxToDelete = aType === "INT" ? 1 : 0
26
+ // [*A, IntB, FloatB]
27
+ const bIdxToDelete = bType === "INT" ? 3 : 1
28
+
29
+ inputCache["A"] = node.inputs[aIdxToDelete]
30
+ this.removeInput(aIdxToDelete)
31
+ inputCache["B"] = node.inputs[bIdxToDelete]
32
+ this.removeInput(bIdxToDelete)
33
+ } else {
34
+ // Nodes being restored/pasted don't have widget_values
35
+ // Node has 4 inputs(IntA, FloatA, IntB, FloatB)
36
+ // Remove both float inputs, Float B moves to index 2 after Float A is removed
37
+ this.removeInput(1)
38
+ this.removeInput(2)
39
+ }
40
+
41
+ // Add a toggle widget to the node
42
+ this.widgets[0].callback = function (v, canvas, node) {
43
+ addInputAtIndex(node, inputCache["A"], 0)
44
+ inputCache["A"] = node.inputs[1]
45
+ node.removeInput(1)
46
+ }
47
+ this.widgets[1].callback = function (v, canvas, node) {
48
+ addInputAtIndex(node, inputCache["B"], 2)
49
+ inputCache["B"] = node.inputs[1]
50
+ node.removeInput(1)
51
+ }
52
+ }
53
+ }
54
+ }
55
+ })
56
+
57
+ /**
58
+ * Adds an input to a node at the given index.
59
+ * @param node {LGraphNode}
60
+ * @param input {INodeInputSlot}
61
+ * @param index {number}
62
+ * @returns {INodeInputSlot}
63
+ */
64
+ function addInputAtIndex(node, input, index) {
65
+ if (!node.inputs) {
66
+ node.inputs = [];
67
+ }
68
+
69
+ if (index > node.inputs.length) {
70
+ console.warn("LiteGraph: Warning adding port index: " + index + " of node " + node.id + ", it doesnt have so many inputs");
71
+ node.inputs.push(input);
72
+ } else {
73
+ node.inputs.splice(index, 0, input);
74
+ }
75
+ if (node.onInputAdded) {
76
+ node.onInputAdded(input);
77
+ }
78
+ node.setSize(node.computeSize());
79
+ LiteGraph.registerNodeAndSlotType(node, input.type || 0);
80
+
81
+ node.setDirtyCanvas(true, true);
82
+ return input;
83
+ }
custom_nodes/ComfyLiterals/nodes.py ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import folder_paths
2
+
3
+ # Hack: string type that is always equal in not equal comparisons
4
+ class AnyType(str):
5
+ def __ne__(self, __value: object) -> bool:
6
+ return False
7
+
8
+
9
+ # Our any instance wants to be a wildcard string
10
+ ANY = AnyType("*")
11
+ class IntLiteral:
12
+ def __init__(self, ):
13
+ pass
14
+
15
+ @classmethod
16
+ def INPUT_TYPES(s):
17
+ return {
18
+ "required": {
19
+ "Number": ("STRING", {}),
20
+ }
21
+ }
22
+
23
+ RETURN_TYPES = ("INT",)
24
+ FUNCTION = "to_int"
25
+
26
+ CATEGORY = "Literals"
27
+
28
+ def to_int(self, Number):
29
+ try:
30
+ ret_val = int(Number)
31
+ except Exception:
32
+ raise Exception("Invalid value provided for INT")
33
+ return (ret_val,)
34
+
35
+
36
+ class FloatLiteral:
37
+ def __init__(self, ):
38
+ pass
39
+
40
+ @classmethod
41
+ def INPUT_TYPES(s):
42
+ return {
43
+ "required": {
44
+ "Number": ("STRING", {}),
45
+ }
46
+ }
47
+
48
+ RETURN_TYPES = ("FLOAT",)
49
+ FUNCTION = "to_float"
50
+
51
+ CATEGORY = "Literals"
52
+
53
+ def to_float(self, Number):
54
+ try:
55
+ ret_val = float(Number)
56
+ except Exception:
57
+ raise Exception("Invalid value provided for FLOAT")
58
+ return (ret_val,)
59
+
60
+
61
+ class StringLiteral:
62
+ def __init__(self, ):
63
+ pass
64
+
65
+ @classmethod
66
+ def INPUT_TYPES(s):
67
+ return {
68
+ "required": {
69
+ "String": ("STRING", {"multiline": True}),
70
+ }
71
+ }
72
+
73
+ RETURN_TYPES = ("STRING",)
74
+ FUNCTION = "to_string"
75
+
76
+ CATEGORY = "Literals"
77
+
78
+ def to_string(self, String):
79
+ return (String,)
80
+
81
+
82
+ class CheckpointListLiteral:
83
+ def __init__(self):
84
+ pass
85
+
86
+ @classmethod
87
+ def INPUT_TYPES(s):
88
+ return {
89
+ "required": {
90
+ "literal": ("STRING", {
91
+ "multiline": True,
92
+ "default": "\n".join(folder_paths.get_filename_list("checkpoints"))
93
+ }),
94
+ },
95
+ }
96
+
97
+ RETURN_TYPES = (ANY,)
98
+ RETURN_NAMES = ("Selected Checkpoints",)
99
+ OUTPUT_IS_LIST = (True,)
100
+ FUNCTION = "parse_literal"
101
+
102
+ # OUTPUT_NODE = False
103
+
104
+ CATEGORY = "List Stuff"
105
+
106
+ def parse_literal(self, literal):
107
+ split = list(filter(None, literal.split("\n")))
108
+ return (split,)
109
+
110
+ class LoraListLiteral:
111
+ def __init__(self):
112
+ pass
113
+
114
+ @classmethod
115
+ def INPUT_TYPES(s):
116
+ return {
117
+ "required": {
118
+ "literal": ("STRING", {
119
+ "multiline": True,
120
+ "default": "\n".join(folder_paths.get_filename_list("loras"))
121
+ }),
122
+ },
123
+ }
124
+
125
+ RETURN_TYPES = (ANY,)
126
+ RETURN_NAMES = ("Selected Loras",)
127
+ OUTPUT_IS_LIST = (True,)
128
+ FUNCTION = "parse_literal"
129
+
130
+ # OUTPUT_NODE = False
131
+
132
+ CATEGORY = "List Stuff"
133
+
134
+ def parse_literal(self, literal):
135
+ split = list(filter(None, literal.split("\n")))
136
+ return (split,)
custom_nodes/ComfyLiterals/operations.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class Operation:
2
+ def __init__(self, ):
3
+ pass
4
+
5
+ @classmethod
6
+ def INPUT_TYPES(s):
7
+ return {
8
+ "required": {
9
+ "A Type": (["Int", "Float"],),
10
+ "B Type": (["Int", "Float"],),
11
+ "Operation": (["A+B", "A-B", "A*B", "A/B"],)
12
+ },
13
+ "optional": {
14
+ "A - Int": ("INT", {"forceInput": True}),
15
+ "A - Float": ("FLOAT", {"forceInput": True}),
16
+ "B - Int": ("INT", {"forceInput": True}),
17
+ "B - Float": ("FLOAT", {"forceInput": True})
18
+ }
19
+ }
20
+
21
+ RETURN_TYPES = ("INT", "FLOAT")
22
+ FUNCTION = "do_operation"
23
+
24
+ CATEGORY = "Literals"
25
+
26
+ def _do_addition(self, a_val, b_val):
27
+ return (int(a_val + b_val), float(a_val + b_val))
28
+
29
+ def _do_subtraction(self, a_val, b_val):
30
+ return (int(a_val - b_val), float(a_val - b_val))
31
+
32
+ def _do_multiplication(self, a_val, b_val):
33
+ return (int(a_val * b_val), float(a_val * b_val))
34
+
35
+ def _do_division(self, a_val, b_val):
36
+ return (int(a_val / b_val), float(a_val / b_val))
37
+
38
+ def do_operation(self, **kwargs):
39
+ print(f"PrintNode: {kwargs}")
40
+ is_a_int = kwargs["A Type"] == "Int"
41
+ is_b_int = kwargs["B Type"] == "Int"
42
+ a_val = kwargs["A - Int"] if is_a_int else kwargs["A - Float"]
43
+ b_val = kwargs["B - Int"] if is_b_int else kwargs["B - Float"]
44
+
45
+ if kwargs["Operation"] == "A+B":
46
+ return self._do_addition(a_val, b_val)
47
+ elif kwargs["Operation"] == "A-B":
48
+ return self._do_subtraction(a_val, b_val)
49
+ elif kwargs["Operation"] == "A*B":
50
+ return self._do_multiplication(a_val, b_val)
51
+ elif kwargs["Operation"] == "A/B":
52
+ return self._do_division(a_val, b_val)
53
+ else:
54
+ raise Exception("Invalid operation provided")
custom_nodes/ComfyLiterals/startup_utils.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from pathlib import Path
3
+
4
+ import folder_paths
5
+
6
+
7
+ def symlink_web_dir(local_path, extension_name):
8
+ comfy_web_ext_root = Path(os.path.join(folder_paths.base_path, "web", "extensions"))
9
+ target_dir = Path(os.path.join(comfy_web_ext_root, extension_name))
10
+ extension_path = Path(__file__).parent.resolve()
11
+
12
+ if target_dir.exists():
13
+ print(f"Web extensions folder found at {target_dir}")
14
+ elif comfy_web_ext_root.exists():
15
+ try:
16
+ os.symlink((os.path.join(extension_path, local_path)), target_dir)
17
+ except OSError as e: # OSError
18
+ print(
19
+ f"Error:\n{e}\n"
20
+ f"Failed to create symlink to {target_dir}. Please copy the folder manually.\n"
21
+ f"Source: {os.path.join(extension_path, local_path)}\n"
22
+ f"Target: {target_dir}"
23
+ )
24
+ except Exception as e:
25
+ print(f"Unexpected error:\n{e}")
26
+ else:
27
+ print(
28
+ f"Failed to find comfy root automatically, please copy the folder {os.path.join(extension_path, 'web')} manually in the web/extensions folder of ComfyUI"
29
+ )
custom_nodes/ComfyMath/.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ **/__pycache__
custom_nodes/ComfyMath/LICENSE ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
custom_nodes/ComfyMath/README.md ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ComfyMath
2
+
3
+ Provides Math Nodes for [ComfyUI](https://github.com/comfyanonymous/ComfyUI)
4
+
5
+ ## Features
6
+
7
+ Provides nodes for:
8
+ * Boolean Logic
9
+ * Integer Arithmetic
10
+ * Floating Point Arithmetic and Functions
11
+ * Vec2, Vec3, and Vec4 Arithmetic and Functions
12
+
13
+ ## Installation
14
+
15
+ From the `custom_nodes` directory in your ComfyUI installation, run:
16
+
17
+ ```sh
18
+ git clone https://github.com/evanspearman/ComfyMath.git
19
+ ```
custom_nodes/ComfyMath/__init__.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from .src.comfymath.convert import NODE_CLASS_MAPPINGS as convert_NCM
2
+ from .src.comfymath.bool import NODE_CLASS_MAPPINGS as bool_NCM
3
+ from .src.comfymath.int import NODE_CLASS_MAPPINGS as int_NCM
4
+ from .src.comfymath.float import NODE_CLASS_MAPPINGS as float_NCM
5
+ from .src.comfymath.number import NODE_CLASS_MAPPINGS as number_NCM
6
+ from .src.comfymath.vec import NODE_CLASS_MAPPINGS as vec_NCM
7
+ from .src.comfymath.control import NODE_CLASS_MAPPINGS as control_NCM
8
+ from .src.comfymath.graphics import NODE_CLASS_MAPPINGS as graphics_NCM
9
+
10
+
11
+ NODE_CLASS_MAPPINGS = {
12
+ **convert_NCM,
13
+ **bool_NCM,
14
+ **int_NCM,
15
+ **float_NCM,
16
+ **number_NCM,
17
+ **vec_NCM,
18
+ **control_NCM,
19
+ **graphics_NCM,
20
+ }
21
+
22
+
23
+ def remove_cm_prefix(node_mapping: str) -> str:
24
+ if node_mapping.startswith("CM_"):
25
+ return node_mapping[3:]
26
+ return node_mapping
27
+
28
+
29
+ NODE_DISPLAY_NAME_MAPPINGS = {key: remove_cm_prefix(key) for key in NODE_CLASS_MAPPINGS}
custom_nodes/ComfyMath/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (1.06 kB). View file
 
custom_nodes/ComfyMath/pyproject.toml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [tool.poetry]
2
+ name = "comfymath"
3
+ version = "0.1.0"
4
+ description = "Math nodes for ComfyUI"
5
+ authors = ["Evan Spearman <evan@spearman.mb.ca>"]
6
+ license = { text = "Apache License 2.0" }
7
+ readme = "README.md"
8
+
9
+ [tool.poetry.dependencies]
10
+ python = "^3.10"
11
+ numpy = "^1.25.1"
12
+
13
+ [tool.poetry.group.dev.dependencies]
14
+ mypy = "^1.4.1"
15
+ black = "^23.7.0"
16
+
17
+ [build-system]
18
+ requires = ["poetry-core"]
19
+ build-backend = "poetry.core.masonry.api"
custom_nodes/ComfyMath/requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ numpy
custom_nodes/ComfyMath/src/comfymath/__init__.py ADDED
File without changes
custom_nodes/ComfyMath/src/comfymath/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (154 Bytes). View file
 
custom_nodes/ComfyMath/src/comfymath/__pycache__/bool.cpython-312.pyc ADDED
Binary file (3.33 kB). View file
 
custom_nodes/ComfyMath/src/comfymath/__pycache__/control.cpython-312.pyc ADDED
Binary file (305 Bytes). View file
 
custom_nodes/ComfyMath/src/comfymath/__pycache__/convert.cpython-312.pyc ADDED
Binary file (12.1 kB). View file
 
custom_nodes/ComfyMath/src/comfymath/__pycache__/float.cpython-312.pyc ADDED
Binary file (12.2 kB). View file
 
custom_nodes/ComfyMath/src/comfymath/__pycache__/graphics.cpython-312.pyc ADDED
Binary file (5.69 kB). View file
 
custom_nodes/ComfyMath/src/comfymath/__pycache__/int.cpython-312.pyc ADDED
Binary file (8.21 kB). View file
 
custom_nodes/ComfyMath/src/comfymath/__pycache__/number.cpython-312.pyc ADDED
Binary file (4 kB). View file
 
custom_nodes/ComfyMath/src/comfymath/__pycache__/types.cpython-312.pyc ADDED
Binary file (723 Bytes). View file
 
custom_nodes/ComfyMath/src/comfymath/__pycache__/vec.cpython-312.pyc ADDED
Binary file (22.4 kB). View file
 
custom_nodes/ComfyMath/src/comfymath/bool.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Any, Callable, Mapping
2
+
3
+ DEFAULT_BOOL = ("BOOLEAN", {"default": False})
4
+
5
+
6
+ BOOL_UNARY_OPERATIONS: Mapping[str, Callable[[bool], bool]] = {
7
+ "Not": lambda a: not a,
8
+ }
9
+
10
+ BOOL_BINARY_OPERATIONS: Mapping[str, Callable[[bool, bool], bool]] = {
11
+ "Nor": lambda a, b: not (a or b),
12
+ "Xor": lambda a, b: a ^ b,
13
+ "Nand": lambda a, b: not (a and b),
14
+ "And": lambda a, b: a and b,
15
+ "Xnor": lambda a, b: not (a ^ b),
16
+ "Or": lambda a, b: a or b,
17
+ "Eq": lambda a, b: a == b,
18
+ "Neq": lambda a, b: a != b,
19
+ }
20
+
21
+
22
+ class BoolUnaryOperation:
23
+ @classmethod
24
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
25
+ return {
26
+ "required": {"op": (list(BOOL_UNARY_OPERATIONS.keys()),), "a": DEFAULT_BOOL}
27
+ }
28
+
29
+ RETURN_TYPES = ("BOOLEAN",)
30
+ FUNCTION = "op"
31
+ CATEGORY = "math/bool"
32
+
33
+ def op(self, op: str, a: bool) -> tuple[bool]:
34
+ return (BOOL_UNARY_OPERATIONS[op](a),)
35
+
36
+
37
+ class BoolBinaryOperation:
38
+ @classmethod
39
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
40
+ return {
41
+ "required": {
42
+ "op": (list(BOOL_BINARY_OPERATIONS.keys()),),
43
+ "a": DEFAULT_BOOL,
44
+ "b": DEFAULT_BOOL,
45
+ }
46
+ }
47
+
48
+ RETURN_TYPES = ("BOOLEAN",)
49
+ FUNCTION = "op"
50
+ CATEGORY = "math/bool"
51
+
52
+ def op(self, op: str, a: bool, b: bool) -> tuple[bool]:
53
+ return (BOOL_BINARY_OPERATIONS[op](a, b),)
54
+
55
+
56
+ NODE_CLASS_MAPPINGS = {
57
+ "CM_BoolUnaryOperation": BoolUnaryOperation,
58
+ "CM_BoolBinaryOperation": BoolBinaryOperation,
59
+ }
custom_nodes/ComfyMath/src/comfymath/control.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from typing import Any, Mapping
2
+
3
+ NODE_CLASS_MAPPINGS: Mapping[str, Any] = {}
custom_nodes/ComfyMath/src/comfymath/convert.py ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Any, Mapping
2
+
3
+ from .vec import VEC2_ZERO, VEC3_ZERO, VEC4_ZERO
4
+ from .types import Number, Vec2, Vec3, Vec4
5
+
6
+
7
+ class BoolToInt:
8
+ @classmethod
9
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
10
+ return {"required": {"a": ("BOOLEAN", {"default": False})}}
11
+
12
+ RETURN_TYPES = ("INT",)
13
+ FUNCTION = "op"
14
+ CATEGORY = "math/conversion"
15
+
16
+ def op(self, a: bool) -> tuple[int]:
17
+ return (int(a),)
18
+
19
+
20
+ class IntToBool:
21
+ @classmethod
22
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
23
+ return {"required": {"a": ("INT", {"default": 0})}}
24
+
25
+ RETURN_TYPES = ("BOOLEAN",)
26
+ FUNCTION = "op"
27
+ CATEGORY = "math/conversion"
28
+
29
+ def op(self, a: int) -> tuple[bool]:
30
+ return (a != 0,)
31
+
32
+
33
+ class FloatToInt:
34
+ @classmethod
35
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
36
+ return {"required": {"a": ("FLOAT", {"default": 0.0, "round": False})}}
37
+
38
+ RETURN_TYPES = ("INT",)
39
+ FUNCTION = "op"
40
+ CATEGORY = "math/conversion"
41
+
42
+ def op(self, a: float) -> tuple[int]:
43
+ return (int(a),)
44
+
45
+
46
+ class IntToFloat:
47
+ @classmethod
48
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
49
+ return {"required": {"a": ("INT", {"default": 0})}}
50
+
51
+ RETURN_TYPES = ("FLOAT",)
52
+ FUNCTION = "op"
53
+ CATEGORY = "math/conversion"
54
+
55
+ def op(self, a: int) -> tuple[float]:
56
+ return (float(a),)
57
+
58
+
59
+ class IntToNumber:
60
+ @classmethod
61
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
62
+ return {"required": {"a": ("INT", {"default": 0})}}
63
+
64
+ RETURN_TYPES = ("NUMBER",)
65
+ FUNCTION = "op"
66
+ CATEGORY = "math/conversion"
67
+
68
+ def op(self, a: int) -> tuple[Number]:
69
+ return (a,)
70
+
71
+
72
+ class NumberToInt:
73
+ @classmethod
74
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
75
+ return {"required": {"a": ("NUMBER", {"default": 0.0})}}
76
+
77
+ RETURN_TYPES = ("INT",)
78
+ FUNCTION = "op"
79
+ CATEGORY = "math/conversion"
80
+
81
+ def op(self, a: Number) -> tuple[int]:
82
+ return (int(a),)
83
+
84
+
85
+ class FloatToNumber:
86
+ @classmethod
87
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
88
+ return {"required": {"a": ("FLOAT", {"default": 0.0, "round": False})}}
89
+
90
+ RETURN_TYPES = ("NUMBER",)
91
+ FUNCTION = "op"
92
+ CATEGORY = "math/conversion"
93
+
94
+ def op(self, a: float) -> tuple[Number]:
95
+ return (a,)
96
+
97
+
98
+ class NumberToFloat:
99
+ @classmethod
100
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
101
+ return {"required": {"a": ("NUMBER", {"default": 0.0})}}
102
+
103
+ RETURN_TYPES = ("FLOAT",)
104
+ FUNCTION = "op"
105
+ CATEGORY = "math/conversion"
106
+
107
+ def op(self, a: Number) -> tuple[float]:
108
+ return (float(a),)
109
+
110
+
111
+ class ComposeVec2:
112
+ @classmethod
113
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
114
+ return {
115
+ "required": {
116
+ "x": ("FLOAT", {"default": 0.0, "round": False}),
117
+ "y": ("FLOAT", {"default": 0.0, "round": False}),
118
+ }
119
+ }
120
+
121
+ RETURN_TYPES = ("VEC2",)
122
+ FUNCTION = "op"
123
+ CATEGORY = "math/conversion"
124
+
125
+ def op(self, x: float, y: float) -> tuple[Vec2]:
126
+ return ((x, y),)
127
+
128
+
129
+ class FillVec2:
130
+ @classmethod
131
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
132
+ return {
133
+ "required": {
134
+ "a": ("FLOAT", {"default": 0.0, "round": False}),
135
+ }
136
+ }
137
+
138
+ RETURN_TYPES = ("VEC2",)
139
+ FUNCTION = "op"
140
+ CATEGORY = "math/conversion"
141
+
142
+ def op(self, a: float) -> tuple[Vec2]:
143
+ return ((a, a),)
144
+
145
+
146
+ class BreakoutVec2:
147
+ @classmethod
148
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
149
+ return {"required": {"a": ("VEC2", {"default": VEC2_ZERO})}}
150
+
151
+ RETURN_TYPES = ("FLOAT", "FLOAT")
152
+ FUNCTION = "op"
153
+ CATEGORY = "math/conversion"
154
+
155
+ def op(self, a: Vec2) -> tuple[float, float]:
156
+ return (a[0], a[1])
157
+
158
+
159
+ class ComposeVec3:
160
+ @classmethod
161
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
162
+ return {
163
+ "required": {
164
+ "x": ("FLOAT", {"default": 0.0}),
165
+ "y": ("FLOAT", {"default": 0.0}),
166
+ "z": ("FLOAT", {"default": 0.0}),
167
+ }
168
+ }
169
+
170
+ RETURN_TYPES = ("VEC3",)
171
+ FUNCTION = "op"
172
+ CATEGORY = "math/conversion"
173
+
174
+ def op(self, x: float, y: float, z: float) -> tuple[Vec3]:
175
+ return ((x, y, z),)
176
+
177
+
178
+ class FillVec3:
179
+ @classmethod
180
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
181
+ return {
182
+ "required": {
183
+ "a": ("FLOAT", {"default": 0.0}),
184
+ }
185
+ }
186
+
187
+ RETURN_TYPES = ("VEC3",)
188
+ FUNCTION = "op"
189
+ CATEGORY = "math/conversion"
190
+
191
+ def op(self, a: float) -> tuple[Vec3]:
192
+ return ((a, a, a),)
193
+
194
+
195
+ class BreakoutVec3:
196
+ @classmethod
197
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
198
+ return {"required": {"a": ("VEC3", {"default": VEC3_ZERO})}}
199
+
200
+ RETURN_TYPES = ("FLOAT", "FLOAT", "FLOAT")
201
+ FUNCTION = "op"
202
+ CATEGORY = "math/conversion"
203
+
204
+ def op(self, a: Vec3) -> tuple[float, float, float]:
205
+ return (a[0], a[1], a[2])
206
+
207
+
208
+ class ComposeVec4:
209
+ @classmethod
210
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
211
+ return {
212
+ "required": {
213
+ "x": ("FLOAT", {"default": 0.0}),
214
+ "y": ("FLOAT", {"default": 0.0}),
215
+ "z": ("FLOAT", {"default": 0.0}),
216
+ "w": ("FLOAT", {"default": 0.0}),
217
+ }
218
+ }
219
+
220
+ RETURN_TYPES = ("VEC4",)
221
+ FUNCTION = "op"
222
+ CATEGORY = "math/conversion"
223
+
224
+ def op(self, x: float, y: float, z: float, w: float) -> tuple[Vec4]:
225
+ return ((x, y, z, w),)
226
+
227
+
228
+ class FillVec4:
229
+ @classmethod
230
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
231
+ return {
232
+ "required": {
233
+ "a": ("FLOAT", {"default": 0.0}),
234
+ }
235
+ }
236
+
237
+ RETURN_TYPES = ("VEC4",)
238
+ FUNCTION = "op"
239
+ CATEGORY = "math/conversion"
240
+
241
+ def op(self, a: float) -> tuple[Vec4]:
242
+ return ((a, a, a, a),)
243
+
244
+
245
+ class BreakoutVec4:
246
+ @classmethod
247
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
248
+ return {"required": {"a": ("VEC4", {"default": VEC4_ZERO})}}
249
+
250
+ RETURN_TYPES = ("FLOAT", "FLOAT", "FLOAT", "FLOAT")
251
+ FUNCTION = "op"
252
+ CATEGORY = "math/conversion"
253
+
254
+ def op(self, a: Vec4) -> tuple[float, float, float, float]:
255
+ return (a[0], a[1], a[2], a[3])
256
+
257
+
258
+ NODE_CLASS_MAPPINGS = {
259
+ "CM_BoolToInt": BoolToInt,
260
+ "CM_IntToBool": IntToBool,
261
+ "CM_FloatToInt": FloatToInt,
262
+ "CM_IntToFloat": IntToFloat,
263
+ "CM_IntToNumber": IntToNumber,
264
+ "CM_NumberToInt": NumberToInt,
265
+ "CM_FloatToNumber": FloatToNumber,
266
+ "CM_NumberToFloat": NumberToFloat,
267
+ "CM_ComposeVec2": ComposeVec2,
268
+ "CM_ComposeVec3": ComposeVec3,
269
+ "CM_ComposeVec4": ComposeVec4,
270
+ "CM_BreakoutVec2": BreakoutVec2,
271
+ "CM_BreakoutVec3": BreakoutVec3,
272
+ "CM_BreakoutVec4": BreakoutVec4,
273
+ }
custom_nodes/ComfyMath/src/comfymath/float.py ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+
3
+ from typing import Any, Callable, Mapping
4
+
5
+ DEFAULT_FLOAT = ("FLOAT", {"default": 0.0, "step": 0.001, "round": False})
6
+
7
+ FLOAT_UNARY_OPERATIONS: Mapping[str, Callable[[float], float]] = {
8
+ "Neg": lambda a: -a,
9
+ "Inc": lambda a: a + 1,
10
+ "Dec": lambda a: a - 1,
11
+ "Abs": lambda a: abs(a),
12
+ "Sqr": lambda a: a * a,
13
+ "Cube": lambda a: a * a * a,
14
+ "Sqrt": lambda a: math.sqrt(a),
15
+ "Exp": lambda a: math.exp(a),
16
+ "Ln": lambda a: math.log(a),
17
+ "Log10": lambda a: math.log10(a),
18
+ "Log2": lambda a: math.log2(a),
19
+ "Sin": lambda a: math.sin(a),
20
+ "Cos": lambda a: math.cos(a),
21
+ "Tan": lambda a: math.tan(a),
22
+ "Asin": lambda a: math.asin(a),
23
+ "Acos": lambda a: math.acos(a),
24
+ "Atan": lambda a: math.atan(a),
25
+ "Sinh": lambda a: math.sinh(a),
26
+ "Cosh": lambda a: math.cosh(a),
27
+ "Tanh": lambda a: math.tanh(a),
28
+ "Asinh": lambda a: math.asinh(a),
29
+ "Acosh": lambda a: math.acosh(a),
30
+ "Atanh": lambda a: math.atanh(a),
31
+ "Round": lambda a: round(a),
32
+ "Floor": lambda a: math.floor(a),
33
+ "Ceil": lambda a: math.ceil(a),
34
+ "Trunc": lambda a: math.trunc(a),
35
+ "Erf": lambda a: math.erf(a),
36
+ "Erfc": lambda a: math.erfc(a),
37
+ "Gamma": lambda a: math.gamma(a),
38
+ "Radians": lambda a: math.radians(a),
39
+ "Degrees": lambda a: math.degrees(a),
40
+ }
41
+
42
+ FLOAT_UNARY_CONDITIONS: Mapping[str, Callable[[float], bool]] = {
43
+ "IsZero": lambda a: a == 0.0,
44
+ "IsPositive": lambda a: a > 0.0,
45
+ "IsNegative": lambda a: a < 0.0,
46
+ "IsNonZero": lambda a: a != 0.0,
47
+ "IsPositiveInfinity": lambda a: math.isinf(a) and a > 0.0,
48
+ "IsNegativeInfinity": lambda a: math.isinf(a) and a < 0.0,
49
+ "IsNaN": lambda a: math.isnan(a),
50
+ "IsFinite": lambda a: math.isfinite(a),
51
+ "IsInfinite": lambda a: math.isinf(a),
52
+ "IsEven": lambda a: a % 2 == 0.0,
53
+ "IsOdd": lambda a: a % 2 != 0.0,
54
+ }
55
+
56
+ FLOAT_BINARY_OPERATIONS: Mapping[str, Callable[[float, float], float]] = {
57
+ "Add": lambda a, b: a + b,
58
+ "Sub": lambda a, b: a - b,
59
+ "Mul": lambda a, b: a * b,
60
+ "Div": lambda a, b: a / b,
61
+ "Mod": lambda a, b: a % b,
62
+ "Pow": lambda a, b: a**b,
63
+ "FloorDiv": lambda a, b: a // b,
64
+ "Max": lambda a, b: max(a, b),
65
+ "Min": lambda a, b: min(a, b),
66
+ "Log": lambda a, b: math.log(a, b),
67
+ "Atan2": lambda a, b: math.atan2(a, b),
68
+ }
69
+
70
+ FLOAT_BINARY_CONDITIONS: Mapping[str, Callable[[float, float], bool]] = {
71
+ "Eq": lambda a, b: a == b,
72
+ "Neq": lambda a, b: a != b,
73
+ "Gt": lambda a, b: a > b,
74
+ "Gte": lambda a, b: a >= b,
75
+ "Lt": lambda a, b: a < b,
76
+ "Lte": lambda a, b: a <= b,
77
+ }
78
+
79
+
80
+ class FloatUnaryOperation:
81
+ @classmethod
82
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
83
+ return {
84
+ "required": {
85
+ "op": (list(FLOAT_UNARY_OPERATIONS.keys()),),
86
+ "a": DEFAULT_FLOAT,
87
+ }
88
+ }
89
+
90
+ RETURN_TYPES = ("FLOAT",)
91
+ FUNCTION = "op"
92
+ CATEGORY = "math/float"
93
+
94
+ def op(self, op: str, a: float) -> tuple[float]:
95
+ return (FLOAT_UNARY_OPERATIONS[op](a),)
96
+
97
+
98
+ class FloatUnaryCondition:
99
+ @classmethod
100
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
101
+ return {
102
+ "required": {
103
+ "op": (list(FLOAT_UNARY_CONDITIONS.keys()),),
104
+ "a": DEFAULT_FLOAT,
105
+ }
106
+ }
107
+
108
+ RETURN_TYPES = ("BOOLEAN",)
109
+ FUNCTION = "op"
110
+ CATEGORY = "math/float"
111
+
112
+ def op(self, op: str, a: float) -> tuple[bool]:
113
+ return (FLOAT_UNARY_CONDITIONS[op](a),)
114
+
115
+
116
+ class FloatBinaryOperation:
117
+ @classmethod
118
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
119
+ return {
120
+ "required": {
121
+ "op": (list(FLOAT_BINARY_OPERATIONS.keys()),),
122
+ "a": DEFAULT_FLOAT,
123
+ "b": DEFAULT_FLOAT,
124
+ }
125
+ }
126
+
127
+ RETURN_TYPES = ("FLOAT",)
128
+ FUNCTION = "op"
129
+ CATEGORY = "math/float"
130
+
131
+ def op(self, op: str, a: float, b: float) -> tuple[float]:
132
+ return (FLOAT_BINARY_OPERATIONS[op](a, b),)
133
+
134
+
135
+ class FloatBinaryCondition:
136
+ @classmethod
137
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
138
+ return {
139
+ "required": {
140
+ "op": (list(FLOAT_BINARY_CONDITIONS.keys()),),
141
+ "a": DEFAULT_FLOAT,
142
+ "b": DEFAULT_FLOAT,
143
+ }
144
+ }
145
+
146
+ RETURN_TYPES = ("BOOLEAN",)
147
+ FUNCTION = "op"
148
+ CATEGORY = "math/float"
149
+
150
+ def op(self, op: str, a: float, b: float) -> tuple[bool]:
151
+ return (FLOAT_BINARY_CONDITIONS[op](a, b),)
152
+
153
+
154
+ NODE_CLASS_MAPPINGS = {
155
+ "CM_FloatUnaryOperation": FloatUnaryOperation,
156
+ "CM_FloatUnaryCondition": FloatUnaryCondition,
157
+ "CM_FloatBinaryOperation": FloatBinaryOperation,
158
+ "CM_FloatBinaryCondition": FloatBinaryCondition,
159
+ }
custom_nodes/ComfyMath/src/comfymath/graphics.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from abc import ABC, abstractmethod
2
+ from typing import Any, Mapping, Sequence, Tuple
3
+
4
+
5
+ SDXL_SUPPORTED_RESOLUTIONS = [
6
+ (1024, 1024, 1.0),
7
+ (1152, 896, 1.2857142857142858),
8
+ (896, 1152, 0.7777777777777778),
9
+ (1216, 832, 1.4615384615384615),
10
+ (832, 1216, 0.6842105263157895),
11
+ (1344, 768, 1.75),
12
+ (768, 1344, 0.5714285714285714),
13
+ (1536, 640, 2.4),
14
+ (640, 1536, 0.4166666666666667),
15
+ ]
16
+
17
+ SDXL_EXTENDED_RESOLUTIONS = [
18
+ (512, 2048, 0.25),
19
+ (512, 1984, 0.26),
20
+ (512, 1920, 0.27),
21
+ (512, 1856, 0.28),
22
+ (576, 1792, 0.32),
23
+ (576, 1728, 0.33),
24
+ (576, 1664, 0.35),
25
+ (640, 1600, 0.4),
26
+ (640, 1536, 0.42),
27
+ (704, 1472, 0.48),
28
+ (704, 1408, 0.5),
29
+ (704, 1344, 0.52),
30
+ (768, 1344, 0.57),
31
+ (768, 1280, 0.6),
32
+ (832, 1216, 0.68),
33
+ (832, 1152, 0.72),
34
+ (896, 1152, 0.78),
35
+ (896, 1088, 0.82),
36
+ (960, 1088, 0.88),
37
+ (960, 1024, 0.94),
38
+ (1024, 1024, 1.0),
39
+ (1024, 960, 1.8),
40
+ (1088, 960, 1.14),
41
+ (1088, 896, 1.22),
42
+ (1152, 896, 1.30),
43
+ (1152, 832, 1.39),
44
+ (1216, 832, 1.47),
45
+ (1280, 768, 1.68),
46
+ (1344, 768, 1.76),
47
+ (1408, 704, 2.0),
48
+ (1472, 704, 2.10),
49
+ (1536, 640, 2.4),
50
+ (1600, 640, 2.5),
51
+ (1664, 576, 2.90),
52
+ (1728, 576, 3.0),
53
+ (1792, 576, 3.12),
54
+ (1856, 512, 3.63),
55
+ (1920, 512, 3.76),
56
+ (1984, 512, 3.89),
57
+ (2048, 512, 4.0),
58
+ ]
59
+
60
+
61
+ class Resolution(ABC):
62
+ @classmethod
63
+ @abstractmethod
64
+ def resolutions(cls) -> Sequence[Tuple[int, int, float]]: ...
65
+
66
+ @classmethod
67
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
68
+ return {
69
+ "required": {
70
+ "resolution": ([f"{res[0]}x{res[1]}" for res in cls.resolutions()],)
71
+ }
72
+ }
73
+
74
+ RETURN_TYPES = ("INT", "INT")
75
+ RETURN_NAMES = ("width", "height")
76
+ FUNCTION = "op"
77
+ CATEGORY = "math/graphics"
78
+
79
+ def op(self, resolution: str) -> tuple[int, int]:
80
+ width, height = resolution.split("x")
81
+ return (int(width), int(height))
82
+
83
+
84
+ class NearestResolution(ABC):
85
+ @classmethod
86
+ @abstractmethod
87
+ def resolutions(cls) -> Sequence[Tuple[int, int, float]]: ...
88
+
89
+ @classmethod
90
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
91
+ return {"required": {"image": ("IMAGE",)}}
92
+
93
+ RETURN_TYPES = ("INT", "INT")
94
+ RETURN_NAMES = ("width", "height")
95
+ FUNCTION = "op"
96
+ CATEGORY = "math/graphics"
97
+
98
+ def op(self, image) -> tuple[int, int]:
99
+ image_width = image.size()[2]
100
+ image_height = image.size()[1]
101
+ print(f"Input image resolution: {image_width}x{image_height}")
102
+ image_ratio = image_width / image_height
103
+ differences = [
104
+ (abs(image_ratio - resolution[2]), resolution)
105
+ for resolution in self.resolutions()
106
+ ]
107
+ smallest = None
108
+ for difference in differences:
109
+ if smallest is None:
110
+ smallest = difference
111
+ else:
112
+ if difference[0] < smallest[0]:
113
+ smallest = difference
114
+ if smallest is not None:
115
+ width = smallest[1][0]
116
+ height = smallest[1][1]
117
+ else:
118
+ width = 1024
119
+ height = 1024
120
+ print(f"Selected resolution: {width}x{height}")
121
+ return (width, height)
122
+
123
+
124
+ class SDXLResolution(Resolution):
125
+ @classmethod
126
+ def resolutions(cls):
127
+ return SDXL_SUPPORTED_RESOLUTIONS
128
+
129
+
130
+ class SDXLExtendedResolution(Resolution):
131
+ @classmethod
132
+ def resolutions(cls):
133
+ return SDXL_EXTENDED_RESOLUTIONS
134
+
135
+
136
+ class NearestSDXLResolution(NearestResolution):
137
+ @classmethod
138
+ def resolutions(cls):
139
+ return SDXL_SUPPORTED_RESOLUTIONS
140
+
141
+
142
+ class NearestSDXLExtendedResolution(NearestResolution):
143
+ @classmethod
144
+ def resolutions(cls):
145
+ return SDXL_EXTENDED_RESOLUTIONS
146
+
147
+
148
+ NODE_CLASS_MAPPINGS = {
149
+ "CM_SDXLResolution": SDXLResolution,
150
+ "CM_NearestSDXLResolution": NearestSDXLResolution,
151
+ "CM_SDXLExtendedResolution": SDXLExtendedResolution,
152
+ "CM_NearestSDXLExtendedResolution": NearestSDXLExtendedResolution,
153
+ }
custom_nodes/ComfyMath/src/comfymath/int.py ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+
3
+ from typing import Any, Callable, Mapping
4
+
5
+ DEFAULT_INT = ("INT", {"default": 0})
6
+
7
+ INT_UNARY_OPERATIONS: Mapping[str, Callable[[int], int]] = {
8
+ "Abs": lambda a: abs(a),
9
+ "Neg": lambda a: -a,
10
+ "Inc": lambda a: a + 1,
11
+ "Dec": lambda a: a - 1,
12
+ "Sqr": lambda a: a * a,
13
+ "Cube": lambda a: a * a * a,
14
+ "Not": lambda a: ~a,
15
+ "Factorial": lambda a: math.factorial(a),
16
+ }
17
+
18
+ INT_UNARY_CONDITIONS: Mapping[str, Callable[[int], bool]] = {
19
+ "IsZero": lambda a: a == 0,
20
+ "IsNonZero": lambda a: a != 0,
21
+ "IsPositive": lambda a: a > 0,
22
+ "IsNegative": lambda a: a < 0,
23
+ "IsEven": lambda a: a % 2 == 0,
24
+ "IsOdd": lambda a: a % 2 == 1,
25
+ }
26
+
27
+ INT_BINARY_OPERATIONS: Mapping[str, Callable[[int, int], int]] = {
28
+ "Add": lambda a, b: a + b,
29
+ "Sub": lambda a, b: a - b,
30
+ "Mul": lambda a, b: a * b,
31
+ "Div": lambda a, b: a // b,
32
+ "Mod": lambda a, b: a % b,
33
+ "Pow": lambda a, b: a**b,
34
+ "And": lambda a, b: a & b,
35
+ "Nand": lambda a, b: ~a & b,
36
+ "Or": lambda a, b: a | b,
37
+ "Nor": lambda a, b: ~a & b,
38
+ "Xor": lambda a, b: a ^ b,
39
+ "Xnor": lambda a, b: ~a ^ b,
40
+ "Shl": lambda a, b: a << b,
41
+ "Shr": lambda a, b: a >> b,
42
+ "Max": lambda a, b: max(a, b),
43
+ "Min": lambda a, b: min(a, b),
44
+ }
45
+
46
+ INT_BINARY_CONDITIONS: Mapping[str, Callable[[int, int], bool]] = {
47
+ "Eq": lambda a, b: a == b,
48
+ "Neq": lambda a, b: a != b,
49
+ "Gt": lambda a, b: a > b,
50
+ "Lt": lambda a, b: a < b,
51
+ "Geq": lambda a, b: a >= b,
52
+ "Leq": lambda a, b: a <= b,
53
+ }
54
+
55
+
56
+ class IntUnaryOperation:
57
+ @classmethod
58
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
59
+ return {
60
+ "required": {"op": (list(INT_UNARY_OPERATIONS.keys()),), "a": DEFAULT_INT}
61
+ }
62
+
63
+ RETURN_TYPES = ("INT",)
64
+ FUNCTION = "op"
65
+ CATEGORY = "math/int"
66
+
67
+ def op(self, op: str, a: int) -> tuple[int]:
68
+ return (INT_UNARY_OPERATIONS[op](a),)
69
+
70
+
71
+ class IntUnaryCondition:
72
+ @classmethod
73
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
74
+ return {
75
+ "required": {"op": (list(INT_UNARY_CONDITIONS.keys()),), "a": DEFAULT_INT}
76
+ }
77
+
78
+ RETURN_TYPES = ("BOOL",)
79
+ FUNCTION = "op"
80
+ CATEGORY = "math/int"
81
+
82
+ def op(self, op: str, a: int) -> tuple[bool]:
83
+ return (INT_UNARY_CONDITIONS[op](a),)
84
+
85
+
86
+ class IntBinaryOperation:
87
+ @classmethod
88
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
89
+ return {
90
+ "required": {
91
+ "op": (list(INT_BINARY_OPERATIONS.keys()),),
92
+ "a": DEFAULT_INT,
93
+ "b": DEFAULT_INT,
94
+ }
95
+ }
96
+
97
+ RETURN_TYPES = ("INT",)
98
+ FUNCTION = "op"
99
+ CATEGORY = "math/int"
100
+
101
+ def op(self, op: str, a: int, b: int) -> tuple[int]:
102
+ return (INT_BINARY_OPERATIONS[op](a, b),)
103
+
104
+
105
+ class IntBinaryCondition:
106
+ @classmethod
107
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
108
+ return {
109
+ "required": {
110
+ "op": (list(INT_BINARY_CONDITIONS.keys()),),
111
+ "a": DEFAULT_INT,
112
+ "b": DEFAULT_INT,
113
+ }
114
+ }
115
+
116
+ RETURN_TYPES = ("BOOL",)
117
+ FUNCTION = "op"
118
+ CATEGORY = "math/int"
119
+
120
+ def op(self, op: str, a: int, b: int) -> tuple[bool]:
121
+ return (INT_BINARY_CONDITIONS[op](a, b),)
122
+
123
+
124
+ NODE_CLASS_MAPPINGS = {
125
+ "CM_IntUnaryOperation": IntUnaryOperation,
126
+ "CM_IntUnaryCondition": IntUnaryCondition,
127
+ "CM_IntBinaryOperation": IntBinaryOperation,
128
+ "CM_IntBinaryCondition": IntBinaryCondition,
129
+ }
custom_nodes/ComfyMath/src/comfymath/number.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dataclasses import dataclass
2
+ from typing import Any, Callable, Mapping
3
+
4
+ from .float import (
5
+ FLOAT_UNARY_OPERATIONS,
6
+ FLOAT_UNARY_CONDITIONS,
7
+ FLOAT_BINARY_OPERATIONS,
8
+ FLOAT_BINARY_CONDITIONS,
9
+ )
10
+ from .types import Number
11
+
12
+ DEFAULT_NUMBER = ("NUMBER", {"default": 0.0})
13
+
14
+
15
+ class NumberUnaryOperation:
16
+ @classmethod
17
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
18
+ return {
19
+ "required": {
20
+ "op": (list(FLOAT_UNARY_OPERATIONS.keys()),),
21
+ "a": DEFAULT_NUMBER,
22
+ }
23
+ }
24
+
25
+ RETURN_TYPES = ("NUMBER",)
26
+ FUNCTION = "op"
27
+ CATEGORY = "math/number"
28
+
29
+ def op(self, op: str, a: Number) -> tuple[float]:
30
+ return (FLOAT_UNARY_OPERATIONS[op](float(a)),)
31
+
32
+
33
+ class NumberUnaryCondition:
34
+ @classmethod
35
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
36
+ return {
37
+ "required": {
38
+ "op": (list(FLOAT_UNARY_CONDITIONS.keys()),),
39
+ "a": DEFAULT_NUMBER,
40
+ }
41
+ }
42
+
43
+ RETURN_TYPES = ("BOOL",)
44
+ FUNCTION = "op"
45
+ CATEGORY = "math/Number"
46
+
47
+ def op(self, op: str, a: Number) -> tuple[bool]:
48
+ return (FLOAT_UNARY_CONDITIONS[op](float(a)),)
49
+
50
+
51
+ class NumberBinaryOperation:
52
+ @classmethod
53
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
54
+ return {
55
+ "required": {
56
+ "op": (list(FLOAT_BINARY_OPERATIONS.keys()),),
57
+ "a": DEFAULT_NUMBER,
58
+ "b": DEFAULT_NUMBER,
59
+ }
60
+ }
61
+
62
+ RETURN_TYPES = ("NUMBER",)
63
+ FUNCTION = "op"
64
+ CATEGORY = "math/number"
65
+
66
+ def op(self, op: str, a: Number, b: Number) -> tuple[float]:
67
+ return (FLOAT_BINARY_OPERATIONS[op](float(a), float(b)),)
68
+
69
+
70
+ class NumberBinaryCondition:
71
+ @classmethod
72
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
73
+ return {
74
+ "required": {
75
+ "op": (list(FLOAT_BINARY_CONDITIONS.keys()),),
76
+ "a": DEFAULT_NUMBER,
77
+ "b": DEFAULT_NUMBER,
78
+ }
79
+ }
80
+
81
+ RETURN_TYPES = ("BOOL",)
82
+ FUNCTION = "op"
83
+ CATEGORY = "math/float"
84
+
85
+ def op(self, op: str, a: Number, b: Number) -> tuple[bool]:
86
+ return (FLOAT_BINARY_CONDITIONS[op](float(a), float(b)),)
87
+
88
+
89
+ NODE_CLASS_MAPPINGS = {
90
+ "CM_NumberUnaryOperation": NumberUnaryOperation,
91
+ "CM_NumberUnaryCondition": NumberUnaryCondition,
92
+ "CM_NumberBinaryOperation": NumberBinaryOperation,
93
+ "CM_NumberBinaryCondition": NumberBinaryCondition,
94
+ }
custom_nodes/ComfyMath/src/comfymath/py.typed ADDED
File without changes
custom_nodes/ComfyMath/src/comfymath/types.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+
3
+ if sys.version_info[1] < 10:
4
+ from typing import Tuple, Union
5
+
6
+ Number = Union[int, float]
7
+ Vec2 = Tuple[float, float]
8
+ Vec3 = Tuple[float, float, float]
9
+ Vec4 = Tuple[float, float, float, float]
10
+ else:
11
+ from typing import TypeAlias
12
+
13
+ Number: TypeAlias = int | float
14
+ Vec2: TypeAlias = tuple[float, float]
15
+ Vec3: TypeAlias = tuple[float, float, float]
16
+ Vec4: TypeAlias = tuple[float, float, float, float]
custom_nodes/ComfyMath/src/comfymath/vec.py ADDED
@@ -0,0 +1,500 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy
2
+
3
+ from typing import Any, Callable, Mapping
4
+
5
+ from .types import Vec2, Vec3, Vec4
6
+
7
+ VEC2_ZERO = (0.0, 0.0)
8
+ DEFAULT_VEC2 = ("VEC2", {"default": VEC2_ZERO})
9
+
10
+ VEC3_ZERO = (0.0, 0.0, 0.0)
11
+ DEFAULT_VEC3 = ("VEC3", {"default": VEC3_ZERO})
12
+
13
+ VEC4_ZERO = (0.0, 0.0, 0.0, 0.0)
14
+ DEFAULT_VEC4 = ("VEC4", {"default": VEC4_ZERO})
15
+
16
+ VEC_UNARY_OPERATIONS: Mapping[str, Callable[[numpy.ndarray], numpy.ndarray]] = {
17
+ "Neg": lambda a: -a,
18
+ "Normalize": lambda a: a / numpy.linalg.norm(a),
19
+ }
20
+
21
+ VEC_TO_SCALAR_UNARY_OPERATION: Mapping[str, Callable[[numpy.ndarray], float]] = {
22
+ "Norm": lambda a: numpy.linalg.norm(a).astype(float),
23
+ }
24
+
25
+ VEC_UNARY_CONDITIONS: Mapping[str, Callable[[numpy.ndarray], bool]] = {
26
+ "IsZero": lambda a: not numpy.any(a).astype(bool),
27
+ "IsNotZero": lambda a: numpy.any(a).astype(bool),
28
+ "IsNormalized": lambda a: numpy.allclose(a, a / numpy.linalg.norm(a)),
29
+ "IsNotNormalized": lambda a: not numpy.allclose(a, a / numpy.linalg.norm(a)),
30
+ }
31
+
32
+ VEC_BINARY_OPERATIONS: Mapping[
33
+ str, Callable[[numpy.ndarray, numpy.ndarray], numpy.ndarray]
34
+ ] = {
35
+ "Add": lambda a, b: a + b,
36
+ "Sub": lambda a, b: a - b,
37
+ "Cross": lambda a, b: numpy.cross(a, b),
38
+ }
39
+
40
+ VEC_TO_SCALAR_BINARY_OPERATION: Mapping[
41
+ str, Callable[[numpy.ndarray, numpy.ndarray], float]
42
+ ] = {
43
+ "Dot": lambda a, b: numpy.dot(a, b),
44
+ "Distance": lambda a, b: numpy.linalg.norm(a - b).astype(float),
45
+ }
46
+
47
+ VEC_BINARY_CONDITIONS: Mapping[str, Callable[[numpy.ndarray, numpy.ndarray], bool]] = {
48
+ "Eq": lambda a, b: numpy.allclose(a, b),
49
+ "Neq": lambda a, b: not numpy.allclose(a, b),
50
+ }
51
+
52
+ VEC_SCALAR_OPERATION: Mapping[str, Callable[[numpy.ndarray, float], numpy.ndarray]] = {
53
+ "Mul": lambda a, b: a * b,
54
+ "Div": lambda a, b: a / b,
55
+ }
56
+
57
+
58
+ def _vec2_from_numpy(a: numpy.ndarray) -> Vec2:
59
+ return (
60
+ float(a[0]),
61
+ float(a[1]),
62
+ )
63
+
64
+
65
+ def _vec3_from_numpy(a: numpy.ndarray) -> Vec3:
66
+ return (
67
+ float(a[0]),
68
+ float(a[1]),
69
+ float(a[2]),
70
+ )
71
+
72
+
73
+ def _vec4_from_numpy(a: numpy.ndarray) -> Vec4:
74
+ return (
75
+ float(a[0]),
76
+ float(a[1]),
77
+ float(a[2]),
78
+ float(a[3]),
79
+ )
80
+
81
+
82
+ class Vec2UnaryOperation:
83
+ @classmethod
84
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
85
+ return {
86
+ "required": {
87
+ "op": (list(VEC_UNARY_OPERATIONS.keys()),),
88
+ "a": DEFAULT_VEC2,
89
+ }
90
+ }
91
+
92
+ RETURN_TYPES = ("VEC2",)
93
+ FUNCTION = "op"
94
+ CATEGORY = "math/vec2"
95
+
96
+ def op(self, op: str, a: Vec2) -> tuple[Vec2]:
97
+ return (_vec2_from_numpy(VEC_UNARY_OPERATIONS[op](numpy.array(a))),)
98
+
99
+
100
+ class Vec2ToScalarUnaryOperation:
101
+ @classmethod
102
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
103
+ return {
104
+ "required": {
105
+ "op": (list(VEC_TO_SCALAR_UNARY_OPERATION.keys()),),
106
+ "a": DEFAULT_VEC2,
107
+ }
108
+ }
109
+
110
+ RETURN_TYPES = ("FLOAT",)
111
+ FUNCTION = "op"
112
+ CATEGORY = "math/vec2"
113
+
114
+ def op(self, op: str, a: Vec2) -> tuple[float]:
115
+ return (VEC_TO_SCALAR_UNARY_OPERATION[op](numpy.array(a)),)
116
+
117
+
118
+ class Vec2UnaryCondition:
119
+ @classmethod
120
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
121
+ return {
122
+ "required": {
123
+ "op": (list(VEC_UNARY_CONDITIONS.keys()),),
124
+ "a": DEFAULT_VEC2,
125
+ }
126
+ }
127
+
128
+ RETURN_TYPES = ("BOOL",)
129
+ FUNCTION = "op"
130
+ CATEGORY = "math/vec2"
131
+
132
+ def op(self, op: str, a: Vec2) -> tuple[bool]:
133
+ return (VEC_UNARY_CONDITIONS[op](numpy.array(a)),)
134
+
135
+
136
+ class Vec2BinaryOperation:
137
+ @classmethod
138
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
139
+ return {
140
+ "required": {
141
+ "op": (list(VEC_BINARY_OPERATIONS.keys()),),
142
+ "a": DEFAULT_VEC2,
143
+ "b": DEFAULT_VEC2,
144
+ }
145
+ }
146
+
147
+ RETURN_TYPES = ("VEC2",)
148
+ FUNCTION = "op"
149
+ CATEGORY = "math/vec2"
150
+
151
+ def op(self, op: str, a: Vec2, b: Vec2) -> tuple[Vec2]:
152
+ return (
153
+ _vec2_from_numpy(VEC_BINARY_OPERATIONS[op](numpy.array(a), numpy.array(b))),
154
+ )
155
+
156
+
157
+ class Vec2ToScalarBinaryOperation:
158
+ @classmethod
159
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
160
+ return {
161
+ "required": {
162
+ "op": (list(VEC_TO_SCALAR_BINARY_OPERATION.keys()),),
163
+ "a": DEFAULT_VEC2,
164
+ "b": DEFAULT_VEC2,
165
+ }
166
+ }
167
+
168
+ RETURN_TYPES = ("FLOAT",)
169
+ FUNCTION = "op"
170
+ CATEGORY = "math/vec2"
171
+
172
+ def op(self, op: str, a: Vec2, b: Vec2) -> tuple[float]:
173
+ return (VEC_TO_SCALAR_BINARY_OPERATION[op](numpy.array(a), numpy.array(b)),)
174
+
175
+
176
+ class Vec2BinaryCondition:
177
+ @classmethod
178
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
179
+ return {
180
+ "required": {
181
+ "op": (list(VEC_BINARY_CONDITIONS.keys()),),
182
+ "a": DEFAULT_VEC2,
183
+ "b": DEFAULT_VEC2,
184
+ }
185
+ }
186
+
187
+ RETURN_TYPES = ("BOOL",)
188
+ FUNCTION = "op"
189
+ CATEGORY = "math/vec2"
190
+
191
+ def op(self, op: str, a: Vec2, b: Vec2) -> tuple[bool]:
192
+ return (VEC_BINARY_CONDITIONS[op](numpy.array(a), numpy.array(b)),)
193
+
194
+
195
+ class Vec2ScalarOperation:
196
+ @classmethod
197
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
198
+ return {
199
+ "required": {
200
+ "op": (list(VEC_SCALAR_OPERATION.keys()),),
201
+ "a": DEFAULT_VEC2,
202
+ "b": ("FLOAT",),
203
+ }
204
+ }
205
+
206
+ RETURN_TYPES = ("VEC2",)
207
+ FUNCTION = "op"
208
+ CATEGORY = "math/vec2"
209
+
210
+ def op(self, op: str, a: Vec2, b: float) -> tuple[Vec2]:
211
+ return (_vec2_from_numpy(VEC_SCALAR_OPERATION[op](numpy.array(a), b)),)
212
+
213
+
214
+ class Vec3UnaryOperation:
215
+ @classmethod
216
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
217
+ return {
218
+ "required": {
219
+ "op": (list(VEC_UNARY_OPERATIONS.keys()),),
220
+ "a": DEFAULT_VEC3,
221
+ }
222
+ }
223
+
224
+ RETURN_TYPES = ("VEC3",)
225
+ FUNCTION = "op"
226
+ CATEGORY = "math/vec3"
227
+
228
+ def op(self, op: str, a: Vec3) -> tuple[Vec3]:
229
+ return (_vec3_from_numpy(VEC_UNARY_OPERATIONS[op](numpy.array(a))),)
230
+
231
+
232
+ class Vec3ToScalarUnaryOperation:
233
+ @classmethod
234
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
235
+ return {
236
+ "required": {
237
+ "op": (list(VEC_TO_SCALAR_UNARY_OPERATION.keys()),),
238
+ "a": DEFAULT_VEC3,
239
+ }
240
+ }
241
+
242
+ RETURN_TYPES = ("FLOAT",)
243
+ FUNCTION = "op"
244
+ CATEGORY = "math/vec3"
245
+
246
+ def op(self, op: str, a: Vec3) -> tuple[float]:
247
+ return (VEC_TO_SCALAR_UNARY_OPERATION[op](numpy.array(a)),)
248
+
249
+
250
+ class Vec3UnaryCondition:
251
+ @classmethod
252
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
253
+ return {
254
+ "required": {
255
+ "op": (list(VEC_UNARY_CONDITIONS.keys()),),
256
+ "a": DEFAULT_VEC3,
257
+ }
258
+ }
259
+
260
+ RETURN_TYPES = ("BOOL",)
261
+ FUNCTION = "op"
262
+ CATEGORY = "math/vec3"
263
+
264
+ def op(self, op: str, a: Vec3) -> tuple[bool]:
265
+ return (VEC_UNARY_CONDITIONS[op](numpy.array(a)),)
266
+
267
+
268
+ class Vec3BinaryOperation:
269
+ @classmethod
270
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
271
+ return {
272
+ "required": {
273
+ "op": (list(VEC_BINARY_OPERATIONS.keys()),),
274
+ "a": DEFAULT_VEC3,
275
+ "b": DEFAULT_VEC3,
276
+ }
277
+ }
278
+
279
+ RETURN_TYPES = ("VEC3",)
280
+ FUNCTION = "op"
281
+ CATEGORY = "math/vec3"
282
+
283
+ def op(self, op: str, a: Vec3, b: Vec3) -> tuple[Vec3]:
284
+ return (
285
+ _vec3_from_numpy(VEC_BINARY_OPERATIONS[op](numpy.array(a), numpy.array(b))),
286
+ )
287
+
288
+
289
+ class Vec3ToScalarBinaryOperation:
290
+ @classmethod
291
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
292
+ return {
293
+ "required": {
294
+ "op": (list(VEC_TO_SCALAR_BINARY_OPERATION.keys()),),
295
+ "a": DEFAULT_VEC3,
296
+ "b": DEFAULT_VEC3,
297
+ }
298
+ }
299
+
300
+ RETURN_TYPES = ("FLOAT",)
301
+ FUNCTION = "op"
302
+ CATEGORY = "math/vec3"
303
+
304
+ def op(self, op: str, a: Vec3, b: Vec3) -> tuple[float]:
305
+ return (VEC_TO_SCALAR_BINARY_OPERATION[op](numpy.array(a), numpy.array(b)),)
306
+
307
+
308
+ class Vec3BinaryCondition:
309
+ @classmethod
310
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
311
+ return {
312
+ "required": {
313
+ "op": (list(VEC_BINARY_CONDITIONS.keys()),),
314
+ "a": DEFAULT_VEC3,
315
+ "b": DEFAULT_VEC3,
316
+ }
317
+ }
318
+
319
+ RETURN_TYPES = ("BOOL",)
320
+ FUNCTION = "op"
321
+ CATEGORY = "math/vec3"
322
+
323
+ def op(self, op: str, a: Vec3, b: Vec3) -> tuple[bool]:
324
+ return (VEC_BINARY_CONDITIONS[op](numpy.array(a), numpy.array(b)),)
325
+
326
+
327
+ class Vec3ScalarOperation:
328
+ @classmethod
329
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
330
+ return {
331
+ "required": {
332
+ "op": (list(VEC_SCALAR_OPERATION.keys()),),
333
+ "a": DEFAULT_VEC3,
334
+ "b": ("FLOAT",),
335
+ }
336
+ }
337
+
338
+ RETURN_TYPES = ("VEC3",)
339
+ FUNCTION = "op"
340
+ CATEGORY = "math/vec3"
341
+
342
+ def op(self, op: str, a: Vec3, b: float) -> tuple[Vec3]:
343
+ return (_vec3_from_numpy(VEC_SCALAR_OPERATION[op](numpy.array(a), b)),)
344
+
345
+
346
+ class Vec4UnaryOperation:
347
+ @classmethod
348
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
349
+ return {
350
+ "required": {
351
+ "op": (list(VEC_UNARY_OPERATIONS.keys()),),
352
+ "a": DEFAULT_VEC4,
353
+ }
354
+ }
355
+
356
+ RETURN_TYPES = ("VEC4",)
357
+ FUNCTION = "op"
358
+ CATEGORY = "math/vec4"
359
+
360
+ def op(self, op: str, a: Vec4) -> tuple[Vec4]:
361
+ return (_vec4_from_numpy(VEC_UNARY_OPERATIONS[op](numpy.array(a))),)
362
+
363
+
364
+ class Vec4ToScalarUnaryOperation:
365
+ @classmethod
366
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
367
+ return {
368
+ "required": {
369
+ "op": (list(VEC_TO_SCALAR_UNARY_OPERATION.keys()),),
370
+ "a": DEFAULT_VEC4,
371
+ }
372
+ }
373
+
374
+ RETURN_TYPES = ("FLOAT",)
375
+ FUNCTION = "op"
376
+ CATEGORY = "math/vec4"
377
+
378
+ def op(self, op: str, a: Vec4) -> tuple[float]:
379
+ return (VEC_TO_SCALAR_UNARY_OPERATION[op](numpy.array(a)),)
380
+
381
+
382
+ class Vec4UnaryCondition:
383
+ @classmethod
384
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
385
+ return {
386
+ "required": {
387
+ "op": (list(VEC_UNARY_CONDITIONS.keys()),),
388
+ "a": DEFAULT_VEC4,
389
+ }
390
+ }
391
+
392
+ RETURN_TYPES = ("BOOL",)
393
+ FUNCTION = "op"
394
+ CATEGORY = "math/vec4"
395
+
396
+ def op(self, op: str, a: Vec4) -> tuple[bool]:
397
+ return (VEC_UNARY_CONDITIONS[op](numpy.array(a)),)
398
+
399
+
400
+ class Vec4BinaryOperation:
401
+ @classmethod
402
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
403
+ return {
404
+ "required": {
405
+ "op": (list(VEC_BINARY_OPERATIONS.keys()),),
406
+ "a": DEFAULT_VEC4,
407
+ "b": DEFAULT_VEC4,
408
+ }
409
+ }
410
+
411
+ RETURN_TYPES = ("VEC4",)
412
+ FUNCTION = "op"
413
+ CATEGORY = "math/vec4"
414
+
415
+ def op(self, op: str, a: Vec4, b: Vec4) -> tuple[Vec4]:
416
+ return (
417
+ _vec4_from_numpy(VEC_BINARY_OPERATIONS[op](numpy.array(a), numpy.array(b))),
418
+ )
419
+
420
+
421
+ class Vec4ToScalarBinaryOperation:
422
+ @classmethod
423
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
424
+ return {
425
+ "required": {
426
+ "op": (list(VEC_TO_SCALAR_BINARY_OPERATION.keys()),),
427
+ "a": DEFAULT_VEC4,
428
+ "b": DEFAULT_VEC4,
429
+ }
430
+ }
431
+
432
+ RETURN_TYPES = ("FLOAT",)
433
+ FUNCTION = "op"
434
+ CATEGORY = "math/vec4"
435
+
436
+ def op(self, op: str, a: Vec4, b: Vec4) -> tuple[float]:
437
+ return (VEC_TO_SCALAR_BINARY_OPERATION[op](numpy.array(a), numpy.array(b)),)
438
+
439
+
440
+ class Vec4BinaryCondition:
441
+ @classmethod
442
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
443
+ return {
444
+ "required": {
445
+ "op": (list(VEC_BINARY_CONDITIONS.keys()),),
446
+ "a": DEFAULT_VEC4,
447
+ "b": DEFAULT_VEC4,
448
+ }
449
+ }
450
+
451
+ RETURN_TYPES = ("BOOL",)
452
+ FUNCTION = "op"
453
+ CATEGORY = "math/vec4"
454
+
455
+ def op(self, op: str, a: Vec4, b: Vec4) -> tuple[bool]:
456
+ return (VEC_BINARY_CONDITIONS[op](numpy.array(a), numpy.array(b)),)
457
+
458
+
459
+ class Vec4ScalarOperation:
460
+ @classmethod
461
+ def INPUT_TYPES(cls) -> Mapping[str, Any]:
462
+ return {
463
+ "required": {
464
+ "op": (list(VEC_SCALAR_OPERATION.keys()),),
465
+ "a": DEFAULT_VEC4,
466
+ "b": ("FLOAT",),
467
+ }
468
+ }
469
+
470
+ RETURN_TYPES = ("VEC4",)
471
+ FUNCTION = "op"
472
+ CATEGORY = "math/vec4"
473
+
474
+ def op(self, op: str, a: Vec4, b: float) -> tuple[Vec4]:
475
+ return (_vec4_from_numpy(VEC_SCALAR_OPERATION[op](numpy.array(a), b)),)
476
+
477
+
478
+ NODE_CLASS_MAPPINGS = {
479
+ "CM_Vec2UnaryOperation": Vec2UnaryOperation,
480
+ "CM_Vec2UnaryCondition": Vec2UnaryCondition,
481
+ "CM_Vec2ToScalarUnaryOperation": Vec2ToScalarUnaryOperation,
482
+ "CM_Vec2BinaryOperation": Vec2BinaryOperation,
483
+ "CM_Vec2BinaryCondition": Vec2BinaryCondition,
484
+ "CM_Vec2ToScalarBinaryOperation": Vec2ToScalarBinaryOperation,
485
+ "CM_Vec2ScalarOperation": Vec2ScalarOperation,
486
+ "CM_Vec3UnaryOperation": Vec3UnaryOperation,
487
+ "CM_Vec3UnaryCondition": Vec3UnaryCondition,
488
+ "CM_Vec3ToScalarUnaryOperation": Vec3ToScalarUnaryOperation,
489
+ "CM_Vec3BinaryOperation": Vec3BinaryOperation,
490
+ "CM_Vec3BinaryCondition": Vec3BinaryCondition,
491
+ "CM_Vec3ToScalarBinaryOperation": Vec3ToScalarBinaryOperation,
492
+ "CM_Vec3ScalarOperation": Vec3ScalarOperation,
493
+ "CM_Vec4UnaryOperation": Vec4UnaryOperation,
494
+ "CM_Vec4UnaryCondition": Vec4UnaryCondition,
495
+ "CM_Vec4ToScalarUnaryOperation": Vec4ToScalarUnaryOperation,
496
+ "CM_Vec4BinaryOperation": Vec4BinaryOperation,
497
+ "CM_Vec4BinaryCondition": Vec4BinaryCondition,
498
+ "CM_Vec4ToScalarBinaryOperation": Vec4ToScalarBinaryOperation,
499
+ "CM_Vec4ScalarOperation": Vec4ScalarOperation,
500
+ }
custom_nodes/ComfyUI-Detail-Daemon/.gitignore ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
110
+ .pdm.toml
111
+ .pdm-python
112
+ .pdm-build/
113
+
114
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
115
+ __pypackages__/
116
+
117
+ # Celery stuff
118
+ celerybeat-schedule
119
+ celerybeat.pid
120
+
121
+ # SageMath parsed files
122
+ *.sage.py
123
+
124
+ # Environments
125
+ .env
126
+ .venv
127
+ env/
128
+ venv/
129
+ ENV/
130
+ env.bak/
131
+ venv.bak/
132
+
133
+ # Spyder project settings
134
+ .spyderproject
135
+ .spyproject
136
+
137
+ # Rope project settings
138
+ .ropeproject
139
+
140
+ # mkdocs documentation
141
+ /site
142
+
143
+ # mypy
144
+ .mypy_cache/
145
+ .dmypy.json
146
+ dmypy.json
147
+
148
+ # Pyre type checker
149
+ .pyre/
150
+
151
+ # pytype static type analyzer
152
+ .pytype/
153
+
154
+ # Cython debug symbols
155
+ cython_debug/
156
+
157
+ # PyCharm
158
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
159
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
160
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
161
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
162
+ #.idea/
custom_nodes/ComfyUI-Detail-Daemon/DetailDaemonIcon.jpg ADDED

Git LFS Details

  • SHA256: c0d1cd99d83d52b5c94bb817390d99081aac2d54c980d4557a029de5c104de6f
  • Pointer size: 131 Bytes
  • Size of remote file: 109 kB
custom_nodes/ComfyUI-Detail-Daemon/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Jonseed
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
custom_nodes/ComfyUI-Detail-Daemon/README.md ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ![DetailDaemon-example](https://github.com/user-attachments/assets/8f336c94-a4c6-426e-abe1-6a4c80a37cbb)
2
+
3
+ # Video Demo
4
+
5
+ Here is a video demo showing Detail Daemon in action, provided by [MuseMachine](https://www.youtube.com/@MuseMachineAI):
6
+
7
+ [![Watch the video](https://img.youtube.com/vi/h8XhR-fjRR8/hqdefault.jpg)](https://www.youtube.com/watch?v=h8XhR-fjRR8)
8
+
9
+ # ComfyUI-Detail-Daemon
10
+
11
+ A port of muerrilla's [sd-webui-Detail-Daemon](https://github.com/muerrilla/sd-webui-detail-daemon/) as a node for ComfyUI, to adjust sigmas that generally enhance details, and possibly remove unwanted bokeh or background blurring, particularly with Flux models (but also works with SDXL, SD1.5, Qwen, Z-Image, and likely other models). If the values are taken too far it results in an oversharpened and/or HDR effect. There are four nodes here. Multiply Sigmas and Lying Sigma Sampler are also included as alternative methods of generally enhancing details.
12
+
13
+ - [**Detail Daemon Sampler**](#detail-daemon-sampler)
14
+ - [**Detail Daemon Graph Sigmas**](#detail-daemon-graph-sigmas) (to graph the sigmas adjustment visually)
15
+ - [**Multiply Sigmas**](#multiply-sigmas) (stateless)
16
+ - [**Lying Sigma Sampler**](#lying-sigma-sampler)
17
+
18
+ Note that Detail Daemon and Lying Sigma Sampler nodes work by default with custom sampler nodes such as `SamplerCustomAdvanced`. If you want to use them with non-custom sampler nodes such as `KSampler` or `KSamplerAdvanced`, then you'll need to make a custom sampler preset using the [`BlehSetSamplerPreset`](https://github.com/blepping/ComfyUI-bleh#blehsetsamplerpreset) node, so you can select the preset from the list in the sampler node, [as discussed here](https://github.com/Jonseed/ComfyUI-Detail-Daemon/discussions/4#discussioncomment-11134965).
19
+
20
+ [Example and testing workflows](#example-and-testing-workflows) are also available.
21
+
22
+ ## Nodes
23
+
24
+ ### Detail Daemon Sampler
25
+
26
+ ![Screenshot 2024-10-29 124741](https://github.com/user-attachments/assets/c11bd716-1fa1-43b6-8d64-ab20642bceb5)
27
+
28
+ Allows sampling with the Detail Daemon schedule adjustment, which keeps the noise levels injected the same while lowering the amount of noise removed at each step, which effectively adds detail. Detail_amounts between 0 and 1.0 work best. See muerrilla's [Detail Daemon](https://github.com/muerrilla/sd-webui-detail-daemon/) repo for full explanation of inputs and methodology. Generally speaking, large features are established in earlier steps and small details take shape in later steps. So adjusting the amount in earlier steps will affect bigger shapes, and adjusting it in later steps will influence smaller fine details. The default adjusts mostly in the middle steps.
29
+
30
+ Parameters (the graphing node below can help visualize these parameters):
31
+ - `detail_amount`: the main value that adjusts the detail in the middle of the generation process. Positive values lower the sigmas, reducing noise removed at each step, which increases detail. For Flux or Z-Image models, you'll probably want between 0.1–1.0 range, or higher. For SDXL models, probably less than 0.25. You can also use negative values if you want to *decrease* detail or simplify the image.
32
+ - `start`: when do you want the adjustment to start, in a percent range from 0–1.0, 0 being the first step, 1.0 being the last step. Recommended: 0.1–0.5
33
+ - `end`: when do you want the adjustment to end, in a percent range from 0–1.0, 0 being the first step, 1.0 being the last step. Recommended: 0.5–0.9
34
+ - `bias`: shifts the detail_amount in the middle steps forward or back in the generation process.
35
+ - `exponent`: changes the curvature of the adjustment. 0 is no curvature, 1 is smoothly curved.
36
+ - `start_offset`: start the detail_amount at a particular value at the beginning of the generation process. Not recommended.
37
+ - `end_offset`: end the detail_amount at a particular value at the end of the generation process.
38
+ - `fade`: reduce the entire adjustment curve by a particular value.
39
+ - `smooth`: (true/false), do you want the adjustment curve to be smooth or not.
40
+ - `cfg_scale_override`: if set to 0 (default), the sampler will automatically determine the CFG scale (if possible). Set to some other value to override (should probably match the CFG used in your workflow).
41
+
42
+ ### Detail Daemon Graph Sigmas
43
+
44
+ ![Screenshot 2024-10-29 131939](https://github.com/user-attachments/assets/d0a3f895-5f6d-4b94-b4d1-aa86e7acb5d7)
45
+
46
+ Allows graphing adjusted sigmas to visually see the effects of different parameters on a graphed curve. This had to be a separate node from the Detail Daemon Sampler node in order to function properly. Just set the values the same as that node, or set inputs on separate primitive nodes that input into both the Detail Daemon Sampler and this Graph Sigmas node. You'll need to run the queue in order to see the graph on the node. *Please note: this node doesn't actually change the sigmas used when generating, it only graphs them*.
47
+
48
+ ### Multiply Sigmas
49
+
50
+ ![Screenshot 2024-10-29 124833](https://github.com/user-attachments/assets/25efbad7-8df2-4c21-a7b5-989d2954df48)
51
+
52
+ Simple node to multiply all sigmas (noise levels) by the supplied factor. It multiplies both the noise levels added *and* denoised by the factor, which somehow adds detail with a factor less than 1. It is *stateless*, meaning it calculates the sigmas fresh on every queue (other multiply sigmas nodes seem to calculate on prior run sigmas).
53
+
54
+ Parameters:
55
+ - `factor`: the amount that you want to multiply the sigma (noise level) by at each step. So, for example, if the first step has a sigma of 1, then using a factor of 0.95 would make this sigma 0.95. If a step has a sigma of 0.7, then a factor of 0.95 would make it 0.665. You probably want to keep this factor between 0.95–0.99. Lower values increase detail, but might also increasingly change the composition of the image, or introduce noisy grain. Setting it to 1.0 effectively disables the node.
56
+ - `start`: when do you want the adjustment to start, in a percent range from 0–1.0, 0 being the first step, 1.0 being the last step.
57
+ - `end`: when do you want the adjustment to end, in a percent range from 0–1.0, 0 being the first step, 1.0 being the last step.
58
+
59
+ ### Lying Sigma Sampler
60
+
61
+ ![Screenshot 2024-10-29 124803](https://github.com/user-attachments/assets/11c24b49-96e1-4f50-9b82-1d6778c2a8ea)
62
+
63
+ A simpler version of Detail Daemon Sampler, with only amount adjustment and start and end values.
64
+
65
+ Parameters:
66
+ - `dishonesty_factor`: similar to `detail_amount` in the Detail Daemon node, this adjusts the amount of detail. It is on a different scale though, for example, -0.05 `dishonesty_factor` is the equivalent of 0.5 in `detail_amount` of Detail Daemon (or 0.95 of Multiply Sigmas). Negative values adjust the sigmas down, increasing detail. You probably want to stay between -0.1 and -0.01. Positive values would increase the sigmas, *decreasing* detail.
67
+ - `start_percent`: when do you want the adjustment to start, in a percent range from 0–1.0, 0 being the first step, 1.0 being the last step. Recommended: 0.1–0.5
68
+ - `end_percent`: when do you want the adjustment to end, in a percent range from 0–1.0, 0 being the first step, 1.0 being the last step. Recommended: 0.5–0.9
69
+
70
+ ## Example and testing workflows
71
+
72
+ [![Screenshot 2024-10-29 134541](https://github.com/user-attachments/assets/a3d2849d-4ed0-4b5b-adca-48dcd07132ca)](https://github.com/Jonseed/ComfyUI-Detail-Daemon/blob/main/Comparing%20Detailers.json)
73
+
74
+ - **Z-Image-Turbo**: the [Z-Image txt2image-DetailDaemon.json](https://github.com/Jonseed/ComfyUI-Detail-Daemon/blob/main/example_workflows/Z-Image%20txt2img-DetailDaemon.json) is an example of using Detail Daemon in a Z-Image txt2img workflow.
75
+ - **Flux**: the [Comparing Detailers.json](https://github.com/Jonseed/ComfyUI-Detail-Daemon/blob/main/example_workflows/Comparing%20Detailers.json) workflow will allow you to compare all these various detailer nodes on the same prompt and seed.
76
+ - **Flux img2img**: the [Flux img2img-DetailDaemon.json](https://github.com/Jonseed/ComfyUI-Detail-Daemon/blob/main/example_workflows/Flux%20img2img-DetailDaemon.json) is an example of using Detail Daemon in a Flux img2img workflow.
77
+ - **Flux upscale**: the [Flux upscale-DetailDaemon.json](https://github.com/Jonseed/ComfyUI-Detail-Daemon/blob/main/example_workflows/Flux%20upscale-Detail%20Daemon.json) is an example of using Detail Daemon in a Flux upscale workflow.
78
+ - **Flux inpainting**: the [Flux inpainting-DetailDaemon.json](https://github.com/Jonseed/ComfyUI-Detail-Daemon/blob/main/example_workflows/Flux%20inpainting-Detail%20Daemon.json) is an example of using Detail Daemon in a Flux inpainting workflow.
79
+ - **SDXL**: the [SDXL txt2img-DetailDaemon.json](https://github.com/Jonseed/ComfyUI-Detail-Daemon/blob/main/example_workflows/SDXL%20txt2img-DetailDaemon.json) is an example of using Detail Daemon in a SDXL workflow.
80
+
81
+ ## Credits
82
+
83
+ - Detail Daemon concept and schedule generation function from muerrilla: https://github.com/muerrilla/sd-webui-detail-daemon/
84
+ - ComfyUI sampler implementation and schedule interpolation, as well as Lying Sigma Sampler, by https://github.com/blepping/
85
+ - Multiply Sigmas node based on the one included here: https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler
custom_nodes/ComfyUI-Detail-Daemon/__init__.py ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # __init__.py
2
+
3
+ from .detail_daemon_node import DetailDaemonSamplerNode, DetailDaemonGraphSigmasNode, MultiplySigmas, LyingSigmaSamplerNode
4
+
5
+ NODE_CLASS_MAPPINGS = {
6
+ "DetailDaemonSamplerNode": DetailDaemonSamplerNode,
7
+ "DetailDaemonGraphSigmasNode": DetailDaemonGraphSigmasNode,
8
+ "MultiplySigmas": MultiplySigmas,
9
+ "LyingSigmaSampler": LyingSigmaSamplerNode
10
+ }
11
+
12
+ NODE_DISPLAY_NAME_MAPPINGS = {
13
+ "DetailDaemonSamplerNode": "Detail Daemon Sampler",
14
+ "DetailDaemonGraphSigmasNode": "Detail Daemon Graph Sigmas",
15
+ "MultiplySigmas": "Multiply Sigmas (stateless)",
16
+ "LyingSigmaSampler": "Lying Sigma Sampler",
17
+ }
18
+
19
+ __all__ = ["NODE_CLASS_MAPPINGS"]
20
+
custom_nodes/ComfyUI-Detail-Daemon/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (610 Bytes). View file
 
custom_nodes/ComfyUI-Detail-Daemon/__pycache__/detail_daemon_node.cpython-312.pyc ADDED
Binary file (15.7 kB). View file
 
custom_nodes/ComfyUI-Detail-Daemon/detail_daemon_node.py ADDED
@@ -0,0 +1,520 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Based on the concept from https://github.com/muerrilla/sd-webui-detail-daemon
2
+
3
+ from __future__ import annotations
4
+
5
+ import io
6
+
7
+ # Trying matplotlib NSWindow warning workaround on macOS
8
+ import platform
9
+
10
+ if platform.system() == 'Darwin': # Check if running on macOS
11
+ import matplotlib
12
+ matplotlib.use('Agg') # Set non-GUI backend to avoid crashes
13
+
14
+ import matplotlib.pyplot as plt
15
+ import numpy as np
16
+ import torch
17
+ from comfy.samplers import KSAMPLER
18
+ from PIL import Image
19
+ import folder_paths
20
+ import random
21
+ import os
22
+
23
+
24
+ # Schedule creation function from https://github.com/muerrilla/sd-webui-detail-daemon
25
+ def make_detail_daemon_schedule(
26
+ steps,
27
+ start,
28
+ end,
29
+ bias,
30
+ amount,
31
+ exponent,
32
+ start_offset,
33
+ end_offset,
34
+ fade,
35
+ smooth,
36
+ ):
37
+ start = min(start, end)
38
+ mid = start + bias * (end - start)
39
+ multipliers = np.zeros(steps)
40
+
41
+ start_idx, mid_idx, end_idx = [
42
+ int(round(x * (steps - 1))) for x in [start, mid, end]
43
+ ]
44
+
45
+ start_values = np.linspace(0, 1, mid_idx - start_idx + 1)
46
+ if smooth:
47
+ start_values = 0.5 * (1 - np.cos(start_values * np.pi))
48
+ start_values = start_values**exponent
49
+ if start_values.any():
50
+ start_values *= amount - start_offset
51
+ start_values += start_offset
52
+
53
+ end_values = np.linspace(1, 0, end_idx - mid_idx + 1)
54
+ if smooth:
55
+ end_values = 0.5 * (1 - np.cos(end_values * np.pi))
56
+ end_values = end_values**exponent
57
+ if end_values.any():
58
+ end_values *= amount - end_offset
59
+ end_values += end_offset
60
+
61
+ multipliers[start_idx : mid_idx + 1] = start_values
62
+ multipliers[mid_idx : end_idx + 1] = end_values
63
+ multipliers[:start_idx] = start_offset
64
+ multipliers[end_idx + 1 :] = end_offset
65
+ multipliers *= 1 - fade
66
+
67
+ return multipliers
68
+
69
+
70
+ class DetailDaemonGraphSigmasNode:
71
+ @classmethod
72
+ def INPUT_TYPES(cls):
73
+ return {
74
+ "required": {
75
+ "sigmas": ("SIGMAS", {"forceInput": True}),
76
+ "detail_amount": (
77
+ "FLOAT",
78
+ {"default": 0.1, "min": -5.0, "max": 5.0, "step": 0.01},
79
+ ),
80
+ "start": (
81
+ "FLOAT",
82
+ {"default": 0.2, "min": 0.0, "max": 1.0, "step": 0.01},
83
+ ),
84
+ "end": (
85
+ "FLOAT",
86
+ {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01},
87
+ ),
88
+ "bias": (
89
+ "FLOAT",
90
+ {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01},
91
+ ),
92
+ "exponent": (
93
+ "FLOAT",
94
+ {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.05},
95
+ ),
96
+ "start_offset": (
97
+ "FLOAT",
98
+ {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.01},
99
+ ),
100
+ "end_offset": (
101
+ "FLOAT",
102
+ {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.01},
103
+ ),
104
+ "fade": (
105
+ "FLOAT",
106
+ {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},
107
+ ),
108
+ "smooth": ("BOOLEAN", {"default": True}),
109
+ "cfg_scale": (
110
+ "FLOAT",
111
+ {
112
+ "default": 1.0,
113
+ "min": 0.0,
114
+ "max": 100.0,
115
+ "step": 0.5,
116
+ "round": 0.01,
117
+ },
118
+ ),
119
+ },
120
+ }
121
+
122
+ RETURN_TYPES = ()
123
+ OUTPUT_NODE = True
124
+ CATEGORY = "sampling/custom_sampling/sigmas"
125
+ FUNCTION = "make_graph"
126
+
127
+ def make_graph(
128
+ self,
129
+ sigmas,
130
+ detail_amount,
131
+ start,
132
+ end,
133
+ bias,
134
+ exponent,
135
+ start_offset,
136
+ end_offset,
137
+ fade,
138
+ smooth,
139
+ cfg_scale,
140
+ ):
141
+ # Create a copy of the input sigmas using clone() for tensors to avoid modifying the original
142
+ sigmas = sigmas.clone()
143
+
144
+ # Derive the number of steps from the length of sigmas minus 1 (ignore the final sigma)
145
+ steps = len(sigmas) - 1 # 21 sigmas, 20 steps
146
+ actual_steps = steps
147
+
148
+ # Create the schedule using the number of steps
149
+ schedule = make_detail_daemon_schedule(
150
+ actual_steps,
151
+ start,
152
+ end,
153
+ bias,
154
+ detail_amount,
155
+ exponent,
156
+ start_offset,
157
+ end_offset,
158
+ fade,
159
+ smooth,
160
+ )
161
+
162
+ # Debugging: print schedule and sigmas lengths to verify alignment
163
+ print(
164
+ f"Number of sigmas: {len(sigmas)}, Number of schedule steps: {len(schedule)}",
165
+ )
166
+
167
+ # Iterate over the sigmas, except for the last one (which we assume is 0 and leave untouched)
168
+ for idx in range(steps):
169
+ multiplier = schedule[idx] * 0.1
170
+
171
+ # Debugging: print each index and sigma to track what's being adjusted
172
+ print(f"Adjusting sigma at index {idx} with multiplier {multiplier}")
173
+
174
+ sigmas[idx] *= (
175
+ 1 - multiplier * cfg_scale
176
+ ) # Adjust each sigma in "both" mode
177
+
178
+ # Create the plot for visualization
179
+ image = self.plot_schedule(schedule)
180
+
181
+ # Save temp image
182
+ output_dir = folder_paths.get_temp_directory()
183
+ prefix_append = "_temp_" + ''.join(random.choice("abcdefghijklmnopqrstupvxyz") for x in range(5))
184
+
185
+ full_output_folder, filename, counter, subfolder, _ = (
186
+ folder_paths.get_save_image_path(prefix_append, output_dir)
187
+ )
188
+ filename = f"{filename}_{counter:05}_.png"
189
+ file_path = os.path.join(full_output_folder, filename)
190
+ image.save(file_path, compress_level=1)
191
+
192
+ return {
193
+ "ui": {
194
+ "images": [
195
+ {"filename": filename, "subfolder": subfolder, "type": "temp"},
196
+ ],
197
+ }
198
+ }
199
+
200
+
201
+ @staticmethod
202
+ def plot_schedule(schedule) -> Image:
203
+ plt.figure(figsize=(6, 4)) # Adjusted width
204
+ plt.plot(schedule, label="Sigma Adjustment Curve")
205
+ plt.xlabel("Steps")
206
+ plt.ylabel("Multiplier (*10)")
207
+ plt.title("Detail Adjustment Schedule")
208
+ plt.legend()
209
+ plt.grid(True)
210
+ plt.xticks(range(len(schedule)))
211
+ plt.ylim(-1, 1)
212
+
213
+ # Use tight_layout or subplots_adjust
214
+ plt.tight_layout()
215
+ # Or manually adjust if needed:
216
+ # plt.subplots_adjust(left=0.2)
217
+
218
+ buf = io.BytesIO()
219
+ plt.savefig(buf, format="PNG")
220
+ plt.close()
221
+ buf.seek(0)
222
+ image = Image.open(buf)
223
+ return image
224
+
225
+
226
+ def get_dd_schedule(
227
+ sigma: float,
228
+ sigmas: torch.Tensor,
229
+ dd_schedule: torch.Tensor,
230
+ ) -> float:
231
+ sched_len = len(dd_schedule)
232
+ if (
233
+ sched_len < 2
234
+ or len(sigmas) < 2
235
+ or sigma <= 0
236
+ or not (sigmas[-1] <= sigma <= sigmas[0])
237
+ ):
238
+ return 0.0
239
+ # First, we find the index of the closest sigma in the list to what the model was
240
+ # called with.
241
+ deltas = (sigmas[:-1] - sigma).abs()
242
+ idx = int(deltas.argmin())
243
+ if (
244
+ (idx == 0 and sigma >= sigmas[0])
245
+ or (idx == sched_len - 1 and sigma <= sigmas[-2])
246
+ or deltas[idx] == 0
247
+ ):
248
+ # Either exact match or closest to head/tail of the DD schedule so we
249
+ # can't interpolate to another schedule item.
250
+ return dd_schedule[idx].item()
251
+ # If we're here, that means the sigma is in between two sigmas in the
252
+ # list.
253
+ idxlow, idxhigh = (idx, idx - 1) if sigma > sigmas[idx] else (idx + 1, idx)
254
+ # We find the low/high neighbor sigmas - our sigma is somewhere between them.
255
+ nlow, nhigh = sigmas[idxlow], sigmas[idxhigh]
256
+ if nhigh - nlow == 0:
257
+ # Shouldn't be possible, but just in case... Avoid divide by zero.
258
+ return dd_schedule[idxlow]
259
+ # Ratio of how close we are to the high neighbor.
260
+ ratio = ((sigma - nlow) / (nhigh - nlow)).clamp(0, 1)
261
+ # Mix the DD schedule high/low items according to the ratio.
262
+ return torch.lerp(dd_schedule[idxlow], dd_schedule[idxhigh], ratio).item()
263
+
264
+
265
+ def detail_daemon_sampler(
266
+ model: object,
267
+ x: torch.Tensor,
268
+ sigmas: torch.Tensor,
269
+ *,
270
+ dds_wrapped_sampler: object,
271
+ dds_make_schedule: callable,
272
+ dds_cfg_scale_override: float,
273
+ **kwargs: dict,
274
+ ) -> torch.Tensor:
275
+ if dds_cfg_scale_override > 0:
276
+ cfg_scale = dds_cfg_scale_override
277
+ else:
278
+ maybe_cfg_scale = getattr(model.inner_model, "cfg", None)
279
+ cfg_scale = (
280
+ float(maybe_cfg_scale) if isinstance(maybe_cfg_scale, (int, float)) else 1.0
281
+ )
282
+ dd_schedule = torch.tensor(
283
+ dds_make_schedule(len(sigmas) - 1),
284
+ dtype=torch.float32,
285
+ device="cpu",
286
+ )
287
+ sigmas_cpu = sigmas.detach().clone().cpu()
288
+ sigma_max, sigma_min = float(sigmas_cpu[0]), float(sigmas_cpu[-1]) + 1e-05
289
+
290
+ def model_wrapper(x: torch.Tensor, sigma: torch.Tensor, **extra_args: dict):
291
+ sigma_float = float(sigma.max().detach().cpu())
292
+ if not (sigma_min <= sigma_float <= sigma_max):
293
+ return model(x, sigma, **extra_args)
294
+ dd_adjustment = get_dd_schedule(sigma_float, sigmas_cpu, dd_schedule) * 0.1
295
+ adjusted_sigma = sigma * max(1e-06, 1.0 - dd_adjustment * cfg_scale)
296
+ return model(x, adjusted_sigma, **extra_args)
297
+
298
+ for k in (
299
+ "inner_model",
300
+ "sigmas",
301
+ ):
302
+ if hasattr(model, k):
303
+ setattr(model_wrapper, k, getattr(model, k))
304
+ return dds_wrapped_sampler.sampler_function(
305
+ model_wrapper,
306
+ x,
307
+ sigmas,
308
+ **kwargs,
309
+ **dds_wrapped_sampler.extra_options,
310
+ )
311
+
312
+
313
+ class DetailDaemonSamplerNode:
314
+ DESCRIPTION = "This sampler wrapper works by adjusting the sigma passed to the model, while the rest of sampling stays the same."
315
+ CATEGORY = "sampling/custom_sampling/samplers"
316
+ RETURN_TYPES = ("SAMPLER",)
317
+ FUNCTION = "go"
318
+
319
+ @classmethod
320
+ def INPUT_TYPES(cls) -> dict:
321
+ return {
322
+ "required": {
323
+ "sampler": ("SAMPLER",),
324
+ "detail_amount": (
325
+ "FLOAT",
326
+ {"default": 0.1, "min": -5.0, "max": 5.0, "step": 0.01},
327
+ ),
328
+ "start": (
329
+ "FLOAT",
330
+ {"default": 0.2, "min": 0.0, "max": 1.0, "step": 0.01},
331
+ ),
332
+ "end": (
333
+ "FLOAT",
334
+ {"default": 0.8, "min": 0.0, "max": 1.0, "step": 0.01},
335
+ ),
336
+ "bias": (
337
+ "FLOAT",
338
+ {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01},
339
+ ),
340
+ "exponent": (
341
+ "FLOAT",
342
+ {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.05},
343
+ ),
344
+ "start_offset": (
345
+ "FLOAT",
346
+ {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.01},
347
+ ),
348
+ "end_offset": (
349
+ "FLOAT",
350
+ {"default": 0.0, "min": -1.0, "max": 1.0, "step": 0.01},
351
+ ),
352
+ "fade": (
353
+ "FLOAT",
354
+ {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.05},
355
+ ),
356
+ "smooth": ("BOOLEAN", {"default": True}),
357
+ "cfg_scale_override": (
358
+ "FLOAT",
359
+ {
360
+ "default": 0,
361
+ "min": 0.0,
362
+ "max": 100.0,
363
+ "step": 0.5,
364
+ "round": 0.01,
365
+ "tooltip": "If set to 0, the sampler will automatically determine the CFG scale (if possible). Set to some other value to override.",
366
+ },
367
+ ),
368
+ },
369
+ }
370
+
371
+ @classmethod
372
+ def go(
373
+ cls,
374
+ sampler: object,
375
+ *,
376
+ detail_amount,
377
+ start,
378
+ end,
379
+ bias,
380
+ exponent,
381
+ start_offset,
382
+ end_offset,
383
+ fade,
384
+ smooth,
385
+ cfg_scale_override,
386
+ ) -> tuple:
387
+ def dds_make_schedule(steps):
388
+ return make_detail_daemon_schedule(
389
+ steps,
390
+ start,
391
+ end,
392
+ bias,
393
+ detail_amount,
394
+ exponent,
395
+ start_offset,
396
+ end_offset,
397
+ fade,
398
+ smooth,
399
+ )
400
+
401
+ return (
402
+ KSAMPLER(
403
+ detail_daemon_sampler,
404
+ extra_options={
405
+ "dds_wrapped_sampler": sampler,
406
+ "dds_make_schedule": dds_make_schedule,
407
+ "dds_cfg_scale_override": cfg_scale_override,
408
+ },
409
+ ),
410
+ )
411
+
412
+ #MultiplySigmas Node
413
+ class MultiplySigmas:
414
+ @classmethod
415
+ def INPUT_TYPES(s):
416
+ return {
417
+ "required": {
418
+ "sigmas": ("SIGMAS", {"forceInput": True}),
419
+ "factor": ("FLOAT", {"default": 1, "min": 0, "max": 100, "step": 0.001}),
420
+ "start": ("FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.001}),
421
+ "end": ("FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.001})
422
+ }
423
+ }
424
+
425
+ FUNCTION = "simple_output"
426
+ RETURN_TYPES = ("SIGMAS",)
427
+ CATEGORY = "sampling/custom_sampling/sigmas"
428
+
429
+ def simple_output(self, sigmas, factor, start, end):
430
+ # Clone the sigmas to ensure the input is not modified (stateless)
431
+ sigmas = sigmas.clone()
432
+
433
+ total_sigmas = len(sigmas)
434
+ start_idx = int(start * total_sigmas)
435
+ end_idx = int(end * total_sigmas)
436
+
437
+ for i in range(start_idx, end_idx):
438
+ sigmas[i] *= factor
439
+
440
+ return (sigmas,)
441
+
442
+ #LyingSigmaSampler
443
+ def lying_sigma_sampler(
444
+ model,
445
+ x,
446
+ sigmas,
447
+ *,
448
+ lss_wrapped_sampler,
449
+ lss_dishonesty_factor,
450
+ lss_startend_percent,
451
+ **kwargs,
452
+ ):
453
+ start_percent, end_percent = lss_startend_percent
454
+ ms = model.inner_model.inner_model.model_sampling
455
+ start_sigma, end_sigma = (
456
+ round(ms.percent_to_sigma(start_percent), 4),
457
+ round(ms.percent_to_sigma(end_percent), 4),
458
+ )
459
+ del ms
460
+
461
+ def model_wrapper(x, sigma, **extra_args):
462
+ sigma_float = float(sigma.max().detach().cpu())
463
+ if end_sigma <= sigma_float <= start_sigma:
464
+ sigma = sigma * (1.0 + lss_dishonesty_factor)
465
+ return model(x, sigma, **extra_args)
466
+
467
+ for k in (
468
+ "inner_model",
469
+ "sigmas",
470
+ ):
471
+ if hasattr(model, k):
472
+ setattr(model_wrapper, k, getattr(model, k))
473
+ return lss_wrapped_sampler.sampler_function(
474
+ model_wrapper,
475
+ x,
476
+ sigmas,
477
+ **kwargs,
478
+ **lss_wrapped_sampler.extra_options,
479
+ )
480
+
481
+
482
+ class LyingSigmaSamplerNode:
483
+ CATEGORY = "sampling/custom_sampling"
484
+ RETURN_TYPES = ("SAMPLER",)
485
+ FUNCTION = "go"
486
+
487
+ @classmethod
488
+ def INPUT_TYPES(cls):
489
+ return {
490
+ "required": {
491
+ "sampler": ("SAMPLER",),
492
+ "dishonesty_factor": (
493
+ "FLOAT",
494
+ {
495
+ "default": -0.05,
496
+ "min": -0.999,
497
+ "step": 0.01,
498
+ "tooltip": "Multiplier for sigmas passed to the model. -0.05 means we reduce the sigma by 5%.",
499
+ },
500
+ ),
501
+ },
502
+ "optional": {
503
+ "start_percent": ("FLOAT", {"default": 0.1, "min": 0.0, "max": 1.0, "step": 0.01}),
504
+ "end_percent": ("FLOAT", {"default": 0.9, "min": 0.0, "max": 1.0, "step": 0.01}),
505
+ },
506
+ }
507
+
508
+ @classmethod
509
+ def go(cls, sampler, dishonesty_factor, *, start_percent=0.0, end_percent=1.0):
510
+ return (
511
+ KSAMPLER(
512
+ lying_sigma_sampler,
513
+ extra_options={
514
+ "lss_wrapped_sampler": sampler,
515
+ "lss_dishonesty_factor": dishonesty_factor,
516
+ "lss_startend_percent": (start_percent, end_percent),
517
+ },
518
+ ),
519
+ )
520
+
custom_nodes/ComfyUI-Detail-Daemon/example_workflows/Comparing Detailers.json ADDED
@@ -0,0 +1,1646 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 103,
3
+ "last_link_id": 207,
4
+ "nodes": [
5
+ {
6
+ "id": 22,
7
+ "type": "DualCLIPLoader",
8
+ "pos": {
9
+ "0": -150,
10
+ "1": 210
11
+ },
12
+ "size": {
13
+ "0": 315,
14
+ "1": 106
15
+ },
16
+ "flags": {
17
+ "collapsed": false
18
+ },
19
+ "order": 0,
20
+ "mode": 0,
21
+ "inputs": [],
22
+ "outputs": [
23
+ {
24
+ "name": "CLIP",
25
+ "type": "CLIP",
26
+ "links": [
27
+ 140
28
+ ],
29
+ "slot_index": 0,
30
+ "shape": 3
31
+ }
32
+ ],
33
+ "properties": {
34
+ "Node name for S&R": "DualCLIPLoader"
35
+ },
36
+ "widgets_values": [
37
+ "ViT-L-14-BEST-smooth-GmP-TE-only-HF-format.safetensors",
38
+ "t5xxl_fp16.safetensors",
39
+ "flux"
40
+ ]
41
+ },
42
+ {
43
+ "id": 28,
44
+ "type": "KSamplerSelect",
45
+ "pos": {
46
+ "0": 230,
47
+ "1": 480
48
+ },
49
+ "size": {
50
+ "0": 315,
51
+ "1": 58
52
+ },
53
+ "flags": {},
54
+ "order": 1,
55
+ "mode": 0,
56
+ "inputs": [],
57
+ "outputs": [
58
+ {
59
+ "name": "SAMPLER",
60
+ "type": "SAMPLER",
61
+ "links": [
62
+ 99,
63
+ 146,
64
+ 151,
65
+ 166
66
+ ],
67
+ "slot_index": 0,
68
+ "shape": 3
69
+ }
70
+ ],
71
+ "properties": {
72
+ "Node name for S&R": "KSamplerSelect"
73
+ },
74
+ "widgets_values": [
75
+ "dpmpp_2m"
76
+ ]
77
+ },
78
+ {
79
+ "id": 5,
80
+ "type": "EmptyLatentImage",
81
+ "pos": {
82
+ "0": 230,
83
+ "1": 170
84
+ },
85
+ "size": {
86
+ "0": 315,
87
+ "1": 106
88
+ },
89
+ "flags": {},
90
+ "order": 2,
91
+ "mode": 0,
92
+ "inputs": [],
93
+ "outputs": [
94
+ {
95
+ "name": "LATENT",
96
+ "type": "LATENT",
97
+ "links": [
98
+ 30,
99
+ 100,
100
+ 145,
101
+ 160
102
+ ],
103
+ "slot_index": 0
104
+ }
105
+ ],
106
+ "properties": {
107
+ "Node name for S&R": "EmptyLatentImage"
108
+ },
109
+ "widgets_values": [
110
+ 1024,
111
+ 1024,
112
+ 1
113
+ ]
114
+ },
115
+ {
116
+ "id": 96,
117
+ "type": "UnetLoaderGGUF",
118
+ "pos": {
119
+ "0": -150,
120
+ "1": 70
121
+ },
122
+ "size": {
123
+ "0": 315,
124
+ "1": 58
125
+ },
126
+ "flags": {},
127
+ "order": 3,
128
+ "mode": 0,
129
+ "inputs": [],
130
+ "outputs": [
131
+ {
132
+ "name": "MODEL",
133
+ "type": "MODEL",
134
+ "links": [
135
+ 194,
136
+ 195
137
+ ],
138
+ "slot_index": 0
139
+ }
140
+ ],
141
+ "properties": {
142
+ "Node name for S&R": "UnetLoaderGGUF"
143
+ },
144
+ "widgets_values": [
145
+ "flux\\flux1-dev-Q8_0.gguf"
146
+ ]
147
+ },
148
+ {
149
+ "id": 30,
150
+ "type": "RandomNoise",
151
+ "pos": {
152
+ "0": 230,
153
+ "1": 330
154
+ },
155
+ "size": {
156
+ "0": 315.3865661621094,
157
+ "1": 82
158
+ },
159
+ "flags": {},
160
+ "order": 4,
161
+ "mode": 0,
162
+ "inputs": [],
163
+ "outputs": [
164
+ {
165
+ "name": "NOISE",
166
+ "type": "NOISE",
167
+ "links": [
168
+ 23,
169
+ 97,
170
+ 141,
171
+ 156
172
+ ],
173
+ "slot_index": 0,
174
+ "shape": 3
175
+ }
176
+ ],
177
+ "properties": {
178
+ "Node name for S&R": "RandomNoise"
179
+ },
180
+ "widgets_values": [
181
+ 55268804028075,
182
+ "fixed"
183
+ ]
184
+ },
185
+ {
186
+ "id": 25,
187
+ "type": "BasicGuider",
188
+ "pos": {
189
+ "0": 240,
190
+ "1": 60
191
+ },
192
+ "size": {
193
+ "0": 241.79998779296875,
194
+ "1": 46
195
+ },
196
+ "flags": {},
197
+ "order": 10,
198
+ "mode": 0,
199
+ "inputs": [
200
+ {
201
+ "name": "model",
202
+ "type": "MODEL",
203
+ "link": 194
204
+ },
205
+ {
206
+ "name": "conditioning",
207
+ "type": "CONDITIONING",
208
+ "link": 51,
209
+ "slot_index": 1
210
+ }
211
+ ],
212
+ "outputs": [
213
+ {
214
+ "name": "GUIDER",
215
+ "type": "GUIDER",
216
+ "links": [
217
+ 17,
218
+ 98,
219
+ 142,
220
+ 157
221
+ ],
222
+ "slot_index": 0,
223
+ "shape": 3
224
+ }
225
+ ],
226
+ "properties": {
227
+ "Node name for S&R": "BasicGuider"
228
+ },
229
+ "widgets_values": []
230
+ },
231
+ {
232
+ "id": 26,
233
+ "type": "SamplerCustomAdvanced",
234
+ "pos": {
235
+ "0": 750,
236
+ "1": 280
237
+ },
238
+ "size": {
239
+ "0": 236.8000030517578,
240
+ "1": 106
241
+ },
242
+ "flags": {
243
+ "collapsed": true
244
+ },
245
+ "order": 13,
246
+ "mode": 0,
247
+ "inputs": [
248
+ {
249
+ "name": "noise",
250
+ "type": "NOISE",
251
+ "link": 23
252
+ },
253
+ {
254
+ "name": "guider",
255
+ "type": "GUIDER",
256
+ "link": 17
257
+ },
258
+ {
259
+ "name": "sampler",
260
+ "type": "SAMPLER",
261
+ "link": 152
262
+ },
263
+ {
264
+ "name": "sigmas",
265
+ "type": "SIGMAS",
266
+ "link": 163
267
+ },
268
+ {
269
+ "name": "latent_image",
270
+ "type": "LATENT",
271
+ "link": 30
272
+ }
273
+ ],
274
+ "outputs": [
275
+ {
276
+ "name": "output",
277
+ "type": "LATENT",
278
+ "links": [
279
+ 110
280
+ ],
281
+ "slot_index": 0,
282
+ "shape": 3
283
+ },
284
+ {
285
+ "name": "denoised_output",
286
+ "type": "LATENT",
287
+ "links": [],
288
+ "slot_index": 1,
289
+ "shape": 3
290
+ }
291
+ ],
292
+ "properties": {
293
+ "Node name for S&R": "SamplerCustomAdvanced"
294
+ },
295
+ "widgets_values": []
296
+ },
297
+ {
298
+ "id": 8,
299
+ "type": "VAEDecode",
300
+ "pos": {
301
+ "0": 780,
302
+ "1": 340
303
+ },
304
+ "size": {
305
+ "0": 210,
306
+ "1": 46
307
+ },
308
+ "flags": {
309
+ "collapsed": true
310
+ },
311
+ "order": 17,
312
+ "mode": 0,
313
+ "inputs": [
314
+ {
315
+ "name": "samples",
316
+ "type": "LATENT",
317
+ "link": 110
318
+ },
319
+ {
320
+ "name": "vae",
321
+ "type": "VAE",
322
+ "link": 25
323
+ }
324
+ ],
325
+ "outputs": [
326
+ {
327
+ "name": "IMAGE",
328
+ "type": "IMAGE",
329
+ "links": [
330
+ 49,
331
+ 196
332
+ ],
333
+ "slot_index": 0
334
+ }
335
+ ],
336
+ "properties": {
337
+ "Node name for S&R": "VAEDecode"
338
+ },
339
+ "widgets_values": []
340
+ },
341
+ {
342
+ "id": 78,
343
+ "type": "VAEDecode",
344
+ "pos": {
345
+ "0": 911.50830078125,
346
+ "1": 783.6454467773438
347
+ },
348
+ "size": {
349
+ "0": 210,
350
+ "1": 46
351
+ },
352
+ "flags": {
353
+ "collapsed": true
354
+ },
355
+ "order": 19,
356
+ "mode": 0,
357
+ "inputs": [
358
+ {
359
+ "name": "samples",
360
+ "type": "LATENT",
361
+ "link": 148
362
+ },
363
+ {
364
+ "name": "vae",
365
+ "type": "VAE",
366
+ "link": 150
367
+ }
368
+ ],
369
+ "outputs": [
370
+ {
371
+ "name": "IMAGE",
372
+ "type": "IMAGE",
373
+ "links": [
374
+ 149,
375
+ 198
376
+ ],
377
+ "slot_index": 0
378
+ }
379
+ ],
380
+ "properties": {
381
+ "Node name for S&R": "VAEDecode"
382
+ },
383
+ "widgets_values": []
384
+ },
385
+ {
386
+ "id": 77,
387
+ "type": "SamplerCustomAdvanced",
388
+ "pos": {
389
+ "0": 878.50830078125,
390
+ "1": 712.6454467773438
391
+ },
392
+ "size": {
393
+ "0": 355.20001220703125,
394
+ "1": 106
395
+ },
396
+ "flags": {
397
+ "collapsed": true
398
+ },
399
+ "order": 15,
400
+ "mode": 0,
401
+ "inputs": [
402
+ {
403
+ "name": "noise",
404
+ "type": "NOISE",
405
+ "link": 141
406
+ },
407
+ {
408
+ "name": "guider",
409
+ "type": "GUIDER",
410
+ "link": 142
411
+ },
412
+ {
413
+ "name": "sampler",
414
+ "type": "SAMPLER",
415
+ "link": 165
416
+ },
417
+ {
418
+ "name": "sigmas",
419
+ "type": "SIGMAS",
420
+ "link": 164
421
+ },
422
+ {
423
+ "name": "latent_image",
424
+ "type": "LATENT",
425
+ "link": 145
426
+ }
427
+ ],
428
+ "outputs": [
429
+ {
430
+ "name": "output",
431
+ "type": "LATENT",
432
+ "links": [
433
+ 148
434
+ ],
435
+ "slot_index": 0,
436
+ "shape": 3
437
+ },
438
+ {
439
+ "name": "denoised_output",
440
+ "type": "LATENT",
441
+ "links": [],
442
+ "slot_index": 1,
443
+ "shape": 3
444
+ }
445
+ ],
446
+ "properties": {
447
+ "Node name for S&R": "SamplerCustomAdvanced"
448
+ },
449
+ "widgets_values": []
450
+ },
451
+ {
452
+ "id": 71,
453
+ "type": "LyingSigmaSampler",
454
+ "pos": {
455
+ "0": 823.50830078125,
456
+ "1": 540.6454467773438
457
+ },
458
+ "size": {
459
+ "0": 315,
460
+ "1": 106
461
+ },
462
+ "flags": {},
463
+ "order": 7,
464
+ "mode": 0,
465
+ "inputs": [
466
+ {
467
+ "name": "sampler",
468
+ "type": "SAMPLER",
469
+ "link": 146
470
+ }
471
+ ],
472
+ "outputs": [
473
+ {
474
+ "name": "SAMPLER",
475
+ "type": "SAMPLER",
476
+ "links": [
477
+ 165
478
+ ],
479
+ "slot_index": 0
480
+ }
481
+ ],
482
+ "properties": {
483
+ "Node name for S&R": "LyingSigmaSampler"
484
+ },
485
+ "widgets_values": [
486
+ -0.05,
487
+ 0.05,
488
+ 0.9
489
+ ]
490
+ },
491
+ {
492
+ "id": 98,
493
+ "type": "Image Comparer (rgthree)",
494
+ "pos": {
495
+ "0": 1727.287109375,
496
+ "1": 459.28717041015625
497
+ },
498
+ "size": {
499
+ "0": 427.1917419433594,
500
+ "1": 458.9107666015625
501
+ },
502
+ "flags": {},
503
+ "order": 25,
504
+ "mode": 0,
505
+ "inputs": [
506
+ {
507
+ "name": "image_a",
508
+ "type": "IMAGE",
509
+ "link": 198,
510
+ "dir": 3
511
+ },
512
+ {
513
+ "name": "image_b",
514
+ "type": "IMAGE",
515
+ "link": 199,
516
+ "dir": 3
517
+ }
518
+ ],
519
+ "outputs": [],
520
+ "title": "Compare with default",
521
+ "properties": {
522
+ "comparer_mode": "Slide"
523
+ },
524
+ "widgets_values": [
525
+ [
526
+ {
527
+ "name": "A",
528
+ "selected": true,
529
+ "url": "/api/view?filename=rgthree.compare._temp_sppos_00001_.png&type=temp&subfolder=&rand=0.9753625084622339"
530
+ },
531
+ {
532
+ "name": "B",
533
+ "selected": true,
534
+ "url": "/api/view?filename=rgthree.compare._temp_sppos_00002_.png&type=temp&subfolder=&rand=0.8074629265257474"
535
+ }
536
+ ]
537
+ ]
538
+ },
539
+ {
540
+ "id": 99,
541
+ "type": "Image Comparer (rgthree)",
542
+ "pos": {
543
+ "0": 1725,
544
+ "1": 1012
545
+ },
546
+ "size": {
547
+ "0": 430.4796142578125,
548
+ "1": 457.0982971191406
549
+ },
550
+ "flags": {},
551
+ "order": 27,
552
+ "mode": 0,
553
+ "inputs": [
554
+ {
555
+ "name": "image_a",
556
+ "type": "IMAGE",
557
+ "link": 200,
558
+ "dir": 3
559
+ },
560
+ {
561
+ "name": "image_b",
562
+ "type": "IMAGE",
563
+ "link": 201,
564
+ "dir": 3
565
+ }
566
+ ],
567
+ "outputs": [],
568
+ "title": "Compare with default",
569
+ "properties": {
570
+ "comparer_mode": "Slide"
571
+ },
572
+ "widgets_values": [
573
+ [
574
+ {
575
+ "name": "A",
576
+ "selected": true,
577
+ "url": "/api/view?filename=rgthree.compare._temp_cquhl_00001_.png&type=temp&subfolder=&rand=0.2284940106180524"
578
+ },
579
+ {
580
+ "name": "B",
581
+ "selected": true,
582
+ "url": "/api/view?filename=rgthree.compare._temp_cquhl_00002_.png&type=temp&subfolder=&rand=0.11443615799445639"
583
+ }
584
+ ]
585
+ ]
586
+ },
587
+ {
588
+ "id": 27,
589
+ "type": "VAELoader",
590
+ "pos": {
591
+ "0": -149,
592
+ "1": 393
593
+ },
594
+ "size": {
595
+ "0": 315,
596
+ "1": 58
597
+ },
598
+ "flags": {},
599
+ "order": 5,
600
+ "mode": 0,
601
+ "inputs": [],
602
+ "outputs": [
603
+ {
604
+ "name": "VAE",
605
+ "type": "VAE",
606
+ "links": [
607
+ 25,
608
+ 103,
609
+ 150,
610
+ 154
611
+ ],
612
+ "slot_index": 0,
613
+ "shape": 3
614
+ }
615
+ ],
616
+ "properties": {
617
+ "Node name for S&R": "VAELoader"
618
+ },
619
+ "widgets_values": [
620
+ "ae.safetensors"
621
+ ]
622
+ },
623
+ {
624
+ "id": 38,
625
+ "type": "CLIPTextEncodeFlux",
626
+ "pos": {
627
+ "0": -149,
628
+ "1": 513
629
+ },
630
+ "size": {
631
+ "0": 348.0617980957031,
632
+ "1": 394.8694152832031
633
+ },
634
+ "flags": {},
635
+ "order": 6,
636
+ "mode": 0,
637
+ "inputs": [
638
+ {
639
+ "name": "clip",
640
+ "type": "CLIP",
641
+ "link": 140
642
+ }
643
+ ],
644
+ "outputs": [
645
+ {
646
+ "name": "CONDITIONING",
647
+ "type": "CONDITIONING",
648
+ "links": [
649
+ 51
650
+ ],
651
+ "slot_index": 0
652
+ }
653
+ ],
654
+ "properties": {
655
+ "Node name for S&R": "CLIPTextEncodeFlux"
656
+ },
657
+ "widgets_values": [
658
+ "a photo of a majestic, vividly colored peacock standing proudly in an exotic, lush jungle. The bird's feathers display an iridescent array of blues, greens, and purples, with intricate eye patterns. Taken with a Canon EOS 5D Mark IV and a Canon EF 100-400mm f/4.5-5.6L IS II USM lens at 200mm, the scene includes tropical plants, vibrant flowers, and distant waterfalls under a bright, sunny sky, creating a rich and detailed paradise setting. The peacock is the focal point, exuding elegance and grace. Tack sharp, with many details. Other elements of wildlife, like colorful butterflies and exotic birds, add life to the scene, enhancing the overall photographic quality.",
659
+ "a photo of a majestic, vividly colored peacock standing proudly in an exotic, lush jungle. The bird's feathers display an iridescent array of blues, greens, and purples, with intricate eye patterns. Taken with a Canon EOS 5D Mark IV and a Canon EF 100-400mm f/4.5-5.6L IS II USM lens at 200mm, the scene includes tropical plants, vibrant flowers, and distant waterfalls under a bright, sunny sky, creating a rich and detailed paradise setting. The peacock is the focal point, exuding elegance and grace. Tack sharp, with many details. Other elements of wildlife, like colorful butterflies and exotic birds, add life to the scene, enhancing the overall photographic quality.",
660
+ 3.5
661
+ ]
662
+ },
663
+ {
664
+ "id": 67,
665
+ "type": "PreviewImage",
666
+ "pos": {
667
+ "0": 244,
668
+ "1": 1005
669
+ },
670
+ "size": {
671
+ "0": 447.607177734375,
672
+ "1": 461.6881103515625
673
+ },
674
+ "flags": {},
675
+ "order": 22,
676
+ "mode": 0,
677
+ "inputs": [
678
+ {
679
+ "name": "images",
680
+ "type": "IMAGE",
681
+ "link": 95
682
+ }
683
+ ],
684
+ "outputs": [],
685
+ "title": "Default preview image (no detailer)",
686
+ "properties": {
687
+ "Node name for S&R": "PreviewImage"
688
+ },
689
+ "widgets_values": []
690
+ },
691
+ {
692
+ "id": 66,
693
+ "type": "SamplerCustomAdvanced",
694
+ "pos": {
695
+ "0": -30,
696
+ "1": 1159
697
+ },
698
+ "size": {
699
+ "0": 355.20001220703125,
700
+ "1": 106
701
+ },
702
+ "flags": {
703
+ "collapsed": true
704
+ },
705
+ "order": 14,
706
+ "mode": 0,
707
+ "inputs": [
708
+ {
709
+ "name": "noise",
710
+ "type": "NOISE",
711
+ "link": 97
712
+ },
713
+ {
714
+ "name": "guider",
715
+ "type": "GUIDER",
716
+ "link": 98
717
+ },
718
+ {
719
+ "name": "sampler",
720
+ "type": "SAMPLER",
721
+ "link": 99
722
+ },
723
+ {
724
+ "name": "sigmas",
725
+ "type": "SIGMAS",
726
+ "link": 96
727
+ },
728
+ {
729
+ "name": "latent_image",
730
+ "type": "LATENT",
731
+ "link": 100
732
+ }
733
+ ],
734
+ "outputs": [
735
+ {
736
+ "name": "output",
737
+ "type": "LATENT",
738
+ "links": [
739
+ 101
740
+ ],
741
+ "slot_index": 0,
742
+ "shape": 3
743
+ },
744
+ {
745
+ "name": "denoised_output",
746
+ "type": "LATENT",
747
+ "links": [],
748
+ "slot_index": 1,
749
+ "shape": 3
750
+ }
751
+ ],
752
+ "properties": {
753
+ "Node name for S&R": "SamplerCustomAdvanced"
754
+ },
755
+ "widgets_values": []
756
+ },
757
+ {
758
+ "id": 65,
759
+ "type": "VAEDecode",
760
+ "pos": {
761
+ "0": 5,
762
+ "1": 1225
763
+ },
764
+ "size": {
765
+ "0": 210,
766
+ "1": 46
767
+ },
768
+ "flags": {
769
+ "collapsed": true
770
+ },
771
+ "order": 18,
772
+ "mode": 0,
773
+ "inputs": [
774
+ {
775
+ "name": "samples",
776
+ "type": "LATENT",
777
+ "link": 101
778
+ },
779
+ {
780
+ "name": "vae",
781
+ "type": "VAE",
782
+ "link": 103
783
+ }
784
+ ],
785
+ "outputs": [
786
+ {
787
+ "name": "IMAGE",
788
+ "type": "IMAGE",
789
+ "links": [
790
+ 95,
791
+ 197,
792
+ 199,
793
+ 201
794
+ ],
795
+ "slot_index": 0
796
+ }
797
+ ],
798
+ "properties": {
799
+ "Node name for S&R": "VAEDecode"
800
+ },
801
+ "widgets_values": []
802
+ },
803
+ {
804
+ "id": 80,
805
+ "type": "DetailDaemonSamplerNode",
806
+ "pos": {
807
+ "0": 735,
808
+ "1": -80
809
+ },
810
+ "size": {
811
+ "0": 228.84759521484375,
812
+ "1": 274
813
+ },
814
+ "flags": {},
815
+ "order": 8,
816
+ "mode": 0,
817
+ "inputs": [
818
+ {
819
+ "name": "sampler",
820
+ "type": "SAMPLER",
821
+ "link": 151
822
+ }
823
+ ],
824
+ "outputs": [
825
+ {
826
+ "name": "SAMPLER",
827
+ "type": "SAMPLER",
828
+ "links": [
829
+ 152
830
+ ]
831
+ }
832
+ ],
833
+ "properties": {
834
+ "Node name for S&R": "DetailDaemonSamplerNode"
835
+ },
836
+ "widgets_values": [
837
+ 0.5,
838
+ 0.1,
839
+ 0.9,
840
+ 0.5,
841
+ 0,
842
+ 0,
843
+ 0,
844
+ 0,
845
+ false,
846
+ 0
847
+ ]
848
+ },
849
+ {
850
+ "id": 37,
851
+ "type": "PreviewImage",
852
+ "pos": {
853
+ "0": 1276,
854
+ "1": -82
855
+ },
856
+ "size": {
857
+ "0": 444.4699401855469,
858
+ "1": 458.221435546875
859
+ },
860
+ "flags": {},
861
+ "order": 21,
862
+ "mode": 0,
863
+ "inputs": [
864
+ {
865
+ "name": "images",
866
+ "type": "IMAGE",
867
+ "link": 49
868
+ }
869
+ ],
870
+ "outputs": [],
871
+ "title": "Detail Daemon preview image",
872
+ "properties": {
873
+ "Node name for S&R": "PreviewImage"
874
+ },
875
+ "widgets_values": []
876
+ },
877
+ {
878
+ "id": 97,
879
+ "type": "Image Comparer (rgthree)",
880
+ "pos": {
881
+ "0": 1728,
882
+ "1": -82
883
+ },
884
+ "size": {
885
+ "0": 438.29681396484375,
886
+ "1": 458.221435546875
887
+ },
888
+ "flags": {},
889
+ "order": 23,
890
+ "mode": 0,
891
+ "inputs": [
892
+ {
893
+ "name": "image_a",
894
+ "type": "IMAGE",
895
+ "link": 196,
896
+ "dir": 3
897
+ },
898
+ {
899
+ "name": "image_b",
900
+ "type": "IMAGE",
901
+ "link": 197,
902
+ "dir": 3
903
+ }
904
+ ],
905
+ "outputs": [],
906
+ "title": "Compare with default",
907
+ "properties": {
908
+ "comparer_mode": "Slide"
909
+ },
910
+ "widgets_values": [
911
+ [
912
+ {
913
+ "name": "A",
914
+ "selected": true,
915
+ "url": "/api/view?filename=rgthree.compare._temp_mqavm_00001_.png&type=temp&subfolder=&rand=0.26559991198291977"
916
+ },
917
+ {
918
+ "name": "B",
919
+ "selected": true,
920
+ "url": "/api/view?filename=rgthree.compare._temp_mqavm_00002_.png&type=temp&subfolder=&rand=0.517245193682482"
921
+ }
922
+ ]
923
+ ]
924
+ },
925
+ {
926
+ "id": 79,
927
+ "type": "PreviewImage",
928
+ "pos": {
929
+ "0": 1271.287109375,
930
+ "1": 454.28717041015625
931
+ },
932
+ "size": {
933
+ "0": 441.1180114746094,
934
+ "1": 464.446533203125
935
+ },
936
+ "flags": {},
937
+ "order": 24,
938
+ "mode": 0,
939
+ "inputs": [
940
+ {
941
+ "name": "images",
942
+ "type": "IMAGE",
943
+ "link": 149
944
+ }
945
+ ],
946
+ "outputs": [],
947
+ "title": "Lying Sigma Sampler preview image",
948
+ "properties": {
949
+ "Node name for S&R": "PreviewImage"
950
+ },
951
+ "widgets_values": []
952
+ },
953
+ {
954
+ "id": 82,
955
+ "type": "PreviewImage",
956
+ "pos": {
957
+ "0": 1264,
958
+ "1": 1002
959
+ },
960
+ "size": {
961
+ "0": 448.5738525390625,
962
+ "1": 467.3197021484375
963
+ },
964
+ "flags": {},
965
+ "order": 26,
966
+ "mode": 0,
967
+ "inputs": [
968
+ {
969
+ "name": "images",
970
+ "type": "IMAGE",
971
+ "link": 155
972
+ }
973
+ ],
974
+ "outputs": [],
975
+ "title": "Multiply Sigmas preview image",
976
+ "properties": {
977
+ "Node name for S&R": "PreviewImage"
978
+ },
979
+ "widgets_values": []
980
+ },
981
+ {
982
+ "id": 100,
983
+ "type": "DetailDaemonGraphSigmasNode",
984
+ "pos": {
985
+ "0": 974,
986
+ "1": -108
987
+ },
988
+ "size": {
989
+ "0": 281.25433349609375,
990
+ "1": 486
991
+ },
992
+ "flags": {},
993
+ "order": 11,
994
+ "mode": 0,
995
+ "inputs": [
996
+ {
997
+ "name": "sigmas",
998
+ "type": "SIGMAS",
999
+ "link": 202
1000
+ }
1001
+ ],
1002
+ "outputs": [],
1003
+ "properties": {
1004
+ "Node name for S&R": "DetailDaemonGraphSigmasNode"
1005
+ },
1006
+ "widgets_values": [
1007
+ 0.5,
1008
+ 0.1,
1009
+ 0.9,
1010
+ 0.5,
1011
+ 0,
1012
+ 0,
1013
+ 0,
1014
+ 0,
1015
+ false,
1016
+ 1
1017
+ ]
1018
+ },
1019
+ {
1020
+ "id": 29,
1021
+ "type": "BasicScheduler",
1022
+ "pos": {
1023
+ "0": 230,
1024
+ "1": 590
1025
+ },
1026
+ "size": {
1027
+ "0": 315,
1028
+ "1": 106
1029
+ },
1030
+ "flags": {},
1031
+ "order": 9,
1032
+ "mode": 0,
1033
+ "inputs": [
1034
+ {
1035
+ "name": "model",
1036
+ "type": "MODEL",
1037
+ "link": 195,
1038
+ "slot_index": 0
1039
+ }
1040
+ ],
1041
+ "outputs": [
1042
+ {
1043
+ "name": "SIGMAS",
1044
+ "type": "SIGMAS",
1045
+ "links": [
1046
+ 96,
1047
+ 163,
1048
+ 164,
1049
+ 202,
1050
+ 205
1051
+ ],
1052
+ "slot_index": 0,
1053
+ "shape": 3
1054
+ }
1055
+ ],
1056
+ "properties": {
1057
+ "Node name for S&R": "BasicScheduler"
1058
+ },
1059
+ "widgets_values": [
1060
+ "beta",
1061
+ 20,
1062
+ 1
1063
+ ]
1064
+ },
1065
+ {
1066
+ "id": 83,
1067
+ "type": "SamplerCustomAdvanced",
1068
+ "pos": {
1069
+ "0": 877,
1070
+ "1": 1340
1071
+ },
1072
+ "size": {
1073
+ "0": 355.20001220703125,
1074
+ "1": 106
1075
+ },
1076
+ "flags": {
1077
+ "collapsed": true
1078
+ },
1079
+ "order": 16,
1080
+ "mode": 0,
1081
+ "inputs": [
1082
+ {
1083
+ "name": "noise",
1084
+ "type": "NOISE",
1085
+ "link": 156
1086
+ },
1087
+ {
1088
+ "name": "guider",
1089
+ "type": "GUIDER",
1090
+ "link": 157
1091
+ },
1092
+ {
1093
+ "name": "sampler",
1094
+ "type": "SAMPLER",
1095
+ "link": 166
1096
+ },
1097
+ {
1098
+ "name": "sigmas",
1099
+ "type": "SIGMAS",
1100
+ "link": 206
1101
+ },
1102
+ {
1103
+ "name": "latent_image",
1104
+ "type": "LATENT",
1105
+ "link": 160
1106
+ }
1107
+ ],
1108
+ "outputs": [
1109
+ {
1110
+ "name": "output",
1111
+ "type": "LATENT",
1112
+ "links": [
1113
+ 162
1114
+ ],
1115
+ "slot_index": 0,
1116
+ "shape": 3
1117
+ },
1118
+ {
1119
+ "name": "denoised_output",
1120
+ "type": "LATENT",
1121
+ "links": [],
1122
+ "slot_index": 1,
1123
+ "shape": 3
1124
+ }
1125
+ ],
1126
+ "properties": {
1127
+ "Node name for S&R": "SamplerCustomAdvanced"
1128
+ },
1129
+ "widgets_values": []
1130
+ },
1131
+ {
1132
+ "id": 81,
1133
+ "type": "VAEDecode",
1134
+ "pos": {
1135
+ "0": 899,
1136
+ "1": 1389
1137
+ },
1138
+ "size": {
1139
+ "0": 210,
1140
+ "1": 46
1141
+ },
1142
+ "flags": {
1143
+ "collapsed": true
1144
+ },
1145
+ "order": 20,
1146
+ "mode": 0,
1147
+ "inputs": [
1148
+ {
1149
+ "name": "samples",
1150
+ "type": "LATENT",
1151
+ "link": 162
1152
+ },
1153
+ {
1154
+ "name": "vae",
1155
+ "type": "VAE",
1156
+ "link": 154
1157
+ }
1158
+ ],
1159
+ "outputs": [
1160
+ {
1161
+ "name": "IMAGE",
1162
+ "type": "IMAGE",
1163
+ "links": [
1164
+ 155,
1165
+ 200
1166
+ ],
1167
+ "slot_index": 0
1168
+ }
1169
+ ],
1170
+ "properties": {
1171
+ "Node name for S&R": "VAEDecode"
1172
+ },
1173
+ "widgets_values": []
1174
+ },
1175
+ {
1176
+ "id": 103,
1177
+ "type": "MultiplySigmas",
1178
+ "pos": {
1179
+ "0": 827,
1180
+ "1": 1175
1181
+ },
1182
+ "size": {
1183
+ "0": 340.20001220703125,
1184
+ "1": 106
1185
+ },
1186
+ "flags": {},
1187
+ "order": 12,
1188
+ "mode": 0,
1189
+ "inputs": [
1190
+ {
1191
+ "name": "sigmas",
1192
+ "type": "SIGMAS",
1193
+ "link": 205
1194
+ }
1195
+ ],
1196
+ "outputs": [
1197
+ {
1198
+ "name": "SIGMAS",
1199
+ "type": "SIGMAS",
1200
+ "links": [
1201
+ 206
1202
+ ]
1203
+ }
1204
+ ],
1205
+ "properties": {
1206
+ "Node name for S&R": "MultiplySigmas"
1207
+ },
1208
+ "widgets_values": [
1209
+ 0.96,
1210
+ 0,
1211
+ 1
1212
+ ]
1213
+ }
1214
+ ],
1215
+ "links": [
1216
+ [
1217
+ 17,
1218
+ 25,
1219
+ 0,
1220
+ 26,
1221
+ 1,
1222
+ "GUIDER"
1223
+ ],
1224
+ [
1225
+ 23,
1226
+ 30,
1227
+ 0,
1228
+ 26,
1229
+ 0,
1230
+ "NOISE"
1231
+ ],
1232
+ [
1233
+ 25,
1234
+ 27,
1235
+ 0,
1236
+ 8,
1237
+ 1,
1238
+ "VAE"
1239
+ ],
1240
+ [
1241
+ 30,
1242
+ 5,
1243
+ 0,
1244
+ 26,
1245
+ 4,
1246
+ "LATENT"
1247
+ ],
1248
+ [
1249
+ 49,
1250
+ 8,
1251
+ 0,
1252
+ 37,
1253
+ 0,
1254
+ "IMAGE"
1255
+ ],
1256
+ [
1257
+ 51,
1258
+ 38,
1259
+ 0,
1260
+ 25,
1261
+ 1,
1262
+ "CONDITIONING"
1263
+ ],
1264
+ [
1265
+ 95,
1266
+ 65,
1267
+ 0,
1268
+ 67,
1269
+ 0,
1270
+ "IMAGE"
1271
+ ],
1272
+ [
1273
+ 96,
1274
+ 29,
1275
+ 0,
1276
+ 66,
1277
+ 3,
1278
+ "SIGMAS"
1279
+ ],
1280
+ [
1281
+ 97,
1282
+ 30,
1283
+ 0,
1284
+ 66,
1285
+ 0,
1286
+ "NOISE"
1287
+ ],
1288
+ [
1289
+ 98,
1290
+ 25,
1291
+ 0,
1292
+ 66,
1293
+ 1,
1294
+ "GUIDER"
1295
+ ],
1296
+ [
1297
+ 99,
1298
+ 28,
1299
+ 0,
1300
+ 66,
1301
+ 2,
1302
+ "SAMPLER"
1303
+ ],
1304
+ [
1305
+ 100,
1306
+ 5,
1307
+ 0,
1308
+ 66,
1309
+ 4,
1310
+ "LATENT"
1311
+ ],
1312
+ [
1313
+ 101,
1314
+ 66,
1315
+ 0,
1316
+ 65,
1317
+ 0,
1318
+ "LATENT"
1319
+ ],
1320
+ [
1321
+ 103,
1322
+ 27,
1323
+ 0,
1324
+ 65,
1325
+ 1,
1326
+ "VAE"
1327
+ ],
1328
+ [
1329
+ 110,
1330
+ 26,
1331
+ 0,
1332
+ 8,
1333
+ 0,
1334
+ "LATENT"
1335
+ ],
1336
+ [
1337
+ 140,
1338
+ 22,
1339
+ 0,
1340
+ 38,
1341
+ 0,
1342
+ "CLIP"
1343
+ ],
1344
+ [
1345
+ 141,
1346
+ 30,
1347
+ 0,
1348
+ 77,
1349
+ 0,
1350
+ "NOISE"
1351
+ ],
1352
+ [
1353
+ 142,
1354
+ 25,
1355
+ 0,
1356
+ 77,
1357
+ 1,
1358
+ "GUIDER"
1359
+ ],
1360
+ [
1361
+ 145,
1362
+ 5,
1363
+ 0,
1364
+ 77,
1365
+ 4,
1366
+ "LATENT"
1367
+ ],
1368
+ [
1369
+ 146,
1370
+ 28,
1371
+ 0,
1372
+ 71,
1373
+ 0,
1374
+ "SAMPLER"
1375
+ ],
1376
+ [
1377
+ 148,
1378
+ 77,
1379
+ 0,
1380
+ 78,
1381
+ 0,
1382
+ "LATENT"
1383
+ ],
1384
+ [
1385
+ 149,
1386
+ 78,
1387
+ 0,
1388
+ 79,
1389
+ 0,
1390
+ "IMAGE"
1391
+ ],
1392
+ [
1393
+ 150,
1394
+ 27,
1395
+ 0,
1396
+ 78,
1397
+ 1,
1398
+ "VAE"
1399
+ ],
1400
+ [
1401
+ 151,
1402
+ 28,
1403
+ 0,
1404
+ 80,
1405
+ 0,
1406
+ "SAMPLER"
1407
+ ],
1408
+ [
1409
+ 152,
1410
+ 80,
1411
+ 0,
1412
+ 26,
1413
+ 2,
1414
+ "SAMPLER"
1415
+ ],
1416
+ [
1417
+ 154,
1418
+ 27,
1419
+ 0,
1420
+ 81,
1421
+ 1,
1422
+ "VAE"
1423
+ ],
1424
+ [
1425
+ 155,
1426
+ 81,
1427
+ 0,
1428
+ 82,
1429
+ 0,
1430
+ "IMAGE"
1431
+ ],
1432
+ [
1433
+ 156,
1434
+ 30,
1435
+ 0,
1436
+ 83,
1437
+ 0,
1438
+ "NOISE"
1439
+ ],
1440
+ [
1441
+ 157,
1442
+ 25,
1443
+ 0,
1444
+ 83,
1445
+ 1,
1446
+ "GUIDER"
1447
+ ],
1448
+ [
1449
+ 160,
1450
+ 5,
1451
+ 0,
1452
+ 83,
1453
+ 4,
1454
+ "LATENT"
1455
+ ],
1456
+ [
1457
+ 162,
1458
+ 83,
1459
+ 0,
1460
+ 81,
1461
+ 0,
1462
+ "LATENT"
1463
+ ],
1464
+ [
1465
+ 163,
1466
+ 29,
1467
+ 0,
1468
+ 26,
1469
+ 3,
1470
+ "SIGMAS"
1471
+ ],
1472
+ [
1473
+ 164,
1474
+ 29,
1475
+ 0,
1476
+ 77,
1477
+ 3,
1478
+ "SIGMAS"
1479
+ ],
1480
+ [
1481
+ 165,
1482
+ 71,
1483
+ 0,
1484
+ 77,
1485
+ 2,
1486
+ "SAMPLER"
1487
+ ],
1488
+ [
1489
+ 166,
1490
+ 28,
1491
+ 0,
1492
+ 83,
1493
+ 2,
1494
+ "SAMPLER"
1495
+ ],
1496
+ [
1497
+ 194,
1498
+ 96,
1499
+ 0,
1500
+ 25,
1501
+ 0,
1502
+ "MODEL"
1503
+ ],
1504
+ [
1505
+ 195,
1506
+ 96,
1507
+ 0,
1508
+ 29,
1509
+ 0,
1510
+ "MODEL"
1511
+ ],
1512
+ [
1513
+ 196,
1514
+ 8,
1515
+ 0,
1516
+ 97,
1517
+ 0,
1518
+ "IMAGE"
1519
+ ],
1520
+ [
1521
+ 197,
1522
+ 65,
1523
+ 0,
1524
+ 97,
1525
+ 1,
1526
+ "IMAGE"
1527
+ ],
1528
+ [
1529
+ 198,
1530
+ 78,
1531
+ 0,
1532
+ 98,
1533
+ 0,
1534
+ "IMAGE"
1535
+ ],
1536
+ [
1537
+ 199,
1538
+ 65,
1539
+ 0,
1540
+ 98,
1541
+ 1,
1542
+ "IMAGE"
1543
+ ],
1544
+ [
1545
+ 200,
1546
+ 81,
1547
+ 0,
1548
+ 99,
1549
+ 0,
1550
+ "IMAGE"
1551
+ ],
1552
+ [
1553
+ 201,
1554
+ 65,
1555
+ 0,
1556
+ 99,
1557
+ 1,
1558
+ "IMAGE"
1559
+ ],
1560
+ [
1561
+ 202,
1562
+ 29,
1563
+ 0,
1564
+ 100,
1565
+ 0,
1566
+ "SIGMAS"
1567
+ ],
1568
+ [
1569
+ 205,
1570
+ 29,
1571
+ 0,
1572
+ 103,
1573
+ 0,
1574
+ "SIGMAS"
1575
+ ],
1576
+ [
1577
+ 206,
1578
+ 103,
1579
+ 0,
1580
+ 83,
1581
+ 3,
1582
+ "SIGMAS"
1583
+ ]
1584
+ ],
1585
+ "groups": [
1586
+ {
1587
+ "title": "Multiply Sigmas",
1588
+ "bounding": [
1589
+ 720,
1590
+ 937,
1591
+ 1450,
1592
+ 543
1593
+ ],
1594
+ "color": "#8A8",
1595
+ "font_size": 24,
1596
+ "flags": {}
1597
+ },
1598
+ {
1599
+ "title": "Lying Sigmas",
1600
+ "bounding": [
1601
+ 725,
1602
+ 399,
1603
+ 1445,
1604
+ 530
1605
+ ],
1606
+ "color": "#b58b2a",
1607
+ "font_size": 24,
1608
+ "flags": {}
1609
+ },
1610
+ {
1611
+ "title": "Detail Daemon",
1612
+ "bounding": [
1613
+ 722,
1614
+ -150,
1615
+ 1450,
1616
+ 539
1617
+ ],
1618
+ "color": "#3f789e",
1619
+ "font_size": 24,
1620
+ "flags": {}
1621
+ },
1622
+ {
1623
+ "title": "Default (no detailer)",
1624
+ "bounding": [
1625
+ -150,
1626
+ 925,
1627
+ 857,
1628
+ 555
1629
+ ],
1630
+ "color": "#a1309b",
1631
+ "font_size": 24,
1632
+ "flags": {}
1633
+ }
1634
+ ],
1635
+ "config": {},
1636
+ "extra": {
1637
+ "ds": {
1638
+ "scale": 0.5131581182307069,
1639
+ "offset": [
1640
+ 684.079338698325,
1641
+ 186.53831665466834
1642
+ ]
1643
+ }
1644
+ },
1645
+ "version": 0.4
1646
+ }
custom_nodes/ComfyUI-Detail-Daemon/example_workflows/Flux img2img-DetailDaemon.json ADDED
@@ -0,0 +1,848 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 63,
3
+ "last_link_id": 150,
4
+ "nodes": [
5
+ {
6
+ "id": 9,
7
+ "type": "SaveImage",
8
+ "pos": {
9
+ "0": 1790,
10
+ "1": 230
11
+ },
12
+ "size": {
13
+ "0": 367.5887451171875,
14
+ "1": 74.19313049316406
15
+ },
16
+ "flags": {},
17
+ "order": 15,
18
+ "mode": 4,
19
+ "inputs": [
20
+ {
21
+ "name": "images",
22
+ "type": "IMAGE",
23
+ "link": 134
24
+ }
25
+ ],
26
+ "outputs": [],
27
+ "properties": {},
28
+ "widgets_values": [
29
+ "ComfyUI"
30
+ ]
31
+ },
32
+ {
33
+ "id": 48,
34
+ "type": "UnetLoaderGGUF",
35
+ "pos": {
36
+ "0": 20,
37
+ "1": 90
38
+ },
39
+ "size": {
40
+ "0": 315,
41
+ "1": 58
42
+ },
43
+ "flags": {},
44
+ "order": 0,
45
+ "mode": 0,
46
+ "inputs": [],
47
+ "outputs": [
48
+ {
49
+ "name": "MODEL",
50
+ "type": "MODEL",
51
+ "links": [
52
+ 130
53
+ ],
54
+ "slot_index": 0
55
+ }
56
+ ],
57
+ "properties": {
58
+ "Node name for S&R": "UnetLoaderGGUF"
59
+ },
60
+ "widgets_values": [
61
+ "flux\\flux1-dev-Q8_0.gguf"
62
+ ]
63
+ },
64
+ {
65
+ "id": 11,
66
+ "type": "DualCLIPLoader",
67
+ "pos": {
68
+ "0": 20,
69
+ "1": 210
70
+ },
71
+ "size": {
72
+ "0": 315,
73
+ "1": 106
74
+ },
75
+ "flags": {},
76
+ "order": 1,
77
+ "mode": 0,
78
+ "inputs": [],
79
+ "outputs": [
80
+ {
81
+ "name": "CLIP",
82
+ "type": "CLIP",
83
+ "links": [
84
+ 144
85
+ ],
86
+ "slot_index": 0,
87
+ "shape": 3
88
+ }
89
+ ],
90
+ "properties": {
91
+ "Node name for S&R": "DualCLIPLoader"
92
+ },
93
+ "widgets_values": [
94
+ "ViT-L-14-BEST-smooth-GmP-TE-only-HF-format.safetensors",
95
+ "t5xxl_fp16.safetensors",
96
+ "flux"
97
+ ]
98
+ },
99
+ {
100
+ "id": 10,
101
+ "type": "VAELoader",
102
+ "pos": {
103
+ "0": 20,
104
+ "1": 370
105
+ },
106
+ "size": {
107
+ "0": 311.81634521484375,
108
+ "1": 60.429901123046875
109
+ },
110
+ "flags": {},
111
+ "order": 2,
112
+ "mode": 0,
113
+ "inputs": [],
114
+ "outputs": [
115
+ {
116
+ "name": "VAE",
117
+ "type": "VAE",
118
+ "links": [
119
+ 12,
120
+ 132
121
+ ],
122
+ "slot_index": 0,
123
+ "shape": 3
124
+ }
125
+ ],
126
+ "properties": {
127
+ "Node name for S&R": "VAELoader"
128
+ },
129
+ "widgets_values": [
130
+ "ae.safetensors"
131
+ ]
132
+ },
133
+ {
134
+ "id": 22,
135
+ "type": "BasicGuider",
136
+ "pos": {
137
+ "0": 900,
138
+ "1": 183
139
+ },
140
+ "size": {
141
+ "0": 222.3482666015625,
142
+ "1": 46
143
+ },
144
+ "flags": {},
145
+ "order": 11,
146
+ "mode": 0,
147
+ "inputs": [
148
+ {
149
+ "name": "model",
150
+ "type": "MODEL",
151
+ "link": 54,
152
+ "slot_index": 0
153
+ },
154
+ {
155
+ "name": "conditioning",
156
+ "type": "CONDITIONING",
157
+ "link": 146,
158
+ "slot_index": 1
159
+ }
160
+ ],
161
+ "outputs": [
162
+ {
163
+ "name": "GUIDER",
164
+ "type": "GUIDER",
165
+ "links": [
166
+ 30
167
+ ],
168
+ "slot_index": 0,
169
+ "shape": 3
170
+ }
171
+ ],
172
+ "properties": {
173
+ "Node name for S&R": "BasicGuider"
174
+ },
175
+ "widgets_values": []
176
+ },
177
+ {
178
+ "id": 13,
179
+ "type": "SamplerCustomAdvanced",
180
+ "pos": {
181
+ "0": 1209,
182
+ "1": 183
183
+ },
184
+ "size": {
185
+ "0": 272.3617858886719,
186
+ "1": 124.53733825683594
187
+ },
188
+ "flags": {},
189
+ "order": 13,
190
+ "mode": 0,
191
+ "inputs": [
192
+ {
193
+ "name": "noise",
194
+ "type": "NOISE",
195
+ "link": 37,
196
+ "slot_index": 0
197
+ },
198
+ {
199
+ "name": "guider",
200
+ "type": "GUIDER",
201
+ "link": 30,
202
+ "slot_index": 1
203
+ },
204
+ {
205
+ "name": "sampler",
206
+ "type": "SAMPLER",
207
+ "link": 138,
208
+ "slot_index": 2
209
+ },
210
+ {
211
+ "name": "sigmas",
212
+ "type": "SIGMAS",
213
+ "link": 20,
214
+ "slot_index": 3
215
+ },
216
+ {
217
+ "name": "latent_image",
218
+ "type": "LATENT",
219
+ "link": 133,
220
+ "slot_index": 4
221
+ }
222
+ ],
223
+ "outputs": [
224
+ {
225
+ "name": "output",
226
+ "type": "LATENT",
227
+ "links": [
228
+ 24
229
+ ],
230
+ "slot_index": 0,
231
+ "shape": 3
232
+ },
233
+ {
234
+ "name": "denoised_output",
235
+ "type": "LATENT",
236
+ "links": null,
237
+ "shape": 3
238
+ }
239
+ ],
240
+ "properties": {
241
+ "Node name for S&R": "SamplerCustomAdvanced"
242
+ },
243
+ "widgets_values": []
244
+ },
245
+ {
246
+ "id": 41,
247
+ "type": "LoadImage",
248
+ "pos": {
249
+ "0": 20,
250
+ "1": 490
251
+ },
252
+ "size": {
253
+ "0": 315,
254
+ "1": 314
255
+ },
256
+ "flags": {},
257
+ "order": 4,
258
+ "mode": 0,
259
+ "inputs": [],
260
+ "outputs": [
261
+ {
262
+ "name": "IMAGE",
263
+ "type": "IMAGE",
264
+ "links": [
265
+ 148
266
+ ],
267
+ "slot_index": 0,
268
+ "shape": 3
269
+ },
270
+ {
271
+ "name": "MASK",
272
+ "type": "MASK",
273
+ "links": null,
274
+ "shape": 3
275
+ }
276
+ ],
277
+ "properties": {
278
+ "Node name for S&R": "LoadImage"
279
+ },
280
+ "widgets_values": [
281
+ "Screenshot 2023-09-18 091517.png",
282
+ "image"
283
+ ]
284
+ },
285
+ {
286
+ "id": 62,
287
+ "type": "ImageResize+",
288
+ "pos": {
289
+ "0": 25,
290
+ "1": 858
291
+ },
292
+ "size": {
293
+ "0": 315,
294
+ "1": 218
295
+ },
296
+ "flags": {},
297
+ "order": 9,
298
+ "mode": 0,
299
+ "inputs": [
300
+ {
301
+ "name": "image",
302
+ "type": "IMAGE",
303
+ "link": 148
304
+ }
305
+ ],
306
+ "outputs": [
307
+ {
308
+ "name": "IMAGE",
309
+ "type": "IMAGE",
310
+ "links": [
311
+ 149
312
+ ],
313
+ "slot_index": 0
314
+ },
315
+ {
316
+ "name": "width",
317
+ "type": "INT",
318
+ "links": null
319
+ },
320
+ {
321
+ "name": "height",
322
+ "type": "INT",
323
+ "links": null
324
+ }
325
+ ],
326
+ "properties": {
327
+ "Node name for S&R": "ImageResize+"
328
+ },
329
+ "widgets_values": [
330
+ 1024,
331
+ 1024,
332
+ "nearest",
333
+ "keep proportion",
334
+ "always",
335
+ 0
336
+ ]
337
+ },
338
+ {
339
+ "id": 49,
340
+ "type": "VAEEncode",
341
+ "pos": {
342
+ "0": 896,
343
+ "1": 353
344
+ },
345
+ "size": {
346
+ "0": 210,
347
+ "1": 46
348
+ },
349
+ "flags": {},
350
+ "order": 12,
351
+ "mode": 0,
352
+ "inputs": [
353
+ {
354
+ "name": "pixels",
355
+ "type": "IMAGE",
356
+ "link": 149
357
+ },
358
+ {
359
+ "name": "vae",
360
+ "type": "VAE",
361
+ "link": 132
362
+ }
363
+ ],
364
+ "outputs": [
365
+ {
366
+ "name": "LATENT",
367
+ "type": "LATENT",
368
+ "links": [
369
+ 133
370
+ ],
371
+ "slot_index": 0
372
+ }
373
+ ],
374
+ "properties": {
375
+ "Node name for S&R": "VAEEncode"
376
+ },
377
+ "widgets_values": []
378
+ },
379
+ {
380
+ "id": 50,
381
+ "type": "PreviewImage",
382
+ "pos": {
383
+ "0": 1793,
384
+ "1": 359
385
+ },
386
+ "size": {
387
+ "0": 535.2194213867188,
388
+ "1": 523.0248413085938
389
+ },
390
+ "flags": {},
391
+ "order": 16,
392
+ "mode": 0,
393
+ "inputs": [
394
+ {
395
+ "name": "images",
396
+ "type": "IMAGE",
397
+ "link": 135
398
+ }
399
+ ],
400
+ "outputs": [],
401
+ "properties": {
402
+ "Node name for S&R": "PreviewImage"
403
+ },
404
+ "widgets_values": []
405
+ },
406
+ {
407
+ "id": 8,
408
+ "type": "VAEDecode",
409
+ "pos": {
410
+ "0": 1535,
411
+ "1": 259
412
+ },
413
+ "size": {
414
+ "0": 210,
415
+ "1": 46
416
+ },
417
+ "flags": {},
418
+ "order": 14,
419
+ "mode": 0,
420
+ "inputs": [
421
+ {
422
+ "name": "samples",
423
+ "type": "LATENT",
424
+ "link": 24
425
+ },
426
+ {
427
+ "name": "vae",
428
+ "type": "VAE",
429
+ "link": 12
430
+ }
431
+ ],
432
+ "outputs": [
433
+ {
434
+ "name": "IMAGE",
435
+ "type": "IMAGE",
436
+ "links": [
437
+ 134,
438
+ 135
439
+ ],
440
+ "slot_index": 0
441
+ }
442
+ ],
443
+ "properties": {
444
+ "Node name for S&R": "VAEDecode"
445
+ },
446
+ "widgets_values": []
447
+ },
448
+ {
449
+ "id": 52,
450
+ "type": "DetailDaemonSamplerNode",
451
+ "pos": {
452
+ "0": 880,
453
+ "1": 502
454
+ },
455
+ "size": {
456
+ "0": 250.63522338867188,
457
+ "1": 274
458
+ },
459
+ "flags": {},
460
+ "order": 8,
461
+ "mode": 0,
462
+ "inputs": [
463
+ {
464
+ "name": "sampler",
465
+ "type": "SAMPLER",
466
+ "link": 137
467
+ }
468
+ ],
469
+ "outputs": [
470
+ {
471
+ "name": "SAMPLER",
472
+ "type": "SAMPLER",
473
+ "links": [
474
+ 138
475
+ ],
476
+ "slot_index": 0
477
+ }
478
+ ],
479
+ "properties": {
480
+ "Node name for S&R": "DetailDaemonSamplerNode"
481
+ },
482
+ "widgets_values": [
483
+ 0.8,
484
+ 0.05,
485
+ 0.9,
486
+ 0.5,
487
+ 0.5,
488
+ 0,
489
+ 0,
490
+ 0,
491
+ true,
492
+ 0
493
+ ]
494
+ },
495
+ {
496
+ "id": 61,
497
+ "type": "CLIPTextEncodeFlux",
498
+ "pos": {
499
+ "0": 403,
500
+ "1": 92
501
+ },
502
+ "size": [
503
+ 402.8331782636767,
504
+ 333.1784071867411
505
+ ],
506
+ "flags": {},
507
+ "order": 7,
508
+ "mode": 0,
509
+ "inputs": [
510
+ {
511
+ "name": "clip",
512
+ "type": "CLIP",
513
+ "link": 144
514
+ }
515
+ ],
516
+ "outputs": [
517
+ {
518
+ "name": "CONDITIONING",
519
+ "type": "CONDITIONING",
520
+ "links": [
521
+ 146
522
+ ],
523
+ "slot_index": 0
524
+ }
525
+ ],
526
+ "properties": {
527
+ "Node name for S&R": "CLIPTextEncodeFlux"
528
+ },
529
+ "widgets_values": [
530
+ "a close-up photograph of a majestic lion resting in the savannah at dusk. The lion's golden fur shimmers under the soft, fading light of the setting sun, casting long shadows across the grasslands. Using a Canon EOS-1D X Mark III paired with a Canon EF 70-200mm f/2.8L IS III USM lens, every detail of the lion's face is crisp, from its piercing amber eyes to the intricate texture of its mane. The backdrop features a hazy orange sky with silhouettes of distant acacia trees, creating a breathtaking scene that encapsulates the wild beauty of the African savannah.",
531
+ "a close-up photograph of a majestic lion resting in the savannah at dusk. The lion's golden fur shimmers under the soft, fading light of the setting sun, casting long shadows across the grasslands. Using a Canon EOS-1D X Mark III paired with a Canon EF 70-200mm f/2.8L IS III USM lens, every detail of the lion's face is crisp, from its piercing amber eyes to the intricate texture of its mane. The backdrop features a hazy orange sky with silhouettes of distant acacia trees, creating a breathtaking scene that encapsulates the wild beauty of the African savannah.",
532
+ 3
533
+ ]
534
+ },
535
+ {
536
+ "id": 25,
537
+ "type": "RandomNoise",
538
+ "pos": {
539
+ "0": 457,
540
+ "1": 502
541
+ },
542
+ "size": [
543
+ 315,
544
+ 82
545
+ ],
546
+ "flags": {},
547
+ "order": 5,
548
+ "mode": 0,
549
+ "inputs": [],
550
+ "outputs": [
551
+ {
552
+ "name": "NOISE",
553
+ "type": "NOISE",
554
+ "links": [
555
+ 37
556
+ ],
557
+ "shape": 3
558
+ }
559
+ ],
560
+ "properties": {
561
+ "Node name for S&R": "RandomNoise"
562
+ },
563
+ "widgets_values": [
564
+ 1010815042691718,
565
+ "fixed"
566
+ ],
567
+ "color": "#2a363b",
568
+ "bgcolor": "#3f5159"
569
+ },
570
+ {
571
+ "id": 16,
572
+ "type": "KSamplerSelect",
573
+ "pos": {
574
+ "0": 460,
575
+ "1": 654
576
+ },
577
+ "size": {
578
+ "0": 315,
579
+ "1": 58
580
+ },
581
+ "flags": {},
582
+ "order": 3,
583
+ "mode": 0,
584
+ "inputs": [],
585
+ "outputs": [
586
+ {
587
+ "name": "SAMPLER",
588
+ "type": "SAMPLER",
589
+ "links": [
590
+ 137
591
+ ],
592
+ "slot_index": 0,
593
+ "shape": 3
594
+ }
595
+ ],
596
+ "properties": {
597
+ "Node name for S&R": "KSamplerSelect"
598
+ },
599
+ "widgets_values": [
600
+ "dpmpp_2m"
601
+ ]
602
+ },
603
+ {
604
+ "id": 17,
605
+ "type": "BasicScheduler",
606
+ "pos": {
607
+ "0": 455,
608
+ "1": 781
609
+ },
610
+ "size": {
611
+ "0": 315,
612
+ "1": 106
613
+ },
614
+ "flags": {},
615
+ "order": 10,
616
+ "mode": 0,
617
+ "inputs": [
618
+ {
619
+ "name": "model",
620
+ "type": "MODEL",
621
+ "link": 55,
622
+ "slot_index": 0
623
+ }
624
+ ],
625
+ "outputs": [
626
+ {
627
+ "name": "SIGMAS",
628
+ "type": "SIGMAS",
629
+ "links": [
630
+ 20
631
+ ],
632
+ "shape": 3
633
+ }
634
+ ],
635
+ "properties": {
636
+ "Node name for S&R": "BasicScheduler"
637
+ },
638
+ "widgets_values": [
639
+ "beta",
640
+ 16,
641
+ 0.8
642
+ ]
643
+ },
644
+ {
645
+ "id": 30,
646
+ "type": "ModelSamplingFlux",
647
+ "pos": {
648
+ "0": 457,
649
+ "1": 939
650
+ },
651
+ "size": {
652
+ "0": 315,
653
+ "1": 130
654
+ },
655
+ "flags": {},
656
+ "order": 6,
657
+ "mode": 0,
658
+ "inputs": [
659
+ {
660
+ "name": "model",
661
+ "type": "MODEL",
662
+ "link": 130,
663
+ "slot_index": 0
664
+ }
665
+ ],
666
+ "outputs": [
667
+ {
668
+ "name": "MODEL",
669
+ "type": "MODEL",
670
+ "links": [
671
+ 54,
672
+ 55
673
+ ],
674
+ "slot_index": 0,
675
+ "shape": 3
676
+ }
677
+ ],
678
+ "properties": {
679
+ "Node name for S&R": "ModelSamplingFlux"
680
+ },
681
+ "widgets_values": [
682
+ 1.15,
683
+ 0.5,
684
+ 1024,
685
+ 1024
686
+ ]
687
+ }
688
+ ],
689
+ "links": [
690
+ [
691
+ 12,
692
+ 10,
693
+ 0,
694
+ 8,
695
+ 1,
696
+ "VAE"
697
+ ],
698
+ [
699
+ 20,
700
+ 17,
701
+ 0,
702
+ 13,
703
+ 3,
704
+ "SIGMAS"
705
+ ],
706
+ [
707
+ 24,
708
+ 13,
709
+ 0,
710
+ 8,
711
+ 0,
712
+ "LATENT"
713
+ ],
714
+ [
715
+ 30,
716
+ 22,
717
+ 0,
718
+ 13,
719
+ 1,
720
+ "GUIDER"
721
+ ],
722
+ [
723
+ 37,
724
+ 25,
725
+ 0,
726
+ 13,
727
+ 0,
728
+ "NOISE"
729
+ ],
730
+ [
731
+ 54,
732
+ 30,
733
+ 0,
734
+ 22,
735
+ 0,
736
+ "MODEL"
737
+ ],
738
+ [
739
+ 55,
740
+ 30,
741
+ 0,
742
+ 17,
743
+ 0,
744
+ "MODEL"
745
+ ],
746
+ [
747
+ 130,
748
+ 48,
749
+ 0,
750
+ 30,
751
+ 0,
752
+ "MODEL"
753
+ ],
754
+ [
755
+ 132,
756
+ 10,
757
+ 0,
758
+ 49,
759
+ 1,
760
+ "VAE"
761
+ ],
762
+ [
763
+ 133,
764
+ 49,
765
+ 0,
766
+ 13,
767
+ 4,
768
+ "LATENT"
769
+ ],
770
+ [
771
+ 134,
772
+ 8,
773
+ 0,
774
+ 9,
775
+ 0,
776
+ "IMAGE"
777
+ ],
778
+ [
779
+ 135,
780
+ 8,
781
+ 0,
782
+ 50,
783
+ 0,
784
+ "IMAGE"
785
+ ],
786
+ [
787
+ 137,
788
+ 16,
789
+ 0,
790
+ 52,
791
+ 0,
792
+ "SAMPLER"
793
+ ],
794
+ [
795
+ 138,
796
+ 52,
797
+ 0,
798
+ 13,
799
+ 2,
800
+ "SAMPLER"
801
+ ],
802
+ [
803
+ 144,
804
+ 11,
805
+ 0,
806
+ 61,
807
+ 0,
808
+ "CLIP"
809
+ ],
810
+ [
811
+ 146,
812
+ 61,
813
+ 0,
814
+ 22,
815
+ 1,
816
+ "CONDITIONING"
817
+ ],
818
+ [
819
+ 148,
820
+ 41,
821
+ 0,
822
+ 62,
823
+ 0,
824
+ "IMAGE"
825
+ ],
826
+ [
827
+ 149,
828
+ 62,
829
+ 0,
830
+ 49,
831
+ 0,
832
+ "IMAGE"
833
+ ]
834
+ ],
835
+ "groups": [],
836
+ "config": {},
837
+ "extra": {
838
+ "ds": {
839
+ "scale": 0.5644739300537774,
840
+ "offset": [
841
+ 644.4923323021252,
842
+ 344.4655124672261
843
+ ]
844
+ },
845
+ "groupNodes": {}
846
+ },
847
+ "version": 0.4
848
+ }