Oysiyl commited on
Commit
3491fee
·
verified ·
1 Parent(s): 762fbb3

Upload 31 files

Browse files
Files changed (32) hide show
  1. .gitattributes +9 -0
  2. custom_nodes/ComfyQR/LICENSE +661 -0
  3. custom_nodes/ComfyQR/README.md +146 -0
  4. custom_nodes/ComfyQR/__init__.py +3 -0
  5. custom_nodes/ComfyQR/example_generations/main_qr_error_corrected.png +3 -0
  6. custom_nodes/ComfyQR/example_generations/main_qr_inpainted.png +3 -0
  7. custom_nodes/ComfyQR/example_generations/main_qr_unscannable.png +3 -0
  8. custom_nodes/ComfyQR/example_generations/old_main_qr_first_iteration.png +3 -0
  9. custom_nodes/ComfyQR/example_generations/unscannable_00001_.png +3 -0
  10. custom_nodes/ComfyQR/example_generations/unscannable_00001_fixed_.png +3 -0
  11. custom_nodes/ComfyQR/examples/img2img-on-errors-validated.json +2078 -0
  12. custom_nodes/ComfyQR/examples/img2img-on-errors.json +1767 -0
  13. custom_nodes/ComfyQR/examples/img2img-only.json +444 -0
  14. custom_nodes/ComfyQR/examples/module-driven-control-net.json +611 -0
  15. custom_nodes/ComfyQR/examples/noisy-latent-split-controlnet-validated.json +2864 -0
  16. custom_nodes/ComfyQR/examples/noisy-latent-split-controlnet.json +2641 -0
  17. custom_nodes/ComfyQR/examples/simple-qr-error-mask.json +427 -0
  18. custom_nodes/ComfyQR/examples/simple-qr-export.json +92 -0
  19. custom_nodes/ComfyQR/img/circle.png +0 -0
  20. custom_nodes/ComfyQR/img/for_deletion/badgers.png +3 -0
  21. custom_nodes/ComfyQR/img/for_deletion/badgers_levels_adjusted.png +3 -0
  22. custom_nodes/ComfyQR/img/gapped_square.png +0 -0
  23. custom_nodes/ComfyQR/img/horizontal-bars.png +0 -0
  24. custom_nodes/ComfyQR/img/node-mask-qr-errors.png +3 -0
  25. custom_nodes/ComfyQR/img/node-qr-code-conformed.png +0 -0
  26. custom_nodes/ComfyQR/img/node-qr-code-split.png +0 -0
  27. custom_nodes/ComfyQR/img/rounded.png +0 -0
  28. custom_nodes/ComfyQR/img/square.png +0 -0
  29. custom_nodes/ComfyQR/img/vertical-bars.png +0 -0
  30. custom_nodes/ComfyQR/pyproject.toml +15 -0
  31. custom_nodes/ComfyQR/qr_nodes.py +645 -0
  32. custom_nodes/ComfyQR/requirements.txt +1 -0
.gitattributes CHANGED
@@ -33,3 +33,12 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ custom_nodes/ComfyQR/example_generations/main_qr_error_corrected.png filter=lfs diff=lfs merge=lfs -text
37
+ custom_nodes/ComfyQR/example_generations/main_qr_inpainted.png filter=lfs diff=lfs merge=lfs -text
38
+ custom_nodes/ComfyQR/example_generations/main_qr_unscannable.png filter=lfs diff=lfs merge=lfs -text
39
+ custom_nodes/ComfyQR/example_generations/old_main_qr_first_iteration.png filter=lfs diff=lfs merge=lfs -text
40
+ custom_nodes/ComfyQR/example_generations/unscannable_00001_.png filter=lfs diff=lfs merge=lfs -text
41
+ custom_nodes/ComfyQR/example_generations/unscannable_00001_fixed_.png filter=lfs diff=lfs merge=lfs -text
42
+ custom_nodes/ComfyQR/img/for_deletion/badgers_levels_adjusted.png filter=lfs diff=lfs merge=lfs -text
43
+ custom_nodes/ComfyQR/img/for_deletion/badgers.png filter=lfs diff=lfs merge=lfs -text
44
+ custom_nodes/ComfyQR/img/node-mask-qr-errors.png filter=lfs diff=lfs merge=lfs -text
custom_nodes/ComfyQR/LICENSE ADDED
@@ -0,0 +1,661 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU AFFERO GENERAL PUBLIC LICENSE
2
+ Version 3, 19 November 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+ Preamble
9
+
10
+ The GNU Affero General Public License is a free, copyleft license for
11
+ software and other kinds of works, specifically designed to ensure
12
+ cooperation with the community in the case of network server software.
13
+
14
+ The licenses for most software and other practical works are designed
15
+ to take away your freedom to share and change the works. By contrast,
16
+ our General Public Licenses are intended to guarantee your freedom to
17
+ share and change all versions of a program--to make sure it remains free
18
+ software for all its users.
19
+
20
+ When we speak of free software, we are referring to freedom, not
21
+ price. Our General Public Licenses are designed to make sure that you
22
+ have the freedom to distribute copies of free software (and charge for
23
+ them if you wish), that you receive source code or can get it if you
24
+ want it, that you can change the software or use pieces of it in new
25
+ free programs, and that you know you can do these things.
26
+
27
+ Developers that use our General Public Licenses protect your rights
28
+ with two steps: (1) assert copyright on the software, and (2) offer
29
+ you this License which gives you legal permission to copy, distribute
30
+ and/or modify the software.
31
+
32
+ A secondary benefit of defending all users' freedom is that
33
+ improvements made in alternate versions of the program, if they
34
+ receive widespread use, become available for other developers to
35
+ incorporate. Many developers of free software are heartened and
36
+ encouraged by the resulting cooperation. However, in the case of
37
+ software used on network servers, this result may fail to come about.
38
+ The GNU General Public License permits making a modified version and
39
+ letting the public access it on a server without ever releasing its
40
+ source code to the public.
41
+
42
+ The GNU Affero General Public License is designed specifically to
43
+ ensure that, in such cases, the modified source code becomes available
44
+ to the community. It requires the operator of a network server to
45
+ provide the source code of the modified version running there to the
46
+ users of that server. Therefore, public use of a modified version, on
47
+ a publicly accessible server, gives the public access to the source
48
+ code of the modified version.
49
+
50
+ An older license, called the Affero General Public License and
51
+ published by Affero, was designed to accomplish similar goals. This is
52
+ a different license, not a version of the Affero GPL, but Affero has
53
+ released a new version of the Affero GPL which permits relicensing under
54
+ this license.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ TERMS AND CONDITIONS
60
+
61
+ 0. Definitions.
62
+
63
+ "This License" refers to version 3 of the GNU Affero General Public License.
64
+
65
+ "Copyright" also means copyright-like laws that apply to other kinds of
66
+ works, such as semiconductor masks.
67
+
68
+ "The Program" refers to any copyrightable work licensed under this
69
+ License. Each licensee is addressed as "you". "Licensees" and
70
+ "recipients" may be individuals or organizations.
71
+
72
+ To "modify" a work means to copy from or adapt all or part of the work
73
+ in a fashion requiring copyright permission, other than the making of an
74
+ exact copy. The resulting work is called a "modified version" of the
75
+ earlier work or a work "based on" the earlier work.
76
+
77
+ A "covered work" means either the unmodified Program or a work based
78
+ on the Program.
79
+
80
+ To "propagate" a work means to do anything with it that, without
81
+ permission, would make you directly or secondarily liable for
82
+ infringement under applicable copyright law, except executing it on a
83
+ computer or modifying a private copy. Propagation includes copying,
84
+ distribution (with or without modification), making available to the
85
+ public, and in some countries other activities as well.
86
+
87
+ To "convey" a work means any kind of propagation that enables other
88
+ parties to make or receive copies. Mere interaction with a user through
89
+ a computer network, with no transfer of a copy, is not conveying.
90
+
91
+ An interactive user interface displays "Appropriate Legal Notices"
92
+ to the extent that it includes a convenient and prominently visible
93
+ feature that (1) displays an appropriate copyright notice, and (2)
94
+ tells the user that there is no warranty for the work (except to the
95
+ extent that warranties are provided), that licensees may convey the
96
+ work under this License, and how to view a copy of this License. If
97
+ the interface presents a list of user commands or options, such as a
98
+ menu, a prominent item in the list meets this criterion.
99
+
100
+ 1. Source Code.
101
+
102
+ The "source code" for a work means the preferred form of the work
103
+ for making modifications to it. "Object code" means any non-source
104
+ form of a work.
105
+
106
+ A "Standard Interface" means an interface that either is an official
107
+ standard defined by a recognized standards body, or, in the case of
108
+ interfaces specified for a particular programming language, one that
109
+ is widely used among developers working in that language.
110
+
111
+ The "System Libraries" of an executable work include anything, other
112
+ than the work as a whole, that (a) is included in the normal form of
113
+ packaging a Major Component, but which is not part of that Major
114
+ Component, and (b) serves only to enable use of the work with that
115
+ Major Component, or to implement a Standard Interface for which an
116
+ implementation is available to the public in source code form. A
117
+ "Major Component", in this context, means a major essential component
118
+ (kernel, window system, and so on) of the specific operating system
119
+ (if any) on which the executable work runs, or a compiler used to
120
+ produce the work, or an object code interpreter used to run it.
121
+
122
+ The "Corresponding Source" for a work in object code form means all
123
+ the source code needed to generate, install, and (for an executable
124
+ work) run the object code and to modify the work, including scripts to
125
+ control those activities. However, it does not include the work's
126
+ System Libraries, or general-purpose tools or generally available free
127
+ programs which are used unmodified in performing those activities but
128
+ which are not part of the work. For example, Corresponding Source
129
+ includes interface definition files associated with source files for
130
+ the work, and the source code for shared libraries and dynamically
131
+ linked subprograms that the work is specifically designed to require,
132
+ such as by intimate data communication or control flow between those
133
+ subprograms and other parts of the work.
134
+
135
+ The Corresponding Source need not include anything that users
136
+ can regenerate automatically from other parts of the Corresponding
137
+ Source.
138
+
139
+ The Corresponding Source for a work in source code form is that
140
+ same work.
141
+
142
+ 2. Basic Permissions.
143
+
144
+ All rights granted under this License are granted for the term of
145
+ copyright on the Program, and are irrevocable provided the stated
146
+ conditions are met. This License explicitly affirms your unlimited
147
+ permission to run the unmodified Program. The output from running a
148
+ covered work is covered by this License only if the output, given its
149
+ content, constitutes a covered work. This License acknowledges your
150
+ rights of fair use or other equivalent, as provided by copyright law.
151
+
152
+ You may make, run and propagate covered works that you do not
153
+ convey, without conditions so long as your license otherwise remains
154
+ in force. You may convey covered works to others for the sole purpose
155
+ of having them make modifications exclusively for you, or provide you
156
+ with facilities for running those works, provided that you comply with
157
+ the terms of this License in conveying all material for which you do
158
+ not control copyright. Those thus making or running the covered works
159
+ for you must do so exclusively on your behalf, under your direction
160
+ and control, on terms that prohibit them from making any copies of
161
+ your copyrighted material outside their relationship with you.
162
+
163
+ Conveying under any other circumstances is permitted solely under
164
+ the conditions stated below. Sublicensing is not allowed; section 10
165
+ makes it unnecessary.
166
+
167
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
168
+
169
+ No covered work shall be deemed part of an effective technological
170
+ measure under any applicable law fulfilling obligations under article
171
+ 11 of the WIPO copyright treaty adopted on 20 December 1996, or
172
+ similar laws prohibiting or restricting circumvention of such
173
+ measures.
174
+
175
+ When you convey a covered work, you waive any legal power to forbid
176
+ circumvention of technological measures to the extent such circumvention
177
+ is effected by exercising rights under this License with respect to
178
+ the covered work, and you disclaim any intention to limit operation or
179
+ modification of the work as a means of enforcing, against the work's
180
+ users, your or third parties' legal rights to forbid circumvention of
181
+ technological measures.
182
+
183
+ 4. Conveying Verbatim Copies.
184
+
185
+ You may convey verbatim copies of the Program's source code as you
186
+ receive it, in any medium, provided that you conspicuously and
187
+ appropriately publish on each copy an appropriate copyright notice;
188
+ keep intact all notices stating that this License and any
189
+ non-permissive terms added in accord with section 7 apply to the code;
190
+ keep intact all notices of the absence of any warranty; and give all
191
+ recipients a copy of this License along with the Program.
192
+
193
+ You may charge any price or no price for each copy that you convey,
194
+ and you may offer support or warranty protection for a fee.
195
+
196
+ 5. Conveying Modified Source Versions.
197
+
198
+ You may convey a work based on the Program, or the modifications to
199
+ produce it from the Program, in the form of source code under the
200
+ terms of section 4, provided that you also meet all of these conditions:
201
+
202
+ a) The work must carry prominent notices stating that you modified
203
+ it, and giving a relevant date.
204
+
205
+ b) The work must carry prominent notices stating that it is
206
+ released under this License and any conditions added under section
207
+ 7. This requirement modifies the requirement in section 4 to
208
+ "keep intact all notices".
209
+
210
+ c) You must license the entire work, as a whole, under this
211
+ License to anyone who comes into possession of a copy. This
212
+ License will therefore apply, along with any applicable section 7
213
+ additional terms, to the whole of the work, and all its parts,
214
+ regardless of how they are packaged. This License gives no
215
+ permission to license the work in any other way, but it does not
216
+ invalidate such permission if you have separately received it.
217
+
218
+ d) If the work has interactive user interfaces, each must display
219
+ Appropriate Legal Notices; however, if the Program has interactive
220
+ interfaces that do not display Appropriate Legal Notices, your
221
+ work need not make them do so.
222
+
223
+ A compilation of a covered work with other separate and independent
224
+ works, which are not by their nature extensions of the covered work,
225
+ and which are not combined with it such as to form a larger program,
226
+ in or on a volume of a storage or distribution medium, is called an
227
+ "aggregate" if the compilation and its resulting copyright are not
228
+ used to limit the access or legal rights of the compilation's users
229
+ beyond what the individual works permit. Inclusion of a covered work
230
+ in an aggregate does not cause this License to apply to the other
231
+ parts of the aggregate.
232
+
233
+ 6. Conveying Non-Source Forms.
234
+
235
+ You may convey a covered work in object code form under the terms
236
+ of sections 4 and 5, provided that you also convey the
237
+ machine-readable Corresponding Source under the terms of this License,
238
+ in one of these ways:
239
+
240
+ a) Convey the object code in, or embodied in, a physical product
241
+ (including a physical distribution medium), accompanied by the
242
+ Corresponding Source fixed on a durable physical medium
243
+ customarily used for software interchange.
244
+
245
+ b) Convey the object code in, or embodied in, a physical product
246
+ (including a physical distribution medium), accompanied by a
247
+ written offer, valid for at least three years and valid for as
248
+ long as you offer spare parts or customer support for that product
249
+ model, to give anyone who possesses the object code either (1) a
250
+ copy of the Corresponding Source for all the software in the
251
+ product that is covered by this License, on a durable physical
252
+ medium customarily used for software interchange, for a price no
253
+ more than your reasonable cost of physically performing this
254
+ conveying of source, or (2) access to copy the
255
+ Corresponding Source from a network server at no charge.
256
+
257
+ c) Convey individual copies of the object code with a copy of the
258
+ written offer to provide the Corresponding Source. This
259
+ alternative is allowed only occasionally and noncommercially, and
260
+ only if you received the object code with such an offer, in accord
261
+ with subsection 6b.
262
+
263
+ d) Convey the object code by offering access from a designated
264
+ place (gratis or for a charge), and offer equivalent access to the
265
+ Corresponding Source in the same way through the same place at no
266
+ further charge. You need not require recipients to copy the
267
+ Corresponding Source along with the object code. If the place to
268
+ copy the object code is a network server, the Corresponding Source
269
+ may be on a different server (operated by you or a third party)
270
+ that supports equivalent copying facilities, provided you maintain
271
+ clear directions next to the object code saying where to find the
272
+ Corresponding Source. Regardless of what server hosts the
273
+ Corresponding Source, you remain obligated to ensure that it is
274
+ available for as long as needed to satisfy these requirements.
275
+
276
+ e) Convey the object code using peer-to-peer transmission, provided
277
+ you inform other peers where the object code and Corresponding
278
+ Source of the work are being offered to the general public at no
279
+ charge under subsection 6d.
280
+
281
+ A separable portion of the object code, whose source code is excluded
282
+ from the Corresponding Source as a System Library, need not be
283
+ included in conveying the object code work.
284
+
285
+ A "User Product" is either (1) a "consumer product", which means any
286
+ tangible personal property which is normally used for personal, family,
287
+ or household purposes, or (2) anything designed or sold for incorporation
288
+ into a dwelling. In determining whether a product is a consumer product,
289
+ doubtful cases shall be resolved in favor of coverage. For a particular
290
+ product received by a particular user, "normally used" refers to a
291
+ typical or common use of that class of product, regardless of the status
292
+ of the particular user or of the way in which the particular user
293
+ actually uses, or expects or is expected to use, the product. A product
294
+ is a consumer product regardless of whether the product has substantial
295
+ commercial, industrial or non-consumer uses, unless such uses represent
296
+ the only significant mode of use of the product.
297
+
298
+ "Installation Information" for a User Product means any methods,
299
+ procedures, authorization keys, or other information required to install
300
+ and execute modified versions of a covered work in that User Product from
301
+ a modified version of its Corresponding Source. The information must
302
+ suffice to ensure that the continued functioning of the modified object
303
+ code is in no case prevented or interfered with solely because
304
+ modification has been made.
305
+
306
+ If you convey an object code work under this section in, or with, or
307
+ specifically for use in, a User Product, and the conveying occurs as
308
+ part of a transaction in which the right of possession and use of the
309
+ User Product is transferred to the recipient in perpetuity or for a
310
+ fixed term (regardless of how the transaction is characterized), the
311
+ Corresponding Source conveyed under this section must be accompanied
312
+ by the Installation Information. But this requirement does not apply
313
+ if neither you nor any third party retains the ability to install
314
+ modified object code on the User Product (for example, the work has
315
+ been installed in ROM).
316
+
317
+ The requirement to provide Installation Information does not include a
318
+ requirement to continue to provide support service, warranty, or updates
319
+ for a work that has been modified or installed by the recipient, or for
320
+ the User Product in which it has been modified or installed. Access to a
321
+ network may be denied when the modification itself materially and
322
+ adversely affects the operation of the network or violates the rules and
323
+ protocols for communication across the network.
324
+
325
+ Corresponding Source conveyed, and Installation Information provided,
326
+ in accord with this section must be in a format that is publicly
327
+ documented (and with an implementation available to the public in
328
+ source code form), and must require no special password or key for
329
+ unpacking, reading or copying.
330
+
331
+ 7. Additional Terms.
332
+
333
+ "Additional permissions" are terms that supplement the terms of this
334
+ License by making exceptions from one or more of its conditions.
335
+ Additional permissions that are applicable to the entire Program shall
336
+ be treated as though they were included in this License, to the extent
337
+ that they are valid under applicable law. If additional permissions
338
+ apply only to part of the Program, that part may be used separately
339
+ under those permissions, but the entire Program remains governed by
340
+ this License without regard to the additional permissions.
341
+
342
+ When you convey a copy of a covered work, you may at your option
343
+ remove any additional permissions from that copy, or from any part of
344
+ it. (Additional permissions may be written to require their own
345
+ removal in certain cases when you modify the work.) You may place
346
+ additional permissions on material, added by you to a covered work,
347
+ for which you have or can give appropriate copyright permission.
348
+
349
+ Notwithstanding any other provision of this License, for material you
350
+ add to a covered work, you may (if authorized by the copyright holders of
351
+ that material) supplement the terms of this License with terms:
352
+
353
+ a) Disclaiming warranty or limiting liability differently from the
354
+ terms of sections 15 and 16 of this License; or
355
+
356
+ b) Requiring preservation of specified reasonable legal notices or
357
+ author attributions in that material or in the Appropriate Legal
358
+ Notices displayed by works containing it; or
359
+
360
+ c) Prohibiting misrepresentation of the origin of that material, or
361
+ requiring that modified versions of such material be marked in
362
+ reasonable ways as different from the original version; or
363
+
364
+ d) Limiting the use for publicity purposes of names of licensors or
365
+ authors of the material; or
366
+
367
+ e) Declining to grant rights under trademark law for use of some
368
+ trade names, trademarks, or service marks; or
369
+
370
+ f) Requiring indemnification of licensors and authors of that
371
+ material by anyone who conveys the material (or modified versions of
372
+ it) with contractual assumptions of liability to the recipient, for
373
+ any liability that these contractual assumptions directly impose on
374
+ those licensors and authors.
375
+
376
+ All other non-permissive additional terms are considered "further
377
+ restrictions" within the meaning of section 10. If the Program as you
378
+ received it, or any part of it, contains a notice stating that it is
379
+ governed by this License along with a term that is a further
380
+ restriction, you may remove that term. If a license document contains
381
+ a further restriction but permits relicensing or conveying under this
382
+ License, you may add to a covered work material governed by the terms
383
+ of that license document, provided that the further restriction does
384
+ not survive such relicensing or conveying.
385
+
386
+ If you add terms to a covered work in accord with this section, you
387
+ must place, in the relevant source files, a statement of the
388
+ additional terms that apply to those files, or a notice indicating
389
+ where to find the applicable terms.
390
+
391
+ Additional terms, permissive or non-permissive, may be stated in the
392
+ form of a separately written license, or stated as exceptions;
393
+ the above requirements apply either way.
394
+
395
+ 8. Termination.
396
+
397
+ You may not propagate or modify a covered work except as expressly
398
+ provided under this License. Any attempt otherwise to propagate or
399
+ modify it is void, and will automatically terminate your rights under
400
+ this License (including any patent licenses granted under the third
401
+ paragraph of section 11).
402
+
403
+ However, if you cease all violation of this License, then your
404
+ license from a particular copyright holder is reinstated (a)
405
+ provisionally, unless and until the copyright holder explicitly and
406
+ finally terminates your license, and (b) permanently, if the copyright
407
+ holder fails to notify you of the violation by some reasonable means
408
+ prior to 60 days after the cessation.
409
+
410
+ Moreover, your license from a particular copyright holder is
411
+ reinstated permanently if the copyright holder notifies you of the
412
+ violation by some reasonable means, this is the first time you have
413
+ received notice of violation of this License (for any work) from that
414
+ copyright holder, and you cure the violation prior to 30 days after
415
+ your receipt of the notice.
416
+
417
+ Termination of your rights under this section does not terminate the
418
+ licenses of parties who have received copies or rights from you under
419
+ this License. If your rights have been terminated and not permanently
420
+ reinstated, you do not qualify to receive new licenses for the same
421
+ material under section 10.
422
+
423
+ 9. Acceptance Not Required for Having Copies.
424
+
425
+ You are not required to accept this License in order to receive or
426
+ run a copy of the Program. Ancillary propagation of a covered work
427
+ occurring solely as a consequence of using peer-to-peer transmission
428
+ to receive a copy likewise does not require acceptance. However,
429
+ nothing other than this License grants you permission to propagate or
430
+ modify any covered work. These actions infringe copyright if you do
431
+ not accept this License. Therefore, by modifying or propagating a
432
+ covered work, you indicate your acceptance of this License to do so.
433
+
434
+ 10. Automatic Licensing of Downstream Recipients.
435
+
436
+ Each time you convey a covered work, the recipient automatically
437
+ receives a license from the original licensors, to run, modify and
438
+ propagate that work, subject to this License. You are not responsible
439
+ for enforcing compliance by third parties with this License.
440
+
441
+ An "entity transaction" is a transaction transferring control of an
442
+ organization, or substantially all assets of one, or subdividing an
443
+ organization, or merging organizations. If propagation of a covered
444
+ work results from an entity transaction, each party to that
445
+ transaction who receives a copy of the work also receives whatever
446
+ licenses to the work the party's predecessor in interest had or could
447
+ give under the previous paragraph, plus a right to possession of the
448
+ Corresponding Source of the work from the predecessor in interest, if
449
+ the predecessor has it or can get it with reasonable efforts.
450
+
451
+ You may not impose any further restrictions on the exercise of the
452
+ rights granted or affirmed under this License. For example, you may
453
+ not impose a license fee, royalty, or other charge for exercise of
454
+ rights granted under this License, and you may not initiate litigation
455
+ (including a cross-claim or counterclaim in a lawsuit) alleging that
456
+ any patent claim is infringed by making, using, selling, offering for
457
+ sale, or importing the Program or any portion of it.
458
+
459
+ 11. Patents.
460
+
461
+ A "contributor" is a copyright holder who authorizes use under this
462
+ License of the Program or a work on which the Program is based. The
463
+ work thus licensed is called the contributor's "contributor version".
464
+
465
+ A contributor's "essential patent claims" are all patent claims
466
+ owned or controlled by the contributor, whether already acquired or
467
+ hereafter acquired, that would be infringed by some manner, permitted
468
+ by this License, of making, using, or selling its contributor version,
469
+ but do not include claims that would be infringed only as a
470
+ consequence of further modification of the contributor version. For
471
+ purposes of this definition, "control" includes the right to grant
472
+ patent sublicenses in a manner consistent with the requirements of
473
+ this License.
474
+
475
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
476
+ patent license under the contributor's essential patent claims, to
477
+ make, use, sell, offer for sale, import and otherwise run, modify and
478
+ propagate the contents of its contributor version.
479
+
480
+ In the following three paragraphs, a "patent license" is any express
481
+ agreement or commitment, however denominated, not to enforce a patent
482
+ (such as an express permission to practice a patent or covenant not to
483
+ sue for patent infringement). To "grant" such a patent license to a
484
+ party means to make such an agreement or commitment not to enforce a
485
+ patent against the party.
486
+
487
+ If you convey a covered work, knowingly relying on a patent license,
488
+ and the Corresponding Source of the work is not available for anyone
489
+ to copy, free of charge and under the terms of this License, through a
490
+ publicly available network server or other readily accessible means,
491
+ then you must either (1) cause the Corresponding Source to be so
492
+ available, or (2) arrange to deprive yourself of the benefit of the
493
+ patent license for this particular work, or (3) arrange, in a manner
494
+ consistent with the requirements of this License, to extend the patent
495
+ license to downstream recipients. "Knowingly relying" means you have
496
+ actual knowledge that, but for the patent license, your conveying the
497
+ covered work in a country, or your recipient's use of the covered work
498
+ in a country, would infringe one or more identifiable patents in that
499
+ country that you have reason to believe are valid.
500
+
501
+ If, pursuant to or in connection with a single transaction or
502
+ arrangement, you convey, or propagate by procuring conveyance of, a
503
+ covered work, and grant a patent license to some of the parties
504
+ receiving the covered work authorizing them to use, propagate, modify
505
+ or convey a specific copy of the covered work, then the patent license
506
+ you grant is automatically extended to all recipients of the covered
507
+ work and works based on it.
508
+
509
+ A patent license is "discriminatory" if it does not include within
510
+ the scope of its coverage, prohibits the exercise of, or is
511
+ conditioned on the non-exercise of one or more of the rights that are
512
+ specifically granted under this License. You may not convey a covered
513
+ work if you are a party to an arrangement with a third party that is
514
+ in the business of distributing software, under which you make payment
515
+ to the third party based on the extent of your activity of conveying
516
+ the work, and under which the third party grants, to any of the
517
+ parties who would receive the covered work from you, a discriminatory
518
+ patent license (a) in connection with copies of the covered work
519
+ conveyed by you (or copies made from those copies), or (b) primarily
520
+ for and in connection with specific products or compilations that
521
+ contain the covered work, unless you entered into that arrangement,
522
+ or that patent license was granted, prior to 28 March 2007.
523
+
524
+ Nothing in this License shall be construed as excluding or limiting
525
+ any implied license or other defenses to infringement that may
526
+ otherwise be available to you under applicable patent law.
527
+
528
+ 12. No Surrender of Others' Freedom.
529
+
530
+ If conditions are imposed on you (whether by court order, agreement or
531
+ otherwise) that contradict the conditions of this License, they do not
532
+ excuse you from the conditions of this License. If you cannot convey a
533
+ covered work so as to satisfy simultaneously your obligations under this
534
+ License and any other pertinent obligations, then as a consequence you may
535
+ not convey it at all. For example, if you agree to terms that obligate you
536
+ to collect a royalty for further conveying from those to whom you convey
537
+ the Program, the only way you could satisfy both those terms and this
538
+ License would be to refrain entirely from conveying the Program.
539
+
540
+ 13. Remote Network Interaction; Use with the GNU General Public License.
541
+
542
+ Notwithstanding any other provision of this License, if you modify the
543
+ Program, your modified version must prominently offer all users
544
+ interacting with it remotely through a computer network (if your version
545
+ supports such interaction) an opportunity to receive the Corresponding
546
+ Source of your version by providing access to the Corresponding Source
547
+ from a network server at no charge, through some standard or customary
548
+ means of facilitating copying of software. This Corresponding Source
549
+ shall include the Corresponding Source for any work covered by version 3
550
+ of the GNU General Public License that is incorporated pursuant to the
551
+ following paragraph.
552
+
553
+ Notwithstanding any other provision of this License, you have
554
+ permission to link or combine any covered work with a work licensed
555
+ under version 3 of the GNU General Public License into a single
556
+ combined work, and to convey the resulting work. The terms of this
557
+ License will continue to apply to the part which is the covered work,
558
+ but the work with which it is combined will remain governed by version
559
+ 3 of the GNU General Public License.
560
+
561
+ 14. Revised Versions of this License.
562
+
563
+ The Free Software Foundation may publish revised and/or new versions of
564
+ the GNU Affero General Public License from time to time. Such new versions
565
+ will be similar in spirit to the present version, but may differ in detail to
566
+ address new problems or concerns.
567
+
568
+ Each version is given a distinguishing version number. If the
569
+ Program specifies that a certain numbered version of the GNU Affero General
570
+ Public License "or any later version" applies to it, you have the
571
+ option of following the terms and conditions either of that numbered
572
+ version or of any later version published by the Free Software
573
+ Foundation. If the Program does not specify a version number of the
574
+ GNU Affero General Public License, you may choose any version ever published
575
+ by the Free Software Foundation.
576
+
577
+ If the Program specifies that a proxy can decide which future
578
+ versions of the GNU Affero General Public License can be used, that proxy's
579
+ public statement of acceptance of a version permanently authorizes you
580
+ to choose that version for the Program.
581
+
582
+ Later license versions may give you additional or different
583
+ permissions. However, no additional obligations are imposed on any
584
+ author or copyright holder as a result of your choosing to follow a
585
+ later version.
586
+
587
+ 15. Disclaimer of Warranty.
588
+
589
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
590
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
591
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
592
+ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
593
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
594
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
595
+ IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
596
+ ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
597
+
598
+ 16. Limitation of Liability.
599
+
600
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
601
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
602
+ THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
603
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
604
+ USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
605
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
606
+ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
607
+ EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
608
+ SUCH DAMAGES.
609
+
610
+ 17. Interpretation of Sections 15 and 16.
611
+
612
+ If the disclaimer of warranty and limitation of liability provided
613
+ above cannot be given local legal effect according to their terms,
614
+ reviewing courts shall apply local law that most closely approximates
615
+ an absolute waiver of all civil liability in connection with the
616
+ Program, unless a warranty or assumption of liability accompanies a
617
+ copy of the Program in return for a fee.
618
+
619
+ END OF TERMS AND CONDITIONS
620
+
621
+ How to Apply These Terms to Your New Programs
622
+
623
+ If you develop a new program, and you want it to be of the greatest
624
+ possible use to the public, the best way to achieve this is to make it
625
+ free software which everyone can redistribute and change under these terms.
626
+
627
+ To do so, attach the following notices to the program. It is safest
628
+ to attach them to the start of each source file to most effectively
629
+ state the exclusion of warranty; and each file should have at least
630
+ the "copyright" line and a pointer to where the full notice is found.
631
+
632
+ <one line to give the program's name and a brief idea of what it does.>
633
+ Copyright (C) 2023 Corey Ryan Hanson
634
+
635
+ This program is free software: you can redistribute it and/or modify
636
+ it under the terms of the GNU Affero General Public License as published
637
+ by the Free Software Foundation, either version 3 of the License, or
638
+ (at your option) any later version.
639
+
640
+ This program is distributed in the hope that it will be useful,
641
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
642
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
643
+ GNU Affero General Public License for more details.
644
+
645
+ You should have received a copy of the GNU Affero General Public License
646
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
647
+
648
+ Also add information on how to contact you by electronic and paper mail.
649
+
650
+ If your software can interact with users remotely through a computer
651
+ network, you should also make sure that it provides a way for users to
652
+ get its source. For example, if your program is a web application, its
653
+ interface could display a "Source" link that leads users to an archive
654
+ of the code. There are many ways you could offer source, and different
655
+ solutions will be better for different programs; see section 13 for the
656
+ specific requirements.
657
+
658
+ You should also get your employer (if you work as a programmer) or school,
659
+ if any, to sign a "copyright disclaimer" for the program, if necessary.
660
+ For more information on this, and how to apply and follow the GNU AGPL, see
661
+ <https://www.gnu.org/licenses/>.
custom_nodes/ComfyQR/README.md ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ComfyQR
2
+
3
+ A set of ComfyUI nodes to dynamically create QR image layers for generative QR art without the hassle of leaving the webui.
4
+
5
+ Everything in this pack is primarily focused on the creation of patterns. While the `Mask QR Errors` does some basic statistics on the differences between pixels, a more definative node on determining scannability can be found in the companion project [ComfyQR-scanning-nodes](https://gitlab.com/sofuego-comfy-nodes/ComfyQR-scanning-nodes) which uses additional dependencies for the reading of QRs.
6
+
7
+ This repository is managed publicly on [Gitlab](https://gitlab.com/sofuego-comfy-nodes/ComfyQR), but also mirrored on [Github](https://github.com/coreyryanhanson/ComfyQR). Please submit any [issues](https://gitlab.com/sofuego-comfy-nodes/ComfyQR/-/issues) or [pull requests](https://gitlab.com/sofuego-comfy-nodes/ComfyQR/-/merge_requests) to the gitlab repo.
8
+
9
+ ![QR code with repo link](example_generations/main_qr_inpainted.png)
10
+
11
+ ## Getting started
12
+
13
+ This project currently contains two nodes for generating QR codes.
14
+
15
+ ### QR Code and QR Code (Split)
16
+
17
+ A dynamically sized QR code without any resampling scaled by the text length, the module size, and the error correction level. Use the `QR Code `for simple workflows and the `QR Code (Split)` if you want to build more advanced pipelines with additional outputs for the `MODULE_LAYER`, `FINDER_LAYER`, or `FINDER_MASK`.
18
+
19
+ ![Split QR Code Node Example](img/node-qr-code-split.png)
20
+
21
+ #### Inputs
22
+
23
+ * `protocol` - If enabled this will prefix the textbox input with a preset to represent the internet protocol. This is included both for convenience and as a workaround for the textbox clipping strings with this character combination.
24
+ * `Http` - Adds "http://" before the text.
25
+ * `Https` - Adds "https://" before the text.
26
+ * `None` - Uses only the contents of the `text` box.
27
+ * `text` - What text to build your QR code with. If `protocol` is specified, this textbox will be combined it with the selected option.
28
+ * `module_size` - The pixel width of the smallest unit of a QR code.
29
+ * `max_image_size` - The maximum size of the resulting QR code. If the combination of `text`, `module_size`, and `error_correction` create dimensions that exceed this, an error will halt the pipeline.
30
+ * `fill_hexcolor` - A string of characters representing the hex value of the QR units. Can be 3 or 6 hexadecimal characters with an optional # before.
31
+ * `back_hexcolor` - A string of characters representing the hex value of the space around the QR units. Can be 3 or 6 hexadecimal characters with an optional # before.
32
+ * `error_correction` - The level of error correction to apply.
33
+ * `Low` - 7% error correction.
34
+ * `Medium` - 15% error correction.
35
+ * `Quartile` - 25% error correction.
36
+ * `High` - 30% error correction.
37
+ * `border` - The border size (In multiples of `module` widths)
38
+ * `module_drawer` - The shape the QR code modules should be. The default is `square`, but see [Alternate Module Drawers](#alternate-module-drawers) below for new examples.
39
+
40
+ #### Outputs
41
+
42
+ * `QR_CODE` - The QR code
43
+ * `MODULE_LAYER` - The QR code with the `back_hexcolor` filling in the function patterns (to remove their influence from the early diffusion steps).
44
+ * `FINDER_LAYER` - The isolated finder patterns over the `back_hexcolor`.
45
+ * `FINDER_MASK` - A mask that isolates the locations of the 3 finder patterns.
46
+ * `QR_VERSION` - An integer of the QR version that was selected based on the text length and error correction level.
47
+ * `IMAGE_SIZE` - An integer based on the pixel width of the resulting QR code.
48
+
49
+ ### QR Code (Conformed to Image Size)
50
+
51
+ ![Conformed QR Code Node Example](img/node-qr-code-conformed.png)
52
+
53
+ A QR code fixed to specific output dimensions through image resampling.
54
+
55
+ #### Inputs
56
+
57
+ * `protocol` - If enabled this will prefix the textbox input with a preset to represent the internet protocol. This is included both for convenience and as a workaround for the textbox clipping strings with this character combination.
58
+ * `Http` - Adds "http://" before the text.
59
+ * `Https` - Adds "https://" before the text.
60
+ * `None` - Uses only the contents of the `text` box.
61
+ * `text` - What text to build your QR code with. If `protocol` is specified, this textbox will be combined it with the selected option.
62
+ * `image_size` - The pixel dimensions to conform the QR code to.
63
+ * `fill_hexcolor` - A string of characters representing the hex value of the QR units. Can be 3 or 6 hexadecimal characters with an optional # before.
64
+ * `back_hexcolor` - A string of characters representing the hex value of the space around the QR units. Can be 3 or 6 hexadecimal characters with an optional # before.
65
+ * `error_correction` - The level of error correction to apply.
66
+ * `Low` - 7% error correction.
67
+ * `Medium` - 15% error correction.
68
+ * `Quartile` - 25% error correction.
69
+ * `High` - 30% error correction.
70
+ * `border` - The border size (In multiples of `module` widths)
71
+ * `resampling` - The resampling algorithm to use when rescaling the QR code.
72
+ * `Bicubic` - Bicubic interpolation
73
+ * `Bilinear` - Bilinear interpolation
74
+ * `Box` - Box interpolation
75
+ * `Hamming` - Hamming interpolation
76
+ * `Lanczos` - Lanczos interpolation
77
+ * `Nearest` - Nearest Neighbor interpolation
78
+ * `module_drawer` - The shape the QR code modules should be. The default is `square`, but see [Alternate Module Drawers](#alternate-module-drawers) below for new examples.
79
+
80
+ #### Outputs
81
+
82
+ * `QR_CODE` - The QR code
83
+ * `QR_VERSION` - An integer of the QR version that was selected based on the text length and error correction level.
84
+
85
+ ### Mask QR Errors
86
+
87
+ A node that that will analyze the differences between a modified QR and create a mask of the estimated errors.
88
+
89
+ ![Mask QR Errors Node Example](img/node-mask-qr-errors.png)
90
+
91
+ **Note**: _This is an extremly powerful node but relies on several assumptions in order to be used._
92
+ 1. A QR with a fixed module size that has not been resampled irregularly or distorted.
93
+ 2. Shared allignment between the `source_qr` and `modified_qr`.
94
+ 3. Fill and back colors must be perfectly white and black (`#FFFFFF`, `#000000`) for the `source_qr`.
95
+ 4. The canvas can be bigger than the QR code, but on the `source_qr`, there should be no pixels the same color as the module color outside of the QR exterior.
96
+
97
+ #### Inputs
98
+
99
+ * `source_qr` - The original QR code used to generate the image (with the same placement and dimensions as `modified_qr`).
100
+ * `modified_qr` - The generated QR art to evaluate (with the same placement and dimensions as `source_qr`).
101
+ * `module_size` - The size in pixels of each QR module (the individual blocks that make up a qr code) in the provided images.
102
+ * `grayscale_method` - How to convert the RGB color channels to a single grayscale value.
103
+ * `mean` - A simple average of the RGB values.
104
+ * `luminance` - Converts colors to grayscale using a [more advanced formula](https://en.wikipedia.org/wiki/Grayscale#Colorimetric_(perceptual_luminance-preserving)_conversion_to_grayscale) to better match percieved brightness.
105
+ * `aggregate_method` - How to aggregate the many pixels that make up a QR module into a single value.
106
+ * `mean` - Within each module a simple average is taken of all constituent pixels.
107
+ * `evaluate` - Which part of the QR to examine.
108
+ * `full_qr` - The entire QR code is evaluated.
109
+ * `module_pattern` - Has the node focus only on the modules while excluding the finder pattern.
110
+ * `finder_pattern` - Ignores the modules while examining only the 3 finder patterns at the corners of the QR.
111
+ * `error_difficulty` - It is possible that while using the same reader a QR code could be easily scannable on one monitor, but not on another. The way the colors are displayed can have a major effect on unsability. By increasing this threshold, you are simulating inability to distinguish midrange pixels for both the `PERCENT_ERROR` and `QR_ERROR_MASK` outputs. It ranges from 0 to 1 where 0 only automatically fails perfect grays while 1 accepts only exactly matched modules that are perfectly black or white.
112
+ * `inverted_pattern` - If set to `True` this assumes that the QR code has inverted colors (a black background with white modules.)
113
+ * `gamma` - If using the `grayscale` method based on `luminance`, this will influence the formula by appending the gamma expansion and compression formulas before and after the color conversion. A gamma of 2.2 will use the [formula specific to srgb](qr_nodes.py#0.04045), while other gamma values will simply use the gamma amount as an exponent.
114
+
115
+ #### Outputs
116
+
117
+ * `QR_ERROR_MASK` - A mask with white areas falling on locations of modules with errors (precision set by `error_difficulty`). This mask can be used for streamlined img2img operations to salvage unscannable QRs.
118
+ * `PERCENT_ERROR` - Number of modules that do not fall into the acceptable threshold (set by `error_difficulty`) divided by the total number of modules.
119
+ * `CORRELATION` - The Pearson correlation coefficient between the QR patterns on the `source_qr` and `modified_qr`
120
+ * `RMSE` - The root mean squared error between both QR codes. In this case, a value of 0 indicates an identical match to the `source_qr`. A value of 1 indicates a perfect inversion where each expected color is the complete opposite.
121
+
122
+ ## Examples
123
+
124
+ There is an assortment of workflow examples that can be found in the `examples` directory or in the metadata of the images in the `example_generations` folder. For example taking this image.
125
+
126
+ ![Bad Scan Example](example_generations/unscannable_00001_.png)
127
+
128
+ And then aggressively increasing the strength of the ControlNet on only the error pixels to make something previously completely unscannable more reliably across different monitors and QR readers.
129
+
130
+ ![Fixed Scan Example](example_generations/unscannable_00001_fixed_.png)
131
+
132
+ Any workflow in the example that ends with "validated" (and a few image examples) assume the installation of the [scanning pack](https://gitlab.com/sofuego-comfy-nodes/ComfyQR-scanning-nodes) as well.
133
+
134
+ ## Alternate Module Drawers
135
+
136
+ The QR generation nodes now support alternate module styles. Experiment using different ones for greater flexibility during generation.
137
+
138
+ | Square | Gapped Square | Circle | Rounded | Vertical bars | Horizontal bars |
139
+ |:---: | :---: | :---: | :---: | :---: | :---: |
140
+ | ![Example QR](/img/square.png) | ![Example QR](img/gapped_square.png) | ![Example QR](img/circle.png) | ![Example QR](img/rounded.png) | ![Example QR](img/vertical-bars.png) | ![Example QR](img/horizontal-bars.png) |
141
+
142
+ **Note** _Even unaltered non square styles will inherently register small deviations from RMSE values and possible minute deviations for correlations when using the [Mask QR Errors](#mask-qr-errors) node. When information is extracted, the `source_qr` values are rounded so that they can only be 0 or 1 (to allow alternate drawers to be used as inputs) and matched against the unrounded aggregation of the `modified_qr` values._
143
+
144
+ ## Future updates
145
+
146
+ If the solution is clean enough and if it can definitively improve scannability, there may be additional plans for the seperation of alignment patterns (based on `module_size`, `border`, and `QR_VERSION`) for more advanced workflows.
custom_nodes/ComfyQR/__init__.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from .qr_nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
2
+
3
+ __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']
custom_nodes/ComfyQR/example_generations/main_qr_error_corrected.png ADDED

Git LFS Details

  • SHA256: acfff7b48dcb74878317a98bf48cf833db200500d246936cfd5f2990b6b0925a
  • Pointer size: 132 Bytes
  • Size of remote file: 1.19 MB
custom_nodes/ComfyQR/example_generations/main_qr_inpainted.png ADDED

Git LFS Details

  • SHA256: 02253a08cf7f1f8d41dbbf3bc7e11a143303ba75dcc48db262b95d8ba392f6cf
  • Pointer size: 132 Bytes
  • Size of remote file: 1.43 MB
custom_nodes/ComfyQR/example_generations/main_qr_unscannable.png ADDED

Git LFS Details

  • SHA256: 13ee8ad1b2707ff019b81bd1228df9f59143a2de983a73af2bc6e21e21322cf8
  • Pointer size: 132 Bytes
  • Size of remote file: 1.2 MB
custom_nodes/ComfyQR/example_generations/old_main_qr_first_iteration.png ADDED

Git LFS Details

  • SHA256: 1ef829b86a132a810a1e879a247e4aa175ebeea721ef54a693e6b0bf569e47a4
  • Pointer size: 131 Bytes
  • Size of remote file: 947 kB
custom_nodes/ComfyQR/example_generations/unscannable_00001_.png ADDED

Git LFS Details

  • SHA256: 2fab5ed73db31b21eb36d0a86f358222603b6e1310864fecc3cfdd1bf4cfd20b
  • Pointer size: 131 Bytes
  • Size of remote file: 929 kB
custom_nodes/ComfyQR/example_generations/unscannable_00001_fixed_.png ADDED

Git LFS Details

  • SHA256: 0e5eaef7d91379c8652010c36be76564e4d96b62036130cb3270667cda86c207
  • Pointer size: 131 Bytes
  • Size of remote file: 984 kB
custom_nodes/ComfyQR/examples/img2img-on-errors-validated.json ADDED
@@ -0,0 +1,2078 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 52,
3
+ "last_link_id": 116,
4
+ "nodes": [
5
+ {
6
+ "id": 19,
7
+ "type": "PreviewImage",
8
+ "pos": [
9
+ 1937.9218999999898,
10
+ 158.36729999999957
11
+ ],
12
+ "size": {
13
+ "0": 210,
14
+ "1": 246
15
+ },
16
+ "flags": {},
17
+ "order": 33,
18
+ "mode": 0,
19
+ "inputs": [
20
+ {
21
+ "name": "images",
22
+ "type": "IMAGE",
23
+ "link": 27
24
+ }
25
+ ],
26
+ "properties": {
27
+ "Node name for S&R": "PreviewImage"
28
+ }
29
+ },
30
+ {
31
+ "id": 20,
32
+ "type": "MaskToImage",
33
+ "pos": [
34
+ 1637.9218999999982,
35
+ 148.3672999999998
36
+ ],
37
+ "size": {
38
+ "0": 210,
39
+ "1": 26
40
+ },
41
+ "flags": {},
42
+ "order": 31,
43
+ "mode": 0,
44
+ "inputs": [
45
+ {
46
+ "name": "mask",
47
+ "type": "MASK",
48
+ "link": 113
49
+ }
50
+ ],
51
+ "outputs": [
52
+ {
53
+ "name": "IMAGE",
54
+ "type": "IMAGE",
55
+ "links": [
56
+ 27
57
+ ],
58
+ "shape": 3,
59
+ "slot_index": 0
60
+ }
61
+ ],
62
+ "properties": {
63
+ "Node name for S&R": "MaskToImage"
64
+ }
65
+ },
66
+ {
67
+ "id": 10,
68
+ "type": "CLIPTextEncode",
69
+ "pos": [
70
+ -242.0780999999985,
71
+ 498.3673000000002
72
+ ],
73
+ "size": {
74
+ "0": 400,
75
+ "1": 200
76
+ },
77
+ "flags": {},
78
+ "order": 10,
79
+ "mode": 0,
80
+ "inputs": [
81
+ {
82
+ "name": "clip",
83
+ "type": "CLIP",
84
+ "link": 8
85
+ }
86
+ ],
87
+ "outputs": [
88
+ {
89
+ "name": "CONDITIONING",
90
+ "type": "CONDITIONING",
91
+ "links": [
92
+ 10
93
+ ],
94
+ "shape": 3,
95
+ "slot_index": 0
96
+ }
97
+ ],
98
+ "title": "Positive Prompt",
99
+ "properties": {
100
+ "Node name for S&R": "CLIPTextEncode"
101
+ },
102
+ "widgets_values": [
103
+ "An evil robot inside a factory destroys paperwork by firing a laser beam with his eyes, futuristic, colorful"
104
+ ]
105
+ },
106
+ {
107
+ "id": 11,
108
+ "type": "CLIPTextEncode",
109
+ "pos": [
110
+ -242.0780999999985,
111
+ 768.3673000000036
112
+ ],
113
+ "size": {
114
+ "0": 400,
115
+ "1": 200
116
+ },
117
+ "flags": {},
118
+ "order": 11,
119
+ "mode": 0,
120
+ "inputs": [
121
+ {
122
+ "name": "clip",
123
+ "type": "CLIP",
124
+ "link": 9
125
+ }
126
+ ],
127
+ "outputs": [
128
+ {
129
+ "name": "CONDITIONING",
130
+ "type": "CONDITIONING",
131
+ "links": [
132
+ 11
133
+ ],
134
+ "shape": 3,
135
+ "slot_index": 0
136
+ }
137
+ ],
138
+ "title": "Negative Prompt",
139
+ "properties": {
140
+ "Node name for S&R": "CLIPTextEncode"
141
+ },
142
+ "widgets_values": [
143
+ "worst quality"
144
+ ]
145
+ },
146
+ {
147
+ "id": 9,
148
+ "type": "CheckpointLoaderSimple",
149
+ "pos": [
150
+ -692.0780999999998,
151
+ 748.3673000000032
152
+ ],
153
+ "size": {
154
+ "0": 315,
155
+ "1": 98
156
+ },
157
+ "flags": {},
158
+ "order": 0,
159
+ "mode": 0,
160
+ "outputs": [
161
+ {
162
+ "name": "MODEL",
163
+ "type": "MODEL",
164
+ "links": [
165
+ 16
166
+ ],
167
+ "shape": 3,
168
+ "slot_index": 0
169
+ },
170
+ {
171
+ "name": "CLIP",
172
+ "type": "CLIP",
173
+ "links": [
174
+ 8,
175
+ 9
176
+ ],
177
+ "shape": 3,
178
+ "slot_index": 1
179
+ },
180
+ {
181
+ "name": "VAE",
182
+ "type": "VAE",
183
+ "links": [
184
+ 18,
185
+ 33
186
+ ],
187
+ "shape": 3,
188
+ "slot_index": 2
189
+ }
190
+ ],
191
+ "properties": {
192
+ "Node name for S&R": "CheckpointLoaderSimple"
193
+ },
194
+ "widgets_values": [
195
+ "1.5/Deliberate-inpainting.safetensors"
196
+ ]
197
+ },
198
+ {
199
+ "id": 25,
200
+ "type": "PrimitiveNode",
201
+ "pos": [
202
+ 1037.9219000000098,
203
+ 578.3673000000001
204
+ ],
205
+ "size": {
206
+ "0": 210,
207
+ "1": 82
208
+ },
209
+ "flags": {},
210
+ "order": 1,
211
+ "mode": 0,
212
+ "outputs": [
213
+ {
214
+ "name": "INT",
215
+ "type": "INT",
216
+ "links": [
217
+ 38,
218
+ 39,
219
+ 40,
220
+ 41
221
+ ],
222
+ "slot_index": 0,
223
+ "widget": {
224
+ "name": "left"
225
+ }
226
+ }
227
+ ],
228
+ "title": "Pad",
229
+ "properties": {
230
+ "Run widget replace on values": false
231
+ },
232
+ "widgets_values": [
233
+ 40,
234
+ "fixed"
235
+ ]
236
+ },
237
+ {
238
+ "id": 28,
239
+ "type": "PrimitiveNode",
240
+ "pos": [
241
+ -783.0781000000013,
242
+ -277.6327000000003
243
+ ],
244
+ "size": {
245
+ "0": 210,
246
+ "1": 106
247
+ },
248
+ "flags": {},
249
+ "order": 2,
250
+ "mode": 0,
251
+ "outputs": [
252
+ {
253
+ "name": "COMBO",
254
+ "type": "COMBO",
255
+ "links": [
256
+ 46,
257
+ 48
258
+ ],
259
+ "slot_index": 0,
260
+ "widget": {
261
+ "name": "protocol"
262
+ }
263
+ }
264
+ ],
265
+ "title": "Protocol",
266
+ "properties": {
267
+ "Run widget replace on values": false
268
+ },
269
+ "widgets_values": [
270
+ "Https",
271
+ "fixed",
272
+ ""
273
+ ]
274
+ },
275
+ {
276
+ "id": 29,
277
+ "type": "PrimitiveNode",
278
+ "pos": [
279
+ -535.078099999998,
280
+ -266.6327000000004
281
+ ],
282
+ "size": {
283
+ "0": 210,
284
+ "1": 76
285
+ },
286
+ "flags": {},
287
+ "order": 3,
288
+ "mode": 0,
289
+ "outputs": [
290
+ {
291
+ "name": "STRING",
292
+ "type": "STRING",
293
+ "links": [
294
+ 47,
295
+ 85
296
+ ],
297
+ "slot_index": 0,
298
+ "widget": {
299
+ "name": "text"
300
+ }
301
+ }
302
+ ],
303
+ "title": "URL",
304
+ "properties": {
305
+ "Run widget replace on values": false
306
+ },
307
+ "widgets_values": [
308
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr-validation-nodes"
309
+ ]
310
+ },
311
+ {
312
+ "id": 22,
313
+ "type": "VAEEncode",
314
+ "pos": [
315
+ 208,
316
+ 231
317
+ ],
318
+ "size": {
319
+ "0": 210,
320
+ "1": 46
321
+ },
322
+ "flags": {},
323
+ "order": 15,
324
+ "mode": 0,
325
+ "inputs": [
326
+ {
327
+ "name": "pixels",
328
+ "type": "IMAGE",
329
+ "link": 87
330
+ },
331
+ {
332
+ "name": "vae",
333
+ "type": "VAE",
334
+ "link": 33
335
+ }
336
+ ],
337
+ "outputs": [
338
+ {
339
+ "name": "LATENT",
340
+ "type": "LATENT",
341
+ "links": [
342
+ 31
343
+ ],
344
+ "shape": 3,
345
+ "slot_index": 0
346
+ }
347
+ ],
348
+ "properties": {
349
+ "Node name for S&R": "VAEEncode"
350
+ }
351
+ },
352
+ {
353
+ "id": 14,
354
+ "type": "KSampler",
355
+ "pos": [
356
+ 647.9219000000045,
357
+ 458.3673000000005
358
+ ],
359
+ "size": {
360
+ "0": 315,
361
+ "1": 474
362
+ },
363
+ "flags": {},
364
+ "order": 26,
365
+ "mode": 0,
366
+ "inputs": [
367
+ {
368
+ "name": "model",
369
+ "type": "MODEL",
370
+ "link": 16
371
+ },
372
+ {
373
+ "name": "positive",
374
+ "type": "CONDITIONING",
375
+ "link": 35
376
+ },
377
+ {
378
+ "name": "negative",
379
+ "type": "CONDITIONING",
380
+ "link": 36
381
+ },
382
+ {
383
+ "name": "latent_image",
384
+ "type": "LATENT",
385
+ "link": 32
386
+ }
387
+ ],
388
+ "outputs": [
389
+ {
390
+ "name": "LATENT",
391
+ "type": "LATENT",
392
+ "links": [
393
+ 17
394
+ ],
395
+ "shape": 3,
396
+ "slot_index": 0
397
+ }
398
+ ],
399
+ "properties": {
400
+ "Node name for S&R": "KSampler"
401
+ },
402
+ "widgets_values": [
403
+ 507775986242591,
404
+ "randomize",
405
+ 25,
406
+ 8,
407
+ "euler_ancestral",
408
+ "normal",
409
+ 0.9600000000000002
410
+ ]
411
+ },
412
+ {
413
+ "id": 8,
414
+ "type": "MaskToImage",
415
+ "pos": [
416
+ 558,
417
+ -42
418
+ ],
419
+ "size": {
420
+ "0": 210,
421
+ "1": 26
422
+ },
423
+ "flags": {},
424
+ "order": 23,
425
+ "mode": 0,
426
+ "inputs": [
427
+ {
428
+ "name": "mask",
429
+ "type": "MASK",
430
+ "link": 92
431
+ }
432
+ ],
433
+ "outputs": [
434
+ {
435
+ "name": "IMAGE",
436
+ "type": "IMAGE",
437
+ "links": [
438
+ 7
439
+ ],
440
+ "shape": 3,
441
+ "slot_index": 0
442
+ }
443
+ ],
444
+ "properties": {
445
+ "Node name for S&R": "MaskToImage"
446
+ }
447
+ },
448
+ {
449
+ "id": 4,
450
+ "type": "SolidMask",
451
+ "pos": [
452
+ -970,
453
+ 294
454
+ ],
455
+ "size": {
456
+ "0": 315,
457
+ "1": 106
458
+ },
459
+ "flags": {},
460
+ "order": 13,
461
+ "mode": 0,
462
+ "inputs": [
463
+ {
464
+ "name": "width",
465
+ "type": "INT",
466
+ "link": 103,
467
+ "widget": {
468
+ "name": "width"
469
+ }
470
+ },
471
+ {
472
+ "name": "height",
473
+ "type": "INT",
474
+ "link": 104,
475
+ "widget": {
476
+ "name": "height"
477
+ }
478
+ }
479
+ ],
480
+ "outputs": [
481
+ {
482
+ "name": "MASK",
483
+ "type": "MASK",
484
+ "links": [
485
+ 1
486
+ ],
487
+ "shape": 3,
488
+ "slot_index": 0
489
+ }
490
+ ],
491
+ "title": "Mask (Gray)",
492
+ "properties": {
493
+ "Node name for S&R": "SolidMask"
494
+ },
495
+ "widgets_values": [
496
+ 0.5,
497
+ 768,
498
+ 768
499
+ ]
500
+ },
501
+ {
502
+ "id": 1,
503
+ "type": "comfy-qr-by-module-split",
504
+ "pos": [
505
+ -842.0781000000012,
506
+ -131.63269999999977
507
+ ],
508
+ "size": {
509
+ "0": 400,
510
+ "1": 344
511
+ },
512
+ "flags": {},
513
+ "order": 12,
514
+ "mode": 0,
515
+ "inputs": [
516
+ {
517
+ "name": "protocol",
518
+ "type": "COMBO",
519
+ "link": 46,
520
+ "widget": {
521
+ "name": "protocol"
522
+ }
523
+ },
524
+ {
525
+ "name": "text",
526
+ "type": "STRING",
527
+ "link": 47,
528
+ "widget": {
529
+ "name": "text"
530
+ }
531
+ }
532
+ ],
533
+ "outputs": [
534
+ {
535
+ "name": "QR_FLATTENED",
536
+ "type": "IMAGE",
537
+ "links": [
538
+ 2
539
+ ],
540
+ "shape": 3,
541
+ "slot_index": 0
542
+ },
543
+ {
544
+ "name": "MODULE_LAYER",
545
+ "type": "IMAGE",
546
+ "links": [],
547
+ "shape": 3,
548
+ "slot_index": 1
549
+ },
550
+ {
551
+ "name": "FUNCTION_LAYER",
552
+ "type": "IMAGE",
553
+ "links": [],
554
+ "shape": 3,
555
+ "slot_index": 2
556
+ },
557
+ {
558
+ "name": "FUNCTION_MASK",
559
+ "type": "MASK",
560
+ "links": [
561
+ 89
562
+ ],
563
+ "shape": 3,
564
+ "slot_index": 3
565
+ },
566
+ {
567
+ "name": "QR_VERSION",
568
+ "type": "INT",
569
+ "links": null,
570
+ "shape": 3
571
+ },
572
+ {
573
+ "name": "IMAGE_SIZE",
574
+ "type": "INT",
575
+ "links": null,
576
+ "shape": 3
577
+ }
578
+ ],
579
+ "properties": {
580
+ "Node name for S&R": "comfy-qr-by-module-split"
581
+ },
582
+ "widgets_values": [
583
+ "Https",
584
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr-validation-nodes",
585
+ 16,
586
+ 768,
587
+ "#000000",
588
+ "#FFFFFF",
589
+ "High",
590
+ 1,
591
+ "Square"
592
+ ]
593
+ },
594
+ {
595
+ "id": 21,
596
+ "type": "SetLatentNoiseMask",
597
+ "pos": [
598
+ 551,
599
+ 238
600
+ ],
601
+ "size": {
602
+ "0": 210,
603
+ "1": 46
604
+ },
605
+ "flags": {},
606
+ "order": 24,
607
+ "mode": 0,
608
+ "inputs": [
609
+ {
610
+ "name": "samples",
611
+ "type": "LATENT",
612
+ "link": 31
613
+ },
614
+ {
615
+ "name": "mask",
616
+ "type": "MASK",
617
+ "link": 93
618
+ }
619
+ ],
620
+ "outputs": [
621
+ {
622
+ "name": "LATENT",
623
+ "type": "LATENT",
624
+ "links": [
625
+ 32
626
+ ],
627
+ "shape": 3,
628
+ "slot_index": 0
629
+ }
630
+ ],
631
+ "properties": {
632
+ "Node name for S&R": "SetLatentNoiseMask"
633
+ }
634
+ },
635
+ {
636
+ "id": 24,
637
+ "type": "ImagePadForOutpaint",
638
+ "pos": [
639
+ 1011,
640
+ 779
641
+ ],
642
+ "size": {
643
+ "0": 315,
644
+ "1": 174
645
+ },
646
+ "flags": {},
647
+ "order": 28,
648
+ "mode": 0,
649
+ "inputs": [
650
+ {
651
+ "name": "image",
652
+ "type": "IMAGE",
653
+ "link": 37
654
+ },
655
+ {
656
+ "name": "left",
657
+ "type": "INT",
658
+ "link": 38,
659
+ "widget": {
660
+ "name": "left"
661
+ }
662
+ },
663
+ {
664
+ "name": "top",
665
+ "type": "INT",
666
+ "link": 39,
667
+ "widget": {
668
+ "name": "top"
669
+ }
670
+ },
671
+ {
672
+ "name": "right",
673
+ "type": "INT",
674
+ "link": 40,
675
+ "widget": {
676
+ "name": "right"
677
+ }
678
+ },
679
+ {
680
+ "name": "bottom",
681
+ "type": "INT",
682
+ "link": 41,
683
+ "widget": {
684
+ "name": "bottom"
685
+ }
686
+ }
687
+ ],
688
+ "outputs": [
689
+ {
690
+ "name": "IMAGE",
691
+ "type": "IMAGE",
692
+ "links": [
693
+ 42
694
+ ],
695
+ "shape": 3,
696
+ "slot_index": 0
697
+ },
698
+ {
699
+ "name": "MASK",
700
+ "type": "MASK",
701
+ "links": null,
702
+ "shape": 3
703
+ }
704
+ ],
705
+ "properties": {
706
+ "Node name for S&R": "ImagePadForOutpaint"
707
+ },
708
+ "widgets_values": [
709
+ 40,
710
+ 40,
711
+ 40,
712
+ 40,
713
+ 0
714
+ ]
715
+ },
716
+ {
717
+ "id": 26,
718
+ "type": "comfy-qr-read",
719
+ "pos": [
720
+ 1404,
721
+ 841
722
+ ],
723
+ "size": {
724
+ "0": 315,
725
+ "1": 58
726
+ },
727
+ "flags": {},
728
+ "order": 30,
729
+ "mode": 0,
730
+ "inputs": [
731
+ {
732
+ "name": "image",
733
+ "type": "IMAGE",
734
+ "link": 42
735
+ }
736
+ ],
737
+ "outputs": [
738
+ {
739
+ "name": "EXTRACTED_TEXT",
740
+ "type": "STRING",
741
+ "links": [
742
+ 45
743
+ ],
744
+ "shape": 3,
745
+ "slot_index": 0
746
+ }
747
+ ],
748
+ "properties": {
749
+ "Node name for S&R": "comfy-qr-read"
750
+ },
751
+ "widgets_values": [
752
+ "pyzbar"
753
+ ]
754
+ },
755
+ {
756
+ "id": 13,
757
+ "type": "ControlNetApplyAdvanced",
758
+ "pos": [
759
+ 247.9219000000045,
760
+ 508.36730000000017
761
+ ],
762
+ "size": {
763
+ "0": 315,
764
+ "1": 166
765
+ },
766
+ "flags": {},
767
+ "order": 20,
768
+ "mode": 0,
769
+ "inputs": [
770
+ {
771
+ "name": "positive",
772
+ "type": "CONDITIONING",
773
+ "link": 10
774
+ },
775
+ {
776
+ "name": "negative",
777
+ "type": "CONDITIONING",
778
+ "link": 11
779
+ },
780
+ {
781
+ "name": "control_net",
782
+ "type": "CONTROL_NET",
783
+ "link": 13
784
+ },
785
+ {
786
+ "name": "image",
787
+ "type": "IMAGE",
788
+ "link": 12
789
+ }
790
+ ],
791
+ "outputs": [
792
+ {
793
+ "name": "positive",
794
+ "type": "CONDITIONING",
795
+ "links": [
796
+ 35
797
+ ],
798
+ "shape": 3,
799
+ "slot_index": 0
800
+ },
801
+ {
802
+ "name": "negative",
803
+ "type": "CONDITIONING",
804
+ "links": [
805
+ 36
806
+ ],
807
+ "shape": 3,
808
+ "slot_index": 1
809
+ }
810
+ ],
811
+ "properties": {
812
+ "Node name for S&R": "ControlNetApplyAdvanced"
813
+ },
814
+ "widgets_values": [
815
+ 5,
816
+ 0,
817
+ 1
818
+ ]
819
+ },
820
+ {
821
+ "id": 5,
822
+ "type": "MaskToImage",
823
+ "pos": [
824
+ -592,
825
+ 305
826
+ ],
827
+ "size": {
828
+ "0": 210,
829
+ "1": 26
830
+ },
831
+ "flags": {},
832
+ "order": 16,
833
+ "mode": 0,
834
+ "inputs": [
835
+ {
836
+ "name": "mask",
837
+ "type": "MASK",
838
+ "link": 1
839
+ }
840
+ ],
841
+ "outputs": [
842
+ {
843
+ "name": "IMAGE",
844
+ "type": "IMAGE",
845
+ "links": [
846
+ 3
847
+ ],
848
+ "shape": 3,
849
+ "slot_index": 0
850
+ }
851
+ ],
852
+ "properties": {
853
+ "Node name for S&R": "MaskToImage"
854
+ }
855
+ },
856
+ {
857
+ "id": 27,
858
+ "type": "comfy-qr-validate",
859
+ "pos": [
860
+ 1357,
861
+ 494
862
+ ],
863
+ "size": {
864
+ "0": 400,
865
+ "1": 200
866
+ },
867
+ "flags": {},
868
+ "order": 32,
869
+ "mode": 0,
870
+ "inputs": [
871
+ {
872
+ "name": "image",
873
+ "type": "IMAGE",
874
+ "link": 44
875
+ },
876
+ {
877
+ "name": "extracted_text",
878
+ "type": "STRING",
879
+ "link": 45
880
+ },
881
+ {
882
+ "name": "protocol",
883
+ "type": "COMBO",
884
+ "link": 48,
885
+ "widget": {
886
+ "name": "protocol"
887
+ }
888
+ },
889
+ {
890
+ "name": "text",
891
+ "type": "STRING",
892
+ "link": 85,
893
+ "widget": {
894
+ "name": "text"
895
+ }
896
+ }
897
+ ],
898
+ "outputs": [
899
+ {
900
+ "name": "IMAGE",
901
+ "type": "IMAGE",
902
+ "links": [
903
+ 43
904
+ ],
905
+ "shape": 3,
906
+ "slot_index": 0
907
+ },
908
+ {
909
+ "name": "VALIDATION_CODE",
910
+ "type": "INT",
911
+ "links": null,
912
+ "shape": 3
913
+ }
914
+ ],
915
+ "properties": {
916
+ "Node name for S&R": "comfy-qr-validate"
917
+ },
918
+ "widgets_values": [
919
+ "Https",
920
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr-validation-nodes",
921
+ "false",
922
+ "False"
923
+ ]
924
+ },
925
+ {
926
+ "id": 23,
927
+ "type": "SaveImage",
928
+ "pos": [
929
+ 1841,
930
+ 506
931
+ ],
932
+ "size": {
933
+ "0": 315,
934
+ "1": 270
935
+ },
936
+ "flags": {},
937
+ "order": 34,
938
+ "mode": 0,
939
+ "inputs": [
940
+ {
941
+ "name": "images",
942
+ "type": "IMAGE",
943
+ "link": 43
944
+ }
945
+ ],
946
+ "properties": {},
947
+ "widgets_values": [
948
+ "ComfyUI"
949
+ ]
950
+ },
951
+ {
952
+ "id": 47,
953
+ "type": "PrimitiveNode",
954
+ "pos": [
955
+ -1252,
956
+ 425
957
+ ],
958
+ "size": {
959
+ "0": 210,
960
+ "1": 82
961
+ },
962
+ "flags": {},
963
+ "order": 4,
964
+ "mode": 0,
965
+ "outputs": [
966
+ {
967
+ "name": "INT",
968
+ "type": "INT",
969
+ "links": [
970
+ 104,
971
+ 106
972
+ ],
973
+ "slot_index": 0,
974
+ "widget": {
975
+ "name": "height"
976
+ }
977
+ }
978
+ ],
979
+ "title": "Height",
980
+ "properties": {
981
+ "Run widget replace on values": false
982
+ },
983
+ "widgets_values": [
984
+ 768,
985
+ "fixed"
986
+ ]
987
+ },
988
+ {
989
+ "id": 46,
990
+ "type": "PrimitiveNode",
991
+ "pos": [
992
+ -1250,
993
+ 278
994
+ ],
995
+ "size": {
996
+ "0": 210,
997
+ "1": 82
998
+ },
999
+ "flags": {},
1000
+ "order": 5,
1001
+ "mode": 0,
1002
+ "outputs": [
1003
+ {
1004
+ "name": "INT",
1005
+ "type": "INT",
1006
+ "links": [
1007
+ 103,
1008
+ 105
1009
+ ],
1010
+ "slot_index": 0,
1011
+ "widget": {
1012
+ "name": "width"
1013
+ }
1014
+ }
1015
+ ],
1016
+ "title": "Width",
1017
+ "properties": {
1018
+ "Run widget replace on values": false
1019
+ },
1020
+ "widgets_values": [
1021
+ 768,
1022
+ "fixed"
1023
+ ]
1024
+ },
1025
+ {
1026
+ "id": 49,
1027
+ "type": "PrimitiveNode",
1028
+ "pos": [
1029
+ -1149,
1030
+ -41
1031
+ ],
1032
+ "size": {
1033
+ "0": 210,
1034
+ "1": 82
1035
+ },
1036
+ "flags": {},
1037
+ "order": 6,
1038
+ "mode": 0,
1039
+ "outputs": [
1040
+ {
1041
+ "name": "INT",
1042
+ "type": "INT",
1043
+ "links": [
1044
+ 107,
1045
+ 109
1046
+ ],
1047
+ "slot_index": 0,
1048
+ "widget": {
1049
+ "name": "x"
1050
+ }
1051
+ }
1052
+ ],
1053
+ "title": "X Offset",
1054
+ "properties": {
1055
+ "Run widget replace on values": false
1056
+ },
1057
+ "widgets_values": [
1058
+ 16,
1059
+ "fixed"
1060
+ ]
1061
+ },
1062
+ {
1063
+ "id": 50,
1064
+ "type": "PrimitiveNode",
1065
+ "pos": [
1066
+ -1146,
1067
+ 94
1068
+ ],
1069
+ "size": {
1070
+ "0": 210,
1071
+ "1": 82
1072
+ },
1073
+ "flags": {},
1074
+ "order": 7,
1075
+ "mode": 0,
1076
+ "outputs": [
1077
+ {
1078
+ "name": "INT",
1079
+ "type": "INT",
1080
+ "links": [
1081
+ 108,
1082
+ 110
1083
+ ],
1084
+ "slot_index": 0,
1085
+ "widget": {
1086
+ "name": "y"
1087
+ }
1088
+ }
1089
+ ],
1090
+ "title": "Y Offset",
1091
+ "properties": {
1092
+ "Run widget replace on values": false
1093
+ },
1094
+ "widgets_values": [
1095
+ 16,
1096
+ "fixed"
1097
+ ]
1098
+ },
1099
+ {
1100
+ "id": 37,
1101
+ "type": "SolidMask",
1102
+ "pos": [
1103
+ -994,
1104
+ 455
1105
+ ],
1106
+ "size": {
1107
+ "0": 315,
1108
+ "1": 106
1109
+ },
1110
+ "flags": {},
1111
+ "order": 14,
1112
+ "mode": 0,
1113
+ "inputs": [
1114
+ {
1115
+ "name": "width",
1116
+ "type": "INT",
1117
+ "link": 105,
1118
+ "widget": {
1119
+ "name": "width"
1120
+ }
1121
+ },
1122
+ {
1123
+ "name": "height",
1124
+ "type": "INT",
1125
+ "link": 106,
1126
+ "widget": {
1127
+ "name": "height"
1128
+ }
1129
+ }
1130
+ ],
1131
+ "outputs": [
1132
+ {
1133
+ "name": "MASK",
1134
+ "type": "MASK",
1135
+ "links": [
1136
+ 88
1137
+ ],
1138
+ "shape": 3,
1139
+ "slot_index": 0
1140
+ }
1141
+ ],
1142
+ "title": "Mask (Black)",
1143
+ "properties": {
1144
+ "Node name for S&R": "SolidMask"
1145
+ },
1146
+ "widgets_values": [
1147
+ 0,
1148
+ 768,
1149
+ 768
1150
+ ]
1151
+ },
1152
+ {
1153
+ "id": 38,
1154
+ "type": "MaskComposite",
1155
+ "pos": [
1156
+ -635,
1157
+ 413
1158
+ ],
1159
+ "size": {
1160
+ "0": 315,
1161
+ "1": 126
1162
+ },
1163
+ "flags": {},
1164
+ "order": 17,
1165
+ "mode": 0,
1166
+ "inputs": [
1167
+ {
1168
+ "name": "destination",
1169
+ "type": "MASK",
1170
+ "link": 88
1171
+ },
1172
+ {
1173
+ "name": "source",
1174
+ "type": "MASK",
1175
+ "link": 89
1176
+ },
1177
+ {
1178
+ "name": "x",
1179
+ "type": "INT",
1180
+ "link": 109,
1181
+ "widget": {
1182
+ "name": "x"
1183
+ }
1184
+ },
1185
+ {
1186
+ "name": "y",
1187
+ "type": "INT",
1188
+ "link": 110,
1189
+ "widget": {
1190
+ "name": "y"
1191
+ }
1192
+ }
1193
+ ],
1194
+ "outputs": [
1195
+ {
1196
+ "name": "MASK",
1197
+ "type": "MASK",
1198
+ "links": [
1199
+ 101
1200
+ ],
1201
+ "shape": 3,
1202
+ "slot_index": 0
1203
+ }
1204
+ ],
1205
+ "title": "Function Mask Expanded",
1206
+ "properties": {
1207
+ "Node name for S&R": "MaskComposite"
1208
+ },
1209
+ "widgets_values": [
1210
+ 16,
1211
+ 16,
1212
+ "add"
1213
+ ]
1214
+ },
1215
+ {
1216
+ "id": 45,
1217
+ "type": "GrowMask",
1218
+ "pos": [
1219
+ 150,
1220
+ 353
1221
+ ],
1222
+ "size": {
1223
+ "0": 315,
1224
+ "1": 82
1225
+ },
1226
+ "flags": {},
1227
+ "order": 19,
1228
+ "mode": 0,
1229
+ "inputs": [
1230
+ {
1231
+ "name": "mask",
1232
+ "type": "MASK",
1233
+ "link": 101
1234
+ }
1235
+ ],
1236
+ "outputs": [
1237
+ {
1238
+ "name": "MASK",
1239
+ "type": "MASK",
1240
+ "links": [
1241
+ 102
1242
+ ],
1243
+ "shape": 3,
1244
+ "slot_index": 0
1245
+ }
1246
+ ],
1247
+ "properties": {
1248
+ "Node name for S&R": "GrowMask"
1249
+ },
1250
+ "widgets_values": [
1251
+ 16,
1252
+ false
1253
+ ]
1254
+ },
1255
+ {
1256
+ "id": 7,
1257
+ "type": "PreviewImage",
1258
+ "pos": [
1259
+ 881,
1260
+ 17
1261
+ ],
1262
+ "size": {
1263
+ "0": 210,
1264
+ "1": 246
1265
+ },
1266
+ "flags": {},
1267
+ "order": 25,
1268
+ "mode": 0,
1269
+ "inputs": [
1270
+ {
1271
+ "name": "images",
1272
+ "type": "IMAGE",
1273
+ "link": 7
1274
+ }
1275
+ ],
1276
+ "properties": {
1277
+ "Node name for S&R": "PreviewImage"
1278
+ }
1279
+ },
1280
+ {
1281
+ "id": 17,
1282
+ "type": "VAEDecode",
1283
+ "pos": [
1284
+ 1039,
1285
+ 464
1286
+ ],
1287
+ "size": {
1288
+ "0": 210,
1289
+ "1": 46
1290
+ },
1291
+ "flags": {},
1292
+ "order": 27,
1293
+ "mode": 0,
1294
+ "inputs": [
1295
+ {
1296
+ "name": "samples",
1297
+ "type": "LATENT",
1298
+ "link": 17
1299
+ },
1300
+ {
1301
+ "name": "vae",
1302
+ "type": "VAE",
1303
+ "link": 18
1304
+ }
1305
+ ],
1306
+ "outputs": [
1307
+ {
1308
+ "name": "IMAGE",
1309
+ "type": "IMAGE",
1310
+ "links": [
1311
+ 37,
1312
+ 44,
1313
+ 112
1314
+ ],
1315
+ "shape": 3,
1316
+ "slot_index": 0
1317
+ }
1318
+ ],
1319
+ "properties": {
1320
+ "Node name for S&R": "VAEDecode"
1321
+ }
1322
+ },
1323
+ {
1324
+ "id": 51,
1325
+ "type": "comfy-qr-mask_errors",
1326
+ "pos": [
1327
+ 1194,
1328
+ 15
1329
+ ],
1330
+ "size": {
1331
+ "0": 317.4000244140625,
1332
+ "1": 262
1333
+ },
1334
+ "flags": {},
1335
+ "order": 29,
1336
+ "mode": 0,
1337
+ "inputs": [
1338
+ {
1339
+ "name": "source_qr",
1340
+ "type": "IMAGE",
1341
+ "link": 111
1342
+ },
1343
+ {
1344
+ "name": "modified_qr",
1345
+ "type": "IMAGE",
1346
+ "link": 112
1347
+ }
1348
+ ],
1349
+ "outputs": [
1350
+ {
1351
+ "name": "QR_ERROR_MASK",
1352
+ "type": "MASK",
1353
+ "links": [
1354
+ 113
1355
+ ],
1356
+ "shape": 3,
1357
+ "slot_index": 0
1358
+ },
1359
+ {
1360
+ "name": "PERCENT_ERROR",
1361
+ "type": "FLOAT",
1362
+ "links": null,
1363
+ "shape": 3
1364
+ },
1365
+ {
1366
+ "name": "CORRELATION",
1367
+ "type": "FLOAT",
1368
+ "links": null,
1369
+ "shape": 3
1370
+ },
1371
+ {
1372
+ "name": "RMSE",
1373
+ "type": "FLOAT",
1374
+ "links": null,
1375
+ "shape": 3
1376
+ }
1377
+ ],
1378
+ "properties": {
1379
+ "Node name for S&R": "comfy-qr-mask_errors"
1380
+ },
1381
+ "widgets_values": [
1382
+ 16,
1383
+ "luminance",
1384
+ "mean",
1385
+ "module_pattern",
1386
+ 0,
1387
+ false,
1388
+ 2.2
1389
+ ]
1390
+ },
1391
+ {
1392
+ "id": 12,
1393
+ "type": "ControlNetLoader",
1394
+ "pos": [
1395
+ -692.0780999999998,
1396
+ 618.3673000000019
1397
+ ],
1398
+ "size": {
1399
+ "0": 315,
1400
+ "1": 58
1401
+ },
1402
+ "flags": {},
1403
+ "order": 8,
1404
+ "mode": 0,
1405
+ "outputs": [
1406
+ {
1407
+ "name": "CONTROL_NET",
1408
+ "type": "CONTROL_NET",
1409
+ "links": [
1410
+ 13
1411
+ ],
1412
+ "shape": 3,
1413
+ "slot_index": 0
1414
+ }
1415
+ ],
1416
+ "properties": {
1417
+ "Node name for S&R": "ControlNetLoader"
1418
+ },
1419
+ "widgets_values": [
1420
+ "1.5/control_v1p_sd15_qrcode_monster_v2.safetensors"
1421
+ ]
1422
+ },
1423
+ {
1424
+ "id": 39,
1425
+ "type": "MaskComposite",
1426
+ "pos": [
1427
+ 484,
1428
+ 51
1429
+ ],
1430
+ "size": {
1431
+ "0": 315,
1432
+ "1": 126
1433
+ },
1434
+ "flags": {},
1435
+ "order": 22,
1436
+ "mode": 0,
1437
+ "inputs": [
1438
+ {
1439
+ "name": "destination",
1440
+ "type": "MASK",
1441
+ "link": 116
1442
+ },
1443
+ {
1444
+ "name": "source",
1445
+ "type": "MASK",
1446
+ "link": 102
1447
+ }
1448
+ ],
1449
+ "outputs": [
1450
+ {
1451
+ "name": "MASK",
1452
+ "type": "MASK",
1453
+ "links": [
1454
+ 92,
1455
+ 93
1456
+ ],
1457
+ "shape": 3,
1458
+ "slot_index": 0
1459
+ }
1460
+ ],
1461
+ "properties": {
1462
+ "Node name for S&R": "MaskComposite"
1463
+ },
1464
+ "widgets_values": [
1465
+ 0,
1466
+ 0,
1467
+ "add"
1468
+ ]
1469
+ },
1470
+ {
1471
+ "id": 6,
1472
+ "type": "ImageCompositeMasked",
1473
+ "pos": [
1474
+ -332.0780999999991,
1475
+ -91.63270000000001
1476
+ ],
1477
+ "size": {
1478
+ "0": 315,
1479
+ "1": 146
1480
+ },
1481
+ "flags": {},
1482
+ "order": 18,
1483
+ "mode": 0,
1484
+ "inputs": [
1485
+ {
1486
+ "name": "destination",
1487
+ "type": "IMAGE",
1488
+ "link": 3
1489
+ },
1490
+ {
1491
+ "name": "source",
1492
+ "type": "IMAGE",
1493
+ "link": 2
1494
+ },
1495
+ {
1496
+ "name": "mask",
1497
+ "type": "MASK",
1498
+ "link": null
1499
+ },
1500
+ {
1501
+ "name": "x",
1502
+ "type": "INT",
1503
+ "link": 107,
1504
+ "widget": {
1505
+ "name": "x"
1506
+ }
1507
+ },
1508
+ {
1509
+ "name": "y",
1510
+ "type": "INT",
1511
+ "link": 108,
1512
+ "widget": {
1513
+ "name": "y"
1514
+ }
1515
+ }
1516
+ ],
1517
+ "outputs": [
1518
+ {
1519
+ "name": "IMAGE",
1520
+ "type": "IMAGE",
1521
+ "links": [
1522
+ 12,
1523
+ 111,
1524
+ 114
1525
+ ],
1526
+ "shape": 3,
1527
+ "slot_index": 0
1528
+ }
1529
+ ],
1530
+ "properties": {
1531
+ "Node name for S&R": "ImageCompositeMasked"
1532
+ },
1533
+ "widgets_values": [
1534
+ 16,
1535
+ 16,
1536
+ false
1537
+ ]
1538
+ },
1539
+ {
1540
+ "id": 2,
1541
+ "type": "LoadImage",
1542
+ "pos": [
1543
+ -288,
1544
+ 115
1545
+ ],
1546
+ "size": {
1547
+ "0": 315,
1548
+ "1": 314.0000305175781
1549
+ },
1550
+ "flags": {},
1551
+ "order": 9,
1552
+ "mode": 0,
1553
+ "outputs": [
1554
+ {
1555
+ "name": "IMAGE",
1556
+ "type": "IMAGE",
1557
+ "links": [
1558
+ 87,
1559
+ 115
1560
+ ],
1561
+ "shape": 3,
1562
+ "slot_index": 0
1563
+ },
1564
+ {
1565
+ "name": "MASK",
1566
+ "type": "MASK",
1567
+ "links": null,
1568
+ "shape": 3
1569
+ }
1570
+ ],
1571
+ "properties": {
1572
+ "Node name for S&R": "LoadImage"
1573
+ },
1574
+ "widgets_values": [
1575
+ "unscannable_00001_ (1).png",
1576
+ "image"
1577
+ ]
1578
+ },
1579
+ {
1580
+ "id": 52,
1581
+ "type": "comfy-qr-mask_errors",
1582
+ "pos": [
1583
+ 86,
1584
+ -181
1585
+ ],
1586
+ "size": {
1587
+ "0": 317.4000244140625,
1588
+ "1": 262
1589
+ },
1590
+ "flags": {},
1591
+ "order": 21,
1592
+ "mode": 0,
1593
+ "inputs": [
1594
+ {
1595
+ "name": "source_qr",
1596
+ "type": "IMAGE",
1597
+ "link": 114
1598
+ },
1599
+ {
1600
+ "name": "modified_qr",
1601
+ "type": "IMAGE",
1602
+ "link": 115
1603
+ }
1604
+ ],
1605
+ "outputs": [
1606
+ {
1607
+ "name": "QR_ERROR_MASK",
1608
+ "type": "MASK",
1609
+ "links": [
1610
+ 116
1611
+ ],
1612
+ "shape": 3,
1613
+ "slot_index": 0
1614
+ },
1615
+ {
1616
+ "name": "PERCENT_ERROR",
1617
+ "type": "FLOAT",
1618
+ "links": null,
1619
+ "shape": 6
1620
+ },
1621
+ {
1622
+ "name": "CORRELATION",
1623
+ "type": "FLOAT",
1624
+ "links": null,
1625
+ "shape": 6
1626
+ },
1627
+ {
1628
+ "name": "RMSE",
1629
+ "type": "FLOAT",
1630
+ "links": null,
1631
+ "shape": 6
1632
+ }
1633
+ ],
1634
+ "properties": {
1635
+ "Node name for S&R": "comfy-qr-mask_errors"
1636
+ },
1637
+ "widgets_values": [
1638
+ 16,
1639
+ "mean",
1640
+ "mean",
1641
+ "module_pattern",
1642
+ 0.5,
1643
+ false,
1644
+ 2.2
1645
+ ]
1646
+ }
1647
+ ],
1648
+ "links": [
1649
+ [
1650
+ 1,
1651
+ 4,
1652
+ 0,
1653
+ 5,
1654
+ 0,
1655
+ "MASK"
1656
+ ],
1657
+ [
1658
+ 2,
1659
+ 1,
1660
+ 0,
1661
+ 6,
1662
+ 1,
1663
+ "IMAGE"
1664
+ ],
1665
+ [
1666
+ 3,
1667
+ 5,
1668
+ 0,
1669
+ 6,
1670
+ 0,
1671
+ "IMAGE"
1672
+ ],
1673
+ [
1674
+ 7,
1675
+ 8,
1676
+ 0,
1677
+ 7,
1678
+ 0,
1679
+ "IMAGE"
1680
+ ],
1681
+ [
1682
+ 8,
1683
+ 9,
1684
+ 1,
1685
+ 10,
1686
+ 0,
1687
+ "CLIP"
1688
+ ],
1689
+ [
1690
+ 9,
1691
+ 9,
1692
+ 1,
1693
+ 11,
1694
+ 0,
1695
+ "CLIP"
1696
+ ],
1697
+ [
1698
+ 10,
1699
+ 10,
1700
+ 0,
1701
+ 13,
1702
+ 0,
1703
+ "CONDITIONING"
1704
+ ],
1705
+ [
1706
+ 11,
1707
+ 11,
1708
+ 0,
1709
+ 13,
1710
+ 1,
1711
+ "CONDITIONING"
1712
+ ],
1713
+ [
1714
+ 12,
1715
+ 6,
1716
+ 0,
1717
+ 13,
1718
+ 3,
1719
+ "IMAGE"
1720
+ ],
1721
+ [
1722
+ 13,
1723
+ 12,
1724
+ 0,
1725
+ 13,
1726
+ 2,
1727
+ "CONTROL_NET"
1728
+ ],
1729
+ [
1730
+ 16,
1731
+ 9,
1732
+ 0,
1733
+ 14,
1734
+ 0,
1735
+ "MODEL"
1736
+ ],
1737
+ [
1738
+ 17,
1739
+ 14,
1740
+ 0,
1741
+ 17,
1742
+ 0,
1743
+ "LATENT"
1744
+ ],
1745
+ [
1746
+ 18,
1747
+ 9,
1748
+ 2,
1749
+ 17,
1750
+ 1,
1751
+ "VAE"
1752
+ ],
1753
+ [
1754
+ 27,
1755
+ 20,
1756
+ 0,
1757
+ 19,
1758
+ 0,
1759
+ "IMAGE"
1760
+ ],
1761
+ [
1762
+ 31,
1763
+ 22,
1764
+ 0,
1765
+ 21,
1766
+ 0,
1767
+ "LATENT"
1768
+ ],
1769
+ [
1770
+ 32,
1771
+ 21,
1772
+ 0,
1773
+ 14,
1774
+ 3,
1775
+ "LATENT"
1776
+ ],
1777
+ [
1778
+ 33,
1779
+ 9,
1780
+ 2,
1781
+ 22,
1782
+ 1,
1783
+ "VAE"
1784
+ ],
1785
+ [
1786
+ 35,
1787
+ 13,
1788
+ 0,
1789
+ 14,
1790
+ 1,
1791
+ "CONDITIONING"
1792
+ ],
1793
+ [
1794
+ 36,
1795
+ 13,
1796
+ 1,
1797
+ 14,
1798
+ 2,
1799
+ "CONDITIONING"
1800
+ ],
1801
+ [
1802
+ 37,
1803
+ 17,
1804
+ 0,
1805
+ 24,
1806
+ 0,
1807
+ "IMAGE"
1808
+ ],
1809
+ [
1810
+ 38,
1811
+ 25,
1812
+ 0,
1813
+ 24,
1814
+ 1,
1815
+ "INT"
1816
+ ],
1817
+ [
1818
+ 39,
1819
+ 25,
1820
+ 0,
1821
+ 24,
1822
+ 2,
1823
+ "INT"
1824
+ ],
1825
+ [
1826
+ 40,
1827
+ 25,
1828
+ 0,
1829
+ 24,
1830
+ 3,
1831
+ "INT"
1832
+ ],
1833
+ [
1834
+ 41,
1835
+ 25,
1836
+ 0,
1837
+ 24,
1838
+ 4,
1839
+ "INT"
1840
+ ],
1841
+ [
1842
+ 42,
1843
+ 24,
1844
+ 0,
1845
+ 26,
1846
+ 0,
1847
+ "IMAGE"
1848
+ ],
1849
+ [
1850
+ 43,
1851
+ 27,
1852
+ 0,
1853
+ 23,
1854
+ 0,
1855
+ "IMAGE"
1856
+ ],
1857
+ [
1858
+ 44,
1859
+ 17,
1860
+ 0,
1861
+ 27,
1862
+ 0,
1863
+ "IMAGE"
1864
+ ],
1865
+ [
1866
+ 45,
1867
+ 26,
1868
+ 0,
1869
+ 27,
1870
+ 1,
1871
+ "STRING"
1872
+ ],
1873
+ [
1874
+ 46,
1875
+ 28,
1876
+ 0,
1877
+ 1,
1878
+ 0,
1879
+ "COMBO"
1880
+ ],
1881
+ [
1882
+ 47,
1883
+ 29,
1884
+ 0,
1885
+ 1,
1886
+ 1,
1887
+ "STRING"
1888
+ ],
1889
+ [
1890
+ 48,
1891
+ 28,
1892
+ 0,
1893
+ 27,
1894
+ 2,
1895
+ "COMBO"
1896
+ ],
1897
+ [
1898
+ 85,
1899
+ 29,
1900
+ 0,
1901
+ 27,
1902
+ 3,
1903
+ "STRING"
1904
+ ],
1905
+ [
1906
+ 87,
1907
+ 2,
1908
+ 0,
1909
+ 22,
1910
+ 0,
1911
+ "IMAGE"
1912
+ ],
1913
+ [
1914
+ 88,
1915
+ 37,
1916
+ 0,
1917
+ 38,
1918
+ 0,
1919
+ "MASK"
1920
+ ],
1921
+ [
1922
+ 89,
1923
+ 1,
1924
+ 3,
1925
+ 38,
1926
+ 1,
1927
+ "MASK"
1928
+ ],
1929
+ [
1930
+ 92,
1931
+ 39,
1932
+ 0,
1933
+ 8,
1934
+ 0,
1935
+ "MASK"
1936
+ ],
1937
+ [
1938
+ 93,
1939
+ 39,
1940
+ 0,
1941
+ 21,
1942
+ 1,
1943
+ "MASK"
1944
+ ],
1945
+ [
1946
+ 101,
1947
+ 38,
1948
+ 0,
1949
+ 45,
1950
+ 0,
1951
+ "MASK"
1952
+ ],
1953
+ [
1954
+ 102,
1955
+ 45,
1956
+ 0,
1957
+ 39,
1958
+ 1,
1959
+ "MASK"
1960
+ ],
1961
+ [
1962
+ 103,
1963
+ 46,
1964
+ 0,
1965
+ 4,
1966
+ 0,
1967
+ "INT"
1968
+ ],
1969
+ [
1970
+ 104,
1971
+ 47,
1972
+ 0,
1973
+ 4,
1974
+ 1,
1975
+ "INT"
1976
+ ],
1977
+ [
1978
+ 105,
1979
+ 46,
1980
+ 0,
1981
+ 37,
1982
+ 0,
1983
+ "INT"
1984
+ ],
1985
+ [
1986
+ 106,
1987
+ 47,
1988
+ 0,
1989
+ 37,
1990
+ 1,
1991
+ "INT"
1992
+ ],
1993
+ [
1994
+ 107,
1995
+ 49,
1996
+ 0,
1997
+ 6,
1998
+ 3,
1999
+ "INT"
2000
+ ],
2001
+ [
2002
+ 108,
2003
+ 50,
2004
+ 0,
2005
+ 6,
2006
+ 4,
2007
+ "INT"
2008
+ ],
2009
+ [
2010
+ 109,
2011
+ 49,
2012
+ 0,
2013
+ 38,
2014
+ 2,
2015
+ "INT"
2016
+ ],
2017
+ [
2018
+ 110,
2019
+ 50,
2020
+ 0,
2021
+ 38,
2022
+ 3,
2023
+ "INT"
2024
+ ],
2025
+ [
2026
+ 111,
2027
+ 6,
2028
+ 0,
2029
+ 51,
2030
+ 0,
2031
+ "IMAGE"
2032
+ ],
2033
+ [
2034
+ 112,
2035
+ 17,
2036
+ 0,
2037
+ 51,
2038
+ 1,
2039
+ "IMAGE"
2040
+ ],
2041
+ [
2042
+ 113,
2043
+ 51,
2044
+ 0,
2045
+ 20,
2046
+ 0,
2047
+ "MASK"
2048
+ ],
2049
+ [
2050
+ 114,
2051
+ 6,
2052
+ 0,
2053
+ 52,
2054
+ 0,
2055
+ "IMAGE"
2056
+ ],
2057
+ [
2058
+ 115,
2059
+ 2,
2060
+ 0,
2061
+ 52,
2062
+ 1,
2063
+ "IMAGE"
2064
+ ],
2065
+ [
2066
+ 116,
2067
+ 52,
2068
+ 0,
2069
+ 39,
2070
+ 0,
2071
+ "MASK"
2072
+ ]
2073
+ ],
2074
+ "groups": [],
2075
+ "config": {},
2076
+ "extra": {},
2077
+ "version": 0.4
2078
+ }
custom_nodes/ComfyQR/examples/img2img-on-errors.json ADDED
@@ -0,0 +1,1767 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 52,
3
+ "last_link_id": 117,
4
+ "nodes": [
5
+ {
6
+ "id": 19,
7
+ "type": "PreviewImage",
8
+ "pos": [
9
+ 1937.9218999999898,
10
+ 158.36729999999957
11
+ ],
12
+ "size": {
13
+ "0": 210,
14
+ "1": 246
15
+ },
16
+ "flags": {},
17
+ "order": 30,
18
+ "mode": 0,
19
+ "inputs": [
20
+ {
21
+ "name": "images",
22
+ "type": "IMAGE",
23
+ "link": 27
24
+ }
25
+ ],
26
+ "properties": {
27
+ "Node name for S&R": "PreviewImage"
28
+ }
29
+ },
30
+ {
31
+ "id": 20,
32
+ "type": "MaskToImage",
33
+ "pos": [
34
+ 1637.9218999999982,
35
+ 148.3672999999998
36
+ ],
37
+ "size": {
38
+ "0": 210,
39
+ "1": 26
40
+ },
41
+ "flags": {},
42
+ "order": 29,
43
+ "mode": 0,
44
+ "inputs": [
45
+ {
46
+ "name": "mask",
47
+ "type": "MASK",
48
+ "link": 113
49
+ }
50
+ ],
51
+ "outputs": [
52
+ {
53
+ "name": "IMAGE",
54
+ "type": "IMAGE",
55
+ "links": [
56
+ 27
57
+ ],
58
+ "shape": 3,
59
+ "slot_index": 0
60
+ }
61
+ ],
62
+ "properties": {
63
+ "Node name for S&R": "MaskToImage"
64
+ }
65
+ },
66
+ {
67
+ "id": 10,
68
+ "type": "CLIPTextEncode",
69
+ "pos": [
70
+ -242.0780999999985,
71
+ 498.3673000000002
72
+ ],
73
+ "size": {
74
+ "0": 400,
75
+ "1": 200
76
+ },
77
+ "flags": {},
78
+ "order": 9,
79
+ "mode": 0,
80
+ "inputs": [
81
+ {
82
+ "name": "clip",
83
+ "type": "CLIP",
84
+ "link": 8
85
+ }
86
+ ],
87
+ "outputs": [
88
+ {
89
+ "name": "CONDITIONING",
90
+ "type": "CONDITIONING",
91
+ "links": [
92
+ 10
93
+ ],
94
+ "shape": 3,
95
+ "slot_index": 0
96
+ }
97
+ ],
98
+ "title": "Positive Prompt",
99
+ "properties": {
100
+ "Node name for S&R": "CLIPTextEncode"
101
+ },
102
+ "widgets_values": [
103
+ "An evil robot inside a factory destroys paperwork by firing a laser beam with his eyes, futuristic, colorful"
104
+ ]
105
+ },
106
+ {
107
+ "id": 11,
108
+ "type": "CLIPTextEncode",
109
+ "pos": [
110
+ -242.0780999999985,
111
+ 768.3673000000036
112
+ ],
113
+ "size": {
114
+ "0": 400,
115
+ "1": 200
116
+ },
117
+ "flags": {},
118
+ "order": 10,
119
+ "mode": 0,
120
+ "inputs": [
121
+ {
122
+ "name": "clip",
123
+ "type": "CLIP",
124
+ "link": 9
125
+ }
126
+ ],
127
+ "outputs": [
128
+ {
129
+ "name": "CONDITIONING",
130
+ "type": "CONDITIONING",
131
+ "links": [
132
+ 11
133
+ ],
134
+ "shape": 3,
135
+ "slot_index": 0
136
+ }
137
+ ],
138
+ "title": "Negative Prompt",
139
+ "properties": {
140
+ "Node name for S&R": "CLIPTextEncode"
141
+ },
142
+ "widgets_values": [
143
+ "worst quality"
144
+ ]
145
+ },
146
+ {
147
+ "id": 9,
148
+ "type": "CheckpointLoaderSimple",
149
+ "pos": [
150
+ -692.0780999999998,
151
+ 748.3673000000032
152
+ ],
153
+ "size": {
154
+ "0": 315,
155
+ "1": 98
156
+ },
157
+ "flags": {},
158
+ "order": 0,
159
+ "mode": 0,
160
+ "outputs": [
161
+ {
162
+ "name": "MODEL",
163
+ "type": "MODEL",
164
+ "links": [
165
+ 16
166
+ ],
167
+ "shape": 3,
168
+ "slot_index": 0
169
+ },
170
+ {
171
+ "name": "CLIP",
172
+ "type": "CLIP",
173
+ "links": [
174
+ 8,
175
+ 9
176
+ ],
177
+ "shape": 3,
178
+ "slot_index": 1
179
+ },
180
+ {
181
+ "name": "VAE",
182
+ "type": "VAE",
183
+ "links": [
184
+ 18,
185
+ 33
186
+ ],
187
+ "shape": 3,
188
+ "slot_index": 2
189
+ }
190
+ ],
191
+ "properties": {
192
+ "Node name for S&R": "CheckpointLoaderSimple"
193
+ },
194
+ "widgets_values": [
195
+ "1.5/Deliberate-inpainting.safetensors"
196
+ ]
197
+ },
198
+ {
199
+ "id": 28,
200
+ "type": "PrimitiveNode",
201
+ "pos": [
202
+ -783.0781000000013,
203
+ -277.6327000000003
204
+ ],
205
+ "size": {
206
+ "0": 210,
207
+ "1": 106
208
+ },
209
+ "flags": {},
210
+ "order": 1,
211
+ "mode": 0,
212
+ "outputs": [
213
+ {
214
+ "name": "COMBO",
215
+ "type": "COMBO",
216
+ "links": [
217
+ 46
218
+ ],
219
+ "slot_index": 0,
220
+ "widget": {
221
+ "name": "protocol"
222
+ }
223
+ }
224
+ ],
225
+ "title": "Protocol",
226
+ "properties": {
227
+ "Run widget replace on values": false
228
+ },
229
+ "widgets_values": [
230
+ "Https",
231
+ "fixed",
232
+ ""
233
+ ]
234
+ },
235
+ {
236
+ "id": 29,
237
+ "type": "PrimitiveNode",
238
+ "pos": [
239
+ -535.078099999998,
240
+ -266.6327000000004
241
+ ],
242
+ "size": {
243
+ "0": 210,
244
+ "1": 76
245
+ },
246
+ "flags": {},
247
+ "order": 2,
248
+ "mode": 0,
249
+ "outputs": [
250
+ {
251
+ "name": "STRING",
252
+ "type": "STRING",
253
+ "links": [
254
+ 47
255
+ ],
256
+ "slot_index": 0,
257
+ "widget": {
258
+ "name": "text"
259
+ }
260
+ }
261
+ ],
262
+ "title": "URL",
263
+ "properties": {
264
+ "Run widget replace on values": false
265
+ },
266
+ "widgets_values": [
267
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr-validation-nodes"
268
+ ]
269
+ },
270
+ {
271
+ "id": 22,
272
+ "type": "VAEEncode",
273
+ "pos": [
274
+ 208,
275
+ 231
276
+ ],
277
+ "size": {
278
+ "0": 210,
279
+ "1": 46
280
+ },
281
+ "flags": {},
282
+ "order": 14,
283
+ "mode": 0,
284
+ "inputs": [
285
+ {
286
+ "name": "pixels",
287
+ "type": "IMAGE",
288
+ "link": 87
289
+ },
290
+ {
291
+ "name": "vae",
292
+ "type": "VAE",
293
+ "link": 33
294
+ }
295
+ ],
296
+ "outputs": [
297
+ {
298
+ "name": "LATENT",
299
+ "type": "LATENT",
300
+ "links": [
301
+ 31
302
+ ],
303
+ "shape": 3,
304
+ "slot_index": 0
305
+ }
306
+ ],
307
+ "properties": {
308
+ "Node name for S&R": "VAEEncode"
309
+ }
310
+ },
311
+ {
312
+ "id": 14,
313
+ "type": "KSampler",
314
+ "pos": [
315
+ 647.9219000000045,
316
+ 458.3673000000005
317
+ ],
318
+ "size": {
319
+ "0": 315,
320
+ "1": 474
321
+ },
322
+ "flags": {},
323
+ "order": 25,
324
+ "mode": 0,
325
+ "inputs": [
326
+ {
327
+ "name": "model",
328
+ "type": "MODEL",
329
+ "link": 16
330
+ },
331
+ {
332
+ "name": "positive",
333
+ "type": "CONDITIONING",
334
+ "link": 35
335
+ },
336
+ {
337
+ "name": "negative",
338
+ "type": "CONDITIONING",
339
+ "link": 36
340
+ },
341
+ {
342
+ "name": "latent_image",
343
+ "type": "LATENT",
344
+ "link": 32
345
+ }
346
+ ],
347
+ "outputs": [
348
+ {
349
+ "name": "LATENT",
350
+ "type": "LATENT",
351
+ "links": [
352
+ 17
353
+ ],
354
+ "shape": 3,
355
+ "slot_index": 0
356
+ }
357
+ ],
358
+ "properties": {
359
+ "Node name for S&R": "KSampler"
360
+ },
361
+ "widgets_values": [
362
+ 364823902739253,
363
+ "randomize",
364
+ 25,
365
+ 8,
366
+ "euler_ancestral",
367
+ "normal",
368
+ 0.9600000000000002
369
+ ]
370
+ },
371
+ {
372
+ "id": 8,
373
+ "type": "MaskToImage",
374
+ "pos": [
375
+ 558,
376
+ -42
377
+ ],
378
+ "size": {
379
+ "0": 210,
380
+ "1": 26
381
+ },
382
+ "flags": {},
383
+ "order": 22,
384
+ "mode": 0,
385
+ "inputs": [
386
+ {
387
+ "name": "mask",
388
+ "type": "MASK",
389
+ "link": 92
390
+ }
391
+ ],
392
+ "outputs": [
393
+ {
394
+ "name": "IMAGE",
395
+ "type": "IMAGE",
396
+ "links": [
397
+ 7
398
+ ],
399
+ "shape": 3,
400
+ "slot_index": 0
401
+ }
402
+ ],
403
+ "properties": {
404
+ "Node name for S&R": "MaskToImage"
405
+ }
406
+ },
407
+ {
408
+ "id": 4,
409
+ "type": "SolidMask",
410
+ "pos": [
411
+ -970,
412
+ 294
413
+ ],
414
+ "size": {
415
+ "0": 315,
416
+ "1": 106
417
+ },
418
+ "flags": {},
419
+ "order": 12,
420
+ "mode": 0,
421
+ "inputs": [
422
+ {
423
+ "name": "width",
424
+ "type": "INT",
425
+ "link": 103,
426
+ "widget": {
427
+ "name": "width"
428
+ }
429
+ },
430
+ {
431
+ "name": "height",
432
+ "type": "INT",
433
+ "link": 104,
434
+ "widget": {
435
+ "name": "height"
436
+ }
437
+ }
438
+ ],
439
+ "outputs": [
440
+ {
441
+ "name": "MASK",
442
+ "type": "MASK",
443
+ "links": [
444
+ 1
445
+ ],
446
+ "shape": 3,
447
+ "slot_index": 0
448
+ }
449
+ ],
450
+ "title": "Mask (Gray)",
451
+ "properties": {
452
+ "Node name for S&R": "SolidMask"
453
+ },
454
+ "widgets_values": [
455
+ 0.5,
456
+ 768,
457
+ 768
458
+ ]
459
+ },
460
+ {
461
+ "id": 1,
462
+ "type": "comfy-qr-by-module-split",
463
+ "pos": [
464
+ -842.0781000000012,
465
+ -131.63269999999977
466
+ ],
467
+ "size": {
468
+ "0": 400,
469
+ "1": 344
470
+ },
471
+ "flags": {},
472
+ "order": 11,
473
+ "mode": 0,
474
+ "inputs": [
475
+ {
476
+ "name": "protocol",
477
+ "type": "COMBO",
478
+ "link": 46,
479
+ "widget": {
480
+ "name": "protocol"
481
+ }
482
+ },
483
+ {
484
+ "name": "text",
485
+ "type": "STRING",
486
+ "link": 47,
487
+ "widget": {
488
+ "name": "text"
489
+ }
490
+ }
491
+ ],
492
+ "outputs": [
493
+ {
494
+ "name": "QR_FLATTENED",
495
+ "type": "IMAGE",
496
+ "links": [
497
+ 2
498
+ ],
499
+ "shape": 3,
500
+ "slot_index": 0
501
+ },
502
+ {
503
+ "name": "MODULE_LAYER",
504
+ "type": "IMAGE",
505
+ "links": [],
506
+ "shape": 3,
507
+ "slot_index": 1
508
+ },
509
+ {
510
+ "name": "FUNCTION_LAYER",
511
+ "type": "IMAGE",
512
+ "links": [],
513
+ "shape": 3,
514
+ "slot_index": 2
515
+ },
516
+ {
517
+ "name": "FUNCTION_MASK",
518
+ "type": "MASK",
519
+ "links": [
520
+ 89
521
+ ],
522
+ "shape": 3,
523
+ "slot_index": 3
524
+ },
525
+ {
526
+ "name": "QR_VERSION",
527
+ "type": "INT",
528
+ "links": null,
529
+ "shape": 3
530
+ },
531
+ {
532
+ "name": "IMAGE_SIZE",
533
+ "type": "INT",
534
+ "links": null,
535
+ "shape": 3
536
+ }
537
+ ],
538
+ "properties": {
539
+ "Node name for S&R": "comfy-qr-by-module-split"
540
+ },
541
+ "widgets_values": [
542
+ "Https",
543
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr-validation-nodes",
544
+ 16,
545
+ 768,
546
+ "#000000",
547
+ "#FFFFFF",
548
+ "High",
549
+ 1,
550
+ "Square"
551
+ ]
552
+ },
553
+ {
554
+ "id": 21,
555
+ "type": "SetLatentNoiseMask",
556
+ "pos": [
557
+ 551,
558
+ 238
559
+ ],
560
+ "size": {
561
+ "0": 210,
562
+ "1": 46
563
+ },
564
+ "flags": {},
565
+ "order": 23,
566
+ "mode": 0,
567
+ "inputs": [
568
+ {
569
+ "name": "samples",
570
+ "type": "LATENT",
571
+ "link": 31
572
+ },
573
+ {
574
+ "name": "mask",
575
+ "type": "MASK",
576
+ "link": 93
577
+ }
578
+ ],
579
+ "outputs": [
580
+ {
581
+ "name": "LATENT",
582
+ "type": "LATENT",
583
+ "links": [
584
+ 32
585
+ ],
586
+ "shape": 3,
587
+ "slot_index": 0
588
+ }
589
+ ],
590
+ "properties": {
591
+ "Node name for S&R": "SetLatentNoiseMask"
592
+ }
593
+ },
594
+ {
595
+ "id": 13,
596
+ "type": "ControlNetApplyAdvanced",
597
+ "pos": [
598
+ 247.9219000000045,
599
+ 508.36730000000017
600
+ ],
601
+ "size": {
602
+ "0": 315,
603
+ "1": 166
604
+ },
605
+ "flags": {},
606
+ "order": 19,
607
+ "mode": 0,
608
+ "inputs": [
609
+ {
610
+ "name": "positive",
611
+ "type": "CONDITIONING",
612
+ "link": 10
613
+ },
614
+ {
615
+ "name": "negative",
616
+ "type": "CONDITIONING",
617
+ "link": 11
618
+ },
619
+ {
620
+ "name": "control_net",
621
+ "type": "CONTROL_NET",
622
+ "link": 13
623
+ },
624
+ {
625
+ "name": "image",
626
+ "type": "IMAGE",
627
+ "link": 12
628
+ }
629
+ ],
630
+ "outputs": [
631
+ {
632
+ "name": "positive",
633
+ "type": "CONDITIONING",
634
+ "links": [
635
+ 35
636
+ ],
637
+ "shape": 3,
638
+ "slot_index": 0
639
+ },
640
+ {
641
+ "name": "negative",
642
+ "type": "CONDITIONING",
643
+ "links": [
644
+ 36
645
+ ],
646
+ "shape": 3,
647
+ "slot_index": 1
648
+ }
649
+ ],
650
+ "properties": {
651
+ "Node name for S&R": "ControlNetApplyAdvanced"
652
+ },
653
+ "widgets_values": [
654
+ 5,
655
+ 0,
656
+ 1
657
+ ]
658
+ },
659
+ {
660
+ "id": 39,
661
+ "type": "MaskComposite",
662
+ "pos": [
663
+ 483,
664
+ 50
665
+ ],
666
+ "size": {
667
+ "0": 315,
668
+ "1": 126
669
+ },
670
+ "flags": {},
671
+ "order": 21,
672
+ "mode": 0,
673
+ "inputs": [
674
+ {
675
+ "name": "destination",
676
+ "type": "MASK",
677
+ "link": 115
678
+ },
679
+ {
680
+ "name": "source",
681
+ "type": "MASK",
682
+ "link": 102
683
+ }
684
+ ],
685
+ "outputs": [
686
+ {
687
+ "name": "MASK",
688
+ "type": "MASK",
689
+ "links": [
690
+ 92,
691
+ 93
692
+ ],
693
+ "shape": 3,
694
+ "slot_index": 0
695
+ }
696
+ ],
697
+ "properties": {
698
+ "Node name for S&R": "MaskComposite"
699
+ },
700
+ "widgets_values": [
701
+ 0,
702
+ 0,
703
+ "add"
704
+ ]
705
+ },
706
+ {
707
+ "id": 5,
708
+ "type": "MaskToImage",
709
+ "pos": [
710
+ -592,
711
+ 305
712
+ ],
713
+ "size": {
714
+ "0": 210,
715
+ "1": 26
716
+ },
717
+ "flags": {},
718
+ "order": 15,
719
+ "mode": 0,
720
+ "inputs": [
721
+ {
722
+ "name": "mask",
723
+ "type": "MASK",
724
+ "link": 1
725
+ }
726
+ ],
727
+ "outputs": [
728
+ {
729
+ "name": "IMAGE",
730
+ "type": "IMAGE",
731
+ "links": [
732
+ 3
733
+ ],
734
+ "shape": 3,
735
+ "slot_index": 0
736
+ }
737
+ ],
738
+ "properties": {
739
+ "Node name for S&R": "MaskToImage"
740
+ }
741
+ },
742
+ {
743
+ "id": 47,
744
+ "type": "PrimitiveNode",
745
+ "pos": [
746
+ -1252,
747
+ 425
748
+ ],
749
+ "size": {
750
+ "0": 210,
751
+ "1": 82
752
+ },
753
+ "flags": {},
754
+ "order": 3,
755
+ "mode": 0,
756
+ "outputs": [
757
+ {
758
+ "name": "INT",
759
+ "type": "INT",
760
+ "links": [
761
+ 104,
762
+ 106
763
+ ],
764
+ "slot_index": 0,
765
+ "widget": {
766
+ "name": "height"
767
+ }
768
+ }
769
+ ],
770
+ "title": "Height",
771
+ "properties": {
772
+ "Run widget replace on values": false
773
+ },
774
+ "widgets_values": [
775
+ 768,
776
+ "fixed"
777
+ ]
778
+ },
779
+ {
780
+ "id": 46,
781
+ "type": "PrimitiveNode",
782
+ "pos": [
783
+ -1250,
784
+ 278
785
+ ],
786
+ "size": {
787
+ "0": 210,
788
+ "1": 82
789
+ },
790
+ "flags": {},
791
+ "order": 4,
792
+ "mode": 0,
793
+ "outputs": [
794
+ {
795
+ "name": "INT",
796
+ "type": "INT",
797
+ "links": [
798
+ 103,
799
+ 105
800
+ ],
801
+ "slot_index": 0,
802
+ "widget": {
803
+ "name": "width"
804
+ }
805
+ }
806
+ ],
807
+ "title": "Width",
808
+ "properties": {
809
+ "Run widget replace on values": false
810
+ },
811
+ "widgets_values": [
812
+ 768,
813
+ "fixed"
814
+ ]
815
+ },
816
+ {
817
+ "id": 49,
818
+ "type": "PrimitiveNode",
819
+ "pos": [
820
+ -1149,
821
+ -41
822
+ ],
823
+ "size": {
824
+ "0": 210,
825
+ "1": 82
826
+ },
827
+ "flags": {},
828
+ "order": 5,
829
+ "mode": 0,
830
+ "outputs": [
831
+ {
832
+ "name": "INT",
833
+ "type": "INT",
834
+ "links": [
835
+ 107,
836
+ 109
837
+ ],
838
+ "slot_index": 0,
839
+ "widget": {
840
+ "name": "x"
841
+ }
842
+ }
843
+ ],
844
+ "title": "X Offset",
845
+ "properties": {
846
+ "Run widget replace on values": false
847
+ },
848
+ "widgets_values": [
849
+ 16,
850
+ "fixed"
851
+ ]
852
+ },
853
+ {
854
+ "id": 50,
855
+ "type": "PrimitiveNode",
856
+ "pos": [
857
+ -1146,
858
+ 94
859
+ ],
860
+ "size": {
861
+ "0": 210,
862
+ "1": 82
863
+ },
864
+ "flags": {},
865
+ "order": 6,
866
+ "mode": 0,
867
+ "outputs": [
868
+ {
869
+ "name": "INT",
870
+ "type": "INT",
871
+ "links": [
872
+ 108,
873
+ 110
874
+ ],
875
+ "slot_index": 0,
876
+ "widget": {
877
+ "name": "y"
878
+ }
879
+ }
880
+ ],
881
+ "title": "Y Offset",
882
+ "properties": {
883
+ "Run widget replace on values": false
884
+ },
885
+ "widgets_values": [
886
+ 16,
887
+ "fixed"
888
+ ]
889
+ },
890
+ {
891
+ "id": 37,
892
+ "type": "SolidMask",
893
+ "pos": [
894
+ -994,
895
+ 455
896
+ ],
897
+ "size": {
898
+ "0": 315,
899
+ "1": 106
900
+ },
901
+ "flags": {},
902
+ "order": 13,
903
+ "mode": 0,
904
+ "inputs": [
905
+ {
906
+ "name": "width",
907
+ "type": "INT",
908
+ "link": 105,
909
+ "widget": {
910
+ "name": "width"
911
+ }
912
+ },
913
+ {
914
+ "name": "height",
915
+ "type": "INT",
916
+ "link": 106,
917
+ "widget": {
918
+ "name": "height"
919
+ }
920
+ }
921
+ ],
922
+ "outputs": [
923
+ {
924
+ "name": "MASK",
925
+ "type": "MASK",
926
+ "links": [
927
+ 88
928
+ ],
929
+ "shape": 3,
930
+ "slot_index": 0
931
+ }
932
+ ],
933
+ "title": "Mask (Black)",
934
+ "properties": {
935
+ "Node name for S&R": "SolidMask"
936
+ },
937
+ "widgets_values": [
938
+ 0,
939
+ 768,
940
+ 768
941
+ ]
942
+ },
943
+ {
944
+ "id": 38,
945
+ "type": "MaskComposite",
946
+ "pos": [
947
+ -635,
948
+ 413
949
+ ],
950
+ "size": {
951
+ "0": 315,
952
+ "1": 126
953
+ },
954
+ "flags": {},
955
+ "order": 16,
956
+ "mode": 0,
957
+ "inputs": [
958
+ {
959
+ "name": "destination",
960
+ "type": "MASK",
961
+ "link": 88
962
+ },
963
+ {
964
+ "name": "source",
965
+ "type": "MASK",
966
+ "link": 89
967
+ },
968
+ {
969
+ "name": "x",
970
+ "type": "INT",
971
+ "link": 109,
972
+ "widget": {
973
+ "name": "x"
974
+ }
975
+ },
976
+ {
977
+ "name": "y",
978
+ "type": "INT",
979
+ "link": 110,
980
+ "widget": {
981
+ "name": "y"
982
+ }
983
+ }
984
+ ],
985
+ "outputs": [
986
+ {
987
+ "name": "MASK",
988
+ "type": "MASK",
989
+ "links": [
990
+ 101
991
+ ],
992
+ "shape": 3,
993
+ "slot_index": 0
994
+ }
995
+ ],
996
+ "title": "Function Mask Expanded",
997
+ "properties": {
998
+ "Node name for S&R": "MaskComposite"
999
+ },
1000
+ "widgets_values": [
1001
+ 16,
1002
+ 16,
1003
+ "add"
1004
+ ]
1005
+ },
1006
+ {
1007
+ "id": 45,
1008
+ "type": "GrowMask",
1009
+ "pos": [
1010
+ 150,
1011
+ 353
1012
+ ],
1013
+ "size": {
1014
+ "0": 315,
1015
+ "1": 82
1016
+ },
1017
+ "flags": {},
1018
+ "order": 18,
1019
+ "mode": 0,
1020
+ "inputs": [
1021
+ {
1022
+ "name": "mask",
1023
+ "type": "MASK",
1024
+ "link": 101
1025
+ }
1026
+ ],
1027
+ "outputs": [
1028
+ {
1029
+ "name": "MASK",
1030
+ "type": "MASK",
1031
+ "links": [
1032
+ 102
1033
+ ],
1034
+ "shape": 3,
1035
+ "slot_index": 0
1036
+ }
1037
+ ],
1038
+ "properties": {
1039
+ "Node name for S&R": "GrowMask"
1040
+ },
1041
+ "widgets_values": [
1042
+ 16,
1043
+ false
1044
+ ]
1045
+ },
1046
+ {
1047
+ "id": 7,
1048
+ "type": "PreviewImage",
1049
+ "pos": [
1050
+ 881,
1051
+ 17
1052
+ ],
1053
+ "size": {
1054
+ "0": 210,
1055
+ "1": 246
1056
+ },
1057
+ "flags": {},
1058
+ "order": 24,
1059
+ "mode": 0,
1060
+ "inputs": [
1061
+ {
1062
+ "name": "images",
1063
+ "type": "IMAGE",
1064
+ "link": 7
1065
+ }
1066
+ ],
1067
+ "properties": {
1068
+ "Node name for S&R": "PreviewImage"
1069
+ }
1070
+ },
1071
+ {
1072
+ "id": 17,
1073
+ "type": "VAEDecode",
1074
+ "pos": [
1075
+ 1039,
1076
+ 464
1077
+ ],
1078
+ "size": {
1079
+ "0": 210,
1080
+ "1": 46
1081
+ },
1082
+ "flags": {},
1083
+ "order": 26,
1084
+ "mode": 0,
1085
+ "inputs": [
1086
+ {
1087
+ "name": "samples",
1088
+ "type": "LATENT",
1089
+ "link": 17
1090
+ },
1091
+ {
1092
+ "name": "vae",
1093
+ "type": "VAE",
1094
+ "link": 18
1095
+ }
1096
+ ],
1097
+ "outputs": [
1098
+ {
1099
+ "name": "IMAGE",
1100
+ "type": "IMAGE",
1101
+ "links": [
1102
+ 112,
1103
+ 114
1104
+ ],
1105
+ "shape": 3,
1106
+ "slot_index": 0
1107
+ }
1108
+ ],
1109
+ "properties": {
1110
+ "Node name for S&R": "VAEDecode"
1111
+ }
1112
+ },
1113
+ {
1114
+ "id": 51,
1115
+ "type": "comfy-qr-mask_errors",
1116
+ "pos": [
1117
+ 1194,
1118
+ 15
1119
+ ],
1120
+ "size": {
1121
+ "0": 317.4000244140625,
1122
+ "1": 262
1123
+ },
1124
+ "flags": {},
1125
+ "order": 27,
1126
+ "mode": 0,
1127
+ "inputs": [
1128
+ {
1129
+ "name": "source_qr",
1130
+ "type": "IMAGE",
1131
+ "link": 111
1132
+ },
1133
+ {
1134
+ "name": "modified_qr",
1135
+ "type": "IMAGE",
1136
+ "link": 112
1137
+ }
1138
+ ],
1139
+ "outputs": [
1140
+ {
1141
+ "name": "QR_ERROR_MASK",
1142
+ "type": "MASK",
1143
+ "links": [
1144
+ 113
1145
+ ],
1146
+ "shape": 3,
1147
+ "slot_index": 0
1148
+ },
1149
+ {
1150
+ "name": "PERCENT_ERROR",
1151
+ "type": "FLOAT",
1152
+ "links": null,
1153
+ "shape": 3
1154
+ },
1155
+ {
1156
+ "name": "CORRELATION",
1157
+ "type": "FLOAT",
1158
+ "links": null,
1159
+ "shape": 3
1160
+ },
1161
+ {
1162
+ "name": "RMSE",
1163
+ "type": "FLOAT",
1164
+ "links": null,
1165
+ "shape": 3
1166
+ }
1167
+ ],
1168
+ "properties": {
1169
+ "Node name for S&R": "comfy-qr-mask_errors"
1170
+ },
1171
+ "widgets_values": [
1172
+ 16,
1173
+ "luminance",
1174
+ "mean",
1175
+ "module_pattern",
1176
+ 0,
1177
+ false,
1178
+ 2.2
1179
+ ]
1180
+ },
1181
+ {
1182
+ "id": 12,
1183
+ "type": "ControlNetLoader",
1184
+ "pos": [
1185
+ -692.0780999999998,
1186
+ 618.3673000000019
1187
+ ],
1188
+ "size": {
1189
+ "0": 315,
1190
+ "1": 58
1191
+ },
1192
+ "flags": {},
1193
+ "order": 7,
1194
+ "mode": 0,
1195
+ "outputs": [
1196
+ {
1197
+ "name": "CONTROL_NET",
1198
+ "type": "CONTROL_NET",
1199
+ "links": [
1200
+ 13
1201
+ ],
1202
+ "shape": 3,
1203
+ "slot_index": 0
1204
+ }
1205
+ ],
1206
+ "properties": {
1207
+ "Node name for S&R": "ControlNetLoader"
1208
+ },
1209
+ "widgets_values": [
1210
+ "1.5/control_v1p_sd15_qrcode_monster_v2.safetensors"
1211
+ ]
1212
+ },
1213
+ {
1214
+ "id": 23,
1215
+ "type": "SaveImage",
1216
+ "pos": [
1217
+ 1473,
1218
+ 510
1219
+ ],
1220
+ "size": {
1221
+ "0": 315,
1222
+ "1": 270
1223
+ },
1224
+ "flags": {},
1225
+ "order": 28,
1226
+ "mode": 0,
1227
+ "inputs": [
1228
+ {
1229
+ "name": "images",
1230
+ "type": "IMAGE",
1231
+ "link": 114
1232
+ }
1233
+ ],
1234
+ "properties": {},
1235
+ "widgets_values": [
1236
+ "ComfyUI"
1237
+ ]
1238
+ },
1239
+ {
1240
+ "id": 6,
1241
+ "type": "ImageCompositeMasked",
1242
+ "pos": [
1243
+ -332.0780999999991,
1244
+ -91.63270000000001
1245
+ ],
1246
+ "size": {
1247
+ "0": 315,
1248
+ "1": 146
1249
+ },
1250
+ "flags": {},
1251
+ "order": 17,
1252
+ "mode": 0,
1253
+ "inputs": [
1254
+ {
1255
+ "name": "destination",
1256
+ "type": "IMAGE",
1257
+ "link": 3
1258
+ },
1259
+ {
1260
+ "name": "source",
1261
+ "type": "IMAGE",
1262
+ "link": 2
1263
+ },
1264
+ {
1265
+ "name": "mask",
1266
+ "type": "MASK",
1267
+ "link": null
1268
+ },
1269
+ {
1270
+ "name": "x",
1271
+ "type": "INT",
1272
+ "link": 107,
1273
+ "widget": {
1274
+ "name": "x"
1275
+ }
1276
+ },
1277
+ {
1278
+ "name": "y",
1279
+ "type": "INT",
1280
+ "link": 108,
1281
+ "widget": {
1282
+ "name": "y"
1283
+ }
1284
+ }
1285
+ ],
1286
+ "outputs": [
1287
+ {
1288
+ "name": "IMAGE",
1289
+ "type": "IMAGE",
1290
+ "links": [
1291
+ 12,
1292
+ 111,
1293
+ 116
1294
+ ],
1295
+ "shape": 3,
1296
+ "slot_index": 0
1297
+ }
1298
+ ],
1299
+ "properties": {
1300
+ "Node name for S&R": "ImageCompositeMasked"
1301
+ },
1302
+ "widgets_values": [
1303
+ 16,
1304
+ 16,
1305
+ false
1306
+ ]
1307
+ },
1308
+ {
1309
+ "id": 2,
1310
+ "type": "LoadImage",
1311
+ "pos": [
1312
+ -288,
1313
+ 115
1314
+ ],
1315
+ "size": {
1316
+ "0": 315,
1317
+ "1": 314.0000305175781
1318
+ },
1319
+ "flags": {},
1320
+ "order": 8,
1321
+ "mode": 0,
1322
+ "outputs": [
1323
+ {
1324
+ "name": "IMAGE",
1325
+ "type": "IMAGE",
1326
+ "links": [
1327
+ 87,
1328
+ 117
1329
+ ],
1330
+ "shape": 3,
1331
+ "slot_index": 0
1332
+ },
1333
+ {
1334
+ "name": "MASK",
1335
+ "type": "MASK",
1336
+ "links": null,
1337
+ "shape": 3
1338
+ }
1339
+ ],
1340
+ "properties": {
1341
+ "Node name for S&R": "LoadImage"
1342
+ },
1343
+ "widgets_values": [
1344
+ "unscannable_00001_ (1).png",
1345
+ "image"
1346
+ ]
1347
+ },
1348
+ {
1349
+ "id": 52,
1350
+ "type": "comfy-qr-mask_errors",
1351
+ "pos": [
1352
+ 120,
1353
+ -146
1354
+ ],
1355
+ "size": {
1356
+ "0": 317.4000244140625,
1357
+ "1": 262
1358
+ },
1359
+ "flags": {},
1360
+ "order": 20,
1361
+ "mode": 0,
1362
+ "inputs": [
1363
+ {
1364
+ "name": "source_qr",
1365
+ "type": "IMAGE",
1366
+ "link": 116
1367
+ },
1368
+ {
1369
+ "name": "modified_qr",
1370
+ "type": "IMAGE",
1371
+ "link": 117
1372
+ }
1373
+ ],
1374
+ "outputs": [
1375
+ {
1376
+ "name": "QR_ERROR_MASK",
1377
+ "type": "MASK",
1378
+ "links": [
1379
+ 115
1380
+ ],
1381
+ "shape": 3,
1382
+ "slot_index": 0
1383
+ },
1384
+ {
1385
+ "name": "PERCENT_ERROR",
1386
+ "type": "FLOAT",
1387
+ "links": null,
1388
+ "shape": 6
1389
+ },
1390
+ {
1391
+ "name": "CORRELATION",
1392
+ "type": "FLOAT",
1393
+ "links": null,
1394
+ "shape": 6
1395
+ },
1396
+ {
1397
+ "name": "RMSE",
1398
+ "type": "FLOAT",
1399
+ "links": null,
1400
+ "shape": 6
1401
+ }
1402
+ ],
1403
+ "properties": {
1404
+ "Node name for S&R": "comfy-qr-mask_errors"
1405
+ },
1406
+ "widgets_values": [
1407
+ 16,
1408
+ "mean",
1409
+ "mean",
1410
+ "module_pattern",
1411
+ 0.5,
1412
+ false,
1413
+ 2.2
1414
+ ]
1415
+ }
1416
+ ],
1417
+ "links": [
1418
+ [
1419
+ 1,
1420
+ 4,
1421
+ 0,
1422
+ 5,
1423
+ 0,
1424
+ "MASK"
1425
+ ],
1426
+ [
1427
+ 2,
1428
+ 1,
1429
+ 0,
1430
+ 6,
1431
+ 1,
1432
+ "IMAGE"
1433
+ ],
1434
+ [
1435
+ 3,
1436
+ 5,
1437
+ 0,
1438
+ 6,
1439
+ 0,
1440
+ "IMAGE"
1441
+ ],
1442
+ [
1443
+ 7,
1444
+ 8,
1445
+ 0,
1446
+ 7,
1447
+ 0,
1448
+ "IMAGE"
1449
+ ],
1450
+ [
1451
+ 8,
1452
+ 9,
1453
+ 1,
1454
+ 10,
1455
+ 0,
1456
+ "CLIP"
1457
+ ],
1458
+ [
1459
+ 9,
1460
+ 9,
1461
+ 1,
1462
+ 11,
1463
+ 0,
1464
+ "CLIP"
1465
+ ],
1466
+ [
1467
+ 10,
1468
+ 10,
1469
+ 0,
1470
+ 13,
1471
+ 0,
1472
+ "CONDITIONING"
1473
+ ],
1474
+ [
1475
+ 11,
1476
+ 11,
1477
+ 0,
1478
+ 13,
1479
+ 1,
1480
+ "CONDITIONING"
1481
+ ],
1482
+ [
1483
+ 12,
1484
+ 6,
1485
+ 0,
1486
+ 13,
1487
+ 3,
1488
+ "IMAGE"
1489
+ ],
1490
+ [
1491
+ 13,
1492
+ 12,
1493
+ 0,
1494
+ 13,
1495
+ 2,
1496
+ "CONTROL_NET"
1497
+ ],
1498
+ [
1499
+ 16,
1500
+ 9,
1501
+ 0,
1502
+ 14,
1503
+ 0,
1504
+ "MODEL"
1505
+ ],
1506
+ [
1507
+ 17,
1508
+ 14,
1509
+ 0,
1510
+ 17,
1511
+ 0,
1512
+ "LATENT"
1513
+ ],
1514
+ [
1515
+ 18,
1516
+ 9,
1517
+ 2,
1518
+ 17,
1519
+ 1,
1520
+ "VAE"
1521
+ ],
1522
+ [
1523
+ 27,
1524
+ 20,
1525
+ 0,
1526
+ 19,
1527
+ 0,
1528
+ "IMAGE"
1529
+ ],
1530
+ [
1531
+ 31,
1532
+ 22,
1533
+ 0,
1534
+ 21,
1535
+ 0,
1536
+ "LATENT"
1537
+ ],
1538
+ [
1539
+ 32,
1540
+ 21,
1541
+ 0,
1542
+ 14,
1543
+ 3,
1544
+ "LATENT"
1545
+ ],
1546
+ [
1547
+ 33,
1548
+ 9,
1549
+ 2,
1550
+ 22,
1551
+ 1,
1552
+ "VAE"
1553
+ ],
1554
+ [
1555
+ 35,
1556
+ 13,
1557
+ 0,
1558
+ 14,
1559
+ 1,
1560
+ "CONDITIONING"
1561
+ ],
1562
+ [
1563
+ 36,
1564
+ 13,
1565
+ 1,
1566
+ 14,
1567
+ 2,
1568
+ "CONDITIONING"
1569
+ ],
1570
+ [
1571
+ 46,
1572
+ 28,
1573
+ 0,
1574
+ 1,
1575
+ 0,
1576
+ "COMBO"
1577
+ ],
1578
+ [
1579
+ 47,
1580
+ 29,
1581
+ 0,
1582
+ 1,
1583
+ 1,
1584
+ "STRING"
1585
+ ],
1586
+ [
1587
+ 87,
1588
+ 2,
1589
+ 0,
1590
+ 22,
1591
+ 0,
1592
+ "IMAGE"
1593
+ ],
1594
+ [
1595
+ 88,
1596
+ 37,
1597
+ 0,
1598
+ 38,
1599
+ 0,
1600
+ "MASK"
1601
+ ],
1602
+ [
1603
+ 89,
1604
+ 1,
1605
+ 3,
1606
+ 38,
1607
+ 1,
1608
+ "MASK"
1609
+ ],
1610
+ [
1611
+ 92,
1612
+ 39,
1613
+ 0,
1614
+ 8,
1615
+ 0,
1616
+ "MASK"
1617
+ ],
1618
+ [
1619
+ 93,
1620
+ 39,
1621
+ 0,
1622
+ 21,
1623
+ 1,
1624
+ "MASK"
1625
+ ],
1626
+ [
1627
+ 101,
1628
+ 38,
1629
+ 0,
1630
+ 45,
1631
+ 0,
1632
+ "MASK"
1633
+ ],
1634
+ [
1635
+ 102,
1636
+ 45,
1637
+ 0,
1638
+ 39,
1639
+ 1,
1640
+ "MASK"
1641
+ ],
1642
+ [
1643
+ 103,
1644
+ 46,
1645
+ 0,
1646
+ 4,
1647
+ 0,
1648
+ "INT"
1649
+ ],
1650
+ [
1651
+ 104,
1652
+ 47,
1653
+ 0,
1654
+ 4,
1655
+ 1,
1656
+ "INT"
1657
+ ],
1658
+ [
1659
+ 105,
1660
+ 46,
1661
+ 0,
1662
+ 37,
1663
+ 0,
1664
+ "INT"
1665
+ ],
1666
+ [
1667
+ 106,
1668
+ 47,
1669
+ 0,
1670
+ 37,
1671
+ 1,
1672
+ "INT"
1673
+ ],
1674
+ [
1675
+ 107,
1676
+ 49,
1677
+ 0,
1678
+ 6,
1679
+ 3,
1680
+ "INT"
1681
+ ],
1682
+ [
1683
+ 108,
1684
+ 50,
1685
+ 0,
1686
+ 6,
1687
+ 4,
1688
+ "INT"
1689
+ ],
1690
+ [
1691
+ 109,
1692
+ 49,
1693
+ 0,
1694
+ 38,
1695
+ 2,
1696
+ "INT"
1697
+ ],
1698
+ [
1699
+ 110,
1700
+ 50,
1701
+ 0,
1702
+ 38,
1703
+ 3,
1704
+ "INT"
1705
+ ],
1706
+ [
1707
+ 111,
1708
+ 6,
1709
+ 0,
1710
+ 51,
1711
+ 0,
1712
+ "IMAGE"
1713
+ ],
1714
+ [
1715
+ 112,
1716
+ 17,
1717
+ 0,
1718
+ 51,
1719
+ 1,
1720
+ "IMAGE"
1721
+ ],
1722
+ [
1723
+ 113,
1724
+ 51,
1725
+ 0,
1726
+ 20,
1727
+ 0,
1728
+ "MASK"
1729
+ ],
1730
+ [
1731
+ 114,
1732
+ 17,
1733
+ 0,
1734
+ 23,
1735
+ 0,
1736
+ "IMAGE"
1737
+ ],
1738
+ [
1739
+ 115,
1740
+ 52,
1741
+ 0,
1742
+ 39,
1743
+ 0,
1744
+ "MASK"
1745
+ ],
1746
+ [
1747
+ 116,
1748
+ 6,
1749
+ 0,
1750
+ 52,
1751
+ 0,
1752
+ "IMAGE"
1753
+ ],
1754
+ [
1755
+ 117,
1756
+ 2,
1757
+ 0,
1758
+ 52,
1759
+ 1,
1760
+ "IMAGE"
1761
+ ]
1762
+ ],
1763
+ "groups": [],
1764
+ "config": {},
1765
+ "extra": {},
1766
+ "version": 0.4
1767
+ }
custom_nodes/ComfyQR/examples/img2img-only.json ADDED
@@ -0,0 +1,444 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 14,
3
+ "last_link_id": 14,
4
+ "nodes": [
5
+ {
6
+ "id": 7,
7
+ "type": "CLIPTextEncode",
8
+ "pos": [
9
+ 643,
10
+ 101
11
+ ],
12
+ "size": {
13
+ "0": 400,
14
+ "1": 200
15
+ },
16
+ "flags": {},
17
+ "order": 2,
18
+ "mode": 0,
19
+ "inputs": [
20
+ {
21
+ "name": "clip",
22
+ "type": "CLIP",
23
+ "link": 2
24
+ }
25
+ ],
26
+ "outputs": [
27
+ {
28
+ "name": "CONDITIONING",
29
+ "type": "CONDITIONING",
30
+ "links": [
31
+ 6
32
+ ],
33
+ "shape": 3,
34
+ "slot_index": 0
35
+ }
36
+ ],
37
+ "properties": {
38
+ "Node name for S&R": "CLIPTextEncode"
39
+ },
40
+ "widgets_values": [
41
+ "Adorable puppies"
42
+ ]
43
+ },
44
+ {
45
+ "id": 9,
46
+ "type": "VAEEncode",
47
+ "pos": [
48
+ 801,
49
+ 641
50
+ ],
51
+ "size": {
52
+ "0": 210,
53
+ "1": 46
54
+ },
55
+ "flags": {},
56
+ "order": 4,
57
+ "mode": 0,
58
+ "inputs": [
59
+ {
60
+ "name": "pixels",
61
+ "type": "IMAGE",
62
+ "link": 14
63
+ },
64
+ {
65
+ "name": "vae",
66
+ "type": "VAE",
67
+ "link": 5
68
+ }
69
+ ],
70
+ "outputs": [
71
+ {
72
+ "name": "LATENT",
73
+ "type": "LATENT",
74
+ "links": [
75
+ 8
76
+ ],
77
+ "shape": 3,
78
+ "slot_index": 0
79
+ }
80
+ ],
81
+ "properties": {
82
+ "Node name for S&R": "VAEEncode"
83
+ }
84
+ },
85
+ {
86
+ "id": 8,
87
+ "type": "CLIPTextEncode",
88
+ "pos": [
89
+ 685,
90
+ 351
91
+ ],
92
+ "size": {
93
+ "0": 400,
94
+ "1": 200
95
+ },
96
+ "flags": {},
97
+ "order": 3,
98
+ "mode": 0,
99
+ "inputs": [
100
+ {
101
+ "name": "clip",
102
+ "type": "CLIP",
103
+ "link": 3
104
+ }
105
+ ],
106
+ "outputs": [
107
+ {
108
+ "name": "CONDITIONING",
109
+ "type": "CONDITIONING",
110
+ "links": [
111
+ 13
112
+ ],
113
+ "shape": 3,
114
+ "slot_index": 0
115
+ }
116
+ ],
117
+ "properties": {
118
+ "Node name for S&R": "CLIPTextEncode"
119
+ },
120
+ "widgets_values": [
121
+ "worst quality"
122
+ ]
123
+ },
124
+ {
125
+ "id": 13,
126
+ "type": "VAEDecode",
127
+ "pos": [
128
+ 1195,
129
+ 696
130
+ ],
131
+ "size": {
132
+ "0": 210,
133
+ "1": 46
134
+ },
135
+ "flags": {},
136
+ "order": 6,
137
+ "mode": 0,
138
+ "inputs": [
139
+ {
140
+ "name": "samples",
141
+ "type": "LATENT",
142
+ "link": 10
143
+ },
144
+ {
145
+ "name": "vae",
146
+ "type": "VAE",
147
+ "link": 11
148
+ }
149
+ ],
150
+ "outputs": [
151
+ {
152
+ "name": "IMAGE",
153
+ "type": "IMAGE",
154
+ "links": [
155
+ 12
156
+ ],
157
+ "shape": 3,
158
+ "slot_index": 0
159
+ }
160
+ ],
161
+ "properties": {
162
+ "Node name for S&R": "VAEDecode"
163
+ }
164
+ },
165
+ {
166
+ "id": 12,
167
+ "type": "SaveImage",
168
+ "pos": [
169
+ 1493,
170
+ 677
171
+ ],
172
+ "size": {
173
+ "0": 315,
174
+ "1": 270
175
+ },
176
+ "flags": {},
177
+ "order": 7,
178
+ "mode": 0,
179
+ "inputs": [
180
+ {
181
+ "name": "images",
182
+ "type": "IMAGE",
183
+ "link": 12
184
+ }
185
+ ],
186
+ "properties": {},
187
+ "widgets_values": [
188
+ "ComfyUI"
189
+ ]
190
+ },
191
+ {
192
+ "id": 6,
193
+ "type": "CheckpointLoaderSimple",
194
+ "pos": [
195
+ 220,
196
+ 182
197
+ ],
198
+ "size": {
199
+ "0": 315,
200
+ "1": 98
201
+ },
202
+ "flags": {},
203
+ "order": 0,
204
+ "mode": 0,
205
+ "outputs": [
206
+ {
207
+ "name": "MODEL",
208
+ "type": "MODEL",
209
+ "links": [
210
+ 9
211
+ ],
212
+ "shape": 3,
213
+ "slot_index": 0
214
+ },
215
+ {
216
+ "name": "CLIP",
217
+ "type": "CLIP",
218
+ "links": [
219
+ 2,
220
+ 3
221
+ ],
222
+ "shape": 3,
223
+ "slot_index": 1
224
+ },
225
+ {
226
+ "name": "VAE",
227
+ "type": "VAE",
228
+ "links": [
229
+ 5,
230
+ 11
231
+ ],
232
+ "shape": 3,
233
+ "slot_index": 2
234
+ }
235
+ ],
236
+ "properties": {
237
+ "Node name for S&R": "CheckpointLoaderSimple"
238
+ },
239
+ "widgets_values": [
240
+ "1.5/v1-5-pruned-emaonly.safetensors"
241
+ ]
242
+ },
243
+ {
244
+ "id": 11,
245
+ "type": "KSampler",
246
+ "pos": [
247
+ 1213,
248
+ 124
249
+ ],
250
+ "size": {
251
+ "0": 315,
252
+ "1": 474
253
+ },
254
+ "flags": {},
255
+ "order": 5,
256
+ "mode": 0,
257
+ "inputs": [
258
+ {
259
+ "name": "model",
260
+ "type": "MODEL",
261
+ "link": 9
262
+ },
263
+ {
264
+ "name": "positive",
265
+ "type": "CONDITIONING",
266
+ "link": 6
267
+ },
268
+ {
269
+ "name": "negative",
270
+ "type": "CONDITIONING",
271
+ "link": 13
272
+ },
273
+ {
274
+ "name": "latent_image",
275
+ "type": "LATENT",
276
+ "link": 8
277
+ }
278
+ ],
279
+ "outputs": [
280
+ {
281
+ "name": "LATENT",
282
+ "type": "LATENT",
283
+ "links": [
284
+ 10
285
+ ],
286
+ "shape": 3,
287
+ "slot_index": 0
288
+ }
289
+ ],
290
+ "properties": {
291
+ "Node name for S&R": "KSampler"
292
+ },
293
+ "widgets_values": [
294
+ 1077540641933383,
295
+ "randomize",
296
+ 20,
297
+ 8,
298
+ "euler",
299
+ "normal",
300
+ 0.6499999999999999
301
+ ]
302
+ },
303
+ {
304
+ "id": 14,
305
+ "type": "comfy-qr-by-image-size",
306
+ "pos": [
307
+ 264,
308
+ 659
309
+ ],
310
+ "size": {
311
+ "0": 400,
312
+ "1": 264
313
+ },
314
+ "flags": {},
315
+ "order": 1,
316
+ "mode": 0,
317
+ "outputs": [
318
+ {
319
+ "name": "QR_CODE",
320
+ "type": "IMAGE",
321
+ "links": [
322
+ 14
323
+ ],
324
+ "shape": 3,
325
+ "slot_index": 0
326
+ },
327
+ {
328
+ "name": "QR_VERSION",
329
+ "type": "INT",
330
+ "links": null,
331
+ "shape": 3
332
+ }
333
+ ],
334
+ "properties": {
335
+ "Node name for S&R": "comfy-qr-by-image-size"
336
+ },
337
+ "widgets_values": [
338
+ "Https",
339
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr",
340
+ 512,
341
+ "#000000",
342
+ "#DDDDDD",
343
+ "High",
344
+ 1,
345
+ "Nearest",
346
+ "Square"
347
+ ]
348
+ }
349
+ ],
350
+ "links": [
351
+ [
352
+ 2,
353
+ 6,
354
+ 1,
355
+ 7,
356
+ 0,
357
+ "CLIP"
358
+ ],
359
+ [
360
+ 3,
361
+ 6,
362
+ 1,
363
+ 8,
364
+ 0,
365
+ "CLIP"
366
+ ],
367
+ [
368
+ 5,
369
+ 6,
370
+ 2,
371
+ 9,
372
+ 1,
373
+ "VAE"
374
+ ],
375
+ [
376
+ 6,
377
+ 7,
378
+ 0,
379
+ 11,
380
+ 1,
381
+ "CONDITIONING"
382
+ ],
383
+ [
384
+ 8,
385
+ 9,
386
+ 0,
387
+ 11,
388
+ 3,
389
+ "LATENT"
390
+ ],
391
+ [
392
+ 9,
393
+ 6,
394
+ 0,
395
+ 11,
396
+ 0,
397
+ "MODEL"
398
+ ],
399
+ [
400
+ 10,
401
+ 11,
402
+ 0,
403
+ 13,
404
+ 0,
405
+ "LATENT"
406
+ ],
407
+ [
408
+ 11,
409
+ 6,
410
+ 2,
411
+ 13,
412
+ 1,
413
+ "VAE"
414
+ ],
415
+ [
416
+ 12,
417
+ 13,
418
+ 0,
419
+ 12,
420
+ 0,
421
+ "IMAGE"
422
+ ],
423
+ [
424
+ 13,
425
+ 8,
426
+ 0,
427
+ 11,
428
+ 2,
429
+ "CONDITIONING"
430
+ ],
431
+ [
432
+ 14,
433
+ 14,
434
+ 0,
435
+ 9,
436
+ 0,
437
+ "IMAGE"
438
+ ]
439
+ ],
440
+ "groups": [],
441
+ "config": {},
442
+ "extra": {},
443
+ "version": 0.4
444
+ }
custom_nodes/ComfyQR/examples/module-driven-control-net.json ADDED
@@ -0,0 +1,611 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 19,
3
+ "last_link_id": 27,
4
+ "nodes": [
5
+ {
6
+ "id": 13,
7
+ "type": "VAEDecode",
8
+ "pos": [
9
+ 1195,
10
+ 696
11
+ ],
12
+ "size": {
13
+ "0": 210,
14
+ "1": 46
15
+ },
16
+ "flags": {},
17
+ "order": 8,
18
+ "mode": 0,
19
+ "inputs": [
20
+ {
21
+ "name": "samples",
22
+ "type": "LATENT",
23
+ "link": 10
24
+ },
25
+ {
26
+ "name": "vae",
27
+ "type": "VAE",
28
+ "link": 11
29
+ }
30
+ ],
31
+ "outputs": [
32
+ {
33
+ "name": "IMAGE",
34
+ "type": "IMAGE",
35
+ "links": [
36
+ 12
37
+ ],
38
+ "shape": 3,
39
+ "slot_index": 0
40
+ }
41
+ ],
42
+ "properties": {
43
+ "Node name for S&R": "VAEDecode"
44
+ }
45
+ },
46
+ {
47
+ "id": 12,
48
+ "type": "SaveImage",
49
+ "pos": [
50
+ 1493,
51
+ 677
52
+ ],
53
+ "size": {
54
+ "0": 315,
55
+ "1": 270
56
+ },
57
+ "flags": {},
58
+ "order": 9,
59
+ "mode": 0,
60
+ "inputs": [
61
+ {
62
+ "name": "images",
63
+ "type": "IMAGE",
64
+ "link": 12
65
+ }
66
+ ],
67
+ "properties": {},
68
+ "widgets_values": [
69
+ "ComfyUI"
70
+ ]
71
+ },
72
+ {
73
+ "id": 6,
74
+ "type": "CheckpointLoaderSimple",
75
+ "pos": [
76
+ 220,
77
+ 182
78
+ ],
79
+ "size": {
80
+ "0": 315,
81
+ "1": 98
82
+ },
83
+ "flags": {},
84
+ "order": 0,
85
+ "mode": 0,
86
+ "outputs": [
87
+ {
88
+ "name": "MODEL",
89
+ "type": "MODEL",
90
+ "links": [
91
+ 9
92
+ ],
93
+ "shape": 3,
94
+ "slot_index": 0
95
+ },
96
+ {
97
+ "name": "CLIP",
98
+ "type": "CLIP",
99
+ "links": [
100
+ 2,
101
+ 3
102
+ ],
103
+ "shape": 3,
104
+ "slot_index": 1
105
+ },
106
+ {
107
+ "name": "VAE",
108
+ "type": "VAE",
109
+ "links": [
110
+ 11
111
+ ],
112
+ "shape": 3,
113
+ "slot_index": 2
114
+ }
115
+ ],
116
+ "properties": {
117
+ "Node name for S&R": "CheckpointLoaderSimple"
118
+ },
119
+ "widgets_values": [
120
+ "1.5/v1-5-pruned-emaonly.safetensors"
121
+ ]
122
+ },
123
+ {
124
+ "id": 15,
125
+ "type": "EmptyLatentImage",
126
+ "pos": [
127
+ 678,
128
+ 604
129
+ ],
130
+ "size": {
131
+ "0": 315,
132
+ "1": 106
133
+ },
134
+ "flags": {},
135
+ "order": 5,
136
+ "mode": 0,
137
+ "inputs": [
138
+ {
139
+ "name": "width",
140
+ "type": "INT",
141
+ "link": 26,
142
+ "widget": {
143
+ "name": "width",
144
+ "config": [
145
+ "INT",
146
+ {
147
+ "default": 512,
148
+ "min": 64,
149
+ "max": 8192,
150
+ "step": 8
151
+ }
152
+ ]
153
+ }
154
+ },
155
+ {
156
+ "name": "height",
157
+ "type": "INT",
158
+ "link": 27,
159
+ "widget": {
160
+ "name": "height",
161
+ "config": [
162
+ "INT",
163
+ {
164
+ "default": 512,
165
+ "min": 64,
166
+ "max": 8192,
167
+ "step": 8
168
+ }
169
+ ]
170
+ }
171
+ }
172
+ ],
173
+ "outputs": [
174
+ {
175
+ "name": "LATENT",
176
+ "type": "LATENT",
177
+ "links": [
178
+ 16
179
+ ],
180
+ "shape": 3,
181
+ "slot_index": 0
182
+ }
183
+ ],
184
+ "properties": {
185
+ "Node name for S&R": "EmptyLatentImage"
186
+ },
187
+ "widgets_values": [
188
+ 512,
189
+ 512,
190
+ 1
191
+ ]
192
+ },
193
+ {
194
+ "id": 7,
195
+ "type": "CLIPTextEncode",
196
+ "pos": [
197
+ 643,
198
+ 101
199
+ ],
200
+ "size": {
201
+ "0": 400,
202
+ "1": 200
203
+ },
204
+ "flags": {},
205
+ "order": 3,
206
+ "mode": 0,
207
+ "inputs": [
208
+ {
209
+ "name": "clip",
210
+ "type": "CLIP",
211
+ "link": 2
212
+ }
213
+ ],
214
+ "outputs": [
215
+ {
216
+ "name": "CONDITIONING",
217
+ "type": "CONDITIONING",
218
+ "links": [
219
+ 17
220
+ ],
221
+ "shape": 3,
222
+ "slot_index": 0
223
+ }
224
+ ],
225
+ "properties": {
226
+ "Node name for S&R": "CLIPTextEncode"
227
+ },
228
+ "widgets_values": [
229
+ "Adorable puppies"
230
+ ]
231
+ },
232
+ {
233
+ "id": 18,
234
+ "type": "ControlNetLoader",
235
+ "pos": [
236
+ 227,
237
+ 366
238
+ ],
239
+ "size": {
240
+ "0": 315,
241
+ "1": 58
242
+ },
243
+ "flags": {},
244
+ "order": 1,
245
+ "mode": 0,
246
+ "outputs": [
247
+ {
248
+ "name": "CONTROL_NET",
249
+ "type": "CONTROL_NET",
250
+ "links": [
251
+ 19
252
+ ],
253
+ "shape": 3,
254
+ "slot_index": 0
255
+ }
256
+ ],
257
+ "properties": {
258
+ "Node name for S&R": "ControlNetLoader"
259
+ },
260
+ "widgets_values": [
261
+ "control_v1p_sd15_qrcode_monster_v2.safetensors"
262
+ ]
263
+ },
264
+ {
265
+ "id": 11,
266
+ "type": "KSampler",
267
+ "pos": [
268
+ 1213,
269
+ 124
270
+ ],
271
+ "size": {
272
+ "0": 315,
273
+ "1": 474
274
+ },
275
+ "flags": {},
276
+ "order": 7,
277
+ "mode": 0,
278
+ "inputs": [
279
+ {
280
+ "name": "model",
281
+ "type": "MODEL",
282
+ "link": 9
283
+ },
284
+ {
285
+ "name": "positive",
286
+ "type": "CONDITIONING",
287
+ "link": 24
288
+ },
289
+ {
290
+ "name": "negative",
291
+ "type": "CONDITIONING",
292
+ "link": 22
293
+ },
294
+ {
295
+ "name": "latent_image",
296
+ "type": "LATENT",
297
+ "link": 16
298
+ }
299
+ ],
300
+ "outputs": [
301
+ {
302
+ "name": "LATENT",
303
+ "type": "LATENT",
304
+ "links": [
305
+ 10
306
+ ],
307
+ "shape": 3,
308
+ "slot_index": 0
309
+ }
310
+ ],
311
+ "properties": {
312
+ "Node name for S&R": "KSampler"
313
+ },
314
+ "widgets_values": [
315
+ 123662286732457,
316
+ "randomize",
317
+ 20,
318
+ 8,
319
+ "euler",
320
+ "normal",
321
+ 1
322
+ ]
323
+ },
324
+ {
325
+ "id": 8,
326
+ "type": "CLIPTextEncode",
327
+ "pos": [
328
+ 656,
329
+ 351
330
+ ],
331
+ "size": {
332
+ "0": 400,
333
+ "1": 200
334
+ },
335
+ "flags": {},
336
+ "order": 4,
337
+ "mode": 0,
338
+ "inputs": [
339
+ {
340
+ "name": "clip",
341
+ "type": "CLIP",
342
+ "link": 3
343
+ }
344
+ ],
345
+ "outputs": [
346
+ {
347
+ "name": "CONDITIONING",
348
+ "type": "CONDITIONING",
349
+ "links": [
350
+ 23
351
+ ],
352
+ "shape": 3,
353
+ "slot_index": 0
354
+ }
355
+ ],
356
+ "properties": {
357
+ "Node name for S&R": "CLIPTextEncode"
358
+ },
359
+ "widgets_values": [
360
+ "worst quality"
361
+ ]
362
+ },
363
+ {
364
+ "id": 17,
365
+ "type": "ControlNetApplyAdvanced",
366
+ "pos": [
367
+ 804,
368
+ 796
369
+ ],
370
+ "size": {
371
+ "0": 315,
372
+ "1": 166
373
+ },
374
+ "flags": {},
375
+ "order": 6,
376
+ "mode": 0,
377
+ "inputs": [
378
+ {
379
+ "name": "positive",
380
+ "type": "CONDITIONING",
381
+ "link": 17
382
+ },
383
+ {
384
+ "name": "negative",
385
+ "type": "CONDITIONING",
386
+ "link": 23
387
+ },
388
+ {
389
+ "name": "control_net",
390
+ "type": "CONTROL_NET",
391
+ "link": 19
392
+ },
393
+ {
394
+ "name": "image",
395
+ "type": "IMAGE",
396
+ "link": 25
397
+ }
398
+ ],
399
+ "outputs": [
400
+ {
401
+ "name": "positive",
402
+ "type": "CONDITIONING",
403
+ "links": [
404
+ 24
405
+ ],
406
+ "shape": 3,
407
+ "slot_index": 0
408
+ },
409
+ {
410
+ "name": "negative",
411
+ "type": "CONDITIONING",
412
+ "links": [
413
+ 22
414
+ ],
415
+ "shape": 3,
416
+ "slot_index": 1
417
+ }
418
+ ],
419
+ "properties": {
420
+ "Node name for S&R": "ControlNetApplyAdvanced"
421
+ },
422
+ "widgets_values": [
423
+ 1.6,
424
+ 0,
425
+ 1
426
+ ]
427
+ },
428
+ {
429
+ "id": 19,
430
+ "type": "comfy-qr-by-module-size",
431
+ "pos": [
432
+ 191,
433
+ 629
434
+ ],
435
+ "size": {
436
+ "0": 400,
437
+ "1": 284
438
+ },
439
+ "flags": {},
440
+ "order": 2,
441
+ "mode": 0,
442
+ "outputs": [
443
+ {
444
+ "name": "QR_CODE",
445
+ "type": "IMAGE",
446
+ "links": [
447
+ 25
448
+ ],
449
+ "shape": 3,
450
+ "slot_index": 0
451
+ },
452
+ {
453
+ "name": "QR_VERSION",
454
+ "type": "INT",
455
+ "links": null,
456
+ "shape": 3
457
+ },
458
+ {
459
+ "name": "IMAGE_SIZE",
460
+ "type": "INT",
461
+ "links": [
462
+ 26,
463
+ 27
464
+ ],
465
+ "shape": 3,
466
+ "slot_index": 2
467
+ }
468
+ ],
469
+ "properties": {
470
+ "Node name for S&R": "comfy-qr-by-module-size"
471
+ },
472
+ "widgets_values": [
473
+ "Https",
474
+ "gitlab.com/sofuego-comfy-nodes",
475
+ 16,
476
+ 512,
477
+ "#000000",
478
+ "#FFFFFF",
479
+ "Medium",
480
+ 1,
481
+ "Square"
482
+ ]
483
+ }
484
+ ],
485
+ "links": [
486
+ [
487
+ 2,
488
+ 6,
489
+ 1,
490
+ 7,
491
+ 0,
492
+ "CLIP"
493
+ ],
494
+ [
495
+ 3,
496
+ 6,
497
+ 1,
498
+ 8,
499
+ 0,
500
+ "CLIP"
501
+ ],
502
+ [
503
+ 9,
504
+ 6,
505
+ 0,
506
+ 11,
507
+ 0,
508
+ "MODEL"
509
+ ],
510
+ [
511
+ 10,
512
+ 11,
513
+ 0,
514
+ 13,
515
+ 0,
516
+ "LATENT"
517
+ ],
518
+ [
519
+ 11,
520
+ 6,
521
+ 2,
522
+ 13,
523
+ 1,
524
+ "VAE"
525
+ ],
526
+ [
527
+ 12,
528
+ 13,
529
+ 0,
530
+ 12,
531
+ 0,
532
+ "IMAGE"
533
+ ],
534
+ [
535
+ 16,
536
+ 15,
537
+ 0,
538
+ 11,
539
+ 3,
540
+ "LATENT"
541
+ ],
542
+ [
543
+ 17,
544
+ 7,
545
+ 0,
546
+ 17,
547
+ 0,
548
+ "CONDITIONING"
549
+ ],
550
+ [
551
+ 19,
552
+ 18,
553
+ 0,
554
+ 17,
555
+ 2,
556
+ "CONTROL_NET"
557
+ ],
558
+ [
559
+ 22,
560
+ 17,
561
+ 1,
562
+ 11,
563
+ 2,
564
+ "CONDITIONING"
565
+ ],
566
+ [
567
+ 23,
568
+ 8,
569
+ 0,
570
+ 17,
571
+ 1,
572
+ "CONDITIONING"
573
+ ],
574
+ [
575
+ 24,
576
+ 17,
577
+ 0,
578
+ 11,
579
+ 1,
580
+ "CONDITIONING"
581
+ ],
582
+ [
583
+ 25,
584
+ 19,
585
+ 0,
586
+ 17,
587
+ 3,
588
+ "IMAGE"
589
+ ],
590
+ [
591
+ 26,
592
+ 19,
593
+ 2,
594
+ 15,
595
+ 0,
596
+ "INT"
597
+ ],
598
+ [
599
+ 27,
600
+ 19,
601
+ 2,
602
+ 15,
603
+ 1,
604
+ "INT"
605
+ ]
606
+ ],
607
+ "groups": [],
608
+ "config": {},
609
+ "extra": {},
610
+ "version": 0.4
611
+ }
custom_nodes/ComfyQR/examples/noisy-latent-split-controlnet-validated.json ADDED
@@ -0,0 +1,2864 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 69,
3
+ "last_link_id": 158,
4
+ "nodes": [
5
+ {
6
+ "id": 13,
7
+ "type": "VAEDecode",
8
+ "pos": [
9
+ 1272,
10
+ 671
11
+ ],
12
+ "size": {
13
+ "0": 210,
14
+ "1": 46
15
+ },
16
+ "flags": {},
17
+ "order": 34,
18
+ "mode": 0,
19
+ "inputs": [
20
+ {
21
+ "name": "samples",
22
+ "type": "LATENT",
23
+ "link": 63
24
+ },
25
+ {
26
+ "name": "vae",
27
+ "type": "VAE",
28
+ "link": 11
29
+ }
30
+ ],
31
+ "outputs": [
32
+ {
33
+ "name": "IMAGE",
34
+ "type": "IMAGE",
35
+ "links": [
36
+ 25,
37
+ 28
38
+ ],
39
+ "shape": 3,
40
+ "slot_index": 0
41
+ }
42
+ ],
43
+ "properties": {
44
+ "Node name for S&R": "VAEDecode"
45
+ }
46
+ },
47
+ {
48
+ "id": 21,
49
+ "type": "ImagePadForOutpaint",
50
+ "pos": [
51
+ 1227,
52
+ 790
53
+ ],
54
+ "size": {
55
+ "0": 315,
56
+ "1": 174
57
+ },
58
+ "flags": {},
59
+ "order": 35,
60
+ "mode": 0,
61
+ "inputs": [
62
+ {
63
+ "name": "image",
64
+ "type": "IMAGE",
65
+ "link": 25
66
+ }
67
+ ],
68
+ "outputs": [
69
+ {
70
+ "name": "IMAGE",
71
+ "type": "IMAGE",
72
+ "links": [
73
+ 26
74
+ ],
75
+ "shape": 3,
76
+ "slot_index": 0
77
+ },
78
+ {
79
+ "name": "MASK",
80
+ "type": "MASK",
81
+ "links": null,
82
+ "shape": 3
83
+ }
84
+ ],
85
+ "properties": {
86
+ "Node name for S&R": "ImagePadForOutpaint"
87
+ },
88
+ "widgets_values": [
89
+ 40,
90
+ 40,
91
+ 40,
92
+ 40,
93
+ 0
94
+ ]
95
+ },
96
+ {
97
+ "id": 19,
98
+ "type": "comfy-qr-read",
99
+ "pos": [
100
+ 1243,
101
+ 1046
102
+ ],
103
+ "size": {
104
+ "0": 315,
105
+ "1": 58
106
+ },
107
+ "flags": {},
108
+ "order": 36,
109
+ "mode": 0,
110
+ "inputs": [
111
+ {
112
+ "name": "image",
113
+ "type": "IMAGE",
114
+ "link": 26
115
+ }
116
+ ],
117
+ "outputs": [
118
+ {
119
+ "name": "EXTRACTED_TEXT",
120
+ "type": "STRING",
121
+ "links": [
122
+ 27
123
+ ],
124
+ "shape": 3,
125
+ "slot_index": 0
126
+ }
127
+ ],
128
+ "properties": {
129
+ "Node name for S&R": "comfy-qr-read"
130
+ },
131
+ "widgets_values": [
132
+ "pyzbar"
133
+ ]
134
+ },
135
+ {
136
+ "id": 47,
137
+ "type": "MaskToImage",
138
+ "pos": [
139
+ -242,
140
+ 776
141
+ ],
142
+ "size": {
143
+ "0": 210,
144
+ "1": 26
145
+ },
146
+ "flags": {},
147
+ "order": 20,
148
+ "mode": 0,
149
+ "inputs": [
150
+ {
151
+ "name": "mask",
152
+ "type": "MASK",
153
+ "link": 104
154
+ }
155
+ ],
156
+ "outputs": [
157
+ {
158
+ "name": "IMAGE",
159
+ "type": "IMAGE",
160
+ "links": null,
161
+ "shape": 3
162
+ }
163
+ ],
164
+ "properties": {
165
+ "Node name for S&R": "MaskToImage"
166
+ }
167
+ },
168
+ {
169
+ "id": 49,
170
+ "type": "MaskComposite",
171
+ "pos": [
172
+ 25,
173
+ 841
174
+ ],
175
+ "size": {
176
+ "0": 315,
177
+ "1": 126
178
+ },
179
+ "flags": {},
180
+ "order": 21,
181
+ "mode": 0,
182
+ "inputs": [
183
+ {
184
+ "name": "destination",
185
+ "type": "MASK",
186
+ "link": 107
187
+ },
188
+ {
189
+ "name": "source",
190
+ "type": "MASK",
191
+ "link": 106
192
+ },
193
+ {
194
+ "name": "x",
195
+ "type": "INT",
196
+ "link": 117,
197
+ "widget": {
198
+ "name": "x",
199
+ "config": [
200
+ "INT",
201
+ {
202
+ "default": 0,
203
+ "min": 0,
204
+ "max": 8192,
205
+ "step": 1
206
+ }
207
+ ]
208
+ }
209
+ },
210
+ {
211
+ "name": "y",
212
+ "type": "INT",
213
+ "link": 121,
214
+ "widget": {
215
+ "name": "y",
216
+ "config": [
217
+ "INT",
218
+ {
219
+ "default": 0,
220
+ "min": 0,
221
+ "max": 8192,
222
+ "step": 1
223
+ }
224
+ ]
225
+ }
226
+ }
227
+ ],
228
+ "outputs": [
229
+ {
230
+ "name": "MASK",
231
+ "type": "MASK",
232
+ "links": [
233
+ 124
234
+ ],
235
+ "shape": 3,
236
+ "slot_index": 0
237
+ }
238
+ ],
239
+ "properties": {
240
+ "Node name for S&R": "MaskComposite"
241
+ },
242
+ "widgets_values": [
243
+ 48,
244
+ 48,
245
+ "add"
246
+ ]
247
+ },
248
+ {
249
+ "id": 44,
250
+ "type": "ImageCompositeMasked",
251
+ "pos": [
252
+ 29,
253
+ 663
254
+ ],
255
+ "size": {
256
+ "0": 315,
257
+ "1": 122
258
+ },
259
+ "flags": {},
260
+ "order": 24,
261
+ "mode": 0,
262
+ "inputs": [
263
+ {
264
+ "name": "destination",
265
+ "type": "IMAGE",
266
+ "link": 146
267
+ },
268
+ {
269
+ "name": "source",
270
+ "type": "IMAGE",
271
+ "link": 127
272
+ },
273
+ {
274
+ "name": "mask",
275
+ "type": "MASK",
276
+ "link": null
277
+ },
278
+ {
279
+ "name": "x",
280
+ "type": "INT",
281
+ "link": 115,
282
+ "widget": {
283
+ "name": "x",
284
+ "config": [
285
+ "INT",
286
+ {
287
+ "default": 0,
288
+ "min": 0,
289
+ "max": 8192,
290
+ "step": 1
291
+ }
292
+ ]
293
+ }
294
+ },
295
+ {
296
+ "name": "y",
297
+ "type": "INT",
298
+ "link": 120,
299
+ "widget": {
300
+ "name": "y",
301
+ "config": [
302
+ "INT",
303
+ {
304
+ "default": 0,
305
+ "min": 0,
306
+ "max": 8192,
307
+ "step": 1
308
+ }
309
+ ]
310
+ }
311
+ }
312
+ ],
313
+ "outputs": [
314
+ {
315
+ "name": "IMAGE",
316
+ "type": "IMAGE",
317
+ "links": [
318
+ 123,
319
+ 132
320
+ ],
321
+ "shape": 3,
322
+ "slot_index": 0
323
+ }
324
+ ],
325
+ "title": "Finder Layer Composite",
326
+ "properties": {
327
+ "Node name for S&R": "ImageCompositeMasked"
328
+ },
329
+ "widgets_values": [
330
+ 48,
331
+ 48
332
+ ]
333
+ },
334
+ {
335
+ "id": 8,
336
+ "type": "CLIPTextEncode",
337
+ "pos": [
338
+ 372,
339
+ 47
340
+ ],
341
+ "size": {
342
+ "0": 400,
343
+ "1": 200
344
+ },
345
+ "flags": {},
346
+ "order": 14,
347
+ "mode": 0,
348
+ "inputs": [
349
+ {
350
+ "name": "clip",
351
+ "type": "CLIP",
352
+ "link": 3
353
+ }
354
+ ],
355
+ "outputs": [
356
+ {
357
+ "name": "CONDITIONING",
358
+ "type": "CONDITIONING",
359
+ "links": [
360
+ 23,
361
+ 34,
362
+ 88
363
+ ],
364
+ "shape": 3,
365
+ "slot_index": 0
366
+ }
367
+ ],
368
+ "title": "Negative Prompt",
369
+ "properties": {
370
+ "Node name for S&R": "CLIPTextEncode"
371
+ },
372
+ "widgets_values": [
373
+ "worst quality"
374
+ ]
375
+ },
376
+ {
377
+ "id": 7,
378
+ "type": "CLIPTextEncode",
379
+ "pos": [
380
+ 376,
381
+ -201
382
+ ],
383
+ "size": {
384
+ "0": 400,
385
+ "1": 200
386
+ },
387
+ "flags": {},
388
+ "order": 13,
389
+ "mode": 0,
390
+ "inputs": [
391
+ {
392
+ "name": "clip",
393
+ "type": "CLIP",
394
+ "link": 2
395
+ }
396
+ ],
397
+ "outputs": [
398
+ {
399
+ "name": "CONDITIONING",
400
+ "type": "CONDITIONING",
401
+ "links": [
402
+ 17,
403
+ 87
404
+ ],
405
+ "shape": 3,
406
+ "slot_index": 0
407
+ }
408
+ ],
409
+ "title": "Positive Prompt",
410
+ "properties": {
411
+ "Node name for S&R": "CLIPTextEncode"
412
+ },
413
+ "widgets_values": [
414
+ "Hot lava"
415
+ ]
416
+ },
417
+ {
418
+ "id": 39,
419
+ "type": "comfy-qr-by-module-split",
420
+ "pos": [
421
+ -422,
422
+ 353
423
+ ],
424
+ "size": [
425
+ 400,
426
+ 344
427
+ ],
428
+ "flags": {},
429
+ "order": 16,
430
+ "mode": 0,
431
+ "inputs": [
432
+ {
433
+ "name": "text",
434
+ "type": "STRING",
435
+ "link": 155,
436
+ "widget": {
437
+ "name": "text",
438
+ "config": [
439
+ "STRING",
440
+ {
441
+ "multiline": true
442
+ }
443
+ ]
444
+ }
445
+ },
446
+ {
447
+ "name": "protocol",
448
+ "type": "Http,Https,None",
449
+ "link": 156,
450
+ "widget": {
451
+ "name": "protocol",
452
+ "config": [
453
+ [
454
+ "Http",
455
+ "Https",
456
+ "None"
457
+ ],
458
+ {
459
+ "default": "Https"
460
+ }
461
+ ]
462
+ }
463
+ }
464
+ ],
465
+ "outputs": [
466
+ {
467
+ "name": "QR_FLATTENED",
468
+ "type": "IMAGE",
469
+ "links": [
470
+ 102
471
+ ],
472
+ "shape": 3,
473
+ "slot_index": 0
474
+ },
475
+ {
476
+ "name": "MODULE_LAYER",
477
+ "type": "IMAGE",
478
+ "links": [
479
+ 126
480
+ ],
481
+ "shape": 3,
482
+ "slot_index": 1
483
+ },
484
+ {
485
+ "name": "FINDER_LAYER",
486
+ "type": "IMAGE",
487
+ "links": [
488
+ 127
489
+ ],
490
+ "shape": 3,
491
+ "slot_index": 2
492
+ },
493
+ {
494
+ "name": "FINDER_MASK",
495
+ "type": "MASK",
496
+ "links": [
497
+ 104,
498
+ 106
499
+ ],
500
+ "shape": 3,
501
+ "slot_index": 3
502
+ },
503
+ {
504
+ "name": "QR_VERSION",
505
+ "type": "INT",
506
+ "links": null,
507
+ "shape": 3
508
+ },
509
+ {
510
+ "name": "IMAGE_SIZE",
511
+ "type": "INT",
512
+ "links": null,
513
+ "shape": 3
514
+ }
515
+ ],
516
+ "properties": {
517
+ "Node name for S&R": "comfy-qr-by-module-split"
518
+ },
519
+ "widgets_values": [
520
+ "Https",
521
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr",
522
+ 16,
523
+ 768,
524
+ "#000000",
525
+ "#FFFFFF",
526
+ "High",
527
+ 1,
528
+ "Square"
529
+ ]
530
+ },
531
+ {
532
+ "id": 54,
533
+ "type": "PrimitiveNode",
534
+ "pos": [
535
+ -594,
536
+ 733
537
+ ],
538
+ "size": {
539
+ "0": 210,
540
+ "1": 82
541
+ },
542
+ "flags": {},
543
+ "order": 0,
544
+ "mode": 0,
545
+ "outputs": [
546
+ {
547
+ "name": "INT",
548
+ "type": "INT",
549
+ "links": [
550
+ 114,
551
+ 115,
552
+ 116,
553
+ 117
554
+ ],
555
+ "slot_index": 0,
556
+ "widget": {
557
+ "name": "x",
558
+ "config": [
559
+ "INT",
560
+ {
561
+ "default": 0,
562
+ "min": 0,
563
+ "max": 8192,
564
+ "step": 1
565
+ }
566
+ ]
567
+ }
568
+ }
569
+ ],
570
+ "title": "X Offset",
571
+ "properties": {},
572
+ "widgets_values": [
573
+ 48,
574
+ "fixed"
575
+ ]
576
+ },
577
+ {
578
+ "id": 55,
579
+ "type": "PrimitiveNode",
580
+ "pos": [
581
+ -592,
582
+ 863
583
+ ],
584
+ "size": {
585
+ "0": 210,
586
+ "1": 82
587
+ },
588
+ "flags": {},
589
+ "order": 1,
590
+ "mode": 0,
591
+ "outputs": [
592
+ {
593
+ "name": "INT",
594
+ "type": "INT",
595
+ "links": [
596
+ 118,
597
+ 119,
598
+ 120,
599
+ 121
600
+ ],
601
+ "slot_index": 0,
602
+ "widget": {
603
+ "name": "y",
604
+ "config": [
605
+ "INT",
606
+ {
607
+ "default": 0,
608
+ "min": 0,
609
+ "max": 8192,
610
+ "step": 1
611
+ }
612
+ ]
613
+ }
614
+ }
615
+ ],
616
+ "title": "Y Offset",
617
+ "properties": {},
618
+ "widgets_values": [
619
+ 48,
620
+ "fixed"
621
+ ]
622
+ },
623
+ {
624
+ "id": 29,
625
+ "type": "LatentCompositeMasked",
626
+ "pos": [
627
+ 1234,
628
+ 432
629
+ ],
630
+ "size": {
631
+ "0": 315,
632
+ "1": 122
633
+ },
634
+ "flags": {},
635
+ "order": 32,
636
+ "mode": 0,
637
+ "inputs": [
638
+ {
639
+ "name": "destination",
640
+ "type": "LATENT",
641
+ "link": 57
642
+ },
643
+ {
644
+ "name": "source",
645
+ "type": "LATENT",
646
+ "link": 65
647
+ },
648
+ {
649
+ "name": "mask",
650
+ "type": "MASK",
651
+ "link": 124
652
+ }
653
+ ],
654
+ "outputs": [
655
+ {
656
+ "name": "LATENT",
657
+ "type": "LATENT",
658
+ "links": [
659
+ 64
660
+ ],
661
+ "shape": 3,
662
+ "slot_index": 0
663
+ }
664
+ ],
665
+ "properties": {
666
+ "Node name for S&R": "LatentCompositeMasked"
667
+ },
668
+ "widgets_values": [
669
+ 0,
670
+ 0
671
+ ]
672
+ },
673
+ {
674
+ "id": 18,
675
+ "type": "ControlNetLoader",
676
+ "pos": [
677
+ 27,
678
+ 217
679
+ ],
680
+ "size": {
681
+ "0": 315,
682
+ "1": 58
683
+ },
684
+ "flags": {},
685
+ "order": 2,
686
+ "mode": 0,
687
+ "outputs": [
688
+ {
689
+ "name": "CONTROL_NET",
690
+ "type": "CONTROL_NET",
691
+ "links": [
692
+ 19,
693
+ 35,
694
+ 92
695
+ ],
696
+ "shape": 3,
697
+ "slot_index": 0
698
+ }
699
+ ],
700
+ "properties": {
701
+ "Node name for S&R": "ControlNetLoader"
702
+ },
703
+ "widgets_values": [
704
+ "control_v1p_sd15_qrcode_monster_v2.safetensors"
705
+ ]
706
+ },
707
+ {
708
+ "id": 20,
709
+ "type": "comfy-qr-validate",
710
+ "pos": [
711
+ 1581,
712
+ 685
713
+ ],
714
+ "size": [
715
+ 400,
716
+ 200
717
+ ],
718
+ "flags": {},
719
+ "order": 37,
720
+ "mode": 0,
721
+ "inputs": [
722
+ {
723
+ "name": "image",
724
+ "type": "IMAGE",
725
+ "link": 28
726
+ },
727
+ {
728
+ "name": "extracted_text",
729
+ "type": "STRING",
730
+ "link": 27
731
+ },
732
+ {
733
+ "name": "protocol",
734
+ "type": "Http,Https,None",
735
+ "link": 157,
736
+ "widget": {
737
+ "name": "protocol",
738
+ "config": [
739
+ [
740
+ "Http",
741
+ "Https",
742
+ "None"
743
+ ],
744
+ {
745
+ "default": "Https"
746
+ }
747
+ ]
748
+ }
749
+ },
750
+ {
751
+ "name": "text",
752
+ "type": "STRING",
753
+ "link": 158,
754
+ "widget": {
755
+ "name": "text",
756
+ "config": [
757
+ "STRING",
758
+ {
759
+ "multiline": true
760
+ }
761
+ ]
762
+ }
763
+ }
764
+ ],
765
+ "outputs": [
766
+ {
767
+ "name": "IMAGE",
768
+ "type": "IMAGE",
769
+ "links": [
770
+ 130
771
+ ],
772
+ "shape": 3,
773
+ "slot_index": 0
774
+ },
775
+ {
776
+ "name": "VALIDATION_CODE",
777
+ "type": "INT",
778
+ "links": null,
779
+ "shape": 3
780
+ }
781
+ ],
782
+ "properties": {
783
+ "Node name for S&R": "comfy-qr-validate"
784
+ },
785
+ "widgets_values": [
786
+ "Https",
787
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr",
788
+ "False"
789
+ ]
790
+ },
791
+ {
792
+ "id": 23,
793
+ "type": "ControlNetApplyAdvanced",
794
+ "pos": [
795
+ 480,
796
+ 809
797
+ ],
798
+ "size": {
799
+ "0": 315,
800
+ "1": 166
801
+ },
802
+ "flags": {},
803
+ "order": 28,
804
+ "mode": 0,
805
+ "inputs": [
806
+ {
807
+ "name": "positive",
808
+ "type": "CONDITIONING",
809
+ "link": 135
810
+ },
811
+ {
812
+ "name": "negative",
813
+ "type": "CONDITIONING",
814
+ "link": 34
815
+ },
816
+ {
817
+ "name": "control_net",
818
+ "type": "CONTROL_NET",
819
+ "link": 35
820
+ },
821
+ {
822
+ "name": "image",
823
+ "type": "IMAGE",
824
+ "link": 123
825
+ }
826
+ ],
827
+ "outputs": [
828
+ {
829
+ "name": "positive",
830
+ "type": "CONDITIONING",
831
+ "links": [
832
+ 136
833
+ ],
834
+ "shape": 3,
835
+ "slot_index": 0
836
+ },
837
+ {
838
+ "name": "negative",
839
+ "type": "CONDITIONING",
840
+ "links": [
841
+ 48
842
+ ],
843
+ "shape": 3,
844
+ "slot_index": 1
845
+ }
846
+ ],
847
+ "title": "ControlNet (FG)",
848
+ "properties": {
849
+ "Node name for S&R": "ControlNetApplyAdvanced"
850
+ },
851
+ "widgets_values": [
852
+ 3,
853
+ 0,
854
+ 1
855
+ ]
856
+ },
857
+ {
858
+ "id": 57,
859
+ "type": "CLIPTextEncode",
860
+ "pos": [
861
+ 413,
862
+ 1033
863
+ ],
864
+ "size": {
865
+ "0": 400,
866
+ "1": 200
867
+ },
868
+ "flags": {},
869
+ "order": 15,
870
+ "mode": 0,
871
+ "inputs": [
872
+ {
873
+ "name": "clip",
874
+ "type": "CLIP",
875
+ "link": 134
876
+ }
877
+ ],
878
+ "outputs": [
879
+ {
880
+ "name": "CONDITIONING",
881
+ "type": "CONDITIONING",
882
+ "links": [
883
+ 135
884
+ ],
885
+ "shape": 3,
886
+ "slot_index": 0
887
+ }
888
+ ],
889
+ "title": "Finder Layer Prompt",
890
+ "properties": {
891
+ "Node name for S&R": "CLIPTextEncode"
892
+ },
893
+ "widgets_values": [
894
+ "Yellow with black markings"
895
+ ]
896
+ },
897
+ {
898
+ "id": 36,
899
+ "type": "VAEEncode",
900
+ "pos": [
901
+ 522,
902
+ 689
903
+ ],
904
+ "size": {
905
+ "0": 210,
906
+ "1": 46
907
+ },
908
+ "flags": {},
909
+ "order": 29,
910
+ "mode": 0,
911
+ "inputs": [
912
+ {
913
+ "name": "pixels",
914
+ "type": "IMAGE",
915
+ "link": 132
916
+ },
917
+ {
918
+ "name": "vae",
919
+ "type": "VAE",
920
+ "link": 78
921
+ }
922
+ ],
923
+ "outputs": [
924
+ {
925
+ "name": "LATENT",
926
+ "type": "LATENT",
927
+ "links": [
928
+ 80
929
+ ],
930
+ "shape": 3,
931
+ "slot_index": 0
932
+ }
933
+ ],
934
+ "title": "VAE Encode (FG)",
935
+ "properties": {
936
+ "Node name for S&R": "VAEEncode"
937
+ }
938
+ },
939
+ {
940
+ "id": 63,
941
+ "type": "VAEEncode",
942
+ "pos": [
943
+ 519,
944
+ 550
945
+ ],
946
+ "size": {
947
+ "0": 210,
948
+ "1": 46
949
+ },
950
+ "flags": {},
951
+ "order": 27,
952
+ "mode": 0,
953
+ "inputs": [
954
+ {
955
+ "name": "pixels",
956
+ "type": "IMAGE",
957
+ "link": 140
958
+ },
959
+ {
960
+ "name": "vae",
961
+ "type": "VAE",
962
+ "link": 141
963
+ }
964
+ ],
965
+ "outputs": [
966
+ {
967
+ "name": "LATENT",
968
+ "type": "LATENT",
969
+ "links": [
970
+ 139
971
+ ],
972
+ "shape": 3,
973
+ "slot_index": 0
974
+ }
975
+ ],
976
+ "title": "VAE Encode (BG)",
977
+ "properties": {
978
+ "Node name for S&R": "VAEEncode"
979
+ }
980
+ },
981
+ {
982
+ "id": 52,
983
+ "type": "PrimitiveNode",
984
+ "pos": [
985
+ -591,
986
+ 991
987
+ ],
988
+ "size": {
989
+ "0": 210,
990
+ "1": 82
991
+ },
992
+ "flags": {},
993
+ "order": 3,
994
+ "mode": 0,
995
+ "outputs": [
996
+ {
997
+ "name": "INT",
998
+ "type": "INT",
999
+ "links": [
1000
+ 110,
1001
+ 112
1002
+ ],
1003
+ "slot_index": 0,
1004
+ "widget": {
1005
+ "name": "width",
1006
+ "config": [
1007
+ "INT",
1008
+ {
1009
+ "default": 512,
1010
+ "min": 1,
1011
+ "max": 8192,
1012
+ "step": 1
1013
+ }
1014
+ ]
1015
+ }
1016
+ }
1017
+ ],
1018
+ "title": "Width",
1019
+ "properties": {},
1020
+ "widgets_values": [
1021
+ 768,
1022
+ "fixed"
1023
+ ]
1024
+ },
1025
+ {
1026
+ "id": 53,
1027
+ "type": "PrimitiveNode",
1028
+ "pos": [
1029
+ -593,
1030
+ 1130
1031
+ ],
1032
+ "size": {
1033
+ "0": 210,
1034
+ "1": 82
1035
+ },
1036
+ "flags": {},
1037
+ "order": 4,
1038
+ "mode": 0,
1039
+ "outputs": [
1040
+ {
1041
+ "name": "INT",
1042
+ "type": "INT",
1043
+ "links": [
1044
+ 111,
1045
+ 113,
1046
+ 144,
1047
+ 145
1048
+ ],
1049
+ "slot_index": 0,
1050
+ "widget": {
1051
+ "name": "height",
1052
+ "config": [
1053
+ "INT",
1054
+ {
1055
+ "default": 512,
1056
+ "min": 1,
1057
+ "max": 8192,
1058
+ "step": 1
1059
+ }
1060
+ ]
1061
+ }
1062
+ }
1063
+ ],
1064
+ "title": "Height",
1065
+ "properties": {},
1066
+ "widgets_values": [
1067
+ 768,
1068
+ "fixed"
1069
+ ]
1070
+ },
1071
+ {
1072
+ "id": 64,
1073
+ "type": "SolidMask",
1074
+ "pos": [
1075
+ -344,
1076
+ 1263
1077
+ ],
1078
+ "size": {
1079
+ "0": 315,
1080
+ "1": 106
1081
+ },
1082
+ "flags": {},
1083
+ "order": 12,
1084
+ "mode": 0,
1085
+ "inputs": [
1086
+ {
1087
+ "name": "width",
1088
+ "type": "INT",
1089
+ "link": 144,
1090
+ "widget": {
1091
+ "name": "width",
1092
+ "config": [
1093
+ "INT",
1094
+ {
1095
+ "default": 512,
1096
+ "min": 1,
1097
+ "max": 8192,
1098
+ "step": 1
1099
+ }
1100
+ ]
1101
+ }
1102
+ },
1103
+ {
1104
+ "name": "height",
1105
+ "type": "INT",
1106
+ "link": 145,
1107
+ "widget": {
1108
+ "name": "height",
1109
+ "config": [
1110
+ "INT",
1111
+ {
1112
+ "default": 512,
1113
+ "min": 1,
1114
+ "max": 8192,
1115
+ "step": 1
1116
+ }
1117
+ ]
1118
+ }
1119
+ }
1120
+ ],
1121
+ "outputs": [
1122
+ {
1123
+ "name": "MASK",
1124
+ "type": "MASK",
1125
+ "links": [
1126
+ 142
1127
+ ],
1128
+ "shape": 3,
1129
+ "slot_index": 0
1130
+ }
1131
+ ],
1132
+ "title": "SolidMask (White)",
1133
+ "properties": {
1134
+ "Node name for S&R": "SolidMask"
1135
+ },
1136
+ "widgets_values": [
1137
+ 1,
1138
+ 768,
1139
+ 768
1140
+ ]
1141
+ },
1142
+ {
1143
+ "id": 40,
1144
+ "type": "SolidMask",
1145
+ "pos": [
1146
+ -347,
1147
+ 949
1148
+ ],
1149
+ "size": {
1150
+ "0": 315,
1151
+ "1": 106
1152
+ },
1153
+ "flags": {},
1154
+ "order": 10,
1155
+ "mode": 0,
1156
+ "inputs": [
1157
+ {
1158
+ "name": "width",
1159
+ "type": "INT",
1160
+ "link": 110,
1161
+ "widget": {
1162
+ "name": "width",
1163
+ "config": [
1164
+ "INT",
1165
+ {
1166
+ "default": 512,
1167
+ "min": 1,
1168
+ "max": 8192,
1169
+ "step": 1
1170
+ }
1171
+ ]
1172
+ }
1173
+ },
1174
+ {
1175
+ "name": "height",
1176
+ "type": "INT",
1177
+ "link": 111,
1178
+ "widget": {
1179
+ "name": "height",
1180
+ "config": [
1181
+ "INT",
1182
+ {
1183
+ "default": 512,
1184
+ "min": 1,
1185
+ "max": 8192,
1186
+ "step": 1
1187
+ }
1188
+ ]
1189
+ }
1190
+ }
1191
+ ],
1192
+ "outputs": [
1193
+ {
1194
+ "name": "MASK",
1195
+ "type": "MASK",
1196
+ "links": [
1197
+ 100
1198
+ ],
1199
+ "shape": 3,
1200
+ "slot_index": 0
1201
+ }
1202
+ ],
1203
+ "title": "SolidMask (Grey)",
1204
+ "properties": {
1205
+ "Node name for S&R": "SolidMask"
1206
+ },
1207
+ "widgets_values": [
1208
+ 0.5,
1209
+ 768,
1210
+ 768
1211
+ ]
1212
+ },
1213
+ {
1214
+ "id": 42,
1215
+ "type": "ImageCompositeMasked",
1216
+ "pos": [
1217
+ 30,
1218
+ 322
1219
+ ],
1220
+ "size": {
1221
+ "0": 315,
1222
+ "1": 122
1223
+ },
1224
+ "flags": {},
1225
+ "order": 22,
1226
+ "mode": 0,
1227
+ "inputs": [
1228
+ {
1229
+ "name": "destination",
1230
+ "type": "IMAGE",
1231
+ "link": 153
1232
+ },
1233
+ {
1234
+ "name": "source",
1235
+ "type": "IMAGE",
1236
+ "link": 102
1237
+ },
1238
+ {
1239
+ "name": "mask",
1240
+ "type": "MASK",
1241
+ "link": null
1242
+ },
1243
+ {
1244
+ "name": "x",
1245
+ "type": "INT",
1246
+ "link": 116,
1247
+ "widget": {
1248
+ "name": "x",
1249
+ "config": [
1250
+ "INT",
1251
+ {
1252
+ "default": 0,
1253
+ "min": 0,
1254
+ "max": 8192,
1255
+ "step": 1
1256
+ }
1257
+ ]
1258
+ }
1259
+ },
1260
+ {
1261
+ "name": "y",
1262
+ "type": "INT",
1263
+ "link": 118,
1264
+ "widget": {
1265
+ "name": "y",
1266
+ "config": [
1267
+ "INT",
1268
+ {
1269
+ "default": 0,
1270
+ "min": 0,
1271
+ "max": 8192,
1272
+ "step": 1
1273
+ }
1274
+ ]
1275
+ }
1276
+ }
1277
+ ],
1278
+ "outputs": [
1279
+ {
1280
+ "name": "IMAGE",
1281
+ "type": "IMAGE",
1282
+ "links": [
1283
+ 125
1284
+ ],
1285
+ "shape": 3,
1286
+ "slot_index": 0
1287
+ }
1288
+ ],
1289
+ "title": "QR Flattened Composite",
1290
+ "properties": {
1291
+ "Node name for S&R": "ImageCompositeMasked"
1292
+ },
1293
+ "widgets_values": [
1294
+ 48,
1295
+ 48
1296
+ ]
1297
+ },
1298
+ {
1299
+ "id": 43,
1300
+ "type": "ImageCompositeMasked",
1301
+ "pos": [
1302
+ 42,
1303
+ 491
1304
+ ],
1305
+ "size": {
1306
+ "0": 315,
1307
+ "1": 122
1308
+ },
1309
+ "flags": {},
1310
+ "order": 23,
1311
+ "mode": 0,
1312
+ "inputs": [
1313
+ {
1314
+ "name": "destination",
1315
+ "type": "IMAGE",
1316
+ "link": 154
1317
+ },
1318
+ {
1319
+ "name": "source",
1320
+ "type": "IMAGE",
1321
+ "link": 126
1322
+ },
1323
+ {
1324
+ "name": "mask",
1325
+ "type": "MASK",
1326
+ "link": null
1327
+ },
1328
+ {
1329
+ "name": "x",
1330
+ "type": "INT",
1331
+ "link": 114,
1332
+ "widget": {
1333
+ "name": "x",
1334
+ "config": [
1335
+ "INT",
1336
+ {
1337
+ "default": 0,
1338
+ "min": 0,
1339
+ "max": 8192,
1340
+ "step": 1
1341
+ }
1342
+ ]
1343
+ }
1344
+ },
1345
+ {
1346
+ "name": "y",
1347
+ "type": "INT",
1348
+ "link": 119,
1349
+ "widget": {
1350
+ "name": "y",
1351
+ "config": [
1352
+ "INT",
1353
+ {
1354
+ "default": 0,
1355
+ "min": 0,
1356
+ "max": 8192,
1357
+ "step": 1
1358
+ }
1359
+ ]
1360
+ }
1361
+ }
1362
+ ],
1363
+ "outputs": [
1364
+ {
1365
+ "name": "IMAGE",
1366
+ "type": "IMAGE",
1367
+ "links": [
1368
+ 122,
1369
+ 140
1370
+ ],
1371
+ "shape": 3,
1372
+ "slot_index": 0
1373
+ }
1374
+ ],
1375
+ "title": "Module Layer Composite",
1376
+ "properties": {
1377
+ "Node name for S&R": "ImageCompositeMasked"
1378
+ },
1379
+ "widgets_values": [
1380
+ 48,
1381
+ 48
1382
+ ]
1383
+ },
1384
+ {
1385
+ "id": 65,
1386
+ "type": "MaskToImage",
1387
+ "pos": [
1388
+ 32,
1389
+ 1267
1390
+ ],
1391
+ "size": {
1392
+ "0": 195.12049865722656,
1393
+ "1": 26
1394
+ },
1395
+ "flags": {},
1396
+ "order": 19,
1397
+ "mode": 0,
1398
+ "inputs": [
1399
+ {
1400
+ "name": "mask",
1401
+ "type": "MASK",
1402
+ "link": 142
1403
+ }
1404
+ ],
1405
+ "outputs": [
1406
+ {
1407
+ "name": "IMAGE",
1408
+ "type": "IMAGE",
1409
+ "links": [
1410
+ 146
1411
+ ],
1412
+ "shape": 3,
1413
+ "slot_index": 0
1414
+ }
1415
+ ],
1416
+ "title": "Solid (White)",
1417
+ "properties": {
1418
+ "Node name for S&R": "MaskToImage"
1419
+ }
1420
+ },
1421
+ {
1422
+ "id": 50,
1423
+ "type": "SolidMask",
1424
+ "pos": [
1425
+ -345,
1426
+ 1106
1427
+ ],
1428
+ "size": {
1429
+ "0": 315,
1430
+ "1": 106
1431
+ },
1432
+ "flags": {},
1433
+ "order": 11,
1434
+ "mode": 0,
1435
+ "inputs": [
1436
+ {
1437
+ "name": "width",
1438
+ "type": "INT",
1439
+ "link": 112,
1440
+ "widget": {
1441
+ "name": "width",
1442
+ "config": [
1443
+ "INT",
1444
+ {
1445
+ "default": 512,
1446
+ "min": 1,
1447
+ "max": 8192,
1448
+ "step": 1
1449
+ }
1450
+ ]
1451
+ }
1452
+ },
1453
+ {
1454
+ "name": "height",
1455
+ "type": "INT",
1456
+ "link": 113,
1457
+ "widget": {
1458
+ "name": "height",
1459
+ "config": [
1460
+ "INT",
1461
+ {
1462
+ "default": 512,
1463
+ "min": 1,
1464
+ "max": 8192,
1465
+ "step": 1
1466
+ }
1467
+ ]
1468
+ }
1469
+ }
1470
+ ],
1471
+ "outputs": [
1472
+ {
1473
+ "name": "MASK",
1474
+ "type": "MASK",
1475
+ "links": [
1476
+ 107,
1477
+ 151
1478
+ ],
1479
+ "shape": 3,
1480
+ "slot_index": 0
1481
+ }
1482
+ ],
1483
+ "title": "SolidMask (Black)",
1484
+ "properties": {
1485
+ "Node name for S&R": "SolidMask"
1486
+ },
1487
+ "widgets_values": [
1488
+ 0,
1489
+ 768,
1490
+ 768
1491
+ ]
1492
+ },
1493
+ {
1494
+ "id": 67,
1495
+ "type": "MaskToImage",
1496
+ "pos": [
1497
+ 36,
1498
+ 1144
1499
+ ],
1500
+ "size": {
1501
+ "0": 195.12049865722656,
1502
+ "1": 26
1503
+ },
1504
+ "flags": {},
1505
+ "order": 18,
1506
+ "mode": 0,
1507
+ "inputs": [
1508
+ {
1509
+ "name": "mask",
1510
+ "type": "MASK",
1511
+ "link": 151
1512
+ }
1513
+ ],
1514
+ "outputs": [
1515
+ {
1516
+ "name": "IMAGE",
1517
+ "type": "IMAGE",
1518
+ "links": [],
1519
+ "shape": 3,
1520
+ "slot_index": 0
1521
+ }
1522
+ ],
1523
+ "title": "Solid (Black)",
1524
+ "properties": {
1525
+ "Node name for S&R": "MaskToImage"
1526
+ }
1527
+ },
1528
+ {
1529
+ "id": 24,
1530
+ "type": "KSamplerAdvanced",
1531
+ "pos": [
1532
+ 878,
1533
+ -37
1534
+ ],
1535
+ "size": {
1536
+ "0": 315,
1537
+ "1": 546
1538
+ },
1539
+ "flags": {},
1540
+ "order": 30,
1541
+ "mode": 0,
1542
+ "inputs": [
1543
+ {
1544
+ "name": "model",
1545
+ "type": "MODEL",
1546
+ "link": 40
1547
+ },
1548
+ {
1549
+ "name": "positive",
1550
+ "type": "CONDITIONING",
1551
+ "link": 89
1552
+ },
1553
+ {
1554
+ "name": "negative",
1555
+ "type": "CONDITIONING",
1556
+ "link": 38
1557
+ },
1558
+ {
1559
+ "name": "latent_image",
1560
+ "type": "LATENT",
1561
+ "link": 139
1562
+ },
1563
+ {
1564
+ "name": "end_at_step",
1565
+ "type": "INT",
1566
+ "link": 45,
1567
+ "widget": {
1568
+ "name": "end_at_step",
1569
+ "config": [
1570
+ "INT",
1571
+ {
1572
+ "default": 10000,
1573
+ "min": 0,
1574
+ "max": 10000
1575
+ }
1576
+ ]
1577
+ }
1578
+ },
1579
+ {
1580
+ "name": "steps",
1581
+ "type": "INT",
1582
+ "link": 82,
1583
+ "widget": {
1584
+ "name": "steps",
1585
+ "config": [
1586
+ "INT",
1587
+ {
1588
+ "default": 20,
1589
+ "min": 1,
1590
+ "max": 10000
1591
+ }
1592
+ ]
1593
+ }
1594
+ }
1595
+ ],
1596
+ "outputs": [
1597
+ {
1598
+ "name": "LATENT",
1599
+ "type": "LATENT",
1600
+ "links": [
1601
+ 57
1602
+ ],
1603
+ "shape": 3,
1604
+ "slot_index": 0
1605
+ }
1606
+ ],
1607
+ "title": "KSampler (BG)",
1608
+ "properties": {
1609
+ "Node name for S&R": "KSamplerAdvanced"
1610
+ },
1611
+ "widgets_values": [
1612
+ "enable",
1613
+ 1004190433642169,
1614
+ "randomize",
1615
+ 25,
1616
+ 8,
1617
+ "euler_ancestral",
1618
+ "normal",
1619
+ 0,
1620
+ 13,
1621
+ "enable"
1622
+ ]
1623
+ },
1624
+ {
1625
+ "id": 30,
1626
+ "type": "KSamplerAdvanced",
1627
+ "pos": [
1628
+ 1634,
1629
+ 25
1630
+ ],
1631
+ "size": {
1632
+ "0": 315,
1633
+ "1": 542
1634
+ },
1635
+ "flags": {},
1636
+ "order": 33,
1637
+ "mode": 0,
1638
+ "inputs": [
1639
+ {
1640
+ "name": "model",
1641
+ "type": "MODEL",
1642
+ "link": 62
1643
+ },
1644
+ {
1645
+ "name": "positive",
1646
+ "type": "CONDITIONING",
1647
+ "link": 90
1648
+ },
1649
+ {
1650
+ "name": "negative",
1651
+ "type": "CONDITIONING",
1652
+ "link": 91
1653
+ },
1654
+ {
1655
+ "name": "latent_image",
1656
+ "type": "LATENT",
1657
+ "link": 64
1658
+ },
1659
+ {
1660
+ "name": "start_at_step",
1661
+ "type": "INT",
1662
+ "link": 58,
1663
+ "widget": {
1664
+ "name": "start_at_step",
1665
+ "config": [
1666
+ "INT",
1667
+ {
1668
+ "default": 0,
1669
+ "min": 0,
1670
+ "max": 10000
1671
+ }
1672
+ ]
1673
+ }
1674
+ },
1675
+ {
1676
+ "name": "steps",
1677
+ "type": "INT",
1678
+ "link": 84,
1679
+ "widget": {
1680
+ "name": "steps",
1681
+ "config": [
1682
+ "INT",
1683
+ {
1684
+ "default": 20,
1685
+ "min": 1,
1686
+ "max": 10000
1687
+ }
1688
+ ]
1689
+ }
1690
+ }
1691
+ ],
1692
+ "outputs": [
1693
+ {
1694
+ "name": "LATENT",
1695
+ "type": "LATENT",
1696
+ "links": [
1697
+ 63
1698
+ ],
1699
+ "shape": 3,
1700
+ "slot_index": 0
1701
+ }
1702
+ ],
1703
+ "title": "KSampler (Combined)",
1704
+ "properties": {
1705
+ "Node name for S&R": "KSamplerAdvanced"
1706
+ },
1707
+ "widgets_values": [
1708
+ "disable",
1709
+ 399768739536783,
1710
+ "randomize",
1711
+ 25,
1712
+ 8,
1713
+ "euler_ancestral",
1714
+ "normal",
1715
+ 13,
1716
+ 10000,
1717
+ "disable"
1718
+ ]
1719
+ },
1720
+ {
1721
+ "id": 37,
1722
+ "type": "PrimitiveNode",
1723
+ "pos": [
1724
+ 991,
1725
+ -189
1726
+ ],
1727
+ "size": {
1728
+ "0": 210,
1729
+ "1": 82
1730
+ },
1731
+ "flags": {},
1732
+ "order": 5,
1733
+ "mode": 0,
1734
+ "outputs": [
1735
+ {
1736
+ "name": "INT",
1737
+ "type": "INT",
1738
+ "links": [
1739
+ 82,
1740
+ 83,
1741
+ 84
1742
+ ],
1743
+ "slot_index": 0,
1744
+ "widget": {
1745
+ "name": "steps",
1746
+ "config": [
1747
+ "INT",
1748
+ {
1749
+ "default": 20,
1750
+ "min": 1,
1751
+ "max": 10000
1752
+ }
1753
+ ]
1754
+ }
1755
+ }
1756
+ ],
1757
+ "title": "Steps",
1758
+ "properties": {},
1759
+ "widgets_values": [
1760
+ 25,
1761
+ "fixed"
1762
+ ]
1763
+ },
1764
+ {
1765
+ "id": 17,
1766
+ "type": "ControlNetApplyAdvanced",
1767
+ "pos": [
1768
+ 471,
1769
+ 294
1770
+ ],
1771
+ "size": {
1772
+ "0": 315,
1773
+ "1": 166
1774
+ },
1775
+ "flags": {},
1776
+ "order": 26,
1777
+ "mode": 0,
1778
+ "inputs": [
1779
+ {
1780
+ "name": "positive",
1781
+ "type": "CONDITIONING",
1782
+ "link": 17
1783
+ },
1784
+ {
1785
+ "name": "negative",
1786
+ "type": "CONDITIONING",
1787
+ "link": 23
1788
+ },
1789
+ {
1790
+ "name": "control_net",
1791
+ "type": "CONTROL_NET",
1792
+ "link": 19
1793
+ },
1794
+ {
1795
+ "name": "image",
1796
+ "type": "IMAGE",
1797
+ "link": 122
1798
+ }
1799
+ ],
1800
+ "outputs": [
1801
+ {
1802
+ "name": "positive",
1803
+ "type": "CONDITIONING",
1804
+ "links": [
1805
+ 89
1806
+ ],
1807
+ "shape": 3,
1808
+ "slot_index": 0
1809
+ },
1810
+ {
1811
+ "name": "negative",
1812
+ "type": "CONDITIONING",
1813
+ "links": [
1814
+ 38
1815
+ ],
1816
+ "shape": 3,
1817
+ "slot_index": 1
1818
+ }
1819
+ ],
1820
+ "title": "ControlNet (BG)",
1821
+ "properties": {
1822
+ "Node name for S&R": "ControlNetApplyAdvanced"
1823
+ },
1824
+ "widgets_values": [
1825
+ 1.4000000000000001,
1826
+ 0,
1827
+ 1
1828
+ ]
1829
+ },
1830
+ {
1831
+ "id": 27,
1832
+ "type": "KSamplerAdvanced",
1833
+ "pos": [
1834
+ 872,
1835
+ 571
1836
+ ],
1837
+ "size": {
1838
+ "0": 315,
1839
+ "1": 546
1840
+ },
1841
+ "flags": {},
1842
+ "order": 31,
1843
+ "mode": 0,
1844
+ "inputs": [
1845
+ {
1846
+ "name": "model",
1847
+ "type": "MODEL",
1848
+ "link": 46
1849
+ },
1850
+ {
1851
+ "name": "positive",
1852
+ "type": "CONDITIONING",
1853
+ "link": 136
1854
+ },
1855
+ {
1856
+ "name": "negative",
1857
+ "type": "CONDITIONING",
1858
+ "link": 48
1859
+ },
1860
+ {
1861
+ "name": "latent_image",
1862
+ "type": "LATENT",
1863
+ "link": 80
1864
+ },
1865
+ {
1866
+ "name": "end_at_step",
1867
+ "type": "INT",
1868
+ "link": 44,
1869
+ "widget": {
1870
+ "name": "end_at_step",
1871
+ "config": [
1872
+ "INT",
1873
+ {
1874
+ "default": 10000,
1875
+ "min": 0,
1876
+ "max": 10000
1877
+ }
1878
+ ]
1879
+ }
1880
+ },
1881
+ {
1882
+ "name": "steps",
1883
+ "type": "INT",
1884
+ "link": 83,
1885
+ "widget": {
1886
+ "name": "steps",
1887
+ "config": [
1888
+ "INT",
1889
+ {
1890
+ "default": 20,
1891
+ "min": 1,
1892
+ "max": 10000
1893
+ }
1894
+ ]
1895
+ }
1896
+ }
1897
+ ],
1898
+ "outputs": [
1899
+ {
1900
+ "name": "LATENT",
1901
+ "type": "LATENT",
1902
+ "links": [
1903
+ 65
1904
+ ],
1905
+ "shape": 3,
1906
+ "slot_index": 0
1907
+ }
1908
+ ],
1909
+ "title": "KSampler (FG)",
1910
+ "properties": {
1911
+ "Node name for S&R": "KSamplerAdvanced"
1912
+ },
1913
+ "widgets_values": [
1914
+ "enable",
1915
+ 604210257117158,
1916
+ "randomize",
1917
+ 25,
1918
+ 8,
1919
+ "euler",
1920
+ "normal",
1921
+ 2,
1922
+ 13,
1923
+ "enable"
1924
+ ]
1925
+ },
1926
+ {
1927
+ "id": 12,
1928
+ "type": "SaveImage",
1929
+ "pos": [
1930
+ 2032,
1931
+ 646
1932
+ ],
1933
+ "size": {
1934
+ "0": 315,
1935
+ "1": 270
1936
+ },
1937
+ "flags": {},
1938
+ "order": 38,
1939
+ "mode": 0,
1940
+ "inputs": [
1941
+ {
1942
+ "name": "images",
1943
+ "type": "IMAGE",
1944
+ "link": 130
1945
+ }
1946
+ ],
1947
+ "properties": {},
1948
+ "widgets_values": [
1949
+ "ComfyUI"
1950
+ ]
1951
+ },
1952
+ {
1953
+ "id": 28,
1954
+ "type": "PrimitiveNode",
1955
+ "pos": [
1956
+ 1235,
1957
+ -191
1958
+ ],
1959
+ "size": {
1960
+ "0": 210,
1961
+ "1": 82
1962
+ },
1963
+ "flags": {},
1964
+ "order": 6,
1965
+ "mode": 0,
1966
+ "outputs": [
1967
+ {
1968
+ "name": "INT",
1969
+ "type": "INT",
1970
+ "links": [
1971
+ 44,
1972
+ 45,
1973
+ 58
1974
+ ],
1975
+ "slot_index": 0,
1976
+ "widget": {
1977
+ "name": "end_at_step",
1978
+ "config": [
1979
+ "INT",
1980
+ {
1981
+ "default": 10000,
1982
+ "min": 0,
1983
+ "max": 10000
1984
+ }
1985
+ ]
1986
+ }
1987
+ }
1988
+ ],
1989
+ "title": "Seperation Step",
1990
+ "properties": {},
1991
+ "widgets_values": [
1992
+ 13,
1993
+ "fixed"
1994
+ ]
1995
+ },
1996
+ {
1997
+ "id": 38,
1998
+ "type": "ControlNetApplyAdvanced",
1999
+ "pos": [
2000
+ 1235,
2001
+ 204
2002
+ ],
2003
+ "size": {
2004
+ "0": 315,
2005
+ "1": 166
2006
+ },
2007
+ "flags": {},
2008
+ "order": 25,
2009
+ "mode": 0,
2010
+ "inputs": [
2011
+ {
2012
+ "name": "positive",
2013
+ "type": "CONDITIONING",
2014
+ "link": 87
2015
+ },
2016
+ {
2017
+ "name": "negative",
2018
+ "type": "CONDITIONING",
2019
+ "link": 88
2020
+ },
2021
+ {
2022
+ "name": "control_net",
2023
+ "type": "CONTROL_NET",
2024
+ "link": 92
2025
+ },
2026
+ {
2027
+ "name": "image",
2028
+ "type": "IMAGE",
2029
+ "link": 125
2030
+ }
2031
+ ],
2032
+ "outputs": [
2033
+ {
2034
+ "name": "positive",
2035
+ "type": "CONDITIONING",
2036
+ "links": [
2037
+ 90
2038
+ ],
2039
+ "shape": 3,
2040
+ "slot_index": 0
2041
+ },
2042
+ {
2043
+ "name": "negative",
2044
+ "type": "CONDITIONING",
2045
+ "links": [
2046
+ 91
2047
+ ],
2048
+ "shape": 3,
2049
+ "slot_index": 1
2050
+ }
2051
+ ],
2052
+ "title": "ControlNet (Combined)",
2053
+ "properties": {
2054
+ "Node name for S&R": "ControlNetApplyAdvanced"
2055
+ },
2056
+ "widgets_values": [
2057
+ 1.5,
2058
+ 0,
2059
+ 1
2060
+ ]
2061
+ },
2062
+ {
2063
+ "id": 6,
2064
+ "type": "CheckpointLoaderSimple",
2065
+ "pos": [
2066
+ 24,
2067
+ 53
2068
+ ],
2069
+ "size": {
2070
+ "0": 315,
2071
+ "1": 98
2072
+ },
2073
+ "flags": {},
2074
+ "order": 7,
2075
+ "mode": 0,
2076
+ "outputs": [
2077
+ {
2078
+ "name": "MODEL",
2079
+ "type": "MODEL",
2080
+ "links": [
2081
+ 40,
2082
+ 46,
2083
+ 62
2084
+ ],
2085
+ "shape": 3,
2086
+ "slot_index": 0
2087
+ },
2088
+ {
2089
+ "name": "CLIP",
2090
+ "type": "CLIP",
2091
+ "links": [
2092
+ 2,
2093
+ 3,
2094
+ 134
2095
+ ],
2096
+ "shape": 3,
2097
+ "slot_index": 1
2098
+ },
2099
+ {
2100
+ "name": "VAE",
2101
+ "type": "VAE",
2102
+ "links": [
2103
+ 11,
2104
+ 78,
2105
+ 141
2106
+ ],
2107
+ "shape": 3,
2108
+ "slot_index": 2
2109
+ }
2110
+ ],
2111
+ "properties": {
2112
+ "Node name for S&R": "CheckpointLoaderSimple"
2113
+ },
2114
+ "widgets_values": [
2115
+ "1.5/v1-5-pruned-emaonly.safetensors"
2116
+ ]
2117
+ },
2118
+ {
2119
+ "id": 41,
2120
+ "type": "MaskToImage",
2121
+ "pos": [
2122
+ -247,
2123
+ 864
2124
+ ],
2125
+ "size": {
2126
+ "0": 210,
2127
+ "1": 26
2128
+ },
2129
+ "flags": {},
2130
+ "order": 17,
2131
+ "mode": 0,
2132
+ "inputs": [
2133
+ {
2134
+ "name": "mask",
2135
+ "type": "MASK",
2136
+ "link": 100
2137
+ }
2138
+ ],
2139
+ "outputs": [
2140
+ {
2141
+ "name": "IMAGE",
2142
+ "type": "IMAGE",
2143
+ "links": [
2144
+ 153,
2145
+ 154
2146
+ ],
2147
+ "shape": 3,
2148
+ "slot_index": 0
2149
+ }
2150
+ ],
2151
+ "title": "Solid (Grey)",
2152
+ "properties": {
2153
+ "Node name for S&R": "MaskToImage"
2154
+ }
2155
+ },
2156
+ {
2157
+ "id": 68,
2158
+ "type": "PrimitiveNode",
2159
+ "pos": [
2160
+ -422,
2161
+ 208
2162
+ ],
2163
+ "size": {
2164
+ "0": 210,
2165
+ "1": 76
2166
+ },
2167
+ "flags": {},
2168
+ "order": 8,
2169
+ "mode": 0,
2170
+ "outputs": [
2171
+ {
2172
+ "name": "STRING",
2173
+ "type": "STRING",
2174
+ "links": [
2175
+ 155,
2176
+ 158
2177
+ ],
2178
+ "slot_index": 0,
2179
+ "widget": {
2180
+ "name": "text",
2181
+ "config": [
2182
+ "STRING",
2183
+ {
2184
+ "multiline": true
2185
+ }
2186
+ ]
2187
+ }
2188
+ }
2189
+ ],
2190
+ "title": "URL",
2191
+ "properties": {},
2192
+ "widgets_values": [
2193
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr"
2194
+ ]
2195
+ },
2196
+ {
2197
+ "id": 69,
2198
+ "type": "PrimitiveNode",
2199
+ "pos": [
2200
+ -422,
2201
+ 70
2202
+ ],
2203
+ "size": {
2204
+ "0": 210,
2205
+ "1": 82
2206
+ },
2207
+ "flags": {},
2208
+ "order": 9,
2209
+ "mode": 0,
2210
+ "outputs": [
2211
+ {
2212
+ "name": "COMBO",
2213
+ "type": "Http,Https,None",
2214
+ "links": [
2215
+ 156,
2216
+ 157
2217
+ ],
2218
+ "slot_index": 0,
2219
+ "widget": {
2220
+ "name": "protocol",
2221
+ "config": [
2222
+ [
2223
+ "Http",
2224
+ "Https",
2225
+ "None"
2226
+ ],
2227
+ {
2228
+ "default": "Https"
2229
+ }
2230
+ ]
2231
+ }
2232
+ }
2233
+ ],
2234
+ "title": "Protocol",
2235
+ "properties": {},
2236
+ "widgets_values": [
2237
+ "Https",
2238
+ "fixed"
2239
+ ]
2240
+ }
2241
+ ],
2242
+ "links": [
2243
+ [
2244
+ 2,
2245
+ 6,
2246
+ 1,
2247
+ 7,
2248
+ 0,
2249
+ "CLIP"
2250
+ ],
2251
+ [
2252
+ 3,
2253
+ 6,
2254
+ 1,
2255
+ 8,
2256
+ 0,
2257
+ "CLIP"
2258
+ ],
2259
+ [
2260
+ 11,
2261
+ 6,
2262
+ 2,
2263
+ 13,
2264
+ 1,
2265
+ "VAE"
2266
+ ],
2267
+ [
2268
+ 17,
2269
+ 7,
2270
+ 0,
2271
+ 17,
2272
+ 0,
2273
+ "CONDITIONING"
2274
+ ],
2275
+ [
2276
+ 19,
2277
+ 18,
2278
+ 0,
2279
+ 17,
2280
+ 2,
2281
+ "CONTROL_NET"
2282
+ ],
2283
+ [
2284
+ 23,
2285
+ 8,
2286
+ 0,
2287
+ 17,
2288
+ 1,
2289
+ "CONDITIONING"
2290
+ ],
2291
+ [
2292
+ 25,
2293
+ 13,
2294
+ 0,
2295
+ 21,
2296
+ 0,
2297
+ "IMAGE"
2298
+ ],
2299
+ [
2300
+ 26,
2301
+ 21,
2302
+ 0,
2303
+ 19,
2304
+ 0,
2305
+ "IMAGE"
2306
+ ],
2307
+ [
2308
+ 27,
2309
+ 19,
2310
+ 0,
2311
+ 20,
2312
+ 1,
2313
+ "STRING"
2314
+ ],
2315
+ [
2316
+ 28,
2317
+ 13,
2318
+ 0,
2319
+ 20,
2320
+ 0,
2321
+ "IMAGE"
2322
+ ],
2323
+ [
2324
+ 34,
2325
+ 8,
2326
+ 0,
2327
+ 23,
2328
+ 1,
2329
+ "CONDITIONING"
2330
+ ],
2331
+ [
2332
+ 35,
2333
+ 18,
2334
+ 0,
2335
+ 23,
2336
+ 2,
2337
+ "CONTROL_NET"
2338
+ ],
2339
+ [
2340
+ 38,
2341
+ 17,
2342
+ 1,
2343
+ 24,
2344
+ 2,
2345
+ "CONDITIONING"
2346
+ ],
2347
+ [
2348
+ 40,
2349
+ 6,
2350
+ 0,
2351
+ 24,
2352
+ 0,
2353
+ "MODEL"
2354
+ ],
2355
+ [
2356
+ 44,
2357
+ 28,
2358
+ 0,
2359
+ 27,
2360
+ 4,
2361
+ "INT"
2362
+ ],
2363
+ [
2364
+ 45,
2365
+ 28,
2366
+ 0,
2367
+ 24,
2368
+ 4,
2369
+ "INT"
2370
+ ],
2371
+ [
2372
+ 46,
2373
+ 6,
2374
+ 0,
2375
+ 27,
2376
+ 0,
2377
+ "MODEL"
2378
+ ],
2379
+ [
2380
+ 48,
2381
+ 23,
2382
+ 1,
2383
+ 27,
2384
+ 2,
2385
+ "CONDITIONING"
2386
+ ],
2387
+ [
2388
+ 57,
2389
+ 24,
2390
+ 0,
2391
+ 29,
2392
+ 0,
2393
+ "LATENT"
2394
+ ],
2395
+ [
2396
+ 58,
2397
+ 28,
2398
+ 0,
2399
+ 30,
2400
+ 4,
2401
+ "INT"
2402
+ ],
2403
+ [
2404
+ 62,
2405
+ 6,
2406
+ 0,
2407
+ 30,
2408
+ 0,
2409
+ "MODEL"
2410
+ ],
2411
+ [
2412
+ 63,
2413
+ 30,
2414
+ 0,
2415
+ 13,
2416
+ 0,
2417
+ "LATENT"
2418
+ ],
2419
+ [
2420
+ 64,
2421
+ 29,
2422
+ 0,
2423
+ 30,
2424
+ 3,
2425
+ "LATENT"
2426
+ ],
2427
+ [
2428
+ 65,
2429
+ 27,
2430
+ 0,
2431
+ 29,
2432
+ 1,
2433
+ "LATENT"
2434
+ ],
2435
+ [
2436
+ 78,
2437
+ 6,
2438
+ 2,
2439
+ 36,
2440
+ 1,
2441
+ "VAE"
2442
+ ],
2443
+ [
2444
+ 80,
2445
+ 36,
2446
+ 0,
2447
+ 27,
2448
+ 3,
2449
+ "LATENT"
2450
+ ],
2451
+ [
2452
+ 82,
2453
+ 37,
2454
+ 0,
2455
+ 24,
2456
+ 5,
2457
+ "INT"
2458
+ ],
2459
+ [
2460
+ 83,
2461
+ 37,
2462
+ 0,
2463
+ 27,
2464
+ 5,
2465
+ "INT"
2466
+ ],
2467
+ [
2468
+ 84,
2469
+ 37,
2470
+ 0,
2471
+ 30,
2472
+ 5,
2473
+ "INT"
2474
+ ],
2475
+ [
2476
+ 87,
2477
+ 7,
2478
+ 0,
2479
+ 38,
2480
+ 0,
2481
+ "CONDITIONING"
2482
+ ],
2483
+ [
2484
+ 88,
2485
+ 8,
2486
+ 0,
2487
+ 38,
2488
+ 1,
2489
+ "CONDITIONING"
2490
+ ],
2491
+ [
2492
+ 89,
2493
+ 17,
2494
+ 0,
2495
+ 24,
2496
+ 1,
2497
+ "CONDITIONING"
2498
+ ],
2499
+ [
2500
+ 90,
2501
+ 38,
2502
+ 0,
2503
+ 30,
2504
+ 1,
2505
+ "CONDITIONING"
2506
+ ],
2507
+ [
2508
+ 91,
2509
+ 38,
2510
+ 1,
2511
+ 30,
2512
+ 2,
2513
+ "CONDITIONING"
2514
+ ],
2515
+ [
2516
+ 92,
2517
+ 18,
2518
+ 0,
2519
+ 38,
2520
+ 2,
2521
+ "CONTROL_NET"
2522
+ ],
2523
+ [
2524
+ 100,
2525
+ 40,
2526
+ 0,
2527
+ 41,
2528
+ 0,
2529
+ "MASK"
2530
+ ],
2531
+ [
2532
+ 102,
2533
+ 39,
2534
+ 0,
2535
+ 42,
2536
+ 1,
2537
+ "IMAGE"
2538
+ ],
2539
+ [
2540
+ 104,
2541
+ 39,
2542
+ 3,
2543
+ 47,
2544
+ 0,
2545
+ "MASK"
2546
+ ],
2547
+ [
2548
+ 106,
2549
+ 39,
2550
+ 3,
2551
+ 49,
2552
+ 1,
2553
+ "MASK"
2554
+ ],
2555
+ [
2556
+ 107,
2557
+ 50,
2558
+ 0,
2559
+ 49,
2560
+ 0,
2561
+ "MASK"
2562
+ ],
2563
+ [
2564
+ 110,
2565
+ 52,
2566
+ 0,
2567
+ 40,
2568
+ 0,
2569
+ "INT"
2570
+ ],
2571
+ [
2572
+ 111,
2573
+ 53,
2574
+ 0,
2575
+ 40,
2576
+ 1,
2577
+ "INT"
2578
+ ],
2579
+ [
2580
+ 112,
2581
+ 52,
2582
+ 0,
2583
+ 50,
2584
+ 0,
2585
+ "INT"
2586
+ ],
2587
+ [
2588
+ 113,
2589
+ 53,
2590
+ 0,
2591
+ 50,
2592
+ 1,
2593
+ "INT"
2594
+ ],
2595
+ [
2596
+ 114,
2597
+ 54,
2598
+ 0,
2599
+ 43,
2600
+ 3,
2601
+ "INT"
2602
+ ],
2603
+ [
2604
+ 115,
2605
+ 54,
2606
+ 0,
2607
+ 44,
2608
+ 3,
2609
+ "INT"
2610
+ ],
2611
+ [
2612
+ 116,
2613
+ 54,
2614
+ 0,
2615
+ 42,
2616
+ 3,
2617
+ "INT"
2618
+ ],
2619
+ [
2620
+ 117,
2621
+ 54,
2622
+ 0,
2623
+ 49,
2624
+ 2,
2625
+ "INT"
2626
+ ],
2627
+ [
2628
+ 118,
2629
+ 55,
2630
+ 0,
2631
+ 42,
2632
+ 4,
2633
+ "INT"
2634
+ ],
2635
+ [
2636
+ 119,
2637
+ 55,
2638
+ 0,
2639
+ 43,
2640
+ 4,
2641
+ "INT"
2642
+ ],
2643
+ [
2644
+ 120,
2645
+ 55,
2646
+ 0,
2647
+ 44,
2648
+ 4,
2649
+ "INT"
2650
+ ],
2651
+ [
2652
+ 121,
2653
+ 55,
2654
+ 0,
2655
+ 49,
2656
+ 3,
2657
+ "INT"
2658
+ ],
2659
+ [
2660
+ 122,
2661
+ 43,
2662
+ 0,
2663
+ 17,
2664
+ 3,
2665
+ "IMAGE"
2666
+ ],
2667
+ [
2668
+ 123,
2669
+ 44,
2670
+ 0,
2671
+ 23,
2672
+ 3,
2673
+ "IMAGE"
2674
+ ],
2675
+ [
2676
+ 124,
2677
+ 49,
2678
+ 0,
2679
+ 29,
2680
+ 2,
2681
+ "MASK"
2682
+ ],
2683
+ [
2684
+ 125,
2685
+ 42,
2686
+ 0,
2687
+ 38,
2688
+ 3,
2689
+ "IMAGE"
2690
+ ],
2691
+ [
2692
+ 126,
2693
+ 39,
2694
+ 1,
2695
+ 43,
2696
+ 1,
2697
+ "IMAGE"
2698
+ ],
2699
+ [
2700
+ 127,
2701
+ 39,
2702
+ 2,
2703
+ 44,
2704
+ 1,
2705
+ "IMAGE"
2706
+ ],
2707
+ [
2708
+ 130,
2709
+ 20,
2710
+ 0,
2711
+ 12,
2712
+ 0,
2713
+ "IMAGE"
2714
+ ],
2715
+ [
2716
+ 132,
2717
+ 44,
2718
+ 0,
2719
+ 36,
2720
+ 0,
2721
+ "IMAGE"
2722
+ ],
2723
+ [
2724
+ 134,
2725
+ 6,
2726
+ 1,
2727
+ 57,
2728
+ 0,
2729
+ "CLIP"
2730
+ ],
2731
+ [
2732
+ 135,
2733
+ 57,
2734
+ 0,
2735
+ 23,
2736
+ 0,
2737
+ "CONDITIONING"
2738
+ ],
2739
+ [
2740
+ 136,
2741
+ 23,
2742
+ 0,
2743
+ 27,
2744
+ 1,
2745
+ "CONDITIONING"
2746
+ ],
2747
+ [
2748
+ 139,
2749
+ 63,
2750
+ 0,
2751
+ 24,
2752
+ 3,
2753
+ "LATENT"
2754
+ ],
2755
+ [
2756
+ 140,
2757
+ 43,
2758
+ 0,
2759
+ 63,
2760
+ 0,
2761
+ "IMAGE"
2762
+ ],
2763
+ [
2764
+ 141,
2765
+ 6,
2766
+ 2,
2767
+ 63,
2768
+ 1,
2769
+ "VAE"
2770
+ ],
2771
+ [
2772
+ 142,
2773
+ 64,
2774
+ 0,
2775
+ 65,
2776
+ 0,
2777
+ "MASK"
2778
+ ],
2779
+ [
2780
+ 144,
2781
+ 53,
2782
+ 0,
2783
+ 64,
2784
+ 0,
2785
+ "INT"
2786
+ ],
2787
+ [
2788
+ 145,
2789
+ 53,
2790
+ 0,
2791
+ 64,
2792
+ 1,
2793
+ "INT"
2794
+ ],
2795
+ [
2796
+ 146,
2797
+ 65,
2798
+ 0,
2799
+ 44,
2800
+ 0,
2801
+ "IMAGE"
2802
+ ],
2803
+ [
2804
+ 151,
2805
+ 50,
2806
+ 0,
2807
+ 67,
2808
+ 0,
2809
+ "MASK"
2810
+ ],
2811
+ [
2812
+ 153,
2813
+ 41,
2814
+ 0,
2815
+ 42,
2816
+ 0,
2817
+ "IMAGE"
2818
+ ],
2819
+ [
2820
+ 154,
2821
+ 41,
2822
+ 0,
2823
+ 43,
2824
+ 0,
2825
+ "IMAGE"
2826
+ ],
2827
+ [
2828
+ 155,
2829
+ 68,
2830
+ 0,
2831
+ 39,
2832
+ 0,
2833
+ "STRING"
2834
+ ],
2835
+ [
2836
+ 156,
2837
+ 69,
2838
+ 0,
2839
+ 39,
2840
+ 1,
2841
+ "Http,Https,None"
2842
+ ],
2843
+ [
2844
+ 157,
2845
+ 69,
2846
+ 0,
2847
+ 20,
2848
+ 2,
2849
+ "Http,Https,None"
2850
+ ],
2851
+ [
2852
+ 158,
2853
+ 68,
2854
+ 0,
2855
+ 20,
2856
+ 3,
2857
+ "STRING"
2858
+ ]
2859
+ ],
2860
+ "groups": [],
2861
+ "config": {},
2862
+ "extra": {},
2863
+ "version": 0.4
2864
+ }
custom_nodes/ComfyQR/examples/noisy-latent-split-controlnet.json ADDED
@@ -0,0 +1,2641 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 69,
3
+ "last_link_id": 160,
4
+ "nodes": [
5
+ {
6
+ "id": 47,
7
+ "type": "MaskToImage",
8
+ "pos": [
9
+ -242,
10
+ 776
11
+ ],
12
+ "size": {
13
+ "0": 210,
14
+ "1": 26
15
+ },
16
+ "flags": {},
17
+ "order": 20,
18
+ "mode": 0,
19
+ "inputs": [
20
+ {
21
+ "name": "mask",
22
+ "type": "MASK",
23
+ "link": 104
24
+ }
25
+ ],
26
+ "outputs": [
27
+ {
28
+ "name": "IMAGE",
29
+ "type": "IMAGE",
30
+ "links": null,
31
+ "shape": 3
32
+ }
33
+ ],
34
+ "properties": {
35
+ "Node name for S&R": "MaskToImage"
36
+ }
37
+ },
38
+ {
39
+ "id": 49,
40
+ "type": "MaskComposite",
41
+ "pos": [
42
+ 25,
43
+ 841
44
+ ],
45
+ "size": {
46
+ "0": 315,
47
+ "1": 126
48
+ },
49
+ "flags": {},
50
+ "order": 21,
51
+ "mode": 0,
52
+ "inputs": [
53
+ {
54
+ "name": "destination",
55
+ "type": "MASK",
56
+ "link": 107
57
+ },
58
+ {
59
+ "name": "source",
60
+ "type": "MASK",
61
+ "link": 106
62
+ },
63
+ {
64
+ "name": "x",
65
+ "type": "INT",
66
+ "link": 117,
67
+ "widget": {
68
+ "name": "x",
69
+ "config": [
70
+ "INT",
71
+ {
72
+ "default": 0,
73
+ "min": 0,
74
+ "max": 8192,
75
+ "step": 1
76
+ }
77
+ ]
78
+ }
79
+ },
80
+ {
81
+ "name": "y",
82
+ "type": "INT",
83
+ "link": 121,
84
+ "widget": {
85
+ "name": "y",
86
+ "config": [
87
+ "INT",
88
+ {
89
+ "default": 0,
90
+ "min": 0,
91
+ "max": 8192,
92
+ "step": 1
93
+ }
94
+ ]
95
+ }
96
+ }
97
+ ],
98
+ "outputs": [
99
+ {
100
+ "name": "MASK",
101
+ "type": "MASK",
102
+ "links": [
103
+ 124
104
+ ],
105
+ "shape": 3,
106
+ "slot_index": 0
107
+ }
108
+ ],
109
+ "properties": {
110
+ "Node name for S&R": "MaskComposite"
111
+ },
112
+ "widgets_values": [
113
+ 48,
114
+ 48,
115
+ "add"
116
+ ]
117
+ },
118
+ {
119
+ "id": 44,
120
+ "type": "ImageCompositeMasked",
121
+ "pos": [
122
+ 29,
123
+ 663
124
+ ],
125
+ "size": {
126
+ "0": 315,
127
+ "1": 122
128
+ },
129
+ "flags": {},
130
+ "order": 24,
131
+ "mode": 0,
132
+ "inputs": [
133
+ {
134
+ "name": "destination",
135
+ "type": "IMAGE",
136
+ "link": 146
137
+ },
138
+ {
139
+ "name": "source",
140
+ "type": "IMAGE",
141
+ "link": 127
142
+ },
143
+ {
144
+ "name": "mask",
145
+ "type": "MASK",
146
+ "link": null
147
+ },
148
+ {
149
+ "name": "x",
150
+ "type": "INT",
151
+ "link": 115,
152
+ "widget": {
153
+ "name": "x",
154
+ "config": [
155
+ "INT",
156
+ {
157
+ "default": 0,
158
+ "min": 0,
159
+ "max": 8192,
160
+ "step": 1
161
+ }
162
+ ]
163
+ }
164
+ },
165
+ {
166
+ "name": "y",
167
+ "type": "INT",
168
+ "link": 120,
169
+ "widget": {
170
+ "name": "y",
171
+ "config": [
172
+ "INT",
173
+ {
174
+ "default": 0,
175
+ "min": 0,
176
+ "max": 8192,
177
+ "step": 1
178
+ }
179
+ ]
180
+ }
181
+ }
182
+ ],
183
+ "outputs": [
184
+ {
185
+ "name": "IMAGE",
186
+ "type": "IMAGE",
187
+ "links": [
188
+ 123,
189
+ 132
190
+ ],
191
+ "shape": 3,
192
+ "slot_index": 0
193
+ }
194
+ ],
195
+ "title": "Finder Layer Composite",
196
+ "properties": {
197
+ "Node name for S&R": "ImageCompositeMasked"
198
+ },
199
+ "widgets_values": [
200
+ 48,
201
+ 48
202
+ ]
203
+ },
204
+ {
205
+ "id": 8,
206
+ "type": "CLIPTextEncode",
207
+ "pos": [
208
+ 372,
209
+ 47
210
+ ],
211
+ "size": {
212
+ "0": 400,
213
+ "1": 200
214
+ },
215
+ "flags": {},
216
+ "order": 14,
217
+ "mode": 0,
218
+ "inputs": [
219
+ {
220
+ "name": "clip",
221
+ "type": "CLIP",
222
+ "link": 3
223
+ }
224
+ ],
225
+ "outputs": [
226
+ {
227
+ "name": "CONDITIONING",
228
+ "type": "CONDITIONING",
229
+ "links": [
230
+ 23,
231
+ 34,
232
+ 88
233
+ ],
234
+ "shape": 3,
235
+ "slot_index": 0
236
+ }
237
+ ],
238
+ "title": "Negative Prompt",
239
+ "properties": {
240
+ "Node name for S&R": "CLIPTextEncode"
241
+ },
242
+ "widgets_values": [
243
+ "worst quality"
244
+ ]
245
+ },
246
+ {
247
+ "id": 7,
248
+ "type": "CLIPTextEncode",
249
+ "pos": [
250
+ 376,
251
+ -201
252
+ ],
253
+ "size": {
254
+ "0": 400,
255
+ "1": 200
256
+ },
257
+ "flags": {},
258
+ "order": 13,
259
+ "mode": 0,
260
+ "inputs": [
261
+ {
262
+ "name": "clip",
263
+ "type": "CLIP",
264
+ "link": 2
265
+ }
266
+ ],
267
+ "outputs": [
268
+ {
269
+ "name": "CONDITIONING",
270
+ "type": "CONDITIONING",
271
+ "links": [
272
+ 17,
273
+ 87
274
+ ],
275
+ "shape": 3,
276
+ "slot_index": 0
277
+ }
278
+ ],
279
+ "title": "Positive Prompt",
280
+ "properties": {
281
+ "Node name for S&R": "CLIPTextEncode"
282
+ },
283
+ "widgets_values": [
284
+ "Hot lava"
285
+ ]
286
+ },
287
+ {
288
+ "id": 39,
289
+ "type": "comfy-qr-by-module-split",
290
+ "pos": [
291
+ -422,
292
+ 353
293
+ ],
294
+ "size": [
295
+ 400,
296
+ 344
297
+ ],
298
+ "flags": {},
299
+ "order": 16,
300
+ "mode": 0,
301
+ "inputs": [
302
+ {
303
+ "name": "text",
304
+ "type": "STRING",
305
+ "link": 155,
306
+ "widget": {
307
+ "name": "text",
308
+ "config": [
309
+ "STRING",
310
+ {
311
+ "multiline": true
312
+ }
313
+ ]
314
+ }
315
+ },
316
+ {
317
+ "name": "protocol",
318
+ "type": "Http,Https,None",
319
+ "link": 156,
320
+ "widget": {
321
+ "name": "protocol",
322
+ "config": [
323
+ [
324
+ "Http",
325
+ "Https",
326
+ "None"
327
+ ],
328
+ {
329
+ "default": "Https"
330
+ }
331
+ ]
332
+ }
333
+ }
334
+ ],
335
+ "outputs": [
336
+ {
337
+ "name": "QR_FLATTENED",
338
+ "type": "IMAGE",
339
+ "links": [
340
+ 102
341
+ ],
342
+ "shape": 3,
343
+ "slot_index": 0
344
+ },
345
+ {
346
+ "name": "MODULE_LAYER",
347
+ "type": "IMAGE",
348
+ "links": [
349
+ 126
350
+ ],
351
+ "shape": 3,
352
+ "slot_index": 1
353
+ },
354
+ {
355
+ "name": "FINDER_LAYER",
356
+ "type": "IMAGE",
357
+ "links": [
358
+ 127
359
+ ],
360
+ "shape": 3,
361
+ "slot_index": 2
362
+ },
363
+ {
364
+ "name": "FINDER_MASK",
365
+ "type": "MASK",
366
+ "links": [
367
+ 104,
368
+ 106
369
+ ],
370
+ "shape": 3,
371
+ "slot_index": 3
372
+ },
373
+ {
374
+ "name": "QR_VERSION",
375
+ "type": "INT",
376
+ "links": null,
377
+ "shape": 3
378
+ },
379
+ {
380
+ "name": "IMAGE_SIZE",
381
+ "type": "INT",
382
+ "links": null,
383
+ "shape": 3
384
+ }
385
+ ],
386
+ "properties": {
387
+ "Node name for S&R": "comfy-qr-by-module-split"
388
+ },
389
+ "widgets_values": [
390
+ "Https",
391
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr",
392
+ 16,
393
+ 768,
394
+ "#000000",
395
+ "#FFFFFF",
396
+ "High",
397
+ 1,
398
+ "Square"
399
+ ]
400
+ },
401
+ {
402
+ "id": 54,
403
+ "type": "PrimitiveNode",
404
+ "pos": [
405
+ -594,
406
+ 733
407
+ ],
408
+ "size": {
409
+ "0": 210,
410
+ "1": 82
411
+ },
412
+ "flags": {},
413
+ "order": 0,
414
+ "mode": 0,
415
+ "outputs": [
416
+ {
417
+ "name": "INT",
418
+ "type": "INT",
419
+ "links": [
420
+ 114,
421
+ 115,
422
+ 116,
423
+ 117
424
+ ],
425
+ "slot_index": 0,
426
+ "widget": {
427
+ "name": "x",
428
+ "config": [
429
+ "INT",
430
+ {
431
+ "default": 0,
432
+ "min": 0,
433
+ "max": 8192,
434
+ "step": 1
435
+ }
436
+ ]
437
+ }
438
+ }
439
+ ],
440
+ "title": "X Offset",
441
+ "properties": {},
442
+ "widgets_values": [
443
+ 48,
444
+ "fixed"
445
+ ]
446
+ },
447
+ {
448
+ "id": 55,
449
+ "type": "PrimitiveNode",
450
+ "pos": [
451
+ -592,
452
+ 863
453
+ ],
454
+ "size": {
455
+ "0": 210,
456
+ "1": 82
457
+ },
458
+ "flags": {},
459
+ "order": 1,
460
+ "mode": 0,
461
+ "outputs": [
462
+ {
463
+ "name": "INT",
464
+ "type": "INT",
465
+ "links": [
466
+ 118,
467
+ 119,
468
+ 120,
469
+ 121
470
+ ],
471
+ "slot_index": 0,
472
+ "widget": {
473
+ "name": "y",
474
+ "config": [
475
+ "INT",
476
+ {
477
+ "default": 0,
478
+ "min": 0,
479
+ "max": 8192,
480
+ "step": 1
481
+ }
482
+ ]
483
+ }
484
+ }
485
+ ],
486
+ "title": "Y Offset",
487
+ "properties": {},
488
+ "widgets_values": [
489
+ 48,
490
+ "fixed"
491
+ ]
492
+ },
493
+ {
494
+ "id": 29,
495
+ "type": "LatentCompositeMasked",
496
+ "pos": [
497
+ 1234,
498
+ 432
499
+ ],
500
+ "size": {
501
+ "0": 315,
502
+ "1": 122
503
+ },
504
+ "flags": {},
505
+ "order": 32,
506
+ "mode": 0,
507
+ "inputs": [
508
+ {
509
+ "name": "destination",
510
+ "type": "LATENT",
511
+ "link": 57
512
+ },
513
+ {
514
+ "name": "source",
515
+ "type": "LATENT",
516
+ "link": 65
517
+ },
518
+ {
519
+ "name": "mask",
520
+ "type": "MASK",
521
+ "link": 124
522
+ }
523
+ ],
524
+ "outputs": [
525
+ {
526
+ "name": "LATENT",
527
+ "type": "LATENT",
528
+ "links": [
529
+ 64
530
+ ],
531
+ "shape": 3,
532
+ "slot_index": 0
533
+ }
534
+ ],
535
+ "properties": {
536
+ "Node name for S&R": "LatentCompositeMasked"
537
+ },
538
+ "widgets_values": [
539
+ 0,
540
+ 0
541
+ ]
542
+ },
543
+ {
544
+ "id": 18,
545
+ "type": "ControlNetLoader",
546
+ "pos": [
547
+ 27,
548
+ 217
549
+ ],
550
+ "size": {
551
+ "0": 315,
552
+ "1": 58
553
+ },
554
+ "flags": {},
555
+ "order": 2,
556
+ "mode": 0,
557
+ "outputs": [
558
+ {
559
+ "name": "CONTROL_NET",
560
+ "type": "CONTROL_NET",
561
+ "links": [
562
+ 19,
563
+ 35,
564
+ 92
565
+ ],
566
+ "shape": 3,
567
+ "slot_index": 0
568
+ }
569
+ ],
570
+ "properties": {
571
+ "Node name for S&R": "ControlNetLoader"
572
+ },
573
+ "widgets_values": [
574
+ "control_v1p_sd15_qrcode_monster_v2.safetensors"
575
+ ]
576
+ },
577
+ {
578
+ "id": 23,
579
+ "type": "ControlNetApplyAdvanced",
580
+ "pos": [
581
+ 480,
582
+ 809
583
+ ],
584
+ "size": {
585
+ "0": 315,
586
+ "1": 166
587
+ },
588
+ "flags": {},
589
+ "order": 28,
590
+ "mode": 0,
591
+ "inputs": [
592
+ {
593
+ "name": "positive",
594
+ "type": "CONDITIONING",
595
+ "link": 135
596
+ },
597
+ {
598
+ "name": "negative",
599
+ "type": "CONDITIONING",
600
+ "link": 34
601
+ },
602
+ {
603
+ "name": "control_net",
604
+ "type": "CONTROL_NET",
605
+ "link": 35
606
+ },
607
+ {
608
+ "name": "image",
609
+ "type": "IMAGE",
610
+ "link": 123
611
+ }
612
+ ],
613
+ "outputs": [
614
+ {
615
+ "name": "positive",
616
+ "type": "CONDITIONING",
617
+ "links": [
618
+ 136
619
+ ],
620
+ "shape": 3,
621
+ "slot_index": 0
622
+ },
623
+ {
624
+ "name": "negative",
625
+ "type": "CONDITIONING",
626
+ "links": [
627
+ 48
628
+ ],
629
+ "shape": 3,
630
+ "slot_index": 1
631
+ }
632
+ ],
633
+ "title": "ControlNet (FG)",
634
+ "properties": {
635
+ "Node name for S&R": "ControlNetApplyAdvanced"
636
+ },
637
+ "widgets_values": [
638
+ 3,
639
+ 0,
640
+ 1
641
+ ]
642
+ },
643
+ {
644
+ "id": 57,
645
+ "type": "CLIPTextEncode",
646
+ "pos": [
647
+ 413,
648
+ 1033
649
+ ],
650
+ "size": {
651
+ "0": 400,
652
+ "1": 200
653
+ },
654
+ "flags": {},
655
+ "order": 15,
656
+ "mode": 0,
657
+ "inputs": [
658
+ {
659
+ "name": "clip",
660
+ "type": "CLIP",
661
+ "link": 134
662
+ }
663
+ ],
664
+ "outputs": [
665
+ {
666
+ "name": "CONDITIONING",
667
+ "type": "CONDITIONING",
668
+ "links": [
669
+ 135
670
+ ],
671
+ "shape": 3,
672
+ "slot_index": 0
673
+ }
674
+ ],
675
+ "title": "Finder Layer Prompt",
676
+ "properties": {
677
+ "Node name for S&R": "CLIPTextEncode"
678
+ },
679
+ "widgets_values": [
680
+ "Yellow with black markings"
681
+ ]
682
+ },
683
+ {
684
+ "id": 36,
685
+ "type": "VAEEncode",
686
+ "pos": [
687
+ 522,
688
+ 689
689
+ ],
690
+ "size": {
691
+ "0": 210,
692
+ "1": 46
693
+ },
694
+ "flags": {},
695
+ "order": 29,
696
+ "mode": 0,
697
+ "inputs": [
698
+ {
699
+ "name": "pixels",
700
+ "type": "IMAGE",
701
+ "link": 132
702
+ },
703
+ {
704
+ "name": "vae",
705
+ "type": "VAE",
706
+ "link": 78
707
+ }
708
+ ],
709
+ "outputs": [
710
+ {
711
+ "name": "LATENT",
712
+ "type": "LATENT",
713
+ "links": [
714
+ 80
715
+ ],
716
+ "shape": 3,
717
+ "slot_index": 0
718
+ }
719
+ ],
720
+ "title": "VAE Encode (FG)",
721
+ "properties": {
722
+ "Node name for S&R": "VAEEncode"
723
+ }
724
+ },
725
+ {
726
+ "id": 63,
727
+ "type": "VAEEncode",
728
+ "pos": [
729
+ 519,
730
+ 550
731
+ ],
732
+ "size": {
733
+ "0": 210,
734
+ "1": 46
735
+ },
736
+ "flags": {},
737
+ "order": 27,
738
+ "mode": 0,
739
+ "inputs": [
740
+ {
741
+ "name": "pixels",
742
+ "type": "IMAGE",
743
+ "link": 140
744
+ },
745
+ {
746
+ "name": "vae",
747
+ "type": "VAE",
748
+ "link": 141
749
+ }
750
+ ],
751
+ "outputs": [
752
+ {
753
+ "name": "LATENT",
754
+ "type": "LATENT",
755
+ "links": [
756
+ 139
757
+ ],
758
+ "shape": 3,
759
+ "slot_index": 0
760
+ }
761
+ ],
762
+ "title": "VAE Encode (BG)",
763
+ "properties": {
764
+ "Node name for S&R": "VAEEncode"
765
+ }
766
+ },
767
+ {
768
+ "id": 52,
769
+ "type": "PrimitiveNode",
770
+ "pos": [
771
+ -591,
772
+ 991
773
+ ],
774
+ "size": {
775
+ "0": 210,
776
+ "1": 82
777
+ },
778
+ "flags": {},
779
+ "order": 3,
780
+ "mode": 0,
781
+ "outputs": [
782
+ {
783
+ "name": "INT",
784
+ "type": "INT",
785
+ "links": [
786
+ 110,
787
+ 112
788
+ ],
789
+ "slot_index": 0,
790
+ "widget": {
791
+ "name": "width",
792
+ "config": [
793
+ "INT",
794
+ {
795
+ "default": 512,
796
+ "min": 1,
797
+ "max": 8192,
798
+ "step": 1
799
+ }
800
+ ]
801
+ }
802
+ }
803
+ ],
804
+ "title": "Width",
805
+ "properties": {},
806
+ "widgets_values": [
807
+ 768,
808
+ "fixed"
809
+ ]
810
+ },
811
+ {
812
+ "id": 53,
813
+ "type": "PrimitiveNode",
814
+ "pos": [
815
+ -593,
816
+ 1130
817
+ ],
818
+ "size": {
819
+ "0": 210,
820
+ "1": 82
821
+ },
822
+ "flags": {},
823
+ "order": 4,
824
+ "mode": 0,
825
+ "outputs": [
826
+ {
827
+ "name": "INT",
828
+ "type": "INT",
829
+ "links": [
830
+ 111,
831
+ 113,
832
+ 144,
833
+ 145
834
+ ],
835
+ "slot_index": 0,
836
+ "widget": {
837
+ "name": "height",
838
+ "config": [
839
+ "INT",
840
+ {
841
+ "default": 512,
842
+ "min": 1,
843
+ "max": 8192,
844
+ "step": 1
845
+ }
846
+ ]
847
+ }
848
+ }
849
+ ],
850
+ "title": "Height",
851
+ "properties": {},
852
+ "widgets_values": [
853
+ 768,
854
+ "fixed"
855
+ ]
856
+ },
857
+ {
858
+ "id": 64,
859
+ "type": "SolidMask",
860
+ "pos": [
861
+ -344,
862
+ 1263
863
+ ],
864
+ "size": {
865
+ "0": 315,
866
+ "1": 106
867
+ },
868
+ "flags": {},
869
+ "order": 12,
870
+ "mode": 0,
871
+ "inputs": [
872
+ {
873
+ "name": "width",
874
+ "type": "INT",
875
+ "link": 144,
876
+ "widget": {
877
+ "name": "width",
878
+ "config": [
879
+ "INT",
880
+ {
881
+ "default": 512,
882
+ "min": 1,
883
+ "max": 8192,
884
+ "step": 1
885
+ }
886
+ ]
887
+ }
888
+ },
889
+ {
890
+ "name": "height",
891
+ "type": "INT",
892
+ "link": 145,
893
+ "widget": {
894
+ "name": "height",
895
+ "config": [
896
+ "INT",
897
+ {
898
+ "default": 512,
899
+ "min": 1,
900
+ "max": 8192,
901
+ "step": 1
902
+ }
903
+ ]
904
+ }
905
+ }
906
+ ],
907
+ "outputs": [
908
+ {
909
+ "name": "MASK",
910
+ "type": "MASK",
911
+ "links": [
912
+ 142
913
+ ],
914
+ "shape": 3,
915
+ "slot_index": 0
916
+ }
917
+ ],
918
+ "title": "SolidMask (White)",
919
+ "properties": {
920
+ "Node name for S&R": "SolidMask"
921
+ },
922
+ "widgets_values": [
923
+ 1,
924
+ 768,
925
+ 768
926
+ ]
927
+ },
928
+ {
929
+ "id": 40,
930
+ "type": "SolidMask",
931
+ "pos": [
932
+ -347,
933
+ 949
934
+ ],
935
+ "size": {
936
+ "0": 315,
937
+ "1": 106
938
+ },
939
+ "flags": {},
940
+ "order": 10,
941
+ "mode": 0,
942
+ "inputs": [
943
+ {
944
+ "name": "width",
945
+ "type": "INT",
946
+ "link": 110,
947
+ "widget": {
948
+ "name": "width",
949
+ "config": [
950
+ "INT",
951
+ {
952
+ "default": 512,
953
+ "min": 1,
954
+ "max": 8192,
955
+ "step": 1
956
+ }
957
+ ]
958
+ }
959
+ },
960
+ {
961
+ "name": "height",
962
+ "type": "INT",
963
+ "link": 111,
964
+ "widget": {
965
+ "name": "height",
966
+ "config": [
967
+ "INT",
968
+ {
969
+ "default": 512,
970
+ "min": 1,
971
+ "max": 8192,
972
+ "step": 1
973
+ }
974
+ ]
975
+ }
976
+ }
977
+ ],
978
+ "outputs": [
979
+ {
980
+ "name": "MASK",
981
+ "type": "MASK",
982
+ "links": [
983
+ 100
984
+ ],
985
+ "shape": 3,
986
+ "slot_index": 0
987
+ }
988
+ ],
989
+ "title": "SolidMask (Grey)",
990
+ "properties": {
991
+ "Node name for S&R": "SolidMask"
992
+ },
993
+ "widgets_values": [
994
+ 0.5,
995
+ 768,
996
+ 768
997
+ ]
998
+ },
999
+ {
1000
+ "id": 42,
1001
+ "type": "ImageCompositeMasked",
1002
+ "pos": [
1003
+ 30,
1004
+ 322
1005
+ ],
1006
+ "size": {
1007
+ "0": 315,
1008
+ "1": 122
1009
+ },
1010
+ "flags": {},
1011
+ "order": 22,
1012
+ "mode": 0,
1013
+ "inputs": [
1014
+ {
1015
+ "name": "destination",
1016
+ "type": "IMAGE",
1017
+ "link": 153
1018
+ },
1019
+ {
1020
+ "name": "source",
1021
+ "type": "IMAGE",
1022
+ "link": 102
1023
+ },
1024
+ {
1025
+ "name": "mask",
1026
+ "type": "MASK",
1027
+ "link": null
1028
+ },
1029
+ {
1030
+ "name": "x",
1031
+ "type": "INT",
1032
+ "link": 116,
1033
+ "widget": {
1034
+ "name": "x",
1035
+ "config": [
1036
+ "INT",
1037
+ {
1038
+ "default": 0,
1039
+ "min": 0,
1040
+ "max": 8192,
1041
+ "step": 1
1042
+ }
1043
+ ]
1044
+ }
1045
+ },
1046
+ {
1047
+ "name": "y",
1048
+ "type": "INT",
1049
+ "link": 118,
1050
+ "widget": {
1051
+ "name": "y",
1052
+ "config": [
1053
+ "INT",
1054
+ {
1055
+ "default": 0,
1056
+ "min": 0,
1057
+ "max": 8192,
1058
+ "step": 1
1059
+ }
1060
+ ]
1061
+ }
1062
+ }
1063
+ ],
1064
+ "outputs": [
1065
+ {
1066
+ "name": "IMAGE",
1067
+ "type": "IMAGE",
1068
+ "links": [
1069
+ 125
1070
+ ],
1071
+ "shape": 3,
1072
+ "slot_index": 0
1073
+ }
1074
+ ],
1075
+ "title": "QR Flattened Composite",
1076
+ "properties": {
1077
+ "Node name for S&R": "ImageCompositeMasked"
1078
+ },
1079
+ "widgets_values": [
1080
+ 48,
1081
+ 48
1082
+ ]
1083
+ },
1084
+ {
1085
+ "id": 43,
1086
+ "type": "ImageCompositeMasked",
1087
+ "pos": [
1088
+ 42,
1089
+ 491
1090
+ ],
1091
+ "size": {
1092
+ "0": 315,
1093
+ "1": 122
1094
+ },
1095
+ "flags": {},
1096
+ "order": 23,
1097
+ "mode": 0,
1098
+ "inputs": [
1099
+ {
1100
+ "name": "destination",
1101
+ "type": "IMAGE",
1102
+ "link": 154
1103
+ },
1104
+ {
1105
+ "name": "source",
1106
+ "type": "IMAGE",
1107
+ "link": 126
1108
+ },
1109
+ {
1110
+ "name": "mask",
1111
+ "type": "MASK",
1112
+ "link": null
1113
+ },
1114
+ {
1115
+ "name": "x",
1116
+ "type": "INT",
1117
+ "link": 114,
1118
+ "widget": {
1119
+ "name": "x",
1120
+ "config": [
1121
+ "INT",
1122
+ {
1123
+ "default": 0,
1124
+ "min": 0,
1125
+ "max": 8192,
1126
+ "step": 1
1127
+ }
1128
+ ]
1129
+ }
1130
+ },
1131
+ {
1132
+ "name": "y",
1133
+ "type": "INT",
1134
+ "link": 119,
1135
+ "widget": {
1136
+ "name": "y",
1137
+ "config": [
1138
+ "INT",
1139
+ {
1140
+ "default": 0,
1141
+ "min": 0,
1142
+ "max": 8192,
1143
+ "step": 1
1144
+ }
1145
+ ]
1146
+ }
1147
+ }
1148
+ ],
1149
+ "outputs": [
1150
+ {
1151
+ "name": "IMAGE",
1152
+ "type": "IMAGE",
1153
+ "links": [
1154
+ 122,
1155
+ 140
1156
+ ],
1157
+ "shape": 3,
1158
+ "slot_index": 0
1159
+ }
1160
+ ],
1161
+ "title": "Module Layer Composite",
1162
+ "properties": {
1163
+ "Node name for S&R": "ImageCompositeMasked"
1164
+ },
1165
+ "widgets_values": [
1166
+ 48,
1167
+ 48
1168
+ ]
1169
+ },
1170
+ {
1171
+ "id": 65,
1172
+ "type": "MaskToImage",
1173
+ "pos": [
1174
+ 32,
1175
+ 1267
1176
+ ],
1177
+ "size": {
1178
+ "0": 195.12049865722656,
1179
+ "1": 26
1180
+ },
1181
+ "flags": {},
1182
+ "order": 19,
1183
+ "mode": 0,
1184
+ "inputs": [
1185
+ {
1186
+ "name": "mask",
1187
+ "type": "MASK",
1188
+ "link": 142
1189
+ }
1190
+ ],
1191
+ "outputs": [
1192
+ {
1193
+ "name": "IMAGE",
1194
+ "type": "IMAGE",
1195
+ "links": [
1196
+ 146
1197
+ ],
1198
+ "shape": 3,
1199
+ "slot_index": 0
1200
+ }
1201
+ ],
1202
+ "title": "Solid (White)",
1203
+ "properties": {
1204
+ "Node name for S&R": "MaskToImage"
1205
+ }
1206
+ },
1207
+ {
1208
+ "id": 50,
1209
+ "type": "SolidMask",
1210
+ "pos": [
1211
+ -345,
1212
+ 1106
1213
+ ],
1214
+ "size": {
1215
+ "0": 315,
1216
+ "1": 106
1217
+ },
1218
+ "flags": {},
1219
+ "order": 11,
1220
+ "mode": 0,
1221
+ "inputs": [
1222
+ {
1223
+ "name": "width",
1224
+ "type": "INT",
1225
+ "link": 112,
1226
+ "widget": {
1227
+ "name": "width",
1228
+ "config": [
1229
+ "INT",
1230
+ {
1231
+ "default": 512,
1232
+ "min": 1,
1233
+ "max": 8192,
1234
+ "step": 1
1235
+ }
1236
+ ]
1237
+ }
1238
+ },
1239
+ {
1240
+ "name": "height",
1241
+ "type": "INT",
1242
+ "link": 113,
1243
+ "widget": {
1244
+ "name": "height",
1245
+ "config": [
1246
+ "INT",
1247
+ {
1248
+ "default": 512,
1249
+ "min": 1,
1250
+ "max": 8192,
1251
+ "step": 1
1252
+ }
1253
+ ]
1254
+ }
1255
+ }
1256
+ ],
1257
+ "outputs": [
1258
+ {
1259
+ "name": "MASK",
1260
+ "type": "MASK",
1261
+ "links": [
1262
+ 107,
1263
+ 151
1264
+ ],
1265
+ "shape": 3,
1266
+ "slot_index": 0
1267
+ }
1268
+ ],
1269
+ "title": "SolidMask (Black)",
1270
+ "properties": {
1271
+ "Node name for S&R": "SolidMask"
1272
+ },
1273
+ "widgets_values": [
1274
+ 0,
1275
+ 768,
1276
+ 768
1277
+ ]
1278
+ },
1279
+ {
1280
+ "id": 67,
1281
+ "type": "MaskToImage",
1282
+ "pos": [
1283
+ 36,
1284
+ 1144
1285
+ ],
1286
+ "size": {
1287
+ "0": 195.12049865722656,
1288
+ "1": 26
1289
+ },
1290
+ "flags": {},
1291
+ "order": 18,
1292
+ "mode": 0,
1293
+ "inputs": [
1294
+ {
1295
+ "name": "mask",
1296
+ "type": "MASK",
1297
+ "link": 151
1298
+ }
1299
+ ],
1300
+ "outputs": [
1301
+ {
1302
+ "name": "IMAGE",
1303
+ "type": "IMAGE",
1304
+ "links": [],
1305
+ "shape": 3,
1306
+ "slot_index": 0
1307
+ }
1308
+ ],
1309
+ "title": "Solid (Black)",
1310
+ "properties": {
1311
+ "Node name for S&R": "MaskToImage"
1312
+ }
1313
+ },
1314
+ {
1315
+ "id": 24,
1316
+ "type": "KSamplerAdvanced",
1317
+ "pos": [
1318
+ 878,
1319
+ -37
1320
+ ],
1321
+ "size": {
1322
+ "0": 315,
1323
+ "1": 546
1324
+ },
1325
+ "flags": {},
1326
+ "order": 30,
1327
+ "mode": 0,
1328
+ "inputs": [
1329
+ {
1330
+ "name": "model",
1331
+ "type": "MODEL",
1332
+ "link": 40
1333
+ },
1334
+ {
1335
+ "name": "positive",
1336
+ "type": "CONDITIONING",
1337
+ "link": 89
1338
+ },
1339
+ {
1340
+ "name": "negative",
1341
+ "type": "CONDITIONING",
1342
+ "link": 38
1343
+ },
1344
+ {
1345
+ "name": "latent_image",
1346
+ "type": "LATENT",
1347
+ "link": 139
1348
+ },
1349
+ {
1350
+ "name": "end_at_step",
1351
+ "type": "INT",
1352
+ "link": 45,
1353
+ "widget": {
1354
+ "name": "end_at_step",
1355
+ "config": [
1356
+ "INT",
1357
+ {
1358
+ "default": 10000,
1359
+ "min": 0,
1360
+ "max": 10000
1361
+ }
1362
+ ]
1363
+ }
1364
+ },
1365
+ {
1366
+ "name": "steps",
1367
+ "type": "INT",
1368
+ "link": 82,
1369
+ "widget": {
1370
+ "name": "steps",
1371
+ "config": [
1372
+ "INT",
1373
+ {
1374
+ "default": 20,
1375
+ "min": 1,
1376
+ "max": 10000
1377
+ }
1378
+ ]
1379
+ }
1380
+ }
1381
+ ],
1382
+ "outputs": [
1383
+ {
1384
+ "name": "LATENT",
1385
+ "type": "LATENT",
1386
+ "links": [
1387
+ 57
1388
+ ],
1389
+ "shape": 3,
1390
+ "slot_index": 0
1391
+ }
1392
+ ],
1393
+ "title": "KSampler (BG)",
1394
+ "properties": {
1395
+ "Node name for S&R": "KSamplerAdvanced"
1396
+ },
1397
+ "widgets_values": [
1398
+ "enable",
1399
+ 414560518288903,
1400
+ "randomize",
1401
+ 25,
1402
+ 8,
1403
+ "euler_ancestral",
1404
+ "normal",
1405
+ 0,
1406
+ 13,
1407
+ "enable"
1408
+ ]
1409
+ },
1410
+ {
1411
+ "id": 30,
1412
+ "type": "KSamplerAdvanced",
1413
+ "pos": [
1414
+ 1634,
1415
+ 25
1416
+ ],
1417
+ "size": {
1418
+ "0": 315,
1419
+ "1": 542
1420
+ },
1421
+ "flags": {},
1422
+ "order": 33,
1423
+ "mode": 0,
1424
+ "inputs": [
1425
+ {
1426
+ "name": "model",
1427
+ "type": "MODEL",
1428
+ "link": 62
1429
+ },
1430
+ {
1431
+ "name": "positive",
1432
+ "type": "CONDITIONING",
1433
+ "link": 90
1434
+ },
1435
+ {
1436
+ "name": "negative",
1437
+ "type": "CONDITIONING",
1438
+ "link": 91
1439
+ },
1440
+ {
1441
+ "name": "latent_image",
1442
+ "type": "LATENT",
1443
+ "link": 64
1444
+ },
1445
+ {
1446
+ "name": "start_at_step",
1447
+ "type": "INT",
1448
+ "link": 58,
1449
+ "widget": {
1450
+ "name": "start_at_step",
1451
+ "config": [
1452
+ "INT",
1453
+ {
1454
+ "default": 0,
1455
+ "min": 0,
1456
+ "max": 10000
1457
+ }
1458
+ ]
1459
+ }
1460
+ },
1461
+ {
1462
+ "name": "steps",
1463
+ "type": "INT",
1464
+ "link": 84,
1465
+ "widget": {
1466
+ "name": "steps",
1467
+ "config": [
1468
+ "INT",
1469
+ {
1470
+ "default": 20,
1471
+ "min": 1,
1472
+ "max": 10000
1473
+ }
1474
+ ]
1475
+ }
1476
+ }
1477
+ ],
1478
+ "outputs": [
1479
+ {
1480
+ "name": "LATENT",
1481
+ "type": "LATENT",
1482
+ "links": [
1483
+ 63
1484
+ ],
1485
+ "shape": 3,
1486
+ "slot_index": 0
1487
+ }
1488
+ ],
1489
+ "title": "KSampler (Combined)",
1490
+ "properties": {
1491
+ "Node name for S&R": "KSamplerAdvanced"
1492
+ },
1493
+ "widgets_values": [
1494
+ "disable",
1495
+ 447592191701148,
1496
+ "randomize",
1497
+ 25,
1498
+ 8,
1499
+ "euler_ancestral",
1500
+ "normal",
1501
+ 13,
1502
+ 10000,
1503
+ "disable"
1504
+ ]
1505
+ },
1506
+ {
1507
+ "id": 37,
1508
+ "type": "PrimitiveNode",
1509
+ "pos": [
1510
+ 991,
1511
+ -189
1512
+ ],
1513
+ "size": {
1514
+ "0": 210,
1515
+ "1": 82
1516
+ },
1517
+ "flags": {},
1518
+ "order": 5,
1519
+ "mode": 0,
1520
+ "outputs": [
1521
+ {
1522
+ "name": "INT",
1523
+ "type": "INT",
1524
+ "links": [
1525
+ 82,
1526
+ 83,
1527
+ 84
1528
+ ],
1529
+ "slot_index": 0,
1530
+ "widget": {
1531
+ "name": "steps",
1532
+ "config": [
1533
+ "INT",
1534
+ {
1535
+ "default": 20,
1536
+ "min": 1,
1537
+ "max": 10000
1538
+ }
1539
+ ]
1540
+ }
1541
+ }
1542
+ ],
1543
+ "title": "Steps",
1544
+ "properties": {},
1545
+ "widgets_values": [
1546
+ 25,
1547
+ "fixed"
1548
+ ]
1549
+ },
1550
+ {
1551
+ "id": 17,
1552
+ "type": "ControlNetApplyAdvanced",
1553
+ "pos": [
1554
+ 471,
1555
+ 294
1556
+ ],
1557
+ "size": {
1558
+ "0": 315,
1559
+ "1": 166
1560
+ },
1561
+ "flags": {},
1562
+ "order": 26,
1563
+ "mode": 0,
1564
+ "inputs": [
1565
+ {
1566
+ "name": "positive",
1567
+ "type": "CONDITIONING",
1568
+ "link": 17
1569
+ },
1570
+ {
1571
+ "name": "negative",
1572
+ "type": "CONDITIONING",
1573
+ "link": 23
1574
+ },
1575
+ {
1576
+ "name": "control_net",
1577
+ "type": "CONTROL_NET",
1578
+ "link": 19
1579
+ },
1580
+ {
1581
+ "name": "image",
1582
+ "type": "IMAGE",
1583
+ "link": 122
1584
+ }
1585
+ ],
1586
+ "outputs": [
1587
+ {
1588
+ "name": "positive",
1589
+ "type": "CONDITIONING",
1590
+ "links": [
1591
+ 89
1592
+ ],
1593
+ "shape": 3,
1594
+ "slot_index": 0
1595
+ },
1596
+ {
1597
+ "name": "negative",
1598
+ "type": "CONDITIONING",
1599
+ "links": [
1600
+ 38
1601
+ ],
1602
+ "shape": 3,
1603
+ "slot_index": 1
1604
+ }
1605
+ ],
1606
+ "title": "ControlNet (BG)",
1607
+ "properties": {
1608
+ "Node name for S&R": "ControlNetApplyAdvanced"
1609
+ },
1610
+ "widgets_values": [
1611
+ 1.4000000000000001,
1612
+ 0,
1613
+ 1
1614
+ ]
1615
+ },
1616
+ {
1617
+ "id": 27,
1618
+ "type": "KSamplerAdvanced",
1619
+ "pos": [
1620
+ 872,
1621
+ 571
1622
+ ],
1623
+ "size": {
1624
+ "0": 315,
1625
+ "1": 546
1626
+ },
1627
+ "flags": {},
1628
+ "order": 31,
1629
+ "mode": 0,
1630
+ "inputs": [
1631
+ {
1632
+ "name": "model",
1633
+ "type": "MODEL",
1634
+ "link": 46
1635
+ },
1636
+ {
1637
+ "name": "positive",
1638
+ "type": "CONDITIONING",
1639
+ "link": 136
1640
+ },
1641
+ {
1642
+ "name": "negative",
1643
+ "type": "CONDITIONING",
1644
+ "link": 48
1645
+ },
1646
+ {
1647
+ "name": "latent_image",
1648
+ "type": "LATENT",
1649
+ "link": 80
1650
+ },
1651
+ {
1652
+ "name": "end_at_step",
1653
+ "type": "INT",
1654
+ "link": 44,
1655
+ "widget": {
1656
+ "name": "end_at_step",
1657
+ "config": [
1658
+ "INT",
1659
+ {
1660
+ "default": 10000,
1661
+ "min": 0,
1662
+ "max": 10000
1663
+ }
1664
+ ]
1665
+ }
1666
+ },
1667
+ {
1668
+ "name": "steps",
1669
+ "type": "INT",
1670
+ "link": 83,
1671
+ "widget": {
1672
+ "name": "steps",
1673
+ "config": [
1674
+ "INT",
1675
+ {
1676
+ "default": 20,
1677
+ "min": 1,
1678
+ "max": 10000
1679
+ }
1680
+ ]
1681
+ }
1682
+ }
1683
+ ],
1684
+ "outputs": [
1685
+ {
1686
+ "name": "LATENT",
1687
+ "type": "LATENT",
1688
+ "links": [
1689
+ 65
1690
+ ],
1691
+ "shape": 3,
1692
+ "slot_index": 0
1693
+ }
1694
+ ],
1695
+ "title": "KSampler (FG)",
1696
+ "properties": {
1697
+ "Node name for S&R": "KSamplerAdvanced"
1698
+ },
1699
+ "widgets_values": [
1700
+ "enable",
1701
+ 502985537802905,
1702
+ "randomize",
1703
+ 25,
1704
+ 8,
1705
+ "euler",
1706
+ "normal",
1707
+ 2,
1708
+ 13,
1709
+ "enable"
1710
+ ]
1711
+ },
1712
+ {
1713
+ "id": 28,
1714
+ "type": "PrimitiveNode",
1715
+ "pos": [
1716
+ 1235,
1717
+ -191
1718
+ ],
1719
+ "size": {
1720
+ "0": 210,
1721
+ "1": 82
1722
+ },
1723
+ "flags": {},
1724
+ "order": 6,
1725
+ "mode": 0,
1726
+ "outputs": [
1727
+ {
1728
+ "name": "INT",
1729
+ "type": "INT",
1730
+ "links": [
1731
+ 44,
1732
+ 45,
1733
+ 58
1734
+ ],
1735
+ "slot_index": 0,
1736
+ "widget": {
1737
+ "name": "end_at_step",
1738
+ "config": [
1739
+ "INT",
1740
+ {
1741
+ "default": 10000,
1742
+ "min": 0,
1743
+ "max": 10000
1744
+ }
1745
+ ]
1746
+ }
1747
+ }
1748
+ ],
1749
+ "title": "Seperation Step",
1750
+ "properties": {},
1751
+ "widgets_values": [
1752
+ 13,
1753
+ "fixed"
1754
+ ]
1755
+ },
1756
+ {
1757
+ "id": 38,
1758
+ "type": "ControlNetApplyAdvanced",
1759
+ "pos": [
1760
+ 1235,
1761
+ 204
1762
+ ],
1763
+ "size": {
1764
+ "0": 315,
1765
+ "1": 166
1766
+ },
1767
+ "flags": {},
1768
+ "order": 25,
1769
+ "mode": 0,
1770
+ "inputs": [
1771
+ {
1772
+ "name": "positive",
1773
+ "type": "CONDITIONING",
1774
+ "link": 87
1775
+ },
1776
+ {
1777
+ "name": "negative",
1778
+ "type": "CONDITIONING",
1779
+ "link": 88
1780
+ },
1781
+ {
1782
+ "name": "control_net",
1783
+ "type": "CONTROL_NET",
1784
+ "link": 92
1785
+ },
1786
+ {
1787
+ "name": "image",
1788
+ "type": "IMAGE",
1789
+ "link": 125
1790
+ }
1791
+ ],
1792
+ "outputs": [
1793
+ {
1794
+ "name": "positive",
1795
+ "type": "CONDITIONING",
1796
+ "links": [
1797
+ 90
1798
+ ],
1799
+ "shape": 3,
1800
+ "slot_index": 0
1801
+ },
1802
+ {
1803
+ "name": "negative",
1804
+ "type": "CONDITIONING",
1805
+ "links": [
1806
+ 91
1807
+ ],
1808
+ "shape": 3,
1809
+ "slot_index": 1
1810
+ }
1811
+ ],
1812
+ "title": "ControlNet (Combined)",
1813
+ "properties": {
1814
+ "Node name for S&R": "ControlNetApplyAdvanced"
1815
+ },
1816
+ "widgets_values": [
1817
+ 1.5,
1818
+ 0,
1819
+ 1
1820
+ ]
1821
+ },
1822
+ {
1823
+ "id": 6,
1824
+ "type": "CheckpointLoaderSimple",
1825
+ "pos": [
1826
+ 24,
1827
+ 53
1828
+ ],
1829
+ "size": {
1830
+ "0": 315,
1831
+ "1": 98
1832
+ },
1833
+ "flags": {},
1834
+ "order": 7,
1835
+ "mode": 0,
1836
+ "outputs": [
1837
+ {
1838
+ "name": "MODEL",
1839
+ "type": "MODEL",
1840
+ "links": [
1841
+ 40,
1842
+ 46,
1843
+ 62
1844
+ ],
1845
+ "shape": 3,
1846
+ "slot_index": 0
1847
+ },
1848
+ {
1849
+ "name": "CLIP",
1850
+ "type": "CLIP",
1851
+ "links": [
1852
+ 2,
1853
+ 3,
1854
+ 134
1855
+ ],
1856
+ "shape": 3,
1857
+ "slot_index": 1
1858
+ },
1859
+ {
1860
+ "name": "VAE",
1861
+ "type": "VAE",
1862
+ "links": [
1863
+ 11,
1864
+ 78,
1865
+ 141
1866
+ ],
1867
+ "shape": 3,
1868
+ "slot_index": 2
1869
+ }
1870
+ ],
1871
+ "properties": {
1872
+ "Node name for S&R": "CheckpointLoaderSimple"
1873
+ },
1874
+ "widgets_values": [
1875
+ "1.5/v1-5-pruned-emaonly.safetensors"
1876
+ ]
1877
+ },
1878
+ {
1879
+ "id": 41,
1880
+ "type": "MaskToImage",
1881
+ "pos": [
1882
+ -247,
1883
+ 864
1884
+ ],
1885
+ "size": {
1886
+ "0": 210,
1887
+ "1": 26
1888
+ },
1889
+ "flags": {},
1890
+ "order": 17,
1891
+ "mode": 0,
1892
+ "inputs": [
1893
+ {
1894
+ "name": "mask",
1895
+ "type": "MASK",
1896
+ "link": 100
1897
+ }
1898
+ ],
1899
+ "outputs": [
1900
+ {
1901
+ "name": "IMAGE",
1902
+ "type": "IMAGE",
1903
+ "links": [
1904
+ 153,
1905
+ 154
1906
+ ],
1907
+ "shape": 3,
1908
+ "slot_index": 0
1909
+ }
1910
+ ],
1911
+ "title": "Solid (Grey)",
1912
+ "properties": {
1913
+ "Node name for S&R": "MaskToImage"
1914
+ }
1915
+ },
1916
+ {
1917
+ "id": 68,
1918
+ "type": "PrimitiveNode",
1919
+ "pos": [
1920
+ -422,
1921
+ 208
1922
+ ],
1923
+ "size": {
1924
+ "0": 210,
1925
+ "1": 76
1926
+ },
1927
+ "flags": {},
1928
+ "order": 8,
1929
+ "mode": 0,
1930
+ "outputs": [
1931
+ {
1932
+ "name": "STRING",
1933
+ "type": "STRING",
1934
+ "links": [
1935
+ 155
1936
+ ],
1937
+ "slot_index": 0,
1938
+ "widget": {
1939
+ "name": "text",
1940
+ "config": [
1941
+ "STRING",
1942
+ {
1943
+ "multiline": true
1944
+ }
1945
+ ]
1946
+ }
1947
+ }
1948
+ ],
1949
+ "title": "URL",
1950
+ "properties": {},
1951
+ "widgets_values": [
1952
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr"
1953
+ ]
1954
+ },
1955
+ {
1956
+ "id": 69,
1957
+ "type": "PrimitiveNode",
1958
+ "pos": [
1959
+ -422,
1960
+ 70
1961
+ ],
1962
+ "size": {
1963
+ "0": 210,
1964
+ "1": 82
1965
+ },
1966
+ "flags": {},
1967
+ "order": 9,
1968
+ "mode": 0,
1969
+ "outputs": [
1970
+ {
1971
+ "name": "COMBO",
1972
+ "type": "Http,Https,None",
1973
+ "links": [
1974
+ 156
1975
+ ],
1976
+ "slot_index": 0,
1977
+ "widget": {
1978
+ "name": "protocol",
1979
+ "config": [
1980
+ [
1981
+ "Http",
1982
+ "Https",
1983
+ "None"
1984
+ ],
1985
+ {
1986
+ "default": "Https"
1987
+ }
1988
+ ]
1989
+ }
1990
+ }
1991
+ ],
1992
+ "title": "Protocol",
1993
+ "properties": {},
1994
+ "widgets_values": [
1995
+ "Https",
1996
+ "fixed"
1997
+ ]
1998
+ },
1999
+ {
2000
+ "id": 13,
2001
+ "type": "VAEDecode",
2002
+ "pos": [
2003
+ 1272,
2004
+ 671
2005
+ ],
2006
+ "size": {
2007
+ "0": 210,
2008
+ "1": 46
2009
+ },
2010
+ "flags": {},
2011
+ "order": 34,
2012
+ "mode": 0,
2013
+ "inputs": [
2014
+ {
2015
+ "name": "samples",
2016
+ "type": "LATENT",
2017
+ "link": 63
2018
+ },
2019
+ {
2020
+ "name": "vae",
2021
+ "type": "VAE",
2022
+ "link": 11
2023
+ }
2024
+ ],
2025
+ "outputs": [
2026
+ {
2027
+ "name": "IMAGE",
2028
+ "type": "IMAGE",
2029
+ "links": [
2030
+ 159
2031
+ ],
2032
+ "shape": 3,
2033
+ "slot_index": 0
2034
+ }
2035
+ ],
2036
+ "properties": {
2037
+ "Node name for S&R": "VAEDecode"
2038
+ }
2039
+ },
2040
+ {
2041
+ "id": 12,
2042
+ "type": "SaveImage",
2043
+ "pos": [
2044
+ 1537,
2045
+ 672
2046
+ ],
2047
+ "size": {
2048
+ "0": 315,
2049
+ "1": 270
2050
+ },
2051
+ "flags": {},
2052
+ "order": 35,
2053
+ "mode": 0,
2054
+ "inputs": [
2055
+ {
2056
+ "name": "images",
2057
+ "type": "IMAGE",
2058
+ "link": 159
2059
+ }
2060
+ ],
2061
+ "properties": {},
2062
+ "widgets_values": [
2063
+ "ComfyUI"
2064
+ ]
2065
+ }
2066
+ ],
2067
+ "links": [
2068
+ [
2069
+ 2,
2070
+ 6,
2071
+ 1,
2072
+ 7,
2073
+ 0,
2074
+ "CLIP"
2075
+ ],
2076
+ [
2077
+ 3,
2078
+ 6,
2079
+ 1,
2080
+ 8,
2081
+ 0,
2082
+ "CLIP"
2083
+ ],
2084
+ [
2085
+ 11,
2086
+ 6,
2087
+ 2,
2088
+ 13,
2089
+ 1,
2090
+ "VAE"
2091
+ ],
2092
+ [
2093
+ 17,
2094
+ 7,
2095
+ 0,
2096
+ 17,
2097
+ 0,
2098
+ "CONDITIONING"
2099
+ ],
2100
+ [
2101
+ 19,
2102
+ 18,
2103
+ 0,
2104
+ 17,
2105
+ 2,
2106
+ "CONTROL_NET"
2107
+ ],
2108
+ [
2109
+ 23,
2110
+ 8,
2111
+ 0,
2112
+ 17,
2113
+ 1,
2114
+ "CONDITIONING"
2115
+ ],
2116
+ [
2117
+ 34,
2118
+ 8,
2119
+ 0,
2120
+ 23,
2121
+ 1,
2122
+ "CONDITIONING"
2123
+ ],
2124
+ [
2125
+ 35,
2126
+ 18,
2127
+ 0,
2128
+ 23,
2129
+ 2,
2130
+ "CONTROL_NET"
2131
+ ],
2132
+ [
2133
+ 38,
2134
+ 17,
2135
+ 1,
2136
+ 24,
2137
+ 2,
2138
+ "CONDITIONING"
2139
+ ],
2140
+ [
2141
+ 40,
2142
+ 6,
2143
+ 0,
2144
+ 24,
2145
+ 0,
2146
+ "MODEL"
2147
+ ],
2148
+ [
2149
+ 44,
2150
+ 28,
2151
+ 0,
2152
+ 27,
2153
+ 4,
2154
+ "INT"
2155
+ ],
2156
+ [
2157
+ 45,
2158
+ 28,
2159
+ 0,
2160
+ 24,
2161
+ 4,
2162
+ "INT"
2163
+ ],
2164
+ [
2165
+ 46,
2166
+ 6,
2167
+ 0,
2168
+ 27,
2169
+ 0,
2170
+ "MODEL"
2171
+ ],
2172
+ [
2173
+ 48,
2174
+ 23,
2175
+ 1,
2176
+ 27,
2177
+ 2,
2178
+ "CONDITIONING"
2179
+ ],
2180
+ [
2181
+ 57,
2182
+ 24,
2183
+ 0,
2184
+ 29,
2185
+ 0,
2186
+ "LATENT"
2187
+ ],
2188
+ [
2189
+ 58,
2190
+ 28,
2191
+ 0,
2192
+ 30,
2193
+ 4,
2194
+ "INT"
2195
+ ],
2196
+ [
2197
+ 62,
2198
+ 6,
2199
+ 0,
2200
+ 30,
2201
+ 0,
2202
+ "MODEL"
2203
+ ],
2204
+ [
2205
+ 63,
2206
+ 30,
2207
+ 0,
2208
+ 13,
2209
+ 0,
2210
+ "LATENT"
2211
+ ],
2212
+ [
2213
+ 64,
2214
+ 29,
2215
+ 0,
2216
+ 30,
2217
+ 3,
2218
+ "LATENT"
2219
+ ],
2220
+ [
2221
+ 65,
2222
+ 27,
2223
+ 0,
2224
+ 29,
2225
+ 1,
2226
+ "LATENT"
2227
+ ],
2228
+ [
2229
+ 78,
2230
+ 6,
2231
+ 2,
2232
+ 36,
2233
+ 1,
2234
+ "VAE"
2235
+ ],
2236
+ [
2237
+ 80,
2238
+ 36,
2239
+ 0,
2240
+ 27,
2241
+ 3,
2242
+ "LATENT"
2243
+ ],
2244
+ [
2245
+ 82,
2246
+ 37,
2247
+ 0,
2248
+ 24,
2249
+ 5,
2250
+ "INT"
2251
+ ],
2252
+ [
2253
+ 83,
2254
+ 37,
2255
+ 0,
2256
+ 27,
2257
+ 5,
2258
+ "INT"
2259
+ ],
2260
+ [
2261
+ 84,
2262
+ 37,
2263
+ 0,
2264
+ 30,
2265
+ 5,
2266
+ "INT"
2267
+ ],
2268
+ [
2269
+ 87,
2270
+ 7,
2271
+ 0,
2272
+ 38,
2273
+ 0,
2274
+ "CONDITIONING"
2275
+ ],
2276
+ [
2277
+ 88,
2278
+ 8,
2279
+ 0,
2280
+ 38,
2281
+ 1,
2282
+ "CONDITIONING"
2283
+ ],
2284
+ [
2285
+ 89,
2286
+ 17,
2287
+ 0,
2288
+ 24,
2289
+ 1,
2290
+ "CONDITIONING"
2291
+ ],
2292
+ [
2293
+ 90,
2294
+ 38,
2295
+ 0,
2296
+ 30,
2297
+ 1,
2298
+ "CONDITIONING"
2299
+ ],
2300
+ [
2301
+ 91,
2302
+ 38,
2303
+ 1,
2304
+ 30,
2305
+ 2,
2306
+ "CONDITIONING"
2307
+ ],
2308
+ [
2309
+ 92,
2310
+ 18,
2311
+ 0,
2312
+ 38,
2313
+ 2,
2314
+ "CONTROL_NET"
2315
+ ],
2316
+ [
2317
+ 100,
2318
+ 40,
2319
+ 0,
2320
+ 41,
2321
+ 0,
2322
+ "MASK"
2323
+ ],
2324
+ [
2325
+ 102,
2326
+ 39,
2327
+ 0,
2328
+ 42,
2329
+ 1,
2330
+ "IMAGE"
2331
+ ],
2332
+ [
2333
+ 104,
2334
+ 39,
2335
+ 3,
2336
+ 47,
2337
+ 0,
2338
+ "MASK"
2339
+ ],
2340
+ [
2341
+ 106,
2342
+ 39,
2343
+ 3,
2344
+ 49,
2345
+ 1,
2346
+ "MASK"
2347
+ ],
2348
+ [
2349
+ 107,
2350
+ 50,
2351
+ 0,
2352
+ 49,
2353
+ 0,
2354
+ "MASK"
2355
+ ],
2356
+ [
2357
+ 110,
2358
+ 52,
2359
+ 0,
2360
+ 40,
2361
+ 0,
2362
+ "INT"
2363
+ ],
2364
+ [
2365
+ 111,
2366
+ 53,
2367
+ 0,
2368
+ 40,
2369
+ 1,
2370
+ "INT"
2371
+ ],
2372
+ [
2373
+ 112,
2374
+ 52,
2375
+ 0,
2376
+ 50,
2377
+ 0,
2378
+ "INT"
2379
+ ],
2380
+ [
2381
+ 113,
2382
+ 53,
2383
+ 0,
2384
+ 50,
2385
+ 1,
2386
+ "INT"
2387
+ ],
2388
+ [
2389
+ 114,
2390
+ 54,
2391
+ 0,
2392
+ 43,
2393
+ 3,
2394
+ "INT"
2395
+ ],
2396
+ [
2397
+ 115,
2398
+ 54,
2399
+ 0,
2400
+ 44,
2401
+ 3,
2402
+ "INT"
2403
+ ],
2404
+ [
2405
+ 116,
2406
+ 54,
2407
+ 0,
2408
+ 42,
2409
+ 3,
2410
+ "INT"
2411
+ ],
2412
+ [
2413
+ 117,
2414
+ 54,
2415
+ 0,
2416
+ 49,
2417
+ 2,
2418
+ "INT"
2419
+ ],
2420
+ [
2421
+ 118,
2422
+ 55,
2423
+ 0,
2424
+ 42,
2425
+ 4,
2426
+ "INT"
2427
+ ],
2428
+ [
2429
+ 119,
2430
+ 55,
2431
+ 0,
2432
+ 43,
2433
+ 4,
2434
+ "INT"
2435
+ ],
2436
+ [
2437
+ 120,
2438
+ 55,
2439
+ 0,
2440
+ 44,
2441
+ 4,
2442
+ "INT"
2443
+ ],
2444
+ [
2445
+ 121,
2446
+ 55,
2447
+ 0,
2448
+ 49,
2449
+ 3,
2450
+ "INT"
2451
+ ],
2452
+ [
2453
+ 122,
2454
+ 43,
2455
+ 0,
2456
+ 17,
2457
+ 3,
2458
+ "IMAGE"
2459
+ ],
2460
+ [
2461
+ 123,
2462
+ 44,
2463
+ 0,
2464
+ 23,
2465
+ 3,
2466
+ "IMAGE"
2467
+ ],
2468
+ [
2469
+ 124,
2470
+ 49,
2471
+ 0,
2472
+ 29,
2473
+ 2,
2474
+ "MASK"
2475
+ ],
2476
+ [
2477
+ 125,
2478
+ 42,
2479
+ 0,
2480
+ 38,
2481
+ 3,
2482
+ "IMAGE"
2483
+ ],
2484
+ [
2485
+ 126,
2486
+ 39,
2487
+ 1,
2488
+ 43,
2489
+ 1,
2490
+ "IMAGE"
2491
+ ],
2492
+ [
2493
+ 127,
2494
+ 39,
2495
+ 2,
2496
+ 44,
2497
+ 1,
2498
+ "IMAGE"
2499
+ ],
2500
+ [
2501
+ 132,
2502
+ 44,
2503
+ 0,
2504
+ 36,
2505
+ 0,
2506
+ "IMAGE"
2507
+ ],
2508
+ [
2509
+ 134,
2510
+ 6,
2511
+ 1,
2512
+ 57,
2513
+ 0,
2514
+ "CLIP"
2515
+ ],
2516
+ [
2517
+ 135,
2518
+ 57,
2519
+ 0,
2520
+ 23,
2521
+ 0,
2522
+ "CONDITIONING"
2523
+ ],
2524
+ [
2525
+ 136,
2526
+ 23,
2527
+ 0,
2528
+ 27,
2529
+ 1,
2530
+ "CONDITIONING"
2531
+ ],
2532
+ [
2533
+ 139,
2534
+ 63,
2535
+ 0,
2536
+ 24,
2537
+ 3,
2538
+ "LATENT"
2539
+ ],
2540
+ [
2541
+ 140,
2542
+ 43,
2543
+ 0,
2544
+ 63,
2545
+ 0,
2546
+ "IMAGE"
2547
+ ],
2548
+ [
2549
+ 141,
2550
+ 6,
2551
+ 2,
2552
+ 63,
2553
+ 1,
2554
+ "VAE"
2555
+ ],
2556
+ [
2557
+ 142,
2558
+ 64,
2559
+ 0,
2560
+ 65,
2561
+ 0,
2562
+ "MASK"
2563
+ ],
2564
+ [
2565
+ 144,
2566
+ 53,
2567
+ 0,
2568
+ 64,
2569
+ 0,
2570
+ "INT"
2571
+ ],
2572
+ [
2573
+ 145,
2574
+ 53,
2575
+ 0,
2576
+ 64,
2577
+ 1,
2578
+ "INT"
2579
+ ],
2580
+ [
2581
+ 146,
2582
+ 65,
2583
+ 0,
2584
+ 44,
2585
+ 0,
2586
+ "IMAGE"
2587
+ ],
2588
+ [
2589
+ 151,
2590
+ 50,
2591
+ 0,
2592
+ 67,
2593
+ 0,
2594
+ "MASK"
2595
+ ],
2596
+ [
2597
+ 153,
2598
+ 41,
2599
+ 0,
2600
+ 42,
2601
+ 0,
2602
+ "IMAGE"
2603
+ ],
2604
+ [
2605
+ 154,
2606
+ 41,
2607
+ 0,
2608
+ 43,
2609
+ 0,
2610
+ "IMAGE"
2611
+ ],
2612
+ [
2613
+ 155,
2614
+ 68,
2615
+ 0,
2616
+ 39,
2617
+ 0,
2618
+ "STRING"
2619
+ ],
2620
+ [
2621
+ 156,
2622
+ 69,
2623
+ 0,
2624
+ 39,
2625
+ 1,
2626
+ "Http,Https,None"
2627
+ ],
2628
+ [
2629
+ 159,
2630
+ 13,
2631
+ 0,
2632
+ 12,
2633
+ 0,
2634
+ "IMAGE"
2635
+ ]
2636
+ ],
2637
+ "groups": [],
2638
+ "config": {},
2639
+ "extra": {},
2640
+ "version": 0.4
2641
+ }
custom_nodes/ComfyQR/examples/simple-qr-error-mask.json ADDED
@@ -0,0 +1,427 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 11,
3
+ "last_link_id": 12,
4
+ "nodes": [
5
+ {
6
+ "id": 5,
7
+ "type": "MaskToImage",
8
+ "pos": [
9
+ 420,
10
+ 740
11
+ ],
12
+ "size": {
13
+ "0": 210,
14
+ "1": 26
15
+ },
16
+ "flags": {},
17
+ "order": 3,
18
+ "mode": 0,
19
+ "inputs": [
20
+ {
21
+ "name": "mask",
22
+ "type": "MASK",
23
+ "link": 1
24
+ }
25
+ ],
26
+ "outputs": [
27
+ {
28
+ "name": "IMAGE",
29
+ "type": "IMAGE",
30
+ "links": [
31
+ 3
32
+ ],
33
+ "shape": 3,
34
+ "slot_index": 0
35
+ }
36
+ ],
37
+ "properties": {
38
+ "Node name for S&R": "MaskToImage"
39
+ }
40
+ },
41
+ {
42
+ "id": 6,
43
+ "type": "ImageCompositeMasked",
44
+ "pos": [
45
+ 640,
46
+ 280
47
+ ],
48
+ "size": {
49
+ "0": 315,
50
+ "1": 146
51
+ },
52
+ "flags": {},
53
+ "order": 4,
54
+ "mode": 0,
55
+ "inputs": [
56
+ {
57
+ "name": "destination",
58
+ "type": "IMAGE",
59
+ "link": 3
60
+ },
61
+ {
62
+ "name": "source",
63
+ "type": "IMAGE",
64
+ "link": 12
65
+ },
66
+ {
67
+ "name": "mask",
68
+ "type": "MASK",
69
+ "link": null
70
+ }
71
+ ],
72
+ "outputs": [
73
+ {
74
+ "name": "IMAGE",
75
+ "type": "IMAGE",
76
+ "links": [
77
+ 8
78
+ ],
79
+ "shape": 3,
80
+ "slot_index": 0
81
+ }
82
+ ],
83
+ "properties": {
84
+ "Node name for S&R": "ImageCompositeMasked"
85
+ },
86
+ "widgets_values": [
87
+ 16,
88
+ 16,
89
+ false
90
+ ]
91
+ },
92
+ {
93
+ "id": 2,
94
+ "type": "LoadImage",
95
+ "pos": [
96
+ 680,
97
+ 520
98
+ ],
99
+ "size": {
100
+ "0": 315,
101
+ "1": 314.0000305175781
102
+ },
103
+ "flags": {},
104
+ "order": 0,
105
+ "mode": 0,
106
+ "outputs": [
107
+ {
108
+ "name": "IMAGE",
109
+ "type": "IMAGE",
110
+ "links": [
111
+ 9
112
+ ],
113
+ "shape": 3,
114
+ "slot_index": 0
115
+ },
116
+ {
117
+ "name": "MASK",
118
+ "type": "MASK",
119
+ "links": null,
120
+ "shape": 3
121
+ }
122
+ ],
123
+ "properties": {
124
+ "Node name for S&R": "LoadImage"
125
+ },
126
+ "widgets_values": [
127
+ "unscannable_00001_.png",
128
+ "image"
129
+ ]
130
+ },
131
+ {
132
+ "id": 9,
133
+ "type": "comfy-qr-mask_errors",
134
+ "pos": [
135
+ 1030,
136
+ 310
137
+ ],
138
+ "size": {
139
+ "0": 317.4000244140625,
140
+ "1": 238
141
+ },
142
+ "flags": {},
143
+ "order": 5,
144
+ "mode": 0,
145
+ "inputs": [
146
+ {
147
+ "name": "source_qr",
148
+ "type": "IMAGE",
149
+ "link": 8
150
+ },
151
+ {
152
+ "name": "modified_qr",
153
+ "type": "IMAGE",
154
+ "link": 9
155
+ }
156
+ ],
157
+ "outputs": [
158
+ {
159
+ "name": "QR_ERROR_MASK",
160
+ "type": "MASK",
161
+ "links": [
162
+ 10
163
+ ],
164
+ "shape": 3,
165
+ "slot_index": 0
166
+ },
167
+ {
168
+ "name": "PERCENT_ERROR",
169
+ "type": "FLOAT",
170
+ "links": null,
171
+ "shape": 3
172
+ },
173
+ {
174
+ "name": "CORRELATION",
175
+ "type": "FLOAT",
176
+ "links": null,
177
+ "shape": 3
178
+ },
179
+ {
180
+ "name": "RMSE",
181
+ "type": "FLOAT",
182
+ "links": null,
183
+ "shape": 3
184
+ }
185
+ ],
186
+ "properties": {
187
+ "Node name for S&R": "comfy-qr-mask_errors"
188
+ },
189
+ "widgets_values": [
190
+ 16,
191
+ "mean",
192
+ "mean",
193
+ "module_pattern",
194
+ 0,
195
+ false
196
+ ]
197
+ },
198
+ {
199
+ "id": 8,
200
+ "type": "MaskToImage",
201
+ "pos": [
202
+ 1399,
203
+ 333
204
+ ],
205
+ "size": {
206
+ "0": 210,
207
+ "1": 26
208
+ },
209
+ "flags": {},
210
+ "order": 6,
211
+ "mode": 0,
212
+ "inputs": [
213
+ {
214
+ "name": "mask",
215
+ "type": "MASK",
216
+ "link": 10
217
+ }
218
+ ],
219
+ "outputs": [
220
+ {
221
+ "name": "IMAGE",
222
+ "type": "IMAGE",
223
+ "links": [
224
+ 11
225
+ ],
226
+ "shape": 3,
227
+ "slot_index": 0
228
+ }
229
+ ],
230
+ "properties": {
231
+ "Node name for S&R": "MaskToImage"
232
+ }
233
+ },
234
+ {
235
+ "id": 10,
236
+ "type": "SaveImage",
237
+ "pos": [
238
+ 1574,
239
+ 474
240
+ ],
241
+ "size": {
242
+ "0": 315,
243
+ "1": 270
244
+ },
245
+ "flags": {},
246
+ "order": 7,
247
+ "mode": 0,
248
+ "inputs": [
249
+ {
250
+ "name": "images",
251
+ "type": "IMAGE",
252
+ "link": 11
253
+ }
254
+ ],
255
+ "properties": {},
256
+ "widgets_values": [
257
+ "ComfyUI"
258
+ ]
259
+ },
260
+ {
261
+ "id": 4,
262
+ "type": "SolidMask",
263
+ "pos": [
264
+ 38,
265
+ 733
266
+ ],
267
+ "size": {
268
+ "0": 315,
269
+ "1": 106
270
+ },
271
+ "flags": {},
272
+ "order": 1,
273
+ "mode": 0,
274
+ "outputs": [
275
+ {
276
+ "name": "MASK",
277
+ "type": "MASK",
278
+ "links": [
279
+ 1
280
+ ],
281
+ "shape": 3,
282
+ "slot_index": 0
283
+ }
284
+ ],
285
+ "properties": {
286
+ "Node name for S&R": "SolidMask"
287
+ },
288
+ "widgets_values": [
289
+ 0.5,
290
+ 768,
291
+ 768
292
+ ]
293
+ },
294
+ {
295
+ "id": 11,
296
+ "type": "comfy-qr-by-module-split",
297
+ "pos": [
298
+ 111,
299
+ 258
300
+ ],
301
+ "size": {
302
+ "0": 400,
303
+ "1": 344
304
+ },
305
+ "flags": {},
306
+ "order": 2,
307
+ "mode": 0,
308
+ "outputs": [
309
+ {
310
+ "name": "QR_CODE",
311
+ "type": "IMAGE",
312
+ "links": [
313
+ 12
314
+ ],
315
+ "shape": 3,
316
+ "slot_index": 0
317
+ },
318
+ {
319
+ "name": "MODULE_LAYER",
320
+ "type": "IMAGE",
321
+ "links": null,
322
+ "shape": 3
323
+ },
324
+ {
325
+ "name": "FINDER_LAYER",
326
+ "type": "IMAGE",
327
+ "links": null,
328
+ "shape": 3
329
+ },
330
+ {
331
+ "name": "FINDER_MASK",
332
+ "type": "MASK",
333
+ "links": null,
334
+ "shape": 3
335
+ },
336
+ {
337
+ "name": "QR_VERSION",
338
+ "type": "INT",
339
+ "links": null,
340
+ "shape": 3
341
+ },
342
+ {
343
+ "name": "IMAGE_SIZE",
344
+ "type": "INT",
345
+ "links": null,
346
+ "shape": 3
347
+ }
348
+ ],
349
+ "properties": {
350
+ "Node name for S&R": "comfy-qr-by-module-split"
351
+ },
352
+ "widgets_values": [
353
+ "Https",
354
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr-validation-nodes",
355
+ 16,
356
+ 768,
357
+ "#000000",
358
+ "#FFFFFF",
359
+ "High",
360
+ 1,
361
+ "Square"
362
+ ]
363
+ }
364
+ ],
365
+ "links": [
366
+ [
367
+ 1,
368
+ 4,
369
+ 0,
370
+ 5,
371
+ 0,
372
+ "MASK"
373
+ ],
374
+ [
375
+ 3,
376
+ 5,
377
+ 0,
378
+ 6,
379
+ 0,
380
+ "IMAGE"
381
+ ],
382
+ [
383
+ 8,
384
+ 6,
385
+ 0,
386
+ 9,
387
+ 0,
388
+ "IMAGE"
389
+ ],
390
+ [
391
+ 9,
392
+ 2,
393
+ 0,
394
+ 9,
395
+ 1,
396
+ "IMAGE"
397
+ ],
398
+ [
399
+ 10,
400
+ 9,
401
+ 0,
402
+ 8,
403
+ 0,
404
+ "MASK"
405
+ ],
406
+ [
407
+ 11,
408
+ 8,
409
+ 0,
410
+ 10,
411
+ 0,
412
+ "IMAGE"
413
+ ],
414
+ [
415
+ 12,
416
+ 11,
417
+ 0,
418
+ 6,
419
+ 1,
420
+ "IMAGE"
421
+ ]
422
+ ],
423
+ "groups": [],
424
+ "config": {},
425
+ "extra": {},
426
+ "version": 0.4
427
+ }
custom_nodes/ComfyQR/examples/simple-qr-export.json ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "last_node_id": 3,
3
+ "last_link_id": 2,
4
+ "nodes": [
5
+ {
6
+ "id": 2,
7
+ "type": "SaveImage",
8
+ "pos": [
9
+ 1034,
10
+ 495
11
+ ],
12
+ "size": {
13
+ "0": 315,
14
+ "1": 270
15
+ },
16
+ "flags": {},
17
+ "order": 1,
18
+ "mode": 0,
19
+ "inputs": [
20
+ {
21
+ "name": "images",
22
+ "type": "IMAGE",
23
+ "link": 2
24
+ }
25
+ ],
26
+ "properties": {},
27
+ "widgets_values": [
28
+ "ComfyUI"
29
+ ]
30
+ },
31
+ {
32
+ "id": 3,
33
+ "type": "comfy-qr-by-image-size",
34
+ "pos": [
35
+ 516,
36
+ 479
37
+ ],
38
+ "size": {
39
+ "0": 400,
40
+ "1": 264
41
+ },
42
+ "flags": {},
43
+ "order": 0,
44
+ "mode": 0,
45
+ "outputs": [
46
+ {
47
+ "name": "QR_CODE",
48
+ "type": "IMAGE",
49
+ "links": [
50
+ 2
51
+ ],
52
+ "shape": 3,
53
+ "slot_index": 0
54
+ },
55
+ {
56
+ "name": "QR_VERSION",
57
+ "type": "INT",
58
+ "links": null,
59
+ "shape": 3
60
+ }
61
+ ],
62
+ "properties": {
63
+ "Node name for S&R": "comfy-qr-by-image-size"
64
+ },
65
+ "widgets_values": [
66
+ "Https",
67
+ "gitlab.com/sofuego-comfy-nodes/comfy-qr",
68
+ 512,
69
+ "00F",
70
+ "FF0",
71
+ "High",
72
+ 1,
73
+ "Nearest",
74
+ "Circle"
75
+ ]
76
+ }
77
+ ],
78
+ "links": [
79
+ [
80
+ 2,
81
+ 3,
82
+ 0,
83
+ 2,
84
+ 0,
85
+ "IMAGE"
86
+ ]
87
+ ],
88
+ "groups": [],
89
+ "config": {},
90
+ "extra": {},
91
+ "version": 0.4
92
+ }
custom_nodes/ComfyQR/img/circle.png ADDED
custom_nodes/ComfyQR/img/for_deletion/badgers.png ADDED

Git LFS Details

  • SHA256: 943c1e341dde232fd0ff7247119a1e4a846cc82c661962b4c27254dd8f79a70d
  • Pointer size: 132 Bytes
  • Size of remote file: 1.58 MB
custom_nodes/ComfyQR/img/for_deletion/badgers_levels_adjusted.png ADDED

Git LFS Details

  • SHA256: 21efa9522bfe425206efcb692988f7e9d579119ed814e1d47485aefa956d4092
  • Pointer size: 132 Bytes
  • Size of remote file: 1.55 MB
custom_nodes/ComfyQR/img/gapped_square.png ADDED
custom_nodes/ComfyQR/img/horizontal-bars.png ADDED
custom_nodes/ComfyQR/img/node-mask-qr-errors.png ADDED

Git LFS Details

  • SHA256: 13c07093b39fee63ff7bbda37bcca001f4c7ac3c36243162dcdd30e8c8376eb5
  • Pointer size: 131 Bytes
  • Size of remote file: 228 kB
custom_nodes/ComfyQR/img/node-qr-code-conformed.png ADDED
custom_nodes/ComfyQR/img/node-qr-code-split.png ADDED
custom_nodes/ComfyQR/img/rounded.png ADDED
custom_nodes/ComfyQR/img/square.png ADDED
custom_nodes/ComfyQR/img/vertical-bars.png ADDED
custom_nodes/ComfyQR/pyproject.toml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "comfyqr"
3
+ description = "QR generation within ComfyUI. Contains nodes suitable for workflows from generating basic QR images to techniques with advanced QR masking."
4
+ version = "0.4.0"
5
+ license = { file = "LICENSE" }
6
+ dependencies = ["qrcode >= 7.1"]
7
+
8
+ [project.urls]
9
+ Repository = "https://github.com/coreyryanhanson/ComfyQR"
10
+ # Used by Comfy Registry https://comfyregistry.org
11
+
12
+ [tool.comfy]
13
+ PublisherId = "coreyryanhanson"
14
+ DisplayName = "ComfyQR"
15
+ Icon = ""
custom_nodes/ComfyQR/qr_nodes.py ADDED
@@ -0,0 +1,645 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import qrcode
3
+ from qrcode.image.styles.moduledrawers import (GappedSquareModuleDrawer,
4
+ CircleModuleDrawer,
5
+ RoundedModuleDrawer,
6
+ VerticalBarsDrawer,
7
+ HorizontalBarsDrawer)
8
+ from qrcode.image.styledpil import StyledPilImage
9
+ from qrcode.image.styles.colormasks import SolidFillColorMask
10
+ from PIL import Image
11
+ import torch
12
+ import torch.nn.functional as F
13
+
14
+
15
+ class QRBase:
16
+ def __init__(self):
17
+ self.text = ""
18
+ self.fill = None
19
+ self.back = None
20
+
21
+ FUNCTION = "generate_qr"
22
+ CATEGORY = "ComfyQR"
23
+
24
+ def _get_error_correction_constant(self, error_correction_string):
25
+ if error_correction_string == "Low":
26
+ return qrcode.constants.ERROR_CORRECT_L
27
+ if error_correction_string == "Medium":
28
+ return qrcode.constants.ERROR_CORRECT_M
29
+ if error_correction_string == "Quartile":
30
+ return qrcode.constants.ERROR_CORRECT_Q
31
+ return qrcode.constants.ERROR_CORRECT_H
32
+
33
+ def _img_to_tensor(self, img):
34
+ out_image = np.array(img, dtype=np.uint8).astype(np.float32) / 255
35
+ return torch.from_numpy(out_image).unsqueeze(0)
36
+
37
+ def _make_qr(self, qr, fill_hexcolor, back_hexcolor, module_drawer):
38
+ self.fill = self._parse_hexcolor_string(fill_hexcolor, "fill_hexcolor")
39
+ self.back = self._parse_hexcolor_string(back_hexcolor, "back_hexcolor")
40
+ qr.make(fit=True)
41
+ if module_drawer == "Square":
42
+ # Keeps using Square QR generation the old way for faster speeds.
43
+ return qr.make_image(fill_color=self.fill, back_color=self.back)
44
+ color_mask = SolidFillColorMask(back_color=self.back,
45
+ front_color=self.fill)
46
+ module_drawing_method = self._select_module_drawer(module_drawer)
47
+ return qr.make_image(image_factory=StyledPilImage,
48
+ color_mask=color_mask,
49
+ module_drawer=module_drawing_method)
50
+
51
+ def _parse_hexcolor_string(self, s, parameter):
52
+ if s.startswith("#"):
53
+ s = s[1:]
54
+ if len(s) == 3:
55
+ rgb = (c + c for c in s)
56
+ elif len(s) == 6:
57
+ rgb = (s[i] + s[i+1] for i in range(0, 6, 2))
58
+ else:
59
+ raise ValueError(f"{parameter} must be 3 or 6 characters long")
60
+ try:
61
+ return tuple(int(channel, 16) for channel in rgb)
62
+ except ValueError:
63
+ raise ValueError(f"{parameter} contains invalid hexadecimal "
64
+ f"characters")
65
+
66
+ def _validate_qr_size(self, size, max_size):
67
+ if size > max_size:
68
+ raise RuntimeError(f"QR dimensions of {size} exceed max size of "
69
+ f"{max_size}.")
70
+
71
+ def _select_module_drawer(self, module_drawer_string):
72
+ """Square is not included in the results, for a speed optimization
73
+ applying color masks. Current version of python-qr code suffers a
74
+ slowdown when using custom colors combined with custom module drawers.
75
+ By bypassing square QRs, non standard colors will load faster."""
76
+ if module_drawer_string == "Gapped square":
77
+ return GappedSquareModuleDrawer()
78
+ if module_drawer_string == "Circle":
79
+ return CircleModuleDrawer()
80
+ if module_drawer_string == "Rounded":
81
+ return RoundedModuleDrawer()
82
+ if module_drawer_string == "Vertical bars":
83
+ return VerticalBarsDrawer()
84
+ if module_drawer_string == "Horizontal bars":
85
+ return HorizontalBarsDrawer()
86
+ raise ValueError(f"Module drawing method of {module_drawer_string} "
87
+ f"not supported")
88
+
89
+ def update_text(self, protocol, text):
90
+ """This function takes input from a text box and a chosen internet
91
+ protocol and stores a full address within an instance variable.
92
+ Backslashes will invalidate text box input and this acts as a
93
+ workaround to be able to use them when required in QR strings.
94
+
95
+ Args:
96
+ protocol: A categorical variable of one of the available internet
97
+ protocols.
98
+ text: The input from the text box.
99
+ """
100
+ if protocol == "Https":
101
+ prefix = "https://"
102
+ elif protocol == "Http":
103
+ prefix = "http://"
104
+ elif protocol == "None":
105
+ prefix = ""
106
+ self.text = prefix + text
107
+
108
+
109
+ class QRByImageSize(QRBase):
110
+
111
+ @classmethod
112
+ def INPUT_TYPES(cls):
113
+ return {
114
+ "required": {
115
+ "protocol": (["Http", "Https", "None"], {"default": "Https"}),
116
+ "text": ("STRING", {"multiline": True}),
117
+ "image_size": ("INT", {"default": 512,
118
+ "min": 64,
119
+ "max": 4096,
120
+ "step": 64}),
121
+ "fill_hexcolor": ("STRING", {"multiline": False,
122
+ "default": "#000000"}),
123
+ "back_hexcolor": ("STRING", {"multiline": False,
124
+ "default": "#FFFFFF"}),
125
+ "error_correction": (["Low", "Medium", "Quartile", "High"],
126
+ {"default": "High"}),
127
+ "border": ("INT", {"default": 1,
128
+ "min": 0,
129
+ "max": 100,
130
+ "step": 1}),
131
+ "resampling": (["Bicubic",
132
+ "Bilinear",
133
+ "Box",
134
+ "Hamming",
135
+ "Lanczos",
136
+ "Nearest"
137
+ ], {"default": "Nearest"}),
138
+ "module_drawer": (["Square",
139
+ "Gapped square",
140
+ "Circle",
141
+ "Rounded",
142
+ "Vertical bars",
143
+ "Horizontal bars"
144
+ ], {"default": "Square"})
145
+ },
146
+ }
147
+
148
+ RETURN_TYPES = ("IMAGE", "INT")
149
+ RETURN_NAMES = ("QR_CODE", "QR_VERSION")
150
+
151
+ def _select_resampling_method(self, resampling_string):
152
+ if resampling_string == "Nearest":
153
+ return Image.NEAREST
154
+ if resampling_string == "Bicubic":
155
+ return Image.BICUBIC
156
+ if resampling_string == "Bilinear":
157
+ return Image.BILINEAR
158
+ if resampling_string == "Lanczos":
159
+ return Image.LANCZOS
160
+ if resampling_string == "Box":
161
+ return Image.BOX
162
+ if resampling_string == "Hamming":
163
+ return Image.HAMMING
164
+ raise ValueError(f"Resampling method of {resampling_string} not "
165
+ f"supported")
166
+
167
+ def generate_qr(
168
+ self,
169
+ protocol,
170
+ text,
171
+ image_size,
172
+ fill_hexcolor,
173
+ back_hexcolor,
174
+ error_correction,
175
+ border,
176
+ resampling,
177
+ module_drawer
178
+ ):
179
+ resampling_method = self._select_resampling_method(resampling)
180
+ error_level = self._get_error_correction_constant(error_correction)
181
+ self.update_text(protocol, text)
182
+ qr = qrcode.QRCode(
183
+ error_correction=error_level,
184
+ box_size=16,
185
+ border=border)
186
+ qr.add_data(self.text)
187
+ img = self._make_qr(qr, fill_hexcolor, back_hexcolor, module_drawer)
188
+ img = img.resize((image_size, image_size), resample=resampling_method)
189
+ return (self._img_to_tensor(img), qr.version)
190
+
191
+
192
+ class QRByModuleSize(QRBase):
193
+
194
+ @classmethod
195
+ def INPUT_TYPES(cls):
196
+ return {
197
+ "required": {
198
+ "protocol": (["Http", "Https", "None"], {"default": "Https"}),
199
+ "text": ("STRING", {"multiline": True}),
200
+ "module_size": ("INT", {"default": 16,
201
+ "min": 1,
202
+ "max": 64,
203
+ "step": 1}),
204
+ "max_image_size": ("INT", {"default": 512,
205
+ "min": 64,
206
+ "max": 4096,
207
+ "step": 64}),
208
+ "fill_hexcolor": ("STRING", {"multiline": False,
209
+ "default": "#000000"}),
210
+ "back_hexcolor": ("STRING", {"multiline": False,
211
+ "default": "#FFFFFF"}),
212
+ "error_correction": (["Low", "Medium", "Quartile", "High"],
213
+ {"default": "High"}),
214
+ "border": ("INT", {"default": 1,
215
+ "min": 0,
216
+ "max": 100,
217
+ "step": 1}),
218
+ "module_drawer": (["Square",
219
+ "Gapped square",
220
+ "Circle",
221
+ "Rounded",
222
+ "Vertical bars",
223
+ "Horizontal bars"
224
+ ], {"default": "Square"})
225
+ },
226
+ }
227
+
228
+ RETURN_TYPES = ("IMAGE", "INT", "INT")
229
+ RETURN_NAMES = ("QR_CODE", "QR_VERSION", "IMAGE_SIZE")
230
+
231
+ def generate_qr(
232
+ self,
233
+ protocol,
234
+ text,
235
+ module_size,
236
+ max_image_size,
237
+ fill_hexcolor,
238
+ back_hexcolor,
239
+ error_correction,
240
+ border,
241
+ module_drawer
242
+ ):
243
+ self.update_text(protocol, text)
244
+ error_level = self._get_error_correction_constant(error_correction)
245
+ qr = qrcode.QRCode(
246
+ error_correction=error_level,
247
+ box_size=module_size,
248
+ border=border)
249
+ qr.add_data(self.text)
250
+ img = self._make_qr(qr, fill_hexcolor, back_hexcolor, module_drawer)
251
+ self._validate_qr_size(img.pixel_size, max_image_size)
252
+ return (self._img_to_tensor(img), qr.version, img.pixel_size)
253
+
254
+
255
+ class QRByModuleSizeSplitFunctionPatterns(QRBase):
256
+
257
+ @classmethod
258
+ def INPUT_TYPES(cls):
259
+ return {
260
+ "required": {
261
+ "protocol": (["Http", "Https", "None"], {"default": "Https"}),
262
+ "text": ("STRING", {"multiline": True}),
263
+ "module_size": ("INT", {"default": 16,
264
+ "min": 1,
265
+ "max": 64,
266
+ "step": 1}),
267
+ "max_image_size": ("INT", {"default": 512,
268
+ "min": 64,
269
+ "max": 4096,
270
+ "step": 64}),
271
+ "fill_hexcolor": ("STRING", {"multiline": False,
272
+ "default": "#000000"}),
273
+ "back_hexcolor": ("STRING", {"multiline": False,
274
+ "default": "#FFFFFF"}),
275
+ "error_correction": (["Low", "Medium", "Quartile", "High"],
276
+ {"default": "High"}),
277
+ "border": ("INT", {"default": 1,
278
+ "min": 0,
279
+ "max": 100,
280
+ "step": 1}),
281
+ "module_drawer": (["Square",
282
+ "Gapped square",
283
+ "Circle",
284
+ "Rounded",
285
+ "Vertical bars",
286
+ "Horizontal bars"
287
+ ], {"default": "Square"})
288
+ },
289
+ }
290
+
291
+ RETURN_TYPES = ("IMAGE", "IMAGE", "IMAGE", "MASK", "INT", "INT")
292
+ RETURN_NAMES = ("QR_CODE",
293
+ "MODULE_LAYER",
294
+ "FINDER_LAYER",
295
+ "FINDER_MASK",
296
+ "QR_VERSION",
297
+ "IMAGE_SIZE")
298
+
299
+ def _generate_finder_pattern_ranges(self, module_size, border_size):
300
+ outer = module_size * border_size
301
+ inner = 7 * module_size + outer
302
+ # Alternate behavior is required to prevent bugs from 0 border_size.
303
+ far_outer = -outer if border_size else None
304
+ return [
305
+ (outer, inner, outer, inner),
306
+ (outer, inner, -inner, far_outer),
307
+ (-inner, far_outer, outer, inner)
308
+ ]
309
+
310
+ def _generate_finder_pattern_mask(self,
311
+ pixel_size,
312
+ module_size,
313
+ border_size):
314
+ mask = np.zeros((pixel_size, pixel_size), dtype=bool)
315
+ for (x_min,
316
+ x_max,
317
+ y_min,
318
+ y_max) in self._generate_finder_pattern_ranges(module_size,
319
+ border_size):
320
+ mask[y_min:y_max, x_min:x_max] = True
321
+ return mask
322
+
323
+ def _apply_fill_to_mask(self, img, mask):
324
+ array = np.array(img).copy()
325
+ indices = np.nonzero(mask)
326
+ array[indices[0], indices[1], :] = self.back
327
+ return Image.fromarray(array)
328
+
329
+ def _mask_to_tensor(self, mask):
330
+ out_image = mask.astype(np.float32)
331
+ return torch.from_numpy(out_image).unsqueeze(0)
332
+
333
+ def generate_qr(
334
+ self,
335
+ protocol,
336
+ text,
337
+ module_size,
338
+ max_image_size,
339
+ fill_hexcolor,
340
+ back_hexcolor,
341
+ error_correction,
342
+ border,
343
+ module_drawer
344
+ ):
345
+ self.update_text(protocol, text)
346
+ error_level = self._get_error_correction_constant(error_correction)
347
+ qr = qrcode.QRCode(
348
+ error_correction=error_level,
349
+ box_size=module_size,
350
+ border=border)
351
+ qr.add_data(self.text)
352
+ img = self._make_qr(qr, fill_hexcolor, back_hexcolor, module_drawer)
353
+ pixel_size = img.pixel_size
354
+ self._validate_qr_size(pixel_size, max_image_size)
355
+ mask = self._generate_finder_pattern_mask(pixel_size,
356
+ module_size,
357
+ border)
358
+ module_image = self._apply_fill_to_mask(img, mask)
359
+ function_image = self._apply_fill_to_mask(img, ~mask)
360
+ return (
361
+ self._img_to_tensor(img),
362
+ self._img_to_tensor(module_image),
363
+ self._img_to_tensor(function_image),
364
+ self._mask_to_tensor(mask),
365
+ qr.version,
366
+ pixel_size,
367
+ )
368
+
369
+
370
+ class QRErrorMasker:
371
+ def __init__(self):
372
+ self.module_size = None
373
+ self.canvas_shape = None
374
+ self.qr_bounds = None
375
+
376
+ FUNCTION = "find_qr_errors"
377
+ CATEGORY = "ComfyQR"
378
+ RETURN_TYPES = ("MASK", "FLOAT", "FLOAT", "FLOAT")
379
+ RETURN_NAMES = ("QR_ERROR_MASK", "PERCENT_ERROR", "CORRELATION", "RMSE")
380
+ OUTPUT_IS_LIST = (False, True, True, True)
381
+
382
+ @classmethod
383
+ def INPUT_TYPES(cls):
384
+ return {
385
+ "required": {
386
+ "source_qr": ("IMAGE",),
387
+ "modified_qr": ("IMAGE",),
388
+ "module_size": ("INT", {"default": 16,
389
+ "min": 1,
390
+ "max": 64,
391
+ "step": 1}),
392
+ "grayscale_method": (["mean", "luminance"],
393
+ {"default": "luminance"}),
394
+ "aggregate_method": (["mean",], {"default": "mean"}),
395
+ "evaluate": (["full_qr", "module_pattern", "finder_pattern"],
396
+ {"default": "module_pattern"}),
397
+ "error_difficulty": ("FLOAT", {"default": 0,
398
+ "min": 0,
399
+ "max": 1,
400
+ "step": .01}),
401
+ "inverted_pattern": ("BOOLEAN", {"default": False}),
402
+ "gamma": ("FLOAT", {"default": 2.2,
403
+ "min": .1,
404
+ "max": 2.8,
405
+ "step": .1}),
406
+ },
407
+ }
408
+
409
+ def _get_qr_bounds(self, tensor, invert):
410
+ module_color = 1.0 if invert else 0.0
411
+ module_pixels = (tensor == module_color)
412
+ indices = torch.nonzero(module_pixels, as_tuple=True)
413
+ # The viewer patterns will guarentee a module pixel in the upper left
414
+ # The bottom right does not have that guarentee so max is used.
415
+ return (indices[0][0],
416
+ indices[0].max() + 1,
417
+ indices[1][0], indices[1].max() + 1)
418
+
419
+ def _extract_pattern_from_bounds(self, tensor):
420
+ return tensor[self.qr_bounds[0]: self.qr_bounds[1],
421
+ self.qr_bounds[2]: self.qr_bounds[3]]
422
+
423
+ def _trim_to_qr_area(self, source_qr, modified_qr, inverted_pattern):
424
+ self.qr_bounds = self._get_qr_bounds(source_qr, inverted_pattern)
425
+ self._check_bounds_and_module_size()
426
+ source_qr = self._extract_pattern_from_bounds(source_qr)
427
+ modified_qr = self._extract_pattern_from_bounds(modified_qr)
428
+ return source_qr, modified_qr
429
+
430
+ def _reshape_tensor_to_modules(self, tensor):
431
+ if len(tensor.shape) != 2:
432
+ raise RuntimeError("Module reshaping requires a 2 dimensional "
433
+ "array.")
434
+ length = tensor.shape[0] // self.module_size
435
+ reshaped_tensor = tensor.view(length,
436
+ self.module_size,
437
+ length,
438
+ self.module_size)
439
+ rehaped_tensor = reshaped_tensor.permute(0, 2, 1, 3).contiguous()
440
+ return rehaped_tensor.view(length, length, self.module_size ** 2)
441
+
442
+ def _check_bounds_and_module_size(self):
443
+ height = self.qr_bounds[1] - self.qr_bounds[0]
444
+ width = self.qr_bounds[3] - self.qr_bounds[2]
445
+ color_warning = "Make sure that qr_fill and back colors have exact "
446
+ "#FFFFFFF and #000000 values (and that module color values do not "
447
+ "occur outside the QR) and invert is set correctly."
448
+ if width != height:
449
+ raise RuntimeError(f"Source QR dimensions are {width} x {height}. "
450
+ f"They must be a perfect square. "
451
+ f"{color_warning}")
452
+ if width % self.module_size:
453
+ raise RuntimeError(f"QR width of {width} does not fit module_size "
454
+ f"of {self.module_size}. It must be perfectly "
455
+ f"divisible. {color_warning}")
456
+
457
+ def _check_equal_shape(self, source_qr, modified_qr):
458
+ if source_qr.shape != modified_qr.shape:
459
+ raise ValueError("Source and modified QR must have the same batch "
460
+ "size and dimensions.")
461
+
462
+ def _squeeze_by_mean(self, tensor):
463
+ return torch.mean(tensor, dim=-1)
464
+
465
+ def _gamma_expansion(self, tensor, gamma):
466
+ if gamma == 1:
467
+ return tensor
468
+ if gamma == 2.2:
469
+ return torch.where(tensor <= 0.04045,
470
+ tensor / 12.92,
471
+ (tensor + 0.055) / 1.055) ** 2.4
472
+ return tensor ** gamma
473
+
474
+ def _gamma_compression(self, tensor, gamma):
475
+ if gamma == 1:
476
+ return tensor
477
+ if gamma == 2.2:
478
+ return torch.where(tensor <= .0031308,
479
+ tensor * 12.92,
480
+ 1.055 * tensor ** (1/2.4) - 0.055)
481
+ return tensor ** (1/gamma)
482
+
483
+ def _grayscale_by_luminance(self, tensor, gamma):
484
+ weights = torch.tensor([0.2125, 0.7154, 0.0721], dtype=torch.float32)
485
+ tensor = self._gamma_expansion(tensor, gamma)
486
+ tensor = tensor @ weights
487
+ if gamma != 1:
488
+ tensor = tensor ** gamma
489
+ return self._gamma_compression(tensor, gamma)
490
+
491
+ def _squeeze_to_modules(self, tensor, method):
492
+ tensor = self._reshape_tensor_to_modules(tensor)
493
+ if method == "mean":
494
+ return self._squeeze_by_mean(tensor)
495
+ raise RuntimeError("Module aggregation currently only supports the "
496
+ "mean.")
497
+
498
+ def _reduce_to_modules(
499
+ self,
500
+ source_qr,
501
+ modified_qr,
502
+ module_size,
503
+ grayscale_method,
504
+ aggregate_method,
505
+ inverted_pattern,
506
+ gamma
507
+ ):
508
+ self.module_size = module_size
509
+ self.canvas_shape = (source_qr.shape[0], source_qr.shape[1])
510
+ # Processed first for simplified indexing of QR bounds.
511
+ source_qr = self._squeeze_by_mean(source_qr)
512
+ source_qr, modified_qr = self._trim_to_qr_area(source_qr,
513
+ modified_qr,
514
+ inverted_pattern
515
+ )
516
+ if grayscale_method == "mean":
517
+ modified_qr = self._squeeze_by_mean(modified_qr)
518
+ elif grayscale_method == "luminance":
519
+ modified_qr = self._grayscale_by_luminance(modified_qr, gamma)
520
+ else:
521
+ raise ValueError("Currently only mean is supported for rgb to "
522
+ "grayscale conversion.")
523
+ source_qr = torch.round(self._squeeze_to_modules(source_qr, "mean"))
524
+ modified_qr = self._squeeze_to_modules(modified_qr, aggregate_method)
525
+ return source_qr, modified_qr
526
+
527
+ def _create_finder_pattern_mask(self, width, inverted):
528
+ mask = torch.zeros((width, width), dtype=torch.bool)
529
+ # When borders are trimmed and QR code has module size of 1, results
530
+ # are consistent.
531
+ finder_coords = [[0, 7, 0, 7], [0, 7, -7, None], [-7, None, 0, 7]]
532
+ for x_min, x_max, y_min, y_max in finder_coords:
533
+ mask[y_min:y_max, x_min:x_max] = True
534
+ return ~mask if inverted else mask
535
+
536
+ def _create_qr_mask(self, tensor, evaluate):
537
+ if evaluate == "module_pattern":
538
+ return self._create_finder_pattern_mask(tensor, True)
539
+ if evaluate == "finder_pattern":
540
+ return self._create_finder_pattern_mask(tensor, False)
541
+ return None
542
+
543
+ def _bin_tensor_to_threshold(self, tensor, contrast_difficulty):
544
+ tensor = tensor.clone()
545
+ threshold = contrast_difficulty / 2
546
+ # Since we are only interested in value matches and there is a clear
547
+ # stable dividing line of .5, bringing in the other array is
548
+ # unneccessary and the binning process can be simplified.
549
+ bin_condition = (tensor + threshold <= .5) & (tensor != .5)
550
+ tensor[bin_condition] = 0.0
551
+ bin_condition = (tensor - threshold >= .5) & (tensor != .5)
552
+ tensor[bin_condition] = 1.0
553
+ return tensor
554
+
555
+ def _replace_qr_to_canvas(self, tensor):
556
+ length = tensor.shape[0] * self.module_size
557
+ bounds = self.qr_bounds
558
+ tensor = F.interpolate(tensor.unsqueeze(0).unsqueeze(0),
559
+ size=(length, length),
560
+ mode='nearest')
561
+ canvas = torch.zeros(self.canvas_shape, dtype=torch.float32)
562
+ canvas[bounds[0]:bounds[1], bounds[2]:bounds[3]] = tensor.squeeze()
563
+ return canvas
564
+
565
+ def _compare_modules(
566
+ self,
567
+ source_qr,
568
+ modified_qr,
569
+ mask,
570
+ error_difficulty
571
+ ):
572
+ modified_qr = self._bin_tensor_to_threshold(modified_qr,
573
+ error_difficulty)
574
+ error = source_qr != modified_qr
575
+ percent_error = error[mask].sum().item() / error[mask].numel()
576
+ if mask is not None:
577
+ error[~mask] = False
578
+ return (self._replace_qr_to_canvas((error).to(torch.float32)),
579
+ percent_error)
580
+
581
+ def _qr_correlation(self, source_qr, modified_qr, mask):
582
+ source_qr = source_qr[mask].numpy().reshape((-1))
583
+ modified_qr = modified_qr[mask].numpy().reshape((-1))
584
+ return np.corrcoef(source_qr, modified_qr)[0, 1]
585
+
586
+ def _qr_rmse(self, source_qr, modified_qr, mask):
587
+ diff = source_qr[mask].numpy() - modified_qr[mask].numpy()
588
+ return np.sqrt((diff ** 2).mean())
589
+
590
+ def find_qr_errors(
591
+ self,
592
+ source_qr,
593
+ modified_qr,
594
+ module_size,
595
+ grayscale_method,
596
+ aggregate_method,
597
+ evaluate,
598
+ error_difficulty,
599
+ inverted_pattern,
600
+ gamma,
601
+ ):
602
+ self._check_equal_shape(source_qr, modified_qr)
603
+ error_masks, error_percents, correlations, rmses = [], [], [], []
604
+ for i in range(source_qr.shape[0]):
605
+ qr_s, qr_m = source_qr[i], modified_qr[i]
606
+ qr_s, qr_m = self._reduce_to_modules(qr_s,
607
+ qr_m,
608
+ module_size,
609
+ grayscale_method,
610
+ aggregate_method,
611
+ inverted_pattern,
612
+ gamma
613
+ )
614
+ mask = self._create_qr_mask(qr_s.shape[0], evaluate)
615
+ error_mask, percent_error = self._compare_modules(qr_s,
616
+ qr_m,
617
+ mask,
618
+ error_difficulty
619
+ )
620
+ correlation = self._qr_correlation(qr_s, qr_m, mask)
621
+ rmse = self._qr_rmse(qr_s, qr_m, mask)
622
+ error_masks.append(error_mask)
623
+ error_percents.append(percent_error)
624
+ correlations.append(correlation)
625
+ rmses.append(rmse)
626
+ error_masks = torch.stack(error_masks, dim=0)
627
+ return (error_masks, error_percents, correlations, rmses)
628
+
629
+
630
+ NODE_CLASS_MAPPINGS = {
631
+ "comfy-qr-by-module-size": QRByModuleSize,
632
+ "comfy-qr-by-image-size": QRByImageSize,
633
+ "comfy-qr-by-module-split":
634
+ QRByModuleSizeSplitFunctionPatterns,
635
+ "comfy-qr-mask_errors": QRErrorMasker,
636
+ }
637
+
638
+
639
+ NODE_DISPLAY_NAME_MAPPINGS = {
640
+ "comfy-qr-by-module-size": "QR Code",
641
+ "comfy-qr-by-image-size": "QR Code (Conformed "
642
+ "to Image Size)",
643
+ "comfy-qr-by-module-split": "QR Code (Split)",
644
+ "comfy-qr-mask_errors": "Mask QR Errors",
645
+ }
custom_nodes/ComfyQR/requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ qrcode >= 7.1