├── LICENCE
├── README.md
├── Sample
├── DelphiCaptchaSample.dpr
├── DelphiCaptchaSample.dproj
├── DelphiCaptchaSample.dproj.local
├── DelphiCaptchaSample.identcache
├── DelphiCaptchaSample.res
├── DelphiCaptchaSample.stat
├── uPrin.dfm
└── uPrin.pas
├── img
├── Delphi.png
└── sample.png
└── src
├── Captcha.Contract.pas
├── Captcha.Enum.pas
├── Captcha.Impl.pas
└── Captcha.Intf.pas
/LICENCE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
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 General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Delphi-Captcha-Generator
2 |
3 | ### Description
4 |
5 | Delphi Captcha generator is an interface that allows you to generate an image in TBitmap format based on the configuration defined when creating the object.
6 |
7 | It is easy to use, and you can add it to your project in routines that require more critical validation before executing automated processes, password validation, and Turing tests (human-machine interaction).
8 |
9 | The interface can return the generated image in various formats:
10 |
11 | - TMemoryStream
12 | - TBitmap
13 | - TJPEG
14 | - Base64 (bitmap format)
15 | - The text generated in the captcha.
16 |
17 | ### How to use
18 |
19 | To use, add it to your project's Search Path or include the units from the 'src' folder, or add the 'src' folder to Delphi's Library Path.
20 |
21 | After that, simply declare the 'Captcha.Intf' unit in the 'uses' clause.
22 |
23 | You can define a global or local variable to perform the process
24 |
25 | Defining an easily understandable captcha with a length of 6 characters, including both uppercase and lowercase letters.
26 |
27 | ```Delphi
28 | var
29 | LBitmap: TBitmap;
30 | LCaptcha: ICaptcha;
31 | begin
32 |
33 | LBitmap:= FCaptcha.SetWidth(200)
34 | .SetLegth(6)
35 | .SetHeigth(80)
36 | .Font('Tahome', 12, clBlack)
37 | .Easy
38 | .Letters
39 | .LetterMixed
40 | .Build.ToBitmap;
41 | Image1.Picture.Assign(LBitmap);
42 |
43 | Lbitmap.free;
44 | end;
45 | ```
46 |
47 | One line example without variables to ICaptcha;
48 |
49 | ```Delphi
50 |
51 | LStream:= TCaptchaUtils
52 | .New
53 | .Alphanumeric
54 | .SetHeigth(80)
55 | .SetWidth(200)
56 | .SetLength(10)
57 | .LetterMixed
58 | .Moderate
59 | .Build
60 | .ToStream;
61 | ```
62 |
63 | You can explore additional configuration options in the project located in the 'sample' folder.
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 | ### Avoiding memory leaks
72 |
73 | Attention: When using ToBitmap, ToStream, ToJPEG, you are responsible for releasing the memory object.
74 |
75 | ### Compatibility
76 |
77 | Delphi XE to 12.0 (Perhaps, it might be compatible with versions older than XE.)
78 |
79 | VCL only
80 |
81 |
82 |
83 |
84 |
85 |
86 | Made with :heart: for Delphi
87 |
88 |
--------------------------------------------------------------------------------
/Sample/DelphiCaptchaSample.dpr:
--------------------------------------------------------------------------------
1 | program DelphiCaptchaSample;
2 |
3 | uses
4 | Vcl.Forms,
5 | uPrin in 'uPrin.pas' {frmPrin},
6 | Captcha.Contract in '..\src\Captcha.Contract.pas',
7 | Captcha.Enum in '..\src\Captcha.Enum.pas',
8 | Captcha.Impl in '..\src\Captcha.Impl.pas',
9 | Captcha.Intf in '..\src\Captcha.Intf.pas';
10 |
11 | {$R *.res}
12 |
13 | begin
14 | ReportMemoryLeaksOnShutdown:= True;
15 | Application.Initialize;
16 | Application.MainFormOnTaskbar := True;
17 | Application.CreateForm(TfrmPrin, frmPrin);
18 | Application.Run;
19 | end.
20 |
--------------------------------------------------------------------------------
/Sample/DelphiCaptchaSample.dproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | {44DA267A-7D5B-4D80-91BC-A5719A25ABBE}
4 | 18.4
5 | VCL
6 | DelphiCaptchaSample.dpr
7 | True
8 | Debug
9 | Win32
10 | 1
11 | Application
12 |
13 |
14 | true
15 |
16 |
17 | true
18 | Base
19 | true
20 |
21 |
22 | true
23 | Base
24 | true
25 |
26 |
27 | true
28 | Cfg_1
29 | true
30 | true
31 |
32 |
33 | true
34 | Base
35 | true
36 |
37 |
38 | true
39 | Cfg_2
40 | true
41 | true
42 |
43 |
44 | .\$(Platform)\$(Config)
45 | .\$(Platform)\$(Config)
46 | false
47 | false
48 | false
49 | false
50 | false
51 | RESTBackendComponents;CloudService;soaprtl;soapmidas;RESTComponents;FireDACIBDriver;FireDACCommon;soapserver;FireDACCommonDriver;inet;FireDAC;FireDACSqliteDriver;$(DCC_UsePackage)
52 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)
53 | $(BDS)\bin\delphi_PROJECTICON.ico
54 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
55 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
56 | DelphiCaptchaSample
57 |
58 |
59 | DBXSqliteDriver;dxSpreadSheetCoreDialogsRS25;dxPSPrVwRibbonRS25;dxRibbonCustomizationFormRS25;vclactnband;vclFireDAC;cxExportRS25;dxHttpIndyRequestRS25;tethering;dxPScxCommonRS25;FireDACADSDriver;cxPivotGridOLAPRS25;cxSchedulerGridRS25;vcltouch;vcldb;Intraweb;svn;dxGaugeControlRS25;cxLibraryRS25;vclib;dxFlowChartAdvancedCustomizeFormRS25;vclx;dxSpreadSheetConditionalFormattingDialogsRS25;dxTileControlRS25;dxMapControlRS25;dxPDFViewerRS25;dxDockingRS25;altlib_database;VCLRESTComponents;rbTCUI1925;rbFireDAC1925;dxPSLnksRS25;rbRTL1925;dxWizardControlRS25;dxRichEditControlRS25;vclie;bindengine;dxFireDACServerModeRS25;vquery250;FireDACMySQLDriver;dxPSdxPDFViewerLnkRS25;altlib_json;bindcompdbx;dxPSdxLCLnkRS25;IndyIPServer;dac250;IndySystem;dsnapcon;dxPSRichEditControlLnkRS25;FireDACMSAccDriver;fmxFireDAC;altlib_controles;vclimg;dxdbtrRS25;dxPScxTLLnkRS25;dxSpreadSheetRS25;altlib_interface;dxPScxSchedulerLnkRS25;FMXTee;cxGridRS25;dxSpreadSheetCoreConditionalFormattingDialogsRS25;DbxCommonDriver;rbADO1925;dxorgcRS25;dxCloudServiceLibraryRS25;rbIBE1925;rbRest1925;xmlrtl;rbUSERDesign1925;fmxobj;dxPScxGridLnkRS25;unidacfmx250;rtl;DbxClientDriver;dacvcl250;dxPSCoreRS25;dxmdsRS25;appanalytics;rbCT1925;rbDAD1925;IndyIPClient;bindcompvcl;dxADOEMFRS25;TeeUI;rbCIDE1925;VclSmp;dclRBADO1925;cxVerticalGridRS25;dxtrmdRS25;RtmRxCtl250;altlibpack_ide_extensions;dxADOServerModeRS25;dxCoreRS25;cxSchedulerTreeBrowserRS25;dxRichEditControlCoreRS25;DBXInterBaseDriver;dxPSTeeChartRS25;svnui;dclRBDBE1925;rbRIDE1925;dxPSdxFCLnkRS25;bindcompfmx;unidac250;inetdb;rbTC1925;FmxTeeUI;rbIDE1925;fmx;fmxdae;dxPScxPivotGridLnkRS25;dxBarDBNavRS25;dxTabbedMDIRS25;dbexpress;IndyCore;dxFlowChartRS25;dsnap;dxBarRS25;dxPSDBTeeChartRS25;dxdborRS25;dxPScxExtCommonRS25;cxPivotGridRS25;dxPSdxSpreadSheetLnkRS25;dxNavBarRS25;dxSpreadSheetReportDesignerRS25;rbDB1925;QRWRunDXE10_2_w64;cxSchedulerRibbonStyleEventEditorRS25;DBXMySQLDriver;dclRBFireDAC1925;FireDACCommonODBC;rbRCL1925;dclRBE1925;cxTreeListRS25;IndyIPCommon;vcl;dxPScxVGridLnkRS25;dxBarExtItemsRS25;dxSkinsCoreRS25;dxComnRS25;dxPSdxDBTVLnkRS25;rbDBE1925;rbTDBC1925;TeeDB;dxSpreadSheetCoreRS25;dxServerModeRS25;dclRBIBE1925;dxFlowChartLayoutsRS25;FireDACPgDriver;ibmonitor;dxEMFRS25;rbUSER1925;rbDIDE1925;ibxpress;Tee;ibxbindings;dxPsPrVwAdvRS25;vclwinx;cxTreeListdxBarPopupMenuRS25;CustomIPTransport;vcldsnap;cxSchedulerWebServiceStorageRS25;dxPSdxOCLnkRS25;rbRAP1925;SynEditDR;bindcomp;crcontrols250;cxPivotGridChartRS25;cxSchedulerRS25;dxBarExtDBItemsRS25;dxOrgChartAdvancedCustomizeFormRS25;rbBDE1925;EurekaLogCore;dxDBXServerModeRS25;dxFireDACEMFRS25;dxGDIPlusRS25;dxPSdxGaugeControlLnkRS25;dbxcds;unidacvcl250;adortl;altlibpack_altcontroller;dacfmx250;dxPSdxDBOCLnkRS25;dxRibbonRS25;dsnapxml;dxSpellCheckerRS25;dbrtl;inetdbxpress;IndyProtocols;dxFlowChartDesignerRS25;dxPSdxMapControlLnkRS25;fmxase;$(DCC_UsePackage)
60 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
61 | Debug
62 | true
63 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
64 | 1033
65 | $(BDS)\bin\default_app.manifest
66 |
67 |
68 | DEBUG;$(DCC_Define)
69 | true
70 | false
71 | true
72 | true
73 | true
74 |
75 |
76 | false
77 | true
78 | true
79 |
80 |
81 | false
82 | RELEASE;$(DCC_Define)
83 | 0
84 | 0
85 |
86 |
87 | true
88 | true
89 |
90 |
91 |
92 | MainSource
93 |
94 |
95 |
96 | dfm
97 |
98 |
99 |
100 |
101 |
102 |
103 | Cfg_2
104 | Base
105 |
106 |
107 | Base
108 |
109 |
110 | Cfg_1
111 | Base
112 |
113 |
114 |
115 | Delphi.Personality.12
116 | Application
117 |
118 |
119 |
120 | DelphiCaptchaSample.dpr
121 |
122 |
123 |
124 |
125 |
126 | DelphiCaptchaSample.exe
127 | true
128 |
129 |
130 |
131 |
132 | 1
133 |
134 |
135 | Contents\MacOS
136 | 1
137 |
138 |
139 | Contents\MacOS
140 | 0
141 |
142 |
143 |
144 |
145 | classes
146 | 1
147 |
148 |
149 |
150 |
151 | library\lib\armeabi-v7a
152 | 1
153 |
154 |
155 |
156 |
157 | library\lib\armeabi
158 | 1
159 |
160 |
161 |
162 |
163 | library\lib\mips
164 | 1
165 |
166 |
167 |
168 |
169 | library\lib\armeabi-v7a
170 | 1
171 |
172 |
173 |
174 |
175 | res\drawable
176 | 1
177 |
178 |
179 |
180 |
181 | res\values
182 | 1
183 |
184 |
185 |
186 |
187 | res\drawable
188 | 1
189 |
190 |
191 |
192 |
193 | res\drawable-xxhdpi
194 | 1
195 |
196 |
197 |
198 |
199 | res\drawable-ldpi
200 | 1
201 |
202 |
203 |
204 |
205 | res\drawable-mdpi
206 | 1
207 |
208 |
209 |
210 |
211 | res\drawable-hdpi
212 | 1
213 |
214 |
215 |
216 |
217 | res\drawable-xhdpi
218 | 1
219 |
220 |
221 |
222 |
223 | res\drawable-small
224 | 1
225 |
226 |
227 |
228 |
229 | res\drawable-normal
230 | 1
231 |
232 |
233 |
234 |
235 | res\drawable-large
236 | 1
237 |
238 |
239 |
240 |
241 | res\drawable-xlarge
242 | 1
243 |
244 |
245 |
246 |
247 | 1
248 |
249 |
250 | Contents\MacOS
251 | 1
252 |
253 |
254 | 0
255 |
256 |
257 |
258 |
259 | Contents\MacOS
260 | 1
261 | .framework
262 |
263 |
264 | 0
265 |
266 |
267 |
268 |
269 | 1
270 | .dylib
271 |
272 |
273 | 1
274 | .dylib
275 |
276 |
277 | 1
278 | .dylib
279 |
280 |
281 | Contents\MacOS
282 | 1
283 | .dylib
284 |
285 |
286 | 0
287 | .dll;.bpl
288 |
289 |
290 |
291 |
292 | 1
293 | .dylib
294 |
295 |
296 | 1
297 | .dylib
298 |
299 |
300 | 1
301 | .dylib
302 |
303 |
304 | Contents\MacOS
305 | 1
306 | .dylib
307 |
308 |
309 | 0
310 | .bpl
311 |
312 |
313 |
314 |
315 | 0
316 |
317 |
318 | 0
319 |
320 |
321 | 0
322 |
323 |
324 | 0
325 |
326 |
327 | Contents\Resources\StartUp\
328 | 0
329 |
330 |
331 | 0
332 |
333 |
334 |
335 |
336 | 1
337 |
338 |
339 | 1
340 |
341 |
342 | 1
343 |
344 |
345 |
346 |
347 | 1
348 |
349 |
350 | 1
351 |
352 |
353 | 1
354 |
355 |
356 |
357 |
358 | 1
359 |
360 |
361 | 1
362 |
363 |
364 | 1
365 |
366 |
367 |
368 |
369 | 1
370 |
371 |
372 | 1
373 |
374 |
375 | 1
376 |
377 |
378 |
379 |
380 | 1
381 |
382 |
383 | 1
384 |
385 |
386 | 1
387 |
388 |
389 |
390 |
391 | 1
392 |
393 |
394 | 1
395 |
396 |
397 | 1
398 |
399 |
400 |
401 |
402 | 1
403 |
404 |
405 | 1
406 |
407 |
408 | 1
409 |
410 |
411 |
412 |
413 | 1
414 |
415 |
416 |
417 |
418 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
419 | 1
420 |
421 |
422 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
423 | 1
424 |
425 |
426 |
427 |
428 | 1
429 |
430 |
431 | 1
432 |
433 |
434 |
435 |
436 | ..\
437 | 1
438 |
439 |
440 | ..\
441 | 1
442 |
443 |
444 |
445 |
446 | 1
447 |
448 |
449 | 1
450 |
451 |
452 | 1
453 |
454 |
455 |
456 |
457 | 1
458 |
459 |
460 | 1
461 |
462 |
463 | 1
464 |
465 |
466 |
467 |
468 | ..\
469 | 1
470 |
471 |
472 |
473 |
474 | Contents
475 | 1
476 |
477 |
478 |
479 |
480 | Contents\Resources
481 | 1
482 |
483 |
484 |
485 |
486 | library\lib\armeabi-v7a
487 | 1
488 |
489 |
490 | 1
491 |
492 |
493 | 1
494 |
495 |
496 | 1
497 |
498 |
499 | 1
500 |
501 |
502 | Contents\MacOS
503 | 1
504 |
505 |
506 | 0
507 |
508 |
509 |
510 |
511 | 1
512 |
513 |
514 | 1
515 |
516 |
517 |
518 |
519 | Assets
520 | 1
521 |
522 |
523 | Assets
524 | 1
525 |
526 |
527 |
528 |
529 | Assets
530 | 1
531 |
532 |
533 | Assets
534 | 1
535 |
536 |
537 |
538 |
539 |
540 |
541 |
542 |
543 |
544 |
545 |
546 |
547 | True
548 |
549 |
550 | 12
551 |
552 |
553 |
554 |
555 |
556 |
--------------------------------------------------------------------------------
/Sample/DelphiCaptchaSample.dproj.local:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 2024/01/08 09:18:25.000.367,=C:\Users\dancarlos.dsn.pack\Documents\Embarcadero\Studio\Projects\Unit4.pas
5 | 2024/01/08 09:23:05.000.768,C:\Users\dancarlos.dsn.pack\Documents\Embarcadero\Studio\Projects\Unit4.pas=C:\Daniel\Top\Delphi-Captcha-Generator\Sample\uPrin.pas
6 | 2024/01/08 09:23:05.000.768,C:\Users\dancarlos.dsn.pack\Documents\Embarcadero\Studio\Projects\Unit4.dfm=C:\Daniel\Top\Delphi-Captcha-Generator\Sample\uPrin.dfm
7 | 2024/01/08 09:23:16.000.397,C:\Users\dancarlos.dsn.pack\Documents\Embarcadero\Studio\Projects\Project3.dproj=C:\Daniel\Top\Delphi-Captcha-Generator\Sample\DelphiCaptchaSample.dproj
8 | 2024/01/08 09:33:54.000.614,=C:\Daniel\Top\Delphi-Captcha-Generator\src\Captcha.Intf.pas
9 | 2024/01/08 09:33:54.000.588,=C:\Daniel\Top\Delphi-Captcha-Generator\src\Captcha.Enum.pas
10 | 2024/01/08 09:33:54.000.577,=C:\Daniel\Top\Delphi-Captcha-Generator\src\Captcha.Contract.pas
11 | 2024/01/08 09:33:54.000.602,=C:\Daniel\Top\Delphi-Captcha-Generator\src\Captcha.Impl.pas
12 |
13 |
14 |
--------------------------------------------------------------------------------
/Sample/DelphiCaptchaSample.identcache:
--------------------------------------------------------------------------------
1 | ;C:\Daniel\Top\Delphi-Captcha-Generator\src\Captcha.Impl.pas 7C:\Daniel\Top\Delphi-Captcha-Generator\Sample\uPrin.pas EC:\Daniel\Top\Delphi-Captcha-Generator\Sample\DelphiCaptchaSample.dpr ;C:\Daniel\Top\Delphi-Captcha-Generator\src\Captcha.Enum.pas ?C:\Daniel\Top\Delphi-Captcha-Generator\src\Captcha.Contract.pas ;C:\Daniel\Top\Delphi-Captcha-Generator\src\Captcha.Intf.pas
--------------------------------------------------------------------------------
/Sample/DelphiCaptchaSample.res:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daviladanielc/Delphi-Captcha-Generator/801b611968be22c2c004b3a9c726eea6849fe931/Sample/DelphiCaptchaSample.res
--------------------------------------------------------------------------------
/Sample/DelphiCaptchaSample.stat:
--------------------------------------------------------------------------------
1 | [Stats]
2 | EditorSecs=4
3 | DesignerSecs=3
4 | InspectorSecs=1
5 | CompileSecs=2809
6 | OtherSecs=9
7 | StartTime=08/01/2024 11:51:17
8 | RealKeys=0
9 | EffectiveKeys=0
10 | DebugSecs=41
11 |
--------------------------------------------------------------------------------
/Sample/uPrin.dfm:
--------------------------------------------------------------------------------
1 | object frmPrin: TfrmPrin
2 | Left = 0
3 | Top = 0
4 | BorderIcons = [biSystemMenu, biMinimize]
5 | BorderStyle = bsSingle
6 | Caption = 'Delphi Captcha Sample'
7 | ClientHeight = 521
8 | ClientWidth = 715
9 | Color = clBtnFace
10 | Font.Charset = DEFAULT_CHARSET
11 | Font.Color = clWindowText
12 | Font.Height = -11
13 | Font.Name = 'Tahoma'
14 | Font.Style = []
15 | OldCreateOrder = False
16 | Position = poScreenCenter
17 | OnCreate = FormCreate
18 | PixelsPerInch = 96
19 | TextHeight = 13
20 | object lblValidate: TLabel
21 | Left = 64
22 | Top = 456
23 | Width = 63
24 | Height = 13
25 | Caption = 'Validate here'
26 | end
27 | object lbl1: TLabel
28 | Left = 152
29 | Top = 88
30 | Width = 86
31 | Height = 13
32 | Caption = 'Background color:'
33 | end
34 | object pnl1: TPanel
35 | Left = 400
36 | Top = 0
37 | Width = 315
38 | Height = 521
39 | Align = alRight
40 | TabOrder = 8
41 | object grpBitmap: TGroupBox
42 | Left = 1
43 | Top = 1
44 | Width = 313
45 | Height = 173
46 | Align = alTop
47 | Caption = 'Bitmap'
48 | TabOrder = 0
49 | object imgBitmap: TImage
50 | Left = 2
51 | Top = 15
52 | Width = 309
53 | Height = 156
54 | Align = alClient
55 | Proportional = True
56 | Stretch = True
57 | ExplicitLeft = 56
58 | ExplicitTop = 62
59 | ExplicitWidth = 105
60 | ExplicitHeight = 105
61 | end
62 | end
63 | object grpJPEG: TGroupBox
64 | Left = 1
65 | Top = 174
66 | Width = 313
67 | Height = 173
68 | Align = alTop
69 | Caption = 'JPEG'
70 | TabOrder = 1
71 | object imgJPEG: TImage
72 | Left = 2
73 | Top = 15
74 | Width = 309
75 | Height = 156
76 | Align = alClient
77 | Proportional = True
78 | Stretch = True
79 | ExplicitLeft = 112
80 | ExplicitTop = 48
81 | ExplicitWidth = 105
82 | ExplicitHeight = 105
83 | end
84 | end
85 | object grpMemoryStream: TGroupBox
86 | Left = 1
87 | Top = 347
88 | Width = 313
89 | Height = 173
90 | Align = alClient
91 | Caption = 'Others'
92 | TabOrder = 2
93 | object btnSaveStream: TButton
94 | Left = 58
95 | Top = 43
96 | Width = 197
97 | Height = 25
98 | Caption = 'Memory Stream - One line'
99 | TabOrder = 0
100 | OnClick = btnSaveStreamClick
101 | end
102 | object btnBase64: TButton
103 | Left = 58
104 | Top = 74
105 | Width = 197
106 | Height = 25
107 | Caption = 'Base64'
108 | TabOrder = 1
109 | OnClick = btnBase64Click
110 | end
111 | object btn1: TButton
112 | Left = 58
113 | Top = 105
114 | Width = 197
115 | Height = 25
116 | Caption = 'Get text of captcha'
117 | TabOrder = 2
118 | OnClick = btn1Click
119 | end
120 | end
121 | end
122 | object btnNewNumber: TButton
123 | Left = 61
124 | Top = 133
125 | Width = 225
126 | Height = 73
127 | Caption = 'New Captcha Numbers'
128 | TabOrder = 5
129 | OnClick = btnNewNumberClick
130 | end
131 | object btnReload: TButton
132 | Left = 61
133 | Top = 370
134 | Width = 225
135 | Height = 73
136 | Caption = 'Refresh'
137 | TabOrder = 10
138 | OnClick = btnReloadClick
139 | end
140 | object edtValidate: TEdit
141 | Left = 61
142 | Top = 472
143 | Width = 225
144 | Height = 27
145 | Font.Charset = DEFAULT_CHARSET
146 | Font.Color = clWindowText
147 | Font.Height = -16
148 | Font.Name = 'Tahoma'
149 | Font.Style = []
150 | ParentFont = False
151 | TabOrder = 9
152 | OnExit = edtValidateExit
153 | end
154 | object btnNewLetters: TButton
155 | Left = 61
156 | Top = 212
157 | Width = 225
158 | Height = 73
159 | Caption = 'New Captcha Letters'
160 | TabOrder = 6
161 | OnClick = btnNewLettersClick
162 | end
163 | object btnNewAlpha: TButton
164 | Left = 61
165 | Top = 291
166 | Width = 225
167 | Height = 73
168 | Caption = 'New Captcha Alphanumeric'
169 | TabOrder = 7
170 | OnClick = btnNewAlphaClick
171 | end
172 | object lbledtLength: TLabeledEdit
173 | Left = 24
174 | Top = 22
175 | Width = 121
176 | Height = 21
177 | EditLabel.Width = 77
178 | EditLabel.Height = 13
179 | EditLabel.Caption = 'Captcha length:'
180 | NumbersOnly = True
181 | TabOrder = 0
182 | Text = '6'
183 | end
184 | object rgOptions: TRadioGroup
185 | Left = 151
186 | Top = 8
187 | Width = 97
188 | Height = 65
189 | Caption = 'Style'
190 | ItemIndex = 2
191 | Items.Strings = (
192 | 'Letter Upper'
193 | 'Letter Lower'
194 | 'Mixed')
195 | TabOrder = 3
196 | end
197 | object rgDifficulty: TRadioGroup
198 | Left = 254
199 | Top = 8
200 | Width = 83
201 | Height = 65
202 | Caption = 'Difficulty'
203 | ItemIndex = 0
204 | Items.Strings = (
205 | 'Easy'
206 | 'Moderate'
207 | 'Hard')
208 | TabOrder = 4
209 | end
210 | object Button1: TButton
211 | Left = 344
212 | Top = 8
213 | Width = 50
214 | Height = 50
215 | HotImageIndex = 0
216 | ImageIndex = 0
217 | Images = il1
218 | TabOrder = 11
219 | OnClick = Button1Click
220 | end
221 | object lbledtWidth: TLabeledEdit
222 | Left = 24
223 | Top = 63
224 | Width = 121
225 | Height = 21
226 | EditLabel.Width = 75
227 | EditLabel.Height = 13
228 | EditLabel.Caption = 'Captcha Width:'
229 | NumbersOnly = True
230 | TabOrder = 1
231 | Text = '200'
232 | end
233 | object lbledtHeigth: TLabeledEdit
234 | Left = 24
235 | Top = 104
236 | Width = 121
237 | Height = 21
238 | EditLabel.Width = 78
239 | EditLabel.Height = 13
240 | EditLabel.Caption = 'Captcha Heigth:'
241 | NumbersOnly = True
242 | TabOrder = 2
243 | Text = '100'
244 | end
245 | object clrbx1: TColorBox
246 | Left = 151
247 | Top = 104
248 | Width = 145
249 | Height = 22
250 | Selected = clWhite
251 | TabOrder = 12
252 | end
253 | object dlgFont1: TFontDialog
254 | Font.Charset = DEFAULT_CHARSET
255 | Font.Color = clWindowText
256 | Font.Height = -16
257 | Font.Name = 'Tahoma'
258 | Font.Style = []
259 | Left = 320
260 | Top = 152
261 | end
262 | object il1: TImageList
263 | Height = 48
264 | Width = 48
265 | Left = 336
266 | Top = 176
267 | Bitmap = {
268 | 494C010101000500040030003000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
269 | 0000000000003600000028000000C00000003000000001002000000000000090
270 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
271 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
272 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
273 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
274 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
275 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
276 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
277 | 0000000000000000000000000000000000000000000000000000000000000000
278 | 0000000000000000000000000000000000000000000000000000000000000000
279 | 0000000000000000000000000000000000000000000000000000000000000000
280 | 0000000000000000000000000000000000000000000000000000000000000000
281 | 0000000000000000000000000000000000000000000000000000000000000000
282 | 0000000000000000000000000000000000000000000000000000000000000000
283 | 0000000000000000000000000000000000000000000000000000000000000000
284 | 0000000000000000000000000000000000000000000000000000000000000000
285 | 0000000000000000000000000000000000000000000000000000000000000000
286 | 0000000000000000000000000000000000000000000000000000000000000000
287 | 0000000000000000000000000000000000000000000000000000000000000000
288 | 0000000000000000000000000000000000000000000000000000000000000000
289 | 0000000000000000000000000000000000000000000000000000000000000000
290 | 0000000000000000000000000000000000000000000000000000000000000000
291 | 0000000000000000000000000000000000000000000000000000000000000000
292 | 0000000000000000000000000000000000000000000000000000000000000000
293 | 0000000000000000000000000000000000000000000000000000000000000000
294 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
295 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
296 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
297 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
298 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
299 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
300 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
301 | 0000000000000000000000000000000000000000000000000000000000000000
302 | 0000000000000000000000000000000000000000000000000000000000000000
303 | 0000000000000000000000000000000000000000000000000000000000000000
304 | 0000000000000000000000000000000000000000000000000000000000000000
305 | 0000000000000000000000000000000000000000000000000000000000000000
306 | 0000000000000000000000000000000000000000000000000000000000000000
307 | 0000000000000000000000000000000000000000000000000000000000000000
308 | 0000000000000000000000000000000000000000000000000000000000000000
309 | 0000000000000000000000000000000000000000000000000000000000000000
310 | 0000000000000000000000000000000000000000000000000000000000000000
311 | 0000000000000000000000000000000000000000000000000000000000000000
312 | 0000000000000000000000000000000000000000000000000000000000000000
313 | 0000000000000000000000000000000000000000000000000000000000000000
314 | 0000000000000000000000000000000000000000000000000000000000000000
315 | 0000000000000000000000000000000000000000000000000000000000000000
316 | 0000000000000000000000000000000000000000000000000000000000000000
317 | 0000000000000000000000000000000000000000000000000000000000000000
318 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
319 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
320 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
321 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
322 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
323 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
324 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
325 | 0000000000000000000000000000000000000000000000000000000000000000
326 | 0000000000000000000000000000000000000000000000000000000000000000
327 | 0000000000000000000000000000000000000000000000000000000000000000
328 | 0000000000000000000000000000000000000000000000000000000000000000
329 | 0000000000000000000000000000000000000000000000000000000000000000
330 | 0000000000000000000000000000000000000000000000000000000000000000
331 | 0000000000000000000000000000000000000000000000000000000000000000
332 | 0000000000000000000000000000000000000000000000000000000000000000
333 | 0000000000000000000000000000000000000000000000000000000000000000
334 | 0000000000000000000000000000000000000000000000000000000000000000
335 | 0000000000000000000000000000000000000000000000000000000000000000
336 | 0000000000000000000000000000000000000000000000000000000000000000
337 | 0000000000000000000000000000000000000000000000000000000000000000
338 | 0000000000000000000000000000000000000000000000000000000000000000
339 | 0000000000000000000000000000000000000000000000000000000000000000
340 | 0000000000000000000000000000000000000000000000000000000000000000
341 | 0000000000000000000000000000000000000000000000000000000000000000
342 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
343 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
344 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
345 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
346 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
347 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
348 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
349 | 0000000000000000000000000000000000000000000000000000000000000000
350 | 0000000000000000000000000000000000000000000000000000000000000000
351 | 0000000000000000000000000000000000000000000000000000000000000000
352 | 0000000000000000000000000000000000000000000000000000000000000000
353 | 0000000000000000000000000000000000000000000000000000000000000000
354 | 0000000000000000000000000000000000000000000000000000000000000000
355 | 0000000000000000000000000000000000000000000000000000000000000000
356 | 0000000000000000000000000000000000000000000000000000000000000000
357 | 0000000000000000000000000000000000000000000000000000000000000000
358 | 0000000000000000000000000000000000000000000000000000000000000000
359 | 0000000000000000000000000000000000000000000000000000000000000000
360 | 0000000000000000000000000000000000000000000000000000000000000000
361 | 0000000000000000000000000000000000000000000000000000000000000000
362 | 0000000000000000000000000000000000000000000000000000000000000000
363 | 0000000000000000000000000000000000000000000000000000000000000000
364 | 0000000000000000000000000000000000000000000000000000000000000000
365 | 0000000000000000000000000000000000000000000000000000000000000000
366 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
367 | 00FFFDD0D100FD717400FF636500FF636500FF636500FF636500FF636500FF63
368 | 6500FF636500FF636500FD737600FDD1D200000000FF000000FF000000FF0000
369 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
370 | 00FF000000FF000000FF000000FF000000FFFDD0D100FD717400FF636500FF63
371 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FD737600FDD1
372 | D200000000FF000000FF000000FF000000FF0000000000000000000000000000
373 | 0000000000000000000000000000000000000000000000000000000000000000
374 | 0000000000000000000000000000000000000000000000000000000000000000
375 | 0000000000000000000000000000000000000000000000000000000000000000
376 | 0000000000000000000000000000000000000000000000000000000000000000
377 | 0000000000000000000000000000000000000000000000000000000000000000
378 | 0000000000000000000000000000000000000000000000000000000000000000
379 | 0000000000000000000000000000000000000000000000000000000000000000
380 | 0000000000000000000000000000000000000000000000000000000000000000
381 | 0000000000000000000000000000000000000000000000000000000000000000
382 | 0000000000000000000000000000000000000000000000000000000000000000
383 | 0000000000000000000000000000000000000000000000000000000000000000
384 | 0000000000000000000000000000000000000000000000000000000000000000
385 | 0000000000000000000000000000000000000000000000000000000000000000
386 | 0000000000000000000000000000000000000000000000000000000000000000
387 | 0000000000000000000000000000000000000000000000000000000000000000
388 | 0000000000000000000000000000000000000000000000000000000000000000
389 | 0000000000000000000000000000000000000000000000000000000000000000
390 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
391 | 00FFFD717400FF636500FF636500FF636500FF636500FF636500FF636500FF63
392 | 6500FF636500FF636500FF636500FD737600000000FF000000FF000000FF0000
393 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
394 | 00FF000000FF000000FF000000FF000000FFFD717400FF636500FF636500FF63
395 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FD73
396 | 7600000000FF000000FF000000FF000000FF0000000000000000000000000000
397 | 0000000000000000000000000000000000000000000000000000000000000000
398 | 0000000000000000000000000000000000000000000000000000000000000000
399 | 0000000000000000000000000000000000000000000000000000000000000000
400 | 0000000000000000000000000000000000000000000000000000000000000000
401 | 0000000000000000000000000000000000000000000000000000000000000000
402 | 0000000000000000000000000000000000000000000000000000000000000000
403 | 0000000000000000000000000000000000000000000000000000000000000000
404 | 0000000000000000000000000000000000000000000000000000000000000000
405 | 0000000000000000000000000000000000000000000000000000000000000000
406 | 0000000000000000000000000000000000000000000000000000000000000000
407 | 0000000000000000000000000000000000000000000000000000000000000000
408 | 0000000000000000000000000000000000000000000000000000000000000000
409 | 0000000000000000000000000000000000000000000000000000000000000000
410 | 0000000000000000000000000000000000000000000000000000000000000000
411 | 0000000000000000000000000000000000000000000000000000000000000000
412 | 0000000000000000000000000000000000000000000000000000000000000000
413 | 0000000000000000000000000000000000000000000000000000000000000000
414 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
415 | 00FFFD717400FF636500FF636500FF636500FF636500FF636500FF636500FF63
416 | 6500FF636500FF636500FF636500FD737600000000FF000000FF000000FF0000
417 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
418 | 00FF000000FF000000FF000000FF000000FFFD717400FF636500FF636500FF63
419 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FD73
420 | 7600000000FF000000FF000000FF000000FF0000000000000000000000000000
421 | 0000000000000000000000000000000000000000000000000000000000000000
422 | 0000000000000000000000000000000000000000000000000000000000000000
423 | 0000000000000000000000000000000000000000000000000000000000000000
424 | 0000000000000000000000000000000000000000000000000000000000000000
425 | 0000000000000000000000000000000000000000000000000000000000000000
426 | 0000000000000000000000000000000000000000000000000000000000000000
427 | 0000000000000000000000000000000000000000000000000000000000000000
428 | 0000000000000000000000000000000000000000000000000000000000000000
429 | 0000000000000000000000000000000000000000000000000000000000000000
430 | 0000000000000000000000000000000000000000000000000000000000000000
431 | 0000000000000000000000000000000000000000000000000000000000000000
432 | 0000000000000000000000000000000000000000000000000000000000000000
433 | 0000000000000000000000000000000000000000000000000000000000000000
434 | 0000000000000000000000000000000000000000000000000000000000000000
435 | 0000000000000000000000000000000000000000000000000000000000000000
436 | 0000000000000000000000000000000000000000000000000000000000000000
437 | 0000000000000000000000000000000000000000000000000000000000000000
438 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
439 | 00FFFDD0D000FD737300FF636500FF636500FF636500FF636500FF636500FF63
440 | 6500FF636500FF636500FD717400FDD0D100000000FF000000FF000000FF0000
441 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
442 | 00FF000000FF000000FF000000FF000000FFFDD0D000FD737300FF636500FF63
443 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FD717400FDD0
444 | D100000000FF000000FF000000FF000000FF0000000000000000000000000000
445 | 0000000000000000000000000000000000000000000000000000000000000000
446 | 0000000000000000000000000000000000000000000000000000000000000000
447 | 0000000000000000000000000000000000000000000000000000000000000000
448 | 0000000000000000000000000000000000000000000000000000000000000000
449 | 0000000000000000000000000000000000000000000000000000000000000000
450 | 0000000000000000000000000000000000000000000000000000000000000000
451 | 0000000000000000000000000000000000000000000000000000000000000000
452 | 0000000000000000000000000000000000000000000000000000000000000000
453 | 0000000000000000000000000000000000000000000000000000000000000000
454 | 0000000000000000000000000000000000000000000000000000000000000000
455 | 0000000000000000000000000000000000000000000000000000000000000000
456 | 0000000000000000000000000000000000000000000000000000000000000000
457 | 0000000000000000000000000000000000000000000000000000000000000000
458 | 0000000000000000000000000000000000000000000000000000000000000000
459 | 0000000000000000000000000000000000000000000000000000000000000000
460 | 0000000000000000000000000000000000000000000000000000000000000000
461 | 0000000000000000000000000000000000000000000000000000000000000000
462 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
463 | 00FF000000FF000000FF000000FF000000FF000000FFFD7E7E00FF636500FF63
464 | 6500FF636500FD848500000000FF000000FF000000FF000000FF000000FF0000
465 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
466 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
467 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
468 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
469 | 0000000000000000000000000000000000000000000000000000000000000000
470 | 0000000000000000000000000000000000000000000000000000000000000000
471 | 0000000000000000000000000000000000000000000000000000000000000000
472 | 0000000000000000000000000000000000000000000000000000000000000000
473 | 0000000000000000000000000000000000000000000000000000000000000000
474 | 0000000000000000000000000000000000000000000000000000000000000000
475 | 0000000000000000000000000000000000000000000000000000000000000000
476 | 0000000000000000000000000000000000000000000000000000000000000000
477 | 0000000000000000000000000000000000000000000000000000000000000000
478 | 0000000000000000000000000000000000000000000000000000000000000000
479 | 0000000000000000000000000000000000000000000000000000000000000000
480 | 0000000000000000000000000000000000000000000000000000000000000000
481 | 0000000000000000000000000000000000000000000000000000000000000000
482 | 0000000000000000000000000000000000000000000000000000000000000000
483 | 0000000000000000000000000000000000000000000000000000000000000000
484 | 0000000000000000000000000000000000000000000000000000000000000000
485 | 0000000000000000000000000000000000000000000000000000000000000000
486 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
487 | 00FF000000FF000000FF000000FF000000FF000000FFFDD4D500FF636500FF63
488 | 6500FF636500FF636500FDC6C700000000FF000000FF000000FF000000FF0000
489 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
490 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
491 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
492 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
493 | 0000000000000000000000000000000000000000000000000000000000000000
494 | 0000000000000000000000000000000000000000000000000000000000000000
495 | 0000000000000000000000000000000000000000000000000000000000000000
496 | 0000000000000000000000000000000000000000000000000000000000000000
497 | 0000000000000000000000000000000000000000000000000000000000000000
498 | 0000000000000000000000000000000000000000000000000000000000000000
499 | 0000000000000000000000000000000000000000000000000000000000000000
500 | 0000000000000000000000000000000000000000000000000000000000000000
501 | 0000000000000000000000000000000000000000000000000000000000000000
502 | 0000000000000000000000000000000000000000000000000000000000000000
503 | 0000000000000000000000000000000000000000000000000000000000000000
504 | 0000000000000000000000000000000000000000000000000000000000000000
505 | 0000000000000000000000000000000000000000000000000000000000000000
506 | 0000000000000000000000000000000000000000000000000000000000000000
507 | 0000000000000000000000000000000000000000000000000000000000000000
508 | 0000000000000000000000000000000000000000000000000000000000000000
509 | 0000000000000000000000000000000000000000000000000000000000000000
510 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
511 | 00FF000000FF000000FF000000FF000000FF000000FF000000FFFD929400FF63
512 | 6500FF636500FF636500FD737300000000FF000000FF000000FF000000FF0000
513 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
514 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
515 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
516 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
517 | 0000000000000000000000000000000000000000000000000000000000000000
518 | 0000000000000000000000000000000000000000000000000000000000000000
519 | 0000000000000000000000000000000000000000000000000000000000000000
520 | 0000000000000000000000000000000000000000000000000000000000000000
521 | 0000000000000000000000000000000000000000000000000000000000000000
522 | 0000000000000000000000000000000000000000000000000000000000000000
523 | 0000000000000000000000000000000000000000000000000000000000000000
524 | 0000000000000000000000000000000000000000000000000000000000000000
525 | 0000000000000000000000000000000000000000000000000000000000000000
526 | 0000000000000000000000000000000000000000000000000000000000000000
527 | 0000000000000000000000000000000000000000000000000000000000000000
528 | 0000000000000000000000000000000000000000000000000000000000000000
529 | 0000000000000000000000000000000000000000000000000000000000000000
530 | 0000000000000000000000000000000000000000000000000000000000000000
531 | 0000000000000000000000000000000000000000000000000000000000000000
532 | 0000000000000000000000000000000000000000000000000000000000000000
533 | 0000000000000000000000000000000000000000000000000000000000000000
534 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
535 | 00FF000000FF000000FF000000FF000000FF000000FF000000FFFDE9E900FD66
536 | 6800FF636500FF636500FF636500FDADAD00000000FF000000FF000000FF0000
537 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
538 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
539 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
540 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
541 | 0000000000000000000000000000000000000000000000000000000000000000
542 | 0000000000000000000000000000000000000000000000000000000000000000
543 | 0000000000000000000000000000000000000000000000000000000000000000
544 | 0000000000000000000000000000000000000000000000000000000000000000
545 | 0000000000000000000000000000000000000000000000000000000000000000
546 | 0000000000000000000000000000000000000000000000000000000000000000
547 | 0000000000000000000000000000000000000000000000000000000000000000
548 | 0000000000000000000000000000000000000000000000000000000000000000
549 | 0000000000000000000000000000000000000000000000000000000000000000
550 | 0000000000000000000000000000000000000000000000000000000000000000
551 | 0000000000000000000000000000000000000000000000000000000000000000
552 | 0000000000000000000000000000000000000000000000000000000000000000
553 | 0000000000000000000000000000000000000000000000000000000000000000
554 | 0000000000000000000000000000000000000000000000000000000000000000
555 | 0000000000000000000000000000000000000000000000000000000000000000
556 | 0000000000000000000000000000000000000000000000000000000000000000
557 | 0000000000000000000000000000000000000000000000000000000000000000
558 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
559 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FFFDAD
560 | AD00FF636500FF636500FF636500FD646600FDE6E700000000FF000000FF0000
561 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
562 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
563 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
564 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
565 | 0000000000000000000000000000000000000000000000000000000000000000
566 | 0000000000000000000000000000000000000000000000000000000000000000
567 | 0000000000000000000000000000000000000000000000000000000000000000
568 | 0000000000000000000000000000000000000000000000000000000000000000
569 | 0000000000000000000000000000000000000000000000000000000000000000
570 | 0000000000000000000000000000000000000000000000000000000000000000
571 | 0000000000000000000000000000000000000000000000000000000000000000
572 | 0000000000000000000000000000000000000000000000000000000000000000
573 | 0000000000000000000000000000000000000000000000000000000000000000
574 | 0000000000000000000000000000000000000000000000000000000000000000
575 | 0000000000000000000000000000000000000000000000000000000000000000
576 | 0000000000000000000000000000000000000000000000000000000000000000
577 | 0000000000000000000000000000000000000000000000000000000000000000
578 | 0000000000000000000000000000000000000000000000000000000000000000
579 | 0000000000000000000000000000000000000000000000000000000000000000
580 | 0000000000000000000000000000000000000000000000000000000000000000
581 | 0000000000000000000000000000000000000000000000000000000000000000
582 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
583 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
584 | 00FFFD727400FF636500FF636500FF636500FD929400000000FF000000FF0000
585 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
586 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
587 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
588 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
589 | 0000000000000000000000000000000000000000000000000000000000000000
590 | 0000000000000000000000000000000000000000000000000000000000000000
591 | 0000000000000000000000000000000000000000000000000000000000000000
592 | 0000000000000000000000000000000000000000000000000000000000000000
593 | 0000000000000000000000000000000000000000000000000000000000000000
594 | 0000000000000000000000000000000000000000000000000000000000000000
595 | 0000000000000000000000000000000000000000000000000000000000000000
596 | 0000000000000000000000000000000000000000000000000000000000000000
597 | 0000000000000000000000000000000000000000000000000000000000000000
598 | 0000000000000000000000000000000000000000000000000000000000000000
599 | 0000000000000000000000000000000000000000000000000000000000000000
600 | 0000000000000000000000000000000000000000000000000000000000000000
601 | 0000000000000000000000000000000000000000000000000000000000000000
602 | 0000000000000000000000000000000000000000000000000000000000000000
603 | 0000000000000000000000000000000000000000000000000000000000000000
604 | 0000000000000000000000000000000000000000000000000000000000000000
605 | 0000000000000000000000000000000000000000000000000000000000000000
606 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
607 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
608 | 00FFFDC6C700FF636500FF636500FF636500FF636500FDD3D300000000FF0000
609 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
610 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
611 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
612 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
613 | 0000000000000000000000000000000000000000000000000000000000000000
614 | 0000000000000000000000000000000000000000000000000000000000000000
615 | 0000000000000000000000000000000000000000000000000000000000000000
616 | 0000000000000000000000000000000000000000000000000000000000000000
617 | 0000000000000000000000000000000000000000000000000000000000000000
618 | 0000000000000000000000000000000000000000000000000000000000000000
619 | 0000000000000000000000000000000000000000000000000000000000000000
620 | 0000000000000000000000000000000000000000000000000000000000000000
621 | 0000000000000000000000000000000000000000000000000000000000000000
622 | 0000000000000000000000000000000000000000000000000000000000000000
623 | 0000000000000000000000000000000000000000000000000000000000000000
624 | 0000000000000000000000000000000000000000000000000000000000000000
625 | 0000000000000000000000000000000000000000000000000000000000000000
626 | 0000000000000000000000000000000000000000000000000000000000000000
627 | 0000000000000000000000000000000000000000000000000000000000000000
628 | 0000000000000000000000000000000000000000000000000000000000000000
629 | 0000000000000000000000000000000000000000000000000000000000000000
630 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
631 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
632 | 00FF000000FFFD878800FF636500FF636500FF636500FD797C00000000FF0000
633 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
634 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
635 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
636 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
637 | 0000000000000000000000000000000000000000000000000000000000000000
638 | 0000000000000000000000000000000000000000000000000000000000000000
639 | 0000000000000000000000000000000000000000000000000000000000000000
640 | 0000000000000000000000000000000000000000000000000000000000000000
641 | 0000000000000000000000000000000000000000000000000000000000000000
642 | 0000000000000000000000000000000000000000000000000000000000000000
643 | 0000000000000000000000000000000000000000000000000000000000000000
644 | 0000000000000000000000000000000000000000000000000000000000000000
645 | 0000000000000000000000000000000000000000000000000000000000000000
646 | 0000000000000000000000000000000000000000000000000000000000000000
647 | 0000000000000000000000000000000000000000000000000000000000000000
648 | 0000000000000000000000000000000000000000000000000000000000000000
649 | 0000000000000000000000000000000000000000000000000000000000000000
650 | 0000000000000000000000000000000000000000000000000000000000000000
651 | 0000000000000000000000000000000000000000000000000000000000000000
652 | 0000000000000000000000000000000000000000000000000000000000000000
653 | 0000000000000000000000000000000000000000000000000000000000000000
654 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
655 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
656 | 00FF000000FFFDDFDF00FD636500FF636500FF636500FF636500FDB9BA000000
657 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
658 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
659 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
660 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
661 | 0000000000000000000000000000000000000000000000000000000000000000
662 | 0000000000000000000000000000000000000000000000000000000000000000
663 | 0000000000000000000000000000000000000000000000000000000000000000
664 | 0000000000000000000000000000000000000000000000000000000000000000
665 | 0000000000000000000000000000000000000000000000000000000000000000
666 | 0000000000000000000000000000000000000000000000000000000000000000
667 | 0000000000000000000000000000000000000000000000000000000000000000
668 | 0000000000000000000000000000000000000000000000000000000000000000
669 | 0000000000000000000000000000000000000000000000000000000000000000
670 | 0000000000000000000000000000000000000000000000000000000000000000
671 | 0000000000000000000000000000000000000000000000000000000000000000
672 | 0000000000000000000000000000000000000000000000000000000000000000
673 | 0000000000000000000000000000000000000000000000000000000000000000
674 | 0000000000000000000000000000000000000000000000000000000000000000
675 | 0000000000000000000000000000000000000000000000000000000000000000
676 | 0000000000000000000000000000000000000000000000000000000000000000
677 | 0000000000000000000000000000000000000000000000000000000000000000
678 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
679 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
680 | 00FF000000FF000000FFFD9FA100FF636500FF636500FF636500FD6A6C000000
681 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
682 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
683 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
684 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
685 | 0000000000000000000000000000000000000000000000000000000000000000
686 | 0000000000000000000000000000000000000000000000000000000000000000
687 | 0000000000000000000000000000000000000000000000000000000000000000
688 | 0000000000000000000000000000000000000000000000000000000000000000
689 | 0000000000000000000000000000000000000000000000000000000000000000
690 | 0000000000000000000000000000000000000000000000000000000000000000
691 | 0000000000000000000000000000000000000000000000000000000000000000
692 | 0000000000000000000000000000000000000000000000000000000000000000
693 | 0000000000000000000000000000000000000000000000000000000000000000
694 | 0000000000000000000000000000000000000000000000000000000000000000
695 | 0000000000000000000000000000000000000000000000000000000000000000
696 | 0000000000000000000000000000000000000000000000000000000000000000
697 | 0000000000000000000000000000000000000000000000000000000000000000
698 | 0000000000000000000000000000000000000000000000000000000000000000
699 | 0000000000000000000000000000000000000000000000000000000000000000
700 | 0000000000000000000000000000000000000000000000000000000000000000
701 | 0000000000000000000000000000000000000000000000000000000000000000
702 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
703 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
704 | 00FF000000FF000000FF000000FFFD6D6E00FF636500FF636500FF636500FD9F
705 | A100000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
706 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
707 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
708 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
709 | 0000000000000000000000000000000000000000000000000000000000000000
710 | 0000000000000000000000000000000000000000000000000000000000000000
711 | 0000000000000000000000000000000000000000000000000000000000000000
712 | 0000000000000000000000000000000000000000000000000000000000000000
713 | 0000000000000000000000000000000000000000000000000000000000000000
714 | 0000000000000000000000000000000000000000000000000000000000000000
715 | 0000000000000000000000000000000000000000000000000000000000000000
716 | 0000000000000000000000000000000000000000000000000000000000000000
717 | 0000000000000000000000000000000000000000000000000000000000000000
718 | 0000000000000000000000000000000000000000000000000000000000000000
719 | 0000000000000000000000000000000000000000000000000000000000000000
720 | 0000000000000000000000000000000000000000000000000000000000000000
721 | 0000000000000000000000000000000000000000000000000000000000000000
722 | 0000000000000000000000000000000000000000000000000000000000000000
723 | 0000000000000000000000000000000000000000000000000000000000000000
724 | 0000000000000000000000000000000000000000000000000000000000000000
725 | 0000000000000000000000000000000000000000000000000000000000000000
726 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
727 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
728 | 00FF000000FF000000FF000000FFFDB9BA00FF636500FF636500FF636500FD61
729 | 6300FDDDDD00000000FF000000FF000000FF000000FF000000FF000000FF0000
730 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
731 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
732 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
733 | 0000000000000000000000000000000000000000000000000000000000000000
734 | 0000000000000000000000000000000000000000000000000000000000000000
735 | 0000000000000000000000000000000000000000000000000000000000000000
736 | 0000000000000000000000000000000000000000000000000000000000000000
737 | 0000000000000000000000000000000000000000000000000000000000000000
738 | 0000000000000000000000000000000000000000000000000000000000000000
739 | 0000000000000000000000000000000000000000000000000000000000000000
740 | 0000000000000000000000000000000000000000000000000000000000000000
741 | 0000000000000000000000000000000000000000000000000000000000000000
742 | 0000000000000000000000000000000000000000000000000000000000000000
743 | 0000000000000000000000000000000000000000000000000000000000000000
744 | 0000000000000000000000000000000000000000000000000000000000000000
745 | 0000000000000000000000000000000000000000000000000000000000000000
746 | 0000000000000000000000000000000000000000000000000000000000000000
747 | 0000000000000000000000000000000000000000000000000000000000000000
748 | 0000000000000000000000000000000000000000000000000000000000000000
749 | 0000000000000000000000000000000000000000000000000000000000000000
750 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
751 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
752 | 00FF000000FF000000FF000000FF000000FFFD7E7E00FF636500FF636500FF63
753 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FF63
754 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FF63
755 | 6500FF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
756 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
757 | 0000000000000000000000000000000000000000000000000000000000000000
758 | 0000000000000000000000000000000000000000000000000000000000000000
759 | 0000000000000000000000000000000000000000000000000000000000000000
760 | 0000000000000000000000000000000000000000000000000000000000000000
761 | 0000000000000000000000000000000000000000000000000000000000000000
762 | 0000000000000000000000000000000000000000000000000000000000000000
763 | 0000000000000000000000000000000000000000000000000000000000000000
764 | 0000000000000000000000000000000000000000000000000000000000000000
765 | 0000000000000000000000000000000000000000000000000000000000000000
766 | 0000000000000000000000000000000000000000000000000000000000000000
767 | 0000000000000000000000000000000000000000000000000000000000000000
768 | 0000000000000000000000000000000000000000000000000000000000000000
769 | 0000000000000000000000000000000000000000000000000000000000000000
770 | 0000000000000000000000000000000000000000000000000000000000000000
771 | 0000000000000000000000000000000000000000000000000000000000000000
772 | 0000000000000000000000000000000000000000000000000000000000000000
773 | 0000000000000000000000000000000000000000000000000000000000000000
774 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
775 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
776 | 00FF000000FF000000FF000000FF000000FFFDD5D500FF636500FF636500FF63
777 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FF63
778 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FF63
779 | 6500FF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
780 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
781 | 0000000000000000000000000000000000000000000000000000000000000000
782 | 0000000000000000000000000000000000000000000000000000000000000000
783 | 0000000000000000000000000000000000000000000000000000000000000000
784 | 0000000000000000000000000000000000000000000000000000000000000000
785 | 0000000000000000000000000000000000000000000000000000000000000000
786 | 0000000000000000000000000000000000000000000000000000000000000000
787 | 0000000000000000000000000000000000000000000000000000000000000000
788 | 0000000000000000000000000000000000000000000000000000000000000000
789 | 0000000000000000000000000000000000000000000000000000000000000000
790 | 0000000000000000000000000000000000000000000000000000000000000000
791 | 0000000000000000000000000000000000000000000000000000000000000000
792 | 0000000000000000000000000000000000000000000000000000000000000000
793 | 0000000000000000000000000000000000000000000000000000000000000000
794 | 0000000000000000000000000000000000000000000000000000000000000000
795 | 0000000000000000000000000000000000000000000000000000000000000000
796 | 0000000000000000000000000000000000000000000000000000000000000000
797 | 0000000000000000000000000000000000000000000000000000000000000000
798 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
799 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
800 | 00FF000000FF000000FF000000FF000000FF000000FFFD939400FF636500FF63
801 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FF63
802 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FF63
803 | 6500FF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
804 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
805 | 0000000000000000000000000000000000000000000000000000000000000000
806 | 0000000000000000000000000000000000000000000000000000000000000000
807 | 0000000000000000000000000000000000000000000000000000000000000000
808 | 0000000000000000000000000000000000000000000000000000000000000000
809 | 0000000000000000000000000000000000000000000000000000000000000000
810 | 0000000000000000000000000000000000000000000000000000000000000000
811 | 0000000000000000000000000000000000000000000000000000000000000000
812 | 0000000000000000000000000000000000000000000000000000000000000000
813 | 0000000000000000000000000000000000000000000000000000000000000000
814 | 0000000000000000000000000000000000000000000000000000000000000000
815 | 0000000000000000000000000000000000000000000000000000000000000000
816 | 0000000000000000000000000000000000000000000000000000000000000000
817 | 0000000000000000000000000000000000000000000000000000000000000000
818 | 0000000000000000000000000000000000000000000000000000000000000000
819 | 0000000000000000000000000000000000000000000000000000000000000000
820 | 0000000000000000000000000000000000000000000000000000000000000000
821 | 0000000000000000000000000000000000000000000000000000000000000000
822 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
823 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
824 | 00FF000000FF000000FF000000FF000000FF000000FFFDE9E900FD666800FF63
825 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FF63
826 | 6500FF636500FF636500FF636500FF636500FF636500FF636500FF636500FF63
827 | 6500FF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
828 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
829 | 0000000000000000000000000000000000000000000000000000000000000000
830 | 0000000000000000000000000000000000000000000000000000000000000000
831 | 0000000000000000000000000000000000000000000000000000000000000000
832 | 0000000000000000000000000000000000000000000000000000000000000000
833 | 0000000000000000000000000000000000000000000000000000000000000000
834 | 0000000000000000000000000000000000000000000000000000000000000000
835 | 0000000000000000000000000000000000000000000000000000000000000000
836 | 0000000000000000000000000000000000000000000000000000000000000000
837 | 0000000000000000000000000000000000000000000000000000000000000000
838 | 0000000000000000000000000000000000000000000000000000000000000000
839 | 0000000000000000000000000000000000000000000000000000000000000000
840 | 0000000000000000000000000000000000000000000000000000000000000000
841 | 0000000000000000000000000000000000000000000000000000000000000000
842 | 0000000000000000000000000000000000000000000000000000000000000000
843 | 0000000000000000000000000000000000000000000000000000000000000000
844 | 0000000000000000000000000000000000000000000000000000000000000000
845 | 0000000000000000000000000000000000000000000000000000000000000000
846 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
847 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
848 | 00FF000000FF000000FF000000FF000000FF000000FF000000FFFDADAD00FF63
849 | 6500FF636500FF636500FD656700FDE6E700000000FF000000FF000000FF0000
850 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
851 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
852 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
853 | 0000000000000000000000000000000000000000000000000000000000000000
854 | 0000000000000000000000000000000000000000000000000000000000000000
855 | 0000000000000000000000000000000000000000000000000000000000000000
856 | 0000000000000000000000000000000000000000000000000000000000000000
857 | 0000000000000000000000000000000000000000000000000000000000000000
858 | 0000000000000000000000000000000000000000000000000000000000000000
859 | 0000000000000000000000000000000000000000000000000000000000000000
860 | 0000000000000000000000000000000000000000000000000000000000000000
861 | 0000000000000000000000000000000000000000000000000000000000000000
862 | 0000000000000000000000000000000000000000000000000000000000000000
863 | 0000000000000000000000000000000000000000000000000000000000000000
864 | 0000000000000000000000000000000000000000000000000000000000000000
865 | 0000000000000000000000000000000000000000000000000000000000000000
866 | 0000000000000000000000000000000000000000000000000000000000000000
867 | 0000000000000000000000000000000000000000000000000000000000000000
868 | 0000000000000000000000000000000000000000000000000000000000000000
869 | 0000000000000000000000000000000000000000000000000000000000000000
870 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
871 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
872 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FFFD74
873 | 7600FF636500FF636500FF636500FD929300000000FF000000FF000000FF0000
874 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
875 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
876 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
877 | 0000000000000000000000000000000000000000000000000000000000000000
878 | 0000000000000000000000000000000000000000000000000000000000000000
879 | 0000000000000000000000000000000000000000000000000000000000000000
880 | 0000000000000000000000000000000000000000000000000000000000000000
881 | 0000000000000000000000000000000000000000000000000000000000000000
882 | 0000000000000000000000000000000000000000000000000000000000000000
883 | 0000000000000000000000000000000000000000000000000000000000000000
884 | 0000000000000000000000000000000000000000000000000000000000000000
885 | 0000000000000000000000000000000000000000000000000000000000000000
886 | 0000000000000000000000000000000000000000000000000000000000000000
887 | 0000000000000000000000000000000000000000000000000000000000000000
888 | 0000000000000000000000000000000000000000000000000000000000000000
889 | 0000000000000000000000000000000000000000000000000000000000000000
890 | 0000000000000000000000000000000000000000000000000000000000000000
891 | 0000000000000000000000000000000000000000000000000000000000000000
892 | 0000000000000000000000000000000000000000000000000000000000000000
893 | 0000000000000000000000000000000000000000000000000000000000000000
894 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
895 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
896 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FFFDC7
897 | C700FF636500FF636500FF636500FF636500FDD1D200000000FF000000FF0000
898 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
899 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
900 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
901 | 0000000000000000000000000000000000000000000000000000000000000000
902 | 0000000000000000000000000000000000000000000000000000000000000000
903 | 0000000000000000000000000000000000000000000000000000000000000000
904 | 0000000000000000000000000000000000000000000000000000000000000000
905 | 0000000000000000000000000000000000000000000000000000000000000000
906 | 0000000000000000000000000000000000000000000000000000000000000000
907 | 0000000000000000000000000000000000000000000000000000000000000000
908 | 0000000000000000000000000000000000000000000000000000000000000000
909 | 0000000000000000000000000000000000000000000000000000000000000000
910 | 0000000000000000000000000000000000000000000000000000000000000000
911 | 0000000000000000000000000000000000000000000000000000000000000000
912 | 0000000000000000000000000000000000000000000000000000000000000000
913 | 0000000000000000000000000000000000000000000000000000000000000000
914 | 0000000000000000000000000000000000000000000000000000000000000000
915 | 0000000000000000000000000000000000000000000000000000000000000000
916 | 0000000000000000000000000000000000000000000000000000000000000000
917 | 0000000000000000000000000000000000000000000000000000000000000000
918 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
919 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
920 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
921 | 00FFFD878800FF636500FF636500FF636500FD797C00000000FF000000FF0000
922 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
923 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
924 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
925 | 0000000000000000000000000000000000000000000000000000000000000000
926 | 0000000000000000000000000000000000000000000000000000000000000000
927 | 0000000000000000000000000000000000000000000000000000000000000000
928 | 0000000000000000000000000000000000000000000000000000000000000000
929 | 0000000000000000000000000000000000000000000000000000000000000000
930 | 0000000000000000000000000000000000000000000000000000000000000000
931 | 0000000000000000000000000000000000000000000000000000000000000000
932 | 0000000000000000000000000000000000000000000000000000000000000000
933 | 0000000000000000000000000000000000000000000000000000000000000000
934 | 0000000000000000000000000000000000000000000000000000000000000000
935 | 0000000000000000000000000000000000000000000000000000000000000000
936 | 0000000000000000000000000000000000000000000000000000000000000000
937 | 0000000000000000000000000000000000000000000000000000000000000000
938 | 0000000000000000000000000000000000000000000000000000000000000000
939 | 0000000000000000000000000000000000000000000000000000000000000000
940 | 0000000000000000000000000000000000000000000000000000000000000000
941 | 0000000000000000000000000000000000000000000000000000000000000000
942 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
943 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
944 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
945 | 00FFFDDFDF00FD636500FF636500FF636500FF636500FDB8B900000000FF0000
946 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
947 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
948 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
949 | 0000000000000000000000000000000000000000000000000000000000000000
950 | 0000000000000000000000000000000000000000000000000000000000000000
951 | 0000000000000000000000000000000000000000000000000000000000000000
952 | 0000000000000000000000000000000000000000000000000000000000000000
953 | 0000000000000000000000000000000000000000000000000000000000000000
954 | 0000000000000000000000000000000000000000000000000000000000000000
955 | 0000000000000000000000000000000000000000000000000000000000000000
956 | 0000000000000000000000000000000000000000000000000000000000000000
957 | 0000000000000000000000000000000000000000000000000000000000000000
958 | 0000000000000000000000000000000000000000000000000000000000000000
959 | 0000000000000000000000000000000000000000000000000000000000000000
960 | 0000000000000000000000000000000000000000000000000000000000000000
961 | 0000000000000000000000000000000000000000000000000000000000000000
962 | 0000000000000000000000000000000000000000000000000000000000000000
963 | 0000000000000000000000000000000000000000000000000000000000000000
964 | 0000000000000000000000000000000000000000000000000000000000000000
965 | 0000000000000000000000000000000000000000000000000000000000000000
966 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
967 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
968 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
969 | 00FF000000FFFD9FA100FF636500FF636500FF636500FD6A6C00000000FF0000
970 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
971 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
972 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
973 | 0000000000000000000000000000000000000000000000000000000000000000
974 | 0000000000000000000000000000000000000000000000000000000000000000
975 | 0000000000000000000000000000000000000000000000000000000000000000
976 | 0000000000000000000000000000000000000000000000000000000000000000
977 | 0000000000000000000000000000000000000000000000000000000000000000
978 | 0000000000000000000000000000000000000000000000000000000000000000
979 | 0000000000000000000000000000000000000000000000000000000000000000
980 | 0000000000000000000000000000000000000000000000000000000000000000
981 | 0000000000000000000000000000000000000000000000000000000000000000
982 | 0000000000000000000000000000000000000000000000000000000000000000
983 | 0000000000000000000000000000000000000000000000000000000000000000
984 | 0000000000000000000000000000000000000000000000000000000000000000
985 | 0000000000000000000000000000000000000000000000000000000000000000
986 | 0000000000000000000000000000000000000000000000000000000000000000
987 | 0000000000000000000000000000000000000000000000000000000000000000
988 | 0000000000000000000000000000000000000000000000000000000000000000
989 | 0000000000000000000000000000000000000000000000000000000000000000
990 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
991 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
992 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
993 | 00FF000000FF000000FFFD6D6E00FF636500FF636500FF636500FD9FA0000000
994 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
995 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
996 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
997 | 0000000000000000000000000000000000000000000000000000000000000000
998 | 0000000000000000000000000000000000000000000000000000000000000000
999 | 0000000000000000000000000000000000000000000000000000000000000000
1000 | 0000000000000000000000000000000000000000000000000000000000000000
1001 | 0000000000000000000000000000000000000000000000000000000000000000
1002 | 0000000000000000000000000000000000000000000000000000000000000000
1003 | 0000000000000000000000000000000000000000000000000000000000000000
1004 | 0000000000000000000000000000000000000000000000000000000000000000
1005 | 0000000000000000000000000000000000000000000000000000000000000000
1006 | 0000000000000000000000000000000000000000000000000000000000000000
1007 | 0000000000000000000000000000000000000000000000000000000000000000
1008 | 0000000000000000000000000000000000000000000000000000000000000000
1009 | 0000000000000000000000000000000000000000000000000000000000000000
1010 | 0000000000000000000000000000000000000000000000000000000000000000
1011 | 0000000000000000000000000000000000000000000000000000000000000000
1012 | 0000000000000000000000000000000000000000000000000000000000000000
1013 | 0000000000000000000000000000000000000000000000000000000000000000
1014 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1015 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1016 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1017 | 00FF000000FF000000FFFDBABB00FF636500FF636500FF636500FD616300FDDD
1018 | DD00000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1019 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1020 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1021 | 0000000000000000000000000000000000000000000000000000000000000000
1022 | 0000000000000000000000000000000000000000000000000000000000000000
1023 | 0000000000000000000000000000000000000000000000000000000000000000
1024 | 0000000000000000000000000000000000000000000000000000000000000000
1025 | 0000000000000000000000000000000000000000000000000000000000000000
1026 | 0000000000000000000000000000000000000000000000000000000000000000
1027 | 0000000000000000000000000000000000000000000000000000000000000000
1028 | 0000000000000000000000000000000000000000000000000000000000000000
1029 | 0000000000000000000000000000000000000000000000000000000000000000
1030 | 0000000000000000000000000000000000000000000000000000000000000000
1031 | 0000000000000000000000000000000000000000000000000000000000000000
1032 | 0000000000000000000000000000000000000000000000000000000000000000
1033 | 0000000000000000000000000000000000000000000000000000000000000000
1034 | 0000000000000000000000000000000000000000000000000000000000000000
1035 | 0000000000000000000000000000000000000000000000000000000000000000
1036 | 0000000000000000000000000000000000000000000000000000000000000000
1037 | 0000000000000000000000000000000000000000000000000000000000000000
1038 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1039 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1040 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1041 | 00FF000000FF000000FF000000FFFD7E7E00FF636500FF636500FF636500FD84
1042 | 8500000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1043 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1044 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1045 | 0000000000000000000000000000000000000000000000000000000000000000
1046 | 0000000000000000000000000000000000000000000000000000000000000000
1047 | 0000000000000000000000000000000000000000000000000000000000000000
1048 | 0000000000000000000000000000000000000000000000000000000000000000
1049 | 0000000000000000000000000000000000000000000000000000000000000000
1050 | 0000000000000000000000000000000000000000000000000000000000000000
1051 | 0000000000000000000000000000000000000000000000000000000000000000
1052 | 0000000000000000000000000000000000000000000000000000000000000000
1053 | 0000000000000000000000000000000000000000000000000000000000000000
1054 | 0000000000000000000000000000000000000000000000000000000000000000
1055 | 0000000000000000000000000000000000000000000000000000000000000000
1056 | 0000000000000000000000000000000000000000000000000000000000000000
1057 | 0000000000000000000000000000000000000000000000000000000000000000
1058 | 0000000000000000000000000000000000000000000000000000000000000000
1059 | 0000000000000000000000000000000000000000000000000000000000000000
1060 | 0000000000000000000000000000000000000000000000000000000000000000
1061 | 0000000000000000000000000000000000000000000000000000000000000000
1062 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1063 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1064 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1065 | 00FF000000FF000000FF000000FFFDD5D500FF636500FF636500FF636500FF63
1066 | 6500FDC7C700000000FF000000FF000000FF000000FF000000FF000000FF0000
1067 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1068 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1069 | 0000000000000000000000000000000000000000000000000000000000000000
1070 | 0000000000000000000000000000000000000000000000000000000000000000
1071 | 0000000000000000000000000000000000000000000000000000000000000000
1072 | 0000000000000000000000000000000000000000000000000000000000000000
1073 | 0000000000000000000000000000000000000000000000000000000000000000
1074 | 0000000000000000000000000000000000000000000000000000000000000000
1075 | 0000000000000000000000000000000000000000000000000000000000000000
1076 | 0000000000000000000000000000000000000000000000000000000000000000
1077 | 0000000000000000000000000000000000000000000000000000000000000000
1078 | 0000000000000000000000000000000000000000000000000000000000000000
1079 | 0000000000000000000000000000000000000000000000000000000000000000
1080 | 0000000000000000000000000000000000000000000000000000000000000000
1081 | 0000000000000000000000000000000000000000000000000000000000000000
1082 | 0000000000000000000000000000000000000000000000000000000000000000
1083 | 0000000000000000000000000000000000000000000000000000000000000000
1084 | 0000000000000000000000000000000000000000000000000000000000000000
1085 | 0000000000000000000000000000000000000000000000000000000000000000
1086 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1087 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1088 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1089 | 00FF000000FF000000FF000000FF000000FFFD939400FF636500FF636500FF63
1090 | 6500FD737300000000FF000000FF000000FF000000FF000000FF000000FF0000
1091 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1092 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1093 | 0000000000000000000000000000000000000000000000000000000000000000
1094 | 0000000000000000000000000000000000000000000000000000000000000000
1095 | 0000000000000000000000000000000000000000000000000000000000000000
1096 | 0000000000000000000000000000000000000000000000000000000000000000
1097 | 0000000000000000000000000000000000000000000000000000000000000000
1098 | 0000000000000000000000000000000000000000000000000000000000000000
1099 | 0000000000000000000000000000000000000000000000000000000000000000
1100 | 0000000000000000000000000000000000000000000000000000000000000000
1101 | 0000000000000000000000000000000000000000000000000000000000000000
1102 | 0000000000000000000000000000000000000000000000000000000000000000
1103 | 0000000000000000000000000000000000000000000000000000000000000000
1104 | 0000000000000000000000000000000000000000000000000000000000000000
1105 | 0000000000000000000000000000000000000000000000000000000000000000
1106 | 0000000000000000000000000000000000000000000000000000000000000000
1107 | 0000000000000000000000000000000000000000000000000000000000000000
1108 | 0000000000000000000000000000000000000000000000000000000000000000
1109 | 0000000000000000000000000000000000000000000000000000000000000000
1110 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1111 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1112 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1113 | 00FF000000FF000000FF000000FF000000FF000000FFFD666800FF636500FF63
1114 | 6500FF636500FDADAE00000000FF000000FF000000FF000000FF000000FF0000
1115 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1116 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1117 | 0000000000000000000000000000000000000000000000000000000000000000
1118 | 0000000000000000000000000000000000000000000000000000000000000000
1119 | 0000000000000000000000000000000000000000000000000000000000000000
1120 | 0000000000000000000000000000000000000000000000000000000000000000
1121 | 0000000000000000000000000000000000000000000000000000000000000000
1122 | 0000000000000000000000000000000000000000000000000000000000000000
1123 | 0000000000000000000000000000000000000000000000000000000000000000
1124 | 0000000000000000000000000000000000000000000000000000000000000000
1125 | 0000000000000000000000000000000000000000000000000000000000000000
1126 | 0000000000000000000000000000000000000000000000000000000000000000
1127 | 0000000000000000000000000000000000000000000000000000000000000000
1128 | 0000000000000000000000000000000000000000000000000000000000000000
1129 | 0000000000000000000000000000000000000000000000000000000000000000
1130 | 0000000000000000000000000000000000000000000000000000000000000000
1131 | 0000000000000000000000000000000000000000000000000000000000000000
1132 | 0000000000000000000000000000000000000000000000000000000000000000
1133 | 0000000000000000000000000000000000000000000000000000000000000000
1134 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1135 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1136 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1137 | 00FF000000FF000000FF000000FF000000FF000000FFFDADAE00FF636500FF63
1138 | 6500FF636500FD646600FDE6E700000000FF000000FF000000FF000000FF0000
1139 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1140 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1141 | 0000000000000000000000000000000000000000000000000000000000000000
1142 | 0000000000000000000000000000000000000000000000000000000000000000
1143 | 0000000000000000000000000000000000000000000000000000000000000000
1144 | 0000000000000000000000000000000000000000000000000000000000000000
1145 | 0000000000000000000000000000000000000000000000000000000000000000
1146 | 0000000000000000000000000000000000000000000000000000000000000000
1147 | 0000000000000000000000000000000000000000000000000000000000000000
1148 | 0000000000000000000000000000000000000000000000000000000000000000
1149 | 0000000000000000000000000000000000000000000000000000000000000000
1150 | 0000000000000000000000000000000000000000000000000000000000000000
1151 | 0000000000000000000000000000000000000000000000000000000000000000
1152 | 0000000000000000000000000000000000000000000000000000000000000000
1153 | 0000000000000000000000000000000000000000000000000000000000000000
1154 | 0000000000000000000000000000000000000000000000000000000000000000
1155 | 0000000000000000000000000000000000000000000000000000000000000000
1156 | 0000000000000000000000000000000000000000000000000000000000000000
1157 | 0000000000000000000000000000000000000000000000000000000000000000
1158 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1159 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1160 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1161 | 00FF000000FF000000FF000000FF000000FF000000FF000000FFFD747600FF63
1162 | 6500FF636500FF636500FD939400000000FF000000FF000000FF000000FF0000
1163 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1164 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1165 | 0000000000000000000000000000000000000000000000000000000000000000
1166 | 0000000000000000000000000000000000000000000000000000000000000000
1167 | 0000000000000000000000000000000000000000000000000000000000000000
1168 | 0000000000000000000000000000000000000000000000000000000000000000
1169 | 0000000000000000000000000000000000000000000000000000000000000000
1170 | 0000000000000000000000000000000000000000000000000000000000000000
1171 | 0000000000000000000000000000000000000000000000000000000000000000
1172 | 0000000000000000000000000000000000000000000000000000000000000000
1173 | 0000000000000000000000000000000000000000000000000000000000000000
1174 | 0000000000000000000000000000000000000000000000000000000000000000
1175 | 0000000000000000000000000000000000000000000000000000000000000000
1176 | 0000000000000000000000000000000000000000000000000000000000000000
1177 | 0000000000000000000000000000000000000000000000000000000000000000
1178 | 0000000000000000000000000000000000000000000000000000000000000000
1179 | 0000000000000000000000000000000000000000000000000000000000000000
1180 | 0000000000000000000000000000000000000000000000000000000000000000
1181 | 0000000000000000000000000000000000000000000000000000000000000000
1182 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1183 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1184 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1185 | 00FF000000FF000000FF000000FF000000FF000000FF000000FFFDC7C700FF63
1186 | 6500FF636500FF636500FF636500FDD3D300000000FF000000FF000000FF0000
1187 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1188 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1189 | 0000000000000000000000000000000000000000000000000000000000000000
1190 | 0000000000000000000000000000000000000000000000000000000000000000
1191 | 0000000000000000000000000000000000000000000000000000000000000000
1192 | 0000000000000000000000000000000000000000000000000000000000000000
1193 | 0000000000000000000000000000000000000000000000000000000000000000
1194 | 0000000000000000000000000000000000000000000000000000000000000000
1195 | 0000000000000000000000000000000000000000000000000000000000000000
1196 | 0000000000000000000000000000000000000000000000000000000000000000
1197 | 0000000000000000000000000000000000000000000000000000000000000000
1198 | 0000000000000000000000000000000000000000000000000000000000000000
1199 | 0000000000000000000000000000000000000000000000000000000000000000
1200 | 0000000000000000000000000000000000000000000000000000000000000000
1201 | 0000000000000000000000000000000000000000000000000000000000000000
1202 | 0000000000000000000000000000000000000000000000000000000000000000
1203 | 0000000000000000000000000000000000000000000000000000000000000000
1204 | 0000000000000000000000000000000000000000000000000000000000000000
1205 | 0000000000000000000000000000000000000000000000000000000000000000
1206 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1207 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1208 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1209 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FFFD89
1210 | 8900FF636500FF636500FF636500FD7B7D00000000FF000000FF000000FF0000
1211 | 00FFFF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1212 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1213 | 0000000000000000000000000000000000000000000000000000000000000000
1214 | 0000000000000000000000000000000000000000000000000000000000000000
1215 | 0000000000000000000000000000000000000000000000000000000000000000
1216 | 0000000000000000000000000000000000000000000000000000000000000000
1217 | 0000000000000000000000000000000000000000000000000000000000000000
1218 | 0000000000000000000000000000000000000000000000000000000000000000
1219 | 0000000000000000000000000000000000000000000000000000000000000000
1220 | 0000000000000000000000000000000000000000000000000000000000000000
1221 | 0000000000000000000000000000000000000000000000000000000000000000
1222 | 0000000000000000000000000000000000000000000000000000000000000000
1223 | 0000000000000000000000000000000000000000000000000000000000000000
1224 | 0000000000000000000000000000000000000000000000000000000000000000
1225 | 0000000000000000000000000000000000000000000000000000000000000000
1226 | 0000000000000000000000000000000000000000000000000000000000000000
1227 | 0000000000000000000000000000000000000000000000000000000000000000
1228 | 0000000000000000000000000000000000000000000000000000000000000000
1229 | 0000000000000000000000000000000000000000000000000000000000000000
1230 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1231 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1232 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1233 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FFFDE0
1234 | E000FD636500FF636500FF636500FF636500FF636500FF636500FF636500FF63
1235 | 6500FF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1236 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1237 | 0000000000000000000000000000000000000000000000000000000000000000
1238 | 0000000000000000000000000000000000000000000000000000000000000000
1239 | 0000000000000000000000000000000000000000000000000000000000000000
1240 | 0000000000000000000000000000000000000000000000000000000000000000
1241 | 0000000000000000000000000000000000000000000000000000000000000000
1242 | 0000000000000000000000000000000000000000000000000000000000000000
1243 | 0000000000000000000000000000000000000000000000000000000000000000
1244 | 0000000000000000000000000000000000000000000000000000000000000000
1245 | 0000000000000000000000000000000000000000000000000000000000000000
1246 | 0000000000000000000000000000000000000000000000000000000000000000
1247 | 0000000000000000000000000000000000000000000000000000000000000000
1248 | 0000000000000000000000000000000000000000000000000000000000000000
1249 | 0000000000000000000000000000000000000000000000000000000000000000
1250 | 0000000000000000000000000000000000000000000000000000000000000000
1251 | 0000000000000000000000000000000000000000000000000000000000000000
1252 | 0000000000000000000000000000000000000000000000000000000000000000
1253 | 0000000000000000000000000000000000000000000000000000000000000000
1254 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1255 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1256 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1257 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1258 | 00FFFD9FA100FF636500FF636500FF636500FF636500FF636500FF636500FF63
1259 | 6500FF636500FF636500FF636500FF636500000000FF000000FF000000FF0000
1260 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1261 | 0000000000000000000000000000000000000000000000000000000000000000
1262 | 0000000000000000000000000000000000000000000000000000000000000000
1263 | 0000000000000000000000000000000000000000000000000000000000000000
1264 | 0000000000000000000000000000000000000000000000000000000000000000
1265 | 0000000000000000000000000000000000000000000000000000000000000000
1266 | 0000000000000000000000000000000000000000000000000000000000000000
1267 | 0000000000000000000000000000000000000000000000000000000000000000
1268 | 0000000000000000000000000000000000000000000000000000000000000000
1269 | 0000000000000000000000000000000000000000000000000000000000000000
1270 | 0000000000000000000000000000000000000000000000000000000000000000
1271 | 0000000000000000000000000000000000000000000000000000000000000000
1272 | 0000000000000000000000000000000000000000000000000000000000000000
1273 | 0000000000000000000000000000000000000000000000000000000000000000
1274 | 0000000000000000000000000000000000000000000000000000000000000000
1275 | 0000000000000000000000000000000000000000000000000000000000000000
1276 | 0000000000000000000000000000000000000000000000000000000000000000
1277 | 0000000000000000000000000000000000000000000000000000000000000000
1278 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1279 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1280 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1281 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1282 | 00FF000000FFFD6B6C00FF636500FF636500FF636500FF636500FF636500FF63
1283 | 6500FF636500FF636500FF636500FD737600000000FF000000FF000000FF0000
1284 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1285 | 0000000000000000000000000000000000000000000000000000000000000000
1286 | 0000000000000000000000000000000000000000000000000000000000000000
1287 | 0000000000000000000000000000000000000000000000000000000000000000
1288 | 0000000000000000000000000000000000000000000000000000000000000000
1289 | 0000000000000000000000000000000000000000000000000000000000000000
1290 | 0000000000000000000000000000000000000000000000000000000000000000
1291 | 0000000000000000000000000000000000000000000000000000000000000000
1292 | 0000000000000000000000000000000000000000000000000000000000000000
1293 | 0000000000000000000000000000000000000000000000000000000000000000
1294 | 0000000000000000000000000000000000000000000000000000000000000000
1295 | 0000000000000000000000000000000000000000000000000000000000000000
1296 | 0000000000000000000000000000000000000000000000000000000000000000
1297 | 0000000000000000000000000000000000000000000000000000000000000000
1298 | 0000000000000000000000000000000000000000000000000000000000000000
1299 | 0000000000000000000000000000000000000000000000000000000000000000
1300 | 0000000000000000000000000000000000000000000000000000000000000000
1301 | 0000000000000000000000000000000000000000000000000000000000000000
1302 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1303 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1304 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1305 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1306 | 00FF000000FFFDD4D500FD767900FF636500FF636500FF636500FF636500FF63
1307 | 6500FF636500FF636500FD717400FDD0D100000000FF000000FF000000FF0000
1308 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1309 | 0000000000000000000000000000000000000000000000000000000000000000
1310 | 0000000000000000000000000000000000000000000000000000000000000000
1311 | 0000000000000000000000000000000000000000000000000000000000000000
1312 | 0000000000000000000000000000000000000000000000000000000000000000
1313 | 0000000000000000000000000000000000000000000000000000000000000000
1314 | 0000000000000000000000000000000000000000000000000000000000000000
1315 | 0000000000000000000000000000000000000000000000000000000000000000
1316 | 0000000000000000000000000000000000000000000000000000000000000000
1317 | 0000000000000000000000000000000000000000000000000000000000000000
1318 | 0000000000000000000000000000000000000000000000000000000000000000
1319 | 0000000000000000000000000000000000000000000000000000000000000000
1320 | 0000000000000000000000000000000000000000000000000000000000000000
1321 | 0000000000000000000000000000000000000000000000000000000000000000
1322 | 0000000000000000000000000000000000000000000000000000000000000000
1323 | 0000000000000000000000000000000000000000000000000000000000000000
1324 | 0000000000000000000000000000000000000000000000000000000000000000
1325 | 0000000000000000000000000000000000000000000000000000000000000000
1326 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1327 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1328 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1329 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1330 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1331 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1332 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1333 | 0000000000000000000000000000000000000000000000000000000000000000
1334 | 0000000000000000000000000000000000000000000000000000000000000000
1335 | 0000000000000000000000000000000000000000000000000000000000000000
1336 | 0000000000000000000000000000000000000000000000000000000000000000
1337 | 0000000000000000000000000000000000000000000000000000000000000000
1338 | 0000000000000000000000000000000000000000000000000000000000000000
1339 | 0000000000000000000000000000000000000000000000000000000000000000
1340 | 0000000000000000000000000000000000000000000000000000000000000000
1341 | 0000000000000000000000000000000000000000000000000000000000000000
1342 | 0000000000000000000000000000000000000000000000000000000000000000
1343 | 0000000000000000000000000000000000000000000000000000000000000000
1344 | 0000000000000000000000000000000000000000000000000000000000000000
1345 | 0000000000000000000000000000000000000000000000000000000000000000
1346 | 0000000000000000000000000000000000000000000000000000000000000000
1347 | 0000000000000000000000000000000000000000000000000000000000000000
1348 | 0000000000000000000000000000000000000000000000000000000000000000
1349 | 0000000000000000000000000000000000000000000000000000000000000000
1350 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1351 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1352 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1353 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1354 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1355 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1356 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1357 | 0000000000000000000000000000000000000000000000000000000000000000
1358 | 0000000000000000000000000000000000000000000000000000000000000000
1359 | 0000000000000000000000000000000000000000000000000000000000000000
1360 | 0000000000000000000000000000000000000000000000000000000000000000
1361 | 0000000000000000000000000000000000000000000000000000000000000000
1362 | 0000000000000000000000000000000000000000000000000000000000000000
1363 | 0000000000000000000000000000000000000000000000000000000000000000
1364 | 0000000000000000000000000000000000000000000000000000000000000000
1365 | 0000000000000000000000000000000000000000000000000000000000000000
1366 | 0000000000000000000000000000000000000000000000000000000000000000
1367 | 0000000000000000000000000000000000000000000000000000000000000000
1368 | 0000000000000000000000000000000000000000000000000000000000000000
1369 | 0000000000000000000000000000000000000000000000000000000000000000
1370 | 0000000000000000000000000000000000000000000000000000000000000000
1371 | 0000000000000000000000000000000000000000000000000000000000000000
1372 | 0000000000000000000000000000000000000000000000000000000000000000
1373 | 0000000000000000000000000000000000000000000000000000000000000000
1374 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1375 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1376 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1377 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1378 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1379 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1380 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1381 | 0000000000000000000000000000000000000000000000000000000000000000
1382 | 0000000000000000000000000000000000000000000000000000000000000000
1383 | 0000000000000000000000000000000000000000000000000000000000000000
1384 | 0000000000000000000000000000000000000000000000000000000000000000
1385 | 0000000000000000000000000000000000000000000000000000000000000000
1386 | 0000000000000000000000000000000000000000000000000000000000000000
1387 | 0000000000000000000000000000000000000000000000000000000000000000
1388 | 0000000000000000000000000000000000000000000000000000000000000000
1389 | 0000000000000000000000000000000000000000000000000000000000000000
1390 | 0000000000000000000000000000000000000000000000000000000000000000
1391 | 0000000000000000000000000000000000000000000000000000000000000000
1392 | 0000000000000000000000000000000000000000000000000000000000000000
1393 | 0000000000000000000000000000000000000000000000000000000000000000
1394 | 0000000000000000000000000000000000000000000000000000000000000000
1395 | 0000000000000000000000000000000000000000000000000000000000000000
1396 | 0000000000000000000000000000000000000000000000000000000000000000
1397 | 0000000000000000000000000000000000000000000000000000000000000000
1398 | 000000000000000000000000000000000000000000FF000000FF000000FF0000
1399 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1400 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1401 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1402 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1403 | 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
1404 | 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
1405 | 0000000000000000000000000000000000000000000000000000000000000000
1406 | 0000000000000000000000000000000000000000000000000000000000000000
1407 | 0000000000000000000000000000000000000000000000000000000000000000
1408 | 0000000000000000000000000000000000000000000000000000000000000000
1409 | 0000000000000000000000000000000000000000000000000000000000000000
1410 | 0000000000000000000000000000000000000000000000000000000000000000
1411 | 0000000000000000000000000000000000000000000000000000000000000000
1412 | 0000000000000000000000000000000000000000000000000000000000000000
1413 | 0000000000000000000000000000000000000000000000000000000000000000
1414 | 0000000000000000000000000000000000000000000000000000000000000000
1415 | 0000000000000000000000000000000000000000000000000000000000000000
1416 | 0000000000000000000000000000000000000000000000000000000000000000
1417 | 0000000000000000000000000000000000000000000000000000000000000000
1418 | 0000000000000000000000000000000000000000000000000000000000000000
1419 | 0000000000000000000000000000000000000000000000000000000000000000
1420 | 0000000000000000000000000000000000000000000000000000000000000000
1421 | 0000000000000000000000000000000000000000000000000000000000000000
1422 | 000000000000000000000000000000000000424D3E000000000000003E000000
1423 | 28000000C0000000300000000100010000000000800400000000000000000000
1424 | 000000000000000000000000FFFFFF00FFFFFFFFFFFF00000000000000000000
1425 | 0000000000000000FFFFFFFFFFFF000000000000000000000000000000000000
1426 | FFFFFFFFFFFF000000000000000000000000000000000000FFFFFFFFFFFF0000
1427 | 00000000000000000000000000000000F000FFFF000F00000000000000000000
1428 | 0000000000000000F000FFFF000F000000000000000000000000000000000000
1429 | F000FFFF000F000000000000000000000000000000000000F000FFFF000F0000
1430 | 00000000000000000000000000000000FF83FFFFF0FF00000000000000000000
1431 | 0000000000000000FF81FFFFF0FF000000000000000000000000000000000000
1432 | FFC1FFFFF0FF000000000000000000000000000000000000FFC0FFFFF0FF0000
1433 | 00000000000000000000000000000000FFE07FFFF0FF00000000000000000000
1434 | 0000000000000000FFF07FFFF0FF000000000000000000000000000000000000
1435 | FFF03FFFF0FF000000000000000000000000000000000000FFF83FFFF0FF0000
1436 | 00000000000000000000000000000000FFF81FFFF0FF00000000000000000000
1437 | 0000000000000000FFFC1FFFF0FF000000000000000000000000000000000000
1438 | FFFE0FFFF0FF000000000000000000000000000000000000FFFE07FFF0FF0000
1439 | 00000000000000000000000000000000FFFF000000FF00000000000000000000
1440 | 0000000000000000FFFF000000FF000000000000000000000000000000000000
1441 | FFFF800000FF000000000000000000000000000000000000FFFF800000FF0000
1442 | 00000000000000000000000000000000FFFFC0FFF0FF00000000000000000000
1443 | 0000000000000000FFFFE0FFF0FF000000000000000000000000000000000000
1444 | FFFFE07FF0FF000000000000000000000000000000000000FFFFF07FF0FF0000
1445 | 00000000000000000000000000000000FFFFF03FF0FF00000000000000000000
1446 | 0000000000000000FFFFF83FF0FF000000000000000000000000000000000000
1447 | FFFFFC1FF0FF000000000000000000000000000000000000FFFFFC0FF0FF0000
1448 | 00000000000000000000000000000000FFFFFE0FF0FF00000000000000000000
1449 | 0000000000000000FFFFFE07F0FF000000000000000000000000000000000000
1450 | FFFFFF07F0FF000000000000000000000000000000000000FFFFFF83F0FF0000
1451 | 00000000000000000000000000000000FFFFFF81F0FF00000000000000000000
1452 | 0000000000000000FFFFFFC1F0FF000000000000000000000000000000000000
1453 | FFFFFFC0F0FF000000000000000000000000000000000000FFFFFFE0F0FF0000
1454 | 00000000000000000000000000000000FFFFFFE000FF00000000000000000000
1455 | 0000000000000000FFFFFFF000FF000000000000000000000000000000000000
1456 | FFFFFFF800FF000000000000000000000000000000000000FFFFFFF800FF0000
1457 | 00000000000000000000000000000000FFFFFFFFFFFF00000000000000000000
1458 | 0000000000000000FFFFFFFFFFFF000000000000000000000000000000000000
1459 | FFFFFFFFFFFF000000000000000000000000000000000000FFFFFFFFFFFF0000
1460 | 0000000000000000000000000000000000000000000000000000000000000000
1461 | 000000000000}
1462 | end
1463 | object dlgSave1: TSaveDialog
1464 | Left = 312
1465 | Top = 264
1466 | end
1467 | end
1468 |
--------------------------------------------------------------------------------
/Sample/uPrin.pas:
--------------------------------------------------------------------------------
1 | unit uPrin;
2 |
3 | interface
4 |
5 | uses
6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
7 | System.Classes, Vcl.Graphics, Vcl.imaging.jpeg, Clipbrd,
8 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
9 | Captcha.Intf, Vcl.Buttons, System.ImageList, Vcl.ImgList, Winapi.ShellAPI;
10 |
11 | type
12 |
13 | TLabeledEditorHelper = class helper for TLabeledEdit
14 | public
15 | function ToInteger: Integer;
16 | end;
17 |
18 | TfrmPrin = class(TForm)
19 | pnl1: TPanel;
20 | grpBitmap: TGroupBox;
21 | grpJPEG: TGroupBox;
22 | grpMemoryStream: TGroupBox;
23 | imgBitmap: TImage;
24 | imgJPEG: TImage;
25 | btnSaveStream: TButton;
26 | btnNewNumber: TButton;
27 | btnReload: TButton;
28 | edtValidate: TEdit;
29 | btnNewLetters: TButton;
30 | btnNewAlpha: TButton;
31 | lbledtLength: TLabeledEdit;
32 | rgOptions: TRadioGroup;
33 | rgDifficulty: TRadioGroup;
34 | btnBase64: TButton;
35 | dlgFont1: TFontDialog;
36 | il1: TImageList;
37 | Button1: TButton;
38 | lbledtWidth: TLabeledEdit;
39 | lbledtHeigth: TLabeledEdit;
40 | lblValidate: TLabel;
41 | dlgSave1: TSaveDialog;
42 | btn1: TButton;
43 | clrbx1: TColorBox;
44 | lbl1: TLabel;
45 | procedure Button1Click(Sender: TObject);
46 | procedure FormCreate(Sender: TObject);
47 | procedure btnNewNumberClick(Sender: TObject);
48 | procedure btnNewLettersClick(Sender: TObject);
49 | procedure btnNewAlphaClick(Sender: TObject);
50 | procedure btnReloadClick(Sender: TObject);
51 | procedure edtValidateExit(Sender: TObject);
52 | procedure btnSaveStreamClick(Sender: TObject);
53 | procedure btnBase64Click(Sender: TObject);
54 | procedure btn1Click(Sender: TObject);
55 | private
56 | { Private declarations }
57 | procedure SetCaptchaDefaults;
58 | public
59 | { Public declarations }
60 | FCaptcha: ICaptcha;
61 | end;
62 |
63 | var
64 | frmPrin: TfrmPrin;
65 |
66 | implementation
67 |
68 | {$R *.dfm}
69 |
70 | procedure TfrmPrin.btn1Click(Sender: TObject);
71 | begin
72 | ShowMessage(FCaptcha.GetTextCaptcha);
73 | end;
74 |
75 | procedure TfrmPrin.btnBase64Click(Sender: TObject);
76 | begin
77 | Clipboard.AsText := FCaptcha.ToBase64;
78 | Application.MessageBox('Copied to clipboard.', 'Captcha',
79 | MB_OK + MB_ICONINFORMATION);
80 |
81 | end;
82 |
83 | procedure TfrmPrin.btnNewAlphaClick(Sender: TObject);
84 | var
85 | LJpeg: TJPEGImage;
86 | LBitMap: TBitmap;
87 | begin
88 | SetCaptchaDefaults;
89 |
90 | case rgDifficulty.ItemIndex of
91 | 0:
92 | FCaptcha.Easy;
93 | 1:
94 | FCaptcha.Moderate;
95 | 2:
96 | FCaptcha.Hard;
97 | end;
98 |
99 | case rgOptions.ItemIndex of
100 | 0:
101 | FCaptcha.LetterUpperCase;
102 | 1:
103 | FCaptcha.LetterLowerCase;
104 | 2:
105 | FCaptcha.LetterMixed;
106 | end;
107 |
108 | FCaptcha.Alphanumeric.Build;
109 | try
110 | LJpeg := FCaptcha.ToJPEG;
111 | // Results an TJPEGImage and it's your responsability to relasead from the memory.
112 | LBitMap := FCaptcha.ToBitmap; // Same
113 | imgJPEG.Picture.Assign(LJpeg);
114 | imgBitmap.Picture.Assign(LBitMap);
115 | finally
116 | LJpeg.Free;
117 | LBitMap.Free;
118 | end;
119 | end;
120 |
121 | procedure TfrmPrin.btnNewLettersClick(Sender: TObject);
122 | var
123 | LJpeg: TJPEGImage;
124 | LBitMap: TBitmap;
125 | begin
126 | SetCaptchaDefaults;
127 |
128 | case rgDifficulty.ItemIndex of
129 | 0:
130 | FCaptcha.Easy;
131 | 1:
132 | FCaptcha.Moderate;
133 | 2:
134 | FCaptcha.Hard;
135 | end;
136 |
137 | case rgOptions.ItemIndex of
138 | 0:
139 | FCaptcha.LetterUpperCase;
140 | 1:
141 | FCaptcha.LetterLowerCase;
142 | 2:
143 | FCaptcha.LetterMixed;
144 | end;
145 | { you can use like this:
146 | FCaptcha.SetWidth
147 | .SetLegth
148 | .SetHeigth
149 | .Font()
150 | .Easy
151 | .Letters
152 | .LetterMixed
153 | .Build;
154 | or
155 |
156 | LJpeg:= FCaptcha.SetWidth
157 | .SetLegth
158 | .SetHeigth
159 | .Font()
160 | .Easy
161 | .Letters.
162 | .LettersMixed
163 | .ToJPEG;
164 | }
165 |
166 | FCaptcha.Letters.Build;
167 | try
168 | LJpeg := FCaptcha.ToJPEG;
169 | // Results an TJPEGImage and it's your responsability to relasead from the memory.
170 | LBitMap := FCaptcha.ToBitmap; // Same
171 | imgJPEG.Picture.Assign(LJpeg);
172 | imgBitmap.Picture.Assign(LBitMap);
173 | finally
174 | LJpeg.Free;
175 | LBitMap.Free;
176 | end;
177 | end;
178 |
179 | procedure TfrmPrin.btnNewNumberClick(Sender: TObject);
180 | var
181 | LJpeg: TJPEGImage;
182 | LBitMap: TBitmap;
183 | begin
184 | SetCaptchaDefaults;
185 | // hey this is just a sample
186 | case rgDifficulty.ItemIndex of
187 | 0:
188 | FCaptcha.Easy;
189 | 1:
190 | FCaptcha.Moderate;
191 | 2:
192 | FCaptcha.Hard;
193 | end;
194 |
195 | FCaptcha.Numbers.Build;
196 | { you can use like this:
197 | FCaptcha.SetWidth
198 | .SetLegth
199 | .SetHeigth
200 | .Font()
201 | .Easy
202 | .Numbers
203 | .Build
204 | or
205 |
206 | LJpeg:= FCaptcha.SetWidth
207 | .SetLegth
208 | .SetHeigth
209 | .Font()
210 | .Easy
211 | .Numbers
212 | .Build
213 | .ToJPEG;
214 | }
215 |
216 | try
217 | LJpeg := FCaptcha.ToJPEG;
218 | // Results an TJPEGImage and it's your responsability to relasead from the memory.
219 | LBitMap := FCaptcha.ToBitmap; // Same
220 | imgJPEG.Picture.Assign(LJpeg);
221 | imgBitmap.Picture.Assign(LBitMap);
222 | finally
223 | LJpeg.Free;
224 | LBitMap.Free;
225 | end;
226 | end;
227 |
228 | procedure TfrmPrin.btnReloadClick(Sender: TObject);
229 | var
230 | LJpeg: TJPEGImage;
231 | LBitMap: TBitmap;
232 | begin
233 | FCaptcha.Build; // to refresh just call the build;
234 | try
235 | LJpeg := FCaptcha.ToJPEG;
236 | // Results an TJPEGImage and it's your responsability to relasead from the memory.
237 | LBitMap := FCaptcha.ToBitmap; // Same
238 | imgJPEG.Picture.Assign(LJpeg);
239 | imgBitmap.Picture.Assign(LBitMap);
240 | finally
241 | LJpeg.Free;
242 | LBitMap.Free;
243 | end;
244 | end;
245 |
246 | procedure TfrmPrin.btnSaveStreamClick(Sender: TObject);
247 | var
248 | LStream: TMemoryStream;
249 | begin
250 | if (dlgSave1.Execute) and (dlgSave1.FileName <> '') then
251 | begin
252 | try
253 | LStream:= TCaptchaUtils
254 | .New
255 | .Alphanumeric
256 | .SetHeigth(80)
257 | .SetWidth(200)
258 | .SetLength(10)
259 | .LetterMixed
260 | .Moderate
261 | .Build
262 | .ToStream;
263 | LStream.SaveToFile(dlgSave1.FileName);
264 | if FileExists(dlgSave1.FileName) then
265 | begin
266 | Application.MessageBox('Sucess!!', 'Captcha',
267 | MB_OK + MB_ICONINFORMATION);
268 | ShellExecute(Handle, 'open', pchar(dlgSave1.FileName), nil, nil, SW_SHOWNORMAL) ;
269 | end;
270 |
271 | finally
272 | LStream.Free;
273 | end;
274 |
275 | end;
276 | end;
277 |
278 | procedure TfrmPrin.Button1Click(Sender: TObject);
279 | begin
280 | dlgFont1.Execute();
281 | end;
282 |
283 | procedure TfrmPrin.edtValidateExit(Sender: TObject);
284 | begin
285 | if edtValidate.Text = '' then
286 | Exit;
287 |
288 | if FCaptcha.Validate(edtValidate.Text) then
289 | begin
290 | MessageDlg('Match!', mtInformation, [mbOk], 0);
291 | edtValidate.SetFocus;
292 | end
293 | else
294 | begin
295 | MessageDlg('Invalid!', mtError, [mbOk], 0);
296 | edtValidate.SetFocus;
297 | end;
298 |
299 | end;
300 |
301 | procedure TfrmPrin.FormCreate(Sender: TObject);
302 | begin
303 | FCaptcha := TCaptchaUtils.New; // its an interface
304 | end;
305 |
306 | procedure TfrmPrin.SetCaptchaDefaults;
307 | begin
308 | FCaptcha.SetHeigth(lbledtHeigth.ToInteger).SetWidth(lbledtWidth.ToInteger)
309 | .SetLength(lbledtLength.ToInteger).Font(dlgFont1.Font.Name,
310 | dlgFont1.Font.Size, dlgFont1.Font.Color).SetBackgroundColor
311 | (clrbx1.Selected);
312 | end;
313 |
314 | { TLabeledEditorHelper }
315 |
316 | function TLabeledEditorHelper.ToInteger: Integer;
317 | begin
318 |
319 | Result := StrToIntDef(Self.Text, 0);
320 |
321 | end;
322 |
323 | end.
324 |
--------------------------------------------------------------------------------
/img/Delphi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daviladanielc/Delphi-Captcha-Generator/801b611968be22c2c004b3a9c726eea6849fe931/img/Delphi.png
--------------------------------------------------------------------------------
/img/sample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daviladanielc/Delphi-Captcha-Generator/801b611968be22c2c004b3a9c726eea6849fe931/img/sample.png
--------------------------------------------------------------------------------
/src/Captcha.Contract.pas:
--------------------------------------------------------------------------------
1 | unit Captcha.Contract;
2 |
3 | interface
4 |
5 | uses
6 | Vcl.Graphics, System.Classes, Vcl.imaging.jpeg;
7 |
8 | type
9 |
10 | ICaptcha = interface
11 | ['{252431A4-5A4A-4954-880E-622D83F7D3B3}']
12 | ///
13 | /// Generates a captcha with letters and numbers: aB34c3
14 | ///
15 | function Alphanumeric: ICaptcha;
16 | ///
17 | /// Generates the captcha and stores it within a TMemoryStream in the standard TBitmap format of the image
18 | ///
19 | function Build: ICaptcha;
20 | ///
21 | /// Generates an easily understandable image.
22 | ///
23 | function Easy: ICaptcha;
24 | ///
25 | /// Changes the default font settings of the captcha upon generation.
26 | ///
27 | function Font(const AName: String; Const ASize: integer; const AColor: TColor): ICaptcha;
28 | ///
29 | /// Returns the text generated in the captcha.
30 | ///
31 | function GetTextCaptcha: string;
32 | ///
33 | /// "Generates a more challenging-to-understand image."
34 | ///
35 | function Hard: ICaptcha;
36 | function LetterLowerCase: ICaptcha;
37 | function LetterMixed: ICaptcha;
38 | ///
39 | /// Specifies that a captcha will be generated using only letters
40 | ///
41 | function Letters: ICaptcha;
42 | function LetterUpperCase: ICaptcha;
43 | function Moderate: ICaptcha;
44 | ///
45 | /// Specifies that a captcha will be generated using only numbers
46 | ///
47 | function Numbers: ICaptcha;
48 | ///
49 | /// Sets the background color of the captcha image. PLEASE pay attention to the color of the letters.
50 | ///
51 | function SetBackgroundColor(const Value: TColor):ICaptcha;
52 | ///
53 | /// Sets the height of the captcha image.
54 | ///
55 | function SetHeigth(const Value: integer): ICaptcha;
56 | ///
57 | /// Sets the length of the captcha image.
58 | ///
59 | function SetLength(const Value: integer): ICaptcha;
60 | ///
61 | /// Sets the width of the captcha image.
62 | ///
63 | function SetWidth(const Value: integer): ICaptcha;
64 | ///
65 | /// Returns the generated image in bitmap format converted to base 64
66 | ///
67 | function ToBase64: String;
68 | ///
69 | /// Returns an object of the generated captcha to bitmap format;
70 | ///
71 | function ToBitmap: Vcl.Graphics.TBitmap;
72 | ///
73 | /// Returns an object of the generated captcha to JPEG format;
74 | ///
75 | function ToJPEG: TJPEGimage;
76 | ///
77 | /// Returns an object of the generated captcha to MemoryStream format;
78 | ///
79 | function ToStream: TMemoryStream;
80 | function Validate(const AText: string): boolean;
81 | end;
82 |
83 | implementation
84 |
85 | end.
86 |
--------------------------------------------------------------------------------
/src/Captcha.Enum.pas:
--------------------------------------------------------------------------------
1 | unit Captcha.Enum;
2 |
3 | interface
4 |
5 | type
6 | TCaptchaType = (ctLetters, ctNumbers, ctAlphaNumeric);
7 | TLetterCase = (lcUppercase, lcLowercase, lcMixed);
8 | TDifficulty = (dcEasy, dcModerate, dcHard);
9 |
10 | implementation
11 |
12 | end.
13 |
--------------------------------------------------------------------------------
/src/Captcha.Impl.pas:
--------------------------------------------------------------------------------
1 | unit Captcha.Impl;
2 |
3 | interface
4 |
5 | uses Vcl.Graphics, System.Classes, System.SysUtils, System.NetEncoding,
6 | Winapi.Messages, Captcha.Contract, Captcha.Enum, Vcl.imaging.jpeg;
7 |
8 | type
9 |
10 | ECaptchaBuildError = class(Exception)
11 | public
12 | constructor Create(const Msg: string); overload;
13 | end;
14 |
15 | TCaptcha = class(TInterfacedObject, ICaptcha)
16 | private
17 | FBackgroundColor: TColor;
18 | FCaptchaText: String;
19 | FCaptchaType: TCaptchaType;
20 | FCustomText: String;
21 | FDifficulty: TDifficulty;
22 | FFontColor: TColor;
23 | FFontName: string;
24 | FFontSize: integer;
25 | FHeight: integer;
26 | FImageStream: TMemoryStream;
27 | FLength: integer;
28 | FLetterCase: TLetterCase;
29 | FWidth: integer;
30 | function GenerateCaptcha: String;
31 | public
32 | constructor Create;
33 | destructor Destroy; override;
34 | function Alphanumeric: ICaptcha;
35 | function Build: ICaptcha;
36 | function Easy: ICaptcha;
37 | function Font(const AName: String; Const ASize: integer;
38 | const AColor: TColor): ICaptcha;
39 | function GetTextCaptcha: string;
40 | function Hard: ICaptcha;
41 | function LetterLowerCase: ICaptcha;
42 | function LetterMixed: ICaptcha;
43 | function Letters: ICaptcha;
44 | function LetterUpperCase: ICaptcha;
45 | function Moderate: ICaptcha;
46 | function Numbers: ICaptcha;
47 | function SetCustomCaptcha(const ACustomCaptcha: String): ICaptcha;
48 | function SetBackgroundColor(const Value: TColor):ICaptcha;
49 | function SetHeigth(const Value: integer): ICaptcha;
50 | function SetLength(const Value: integer): ICaptcha;
51 | function SetWidth(const Value: integer): ICaptcha;
52 | function ToBase64: String;
53 | function ToBitmap: Vcl.Graphics.TBitmap;
54 | function ToJPEG: TJPEGimage;
55 | function ToStream: TMemoryStream;
56 | function Validate(const AText: string): boolean;
57 | end;
58 |
59 | implementation
60 |
61 | uses
62 | Winapi.Windows;
63 |
64 | { TCaptcha }
65 |
66 | function TCaptcha.Alphanumeric: ICaptcha;
67 | begin
68 | Result := Self;
69 | FCaptchaType := ctAlphaNumeric;
70 | end;
71 |
72 | function TCaptcha.Build: ICaptcha;
73 | var
74 | i, x, y: integer;
75 | LDifficultyDots: integer;
76 | LDifficultyLines: integer;
77 | LBitmap: Vcl.Graphics.TBitmap;
78 | begin
79 | Result := Self;
80 | FImageStream.Clear;
81 | LDifficultyDots := 0;
82 | LDifficultyLines := 0;
83 | try
84 | if FCustomText = '' then
85 | FCaptchaText := GenerateCaptcha
86 | else
87 | FCaptchaText := FCustomText;
88 |
89 | case FDifficulty of
90 | dcEasy:
91 | begin
92 | LDifficultyDots := 100;
93 | LDifficultyLines := 10;
94 | end;
95 | dcModerate:
96 | begin
97 | LDifficultyDots := 300;
98 | LDifficultyLines := 20;
99 | end;
100 | dcHard:
101 | begin
102 | LDifficultyDots := 500;
103 | LDifficultyLines := 30;
104 | end;
105 | end;
106 |
107 | LBitmap := Vcl.Graphics.TBitmap.Create;
108 | try
109 | LBitmap.Width := FWidth;
110 | LBitmap.Height := FHeight;
111 |
112 | // Calculates the initial position to center the text
113 | x := (FWidth - LBitmap.Canvas.TextWidth(FCaptchaText)) div 2;
114 | y := (FHeight - LBitmap.Canvas.TextHeight(FCaptchaText)) div 2;
115 |
116 | // Applies the font before drawing the text
117 | LBitmap.Canvas.Font.Size := FFontSize;
118 | LBitmap.Canvas.Font.Name := FFontName;
119 | LBitmap.Canvas.Font.Color := FFontColor;
120 |
121 | // Set the background color
122 | LBitmap.Canvas.Brush.Color := FBackgroundColor;
123 | LBitmap.Canvas.Brush.Style:= bsSolid;
124 | LBitmap.Canvas.FillRect(Rect(0, 0, LBitmap.Width, LBitmap.Height));
125 |
126 | // Draws the text on the image
127 | LBitmap.Canvas.TextOut(x, y, FCaptchaText);
128 |
129 | // Adds noise to the image (random dots).
130 | for i := 1 to LDifficultyDots do
131 | begin
132 | x := Random(FWidth);
133 | y := Random(FHeight);
134 | LBitmap.Canvas.Pixels[x, y] := clBlack;
135 | end;
136 |
137 | // Adds random lines to the image
138 | for i := 1 to LDifficultyLines do
139 | begin
140 | LBitmap.Canvas.Pen.Color := RGB(Random(256), Random(256), Random(256));
141 | LBitmap.Canvas.MoveTo(Random(FWidth), Random(FHeight));
142 | LBitmap.Canvas.LineTo(Random(FWidth), Random(FHeight));
143 | end;
144 |
145 | LBitmap.SaveToStream(FImageStream);
146 | FImageStream.Position := 0;
147 | finally
148 | LBitmap.Free;
149 | end;
150 | except
151 | on E: Exception do
152 | ECaptchaBuildError.Create(E.Message);
153 | end;
154 |
155 | end;
156 |
157 | constructor TCaptcha.Create;
158 | begin
159 | FCustomText := '';
160 | FDifficulty := dcEasy;
161 | FCaptchaType := ctAlphaNumeric;
162 | FLetterCase := lcUppercase;
163 | FWidth := 200;
164 | FHeight := 80;
165 | FLength := 6;
166 | FBackgroundColor:= clWhite;
167 | FImageStream := TMemoryStream.Create;
168 | end;
169 |
170 | destructor TCaptcha.Destroy;
171 | begin
172 | FImageStream.Free;
173 | inherited;
174 | end;
175 |
176 | function TCaptcha.Easy: ICaptcha;
177 | begin
178 | Result := Self;
179 | FDifficulty := dcEasy;
180 | end;
181 |
182 | function TCaptcha.Font(const AName: String; Const ASize: integer;
183 | const AColor: TColor): ICaptcha;
184 | begin
185 | Result := Self;
186 | FFontName := AName;
187 | FFontColor := AColor;
188 | FFontSize := ASize;
189 | end;
190 |
191 | function TCaptcha.GenerateCaptcha: String;
192 | var
193 | i: integer;
194 | begin
195 | for i := 1 to FLength do
196 | begin
197 | case FCaptchaType of
198 | ctLetters:
199 | Result := Result + Chr(65 + Random(26));
200 | ctNumbers:
201 | Result := Result + IntToStr(Random(10));
202 | ctAlphaNumeric:
203 | if Random(2) = 0 then
204 | Result := Result + Chr(65 + Random(26))
205 | else
206 | Result := Result + IntToStr(Random(10));
207 | end;
208 | end;
209 |
210 | case FLetterCase of
211 | lcUppercase:
212 | Result := Result.ToUpper;
213 | lcLowercase:
214 | Result := Result.ToLower;
215 | lcMixed:
216 | begin
217 | for i := 1 to Length(Result) do
218 | begin
219 | if Random(2) = 0 then
220 | Result[i] := UpperCase(Result[i])[1]
221 | else
222 | Result[i] := LowerCase(Result[i])[1];
223 | end;
224 | end;
225 | end;
226 | end;
227 |
228 | function TCaptcha.GetTextCaptcha: string;
229 | begin
230 | Result := FCaptchaText;
231 | end;
232 |
233 | function TCaptcha.Hard: ICaptcha;
234 | begin
235 | Result := Self;
236 | FDifficulty := dcHard;
237 | end;
238 |
239 | function TCaptcha.Letters: ICaptcha;
240 | begin
241 | Result := Self;
242 | FCaptchaType := ctLetters;
243 | end;
244 |
245 | function TCaptcha.LetterLowerCase: ICaptcha;
246 | begin
247 | Result := Self;
248 | FLetterCase := lcLowercase;
249 | end;
250 |
251 | function TCaptcha.LetterMixed: ICaptcha;
252 | begin
253 | Result := Self;
254 | FLetterCase := lcMixed;
255 | end;
256 |
257 | function TCaptcha.Moderate: ICaptcha;
258 | begin
259 | Result := Self;
260 | FDifficulty := dcModerate;
261 | end;
262 |
263 | function TCaptcha.Numbers: ICaptcha;
264 | begin
265 | Result := Self;
266 | FCaptchaType := ctNumbers;
267 | end;
268 |
269 | function TCaptcha.SetBackgroundColor(const Value: TColor): ICaptcha;
270 | begin
271 | Result:= Self;
272 | FBackgroundColor:= Value;
273 | end;
274 |
275 | function TCaptcha.SetCustomCaptcha(const ACustomCaptcha: String): ICaptcha;
276 | begin
277 | Result := Self;
278 | FCustomText := ACustomCaptcha;
279 | end;
280 |
281 | function TCaptcha.SetHeigth(const Value: integer): ICaptcha;
282 | begin
283 | Result := Self;
284 | FHeight := Value;
285 | end;
286 |
287 | function TCaptcha.SetLength(const Value: integer): ICaptcha;
288 | begin
289 | Result := Self;
290 | FLength := Value;
291 | end;
292 |
293 | function TCaptcha.SetWidth(const Value: integer): ICaptcha;
294 | begin
295 | Result := Self;
296 | FWidth := Value;
297 | end;
298 |
299 | function TCaptcha.ToBase64: String;
300 | var
301 | LInput: TBytesStream;
302 | LOutput: TStringStream;
303 | LEncoding: TBase64Encoding;
304 | begin
305 | LInput := TBytesStream.Create;
306 | try
307 | FImageStream.SaveToStream(LInput);
308 | LInput.Position := 0;
309 | LOutput := TStringStream.Create('', TEncoding.ASCII);
310 | try
311 | LEncoding := TBase64Encoding.Create(0);
312 | try
313 | LEncoding.Encode(LInput, LOutput);
314 | Result := LOutput.DataString;
315 | finally
316 | LEncoding.Free;
317 | end;
318 | finally
319 | LOutput.Free;
320 | end;
321 | finally
322 | LInput.Free;
323 | end;
324 | end;
325 |
326 | function TCaptcha.ToBitmap: Vcl.Graphics.TBitmap;
327 | var
328 | LBitmap: Vcl.Graphics.TBitmap;
329 | LStream: TMemoryStream;
330 | begin
331 | try
332 | LBitmap := Vcl.Graphics.TBitmap.Create;
333 | LStream := Self.ToStream;
334 | LBitmap.LoadFromStream(LStream);
335 | Result := LBitmap;
336 | finally
337 | LStream.Free;
338 | end;
339 |
340 | end;
341 |
342 | function TCaptcha.ToJPEG: TJPEGimage;
343 | var
344 | LStream: TMemoryStream;
345 | LBitmap: Vcl.Graphics.TBitmap;
346 | begin
347 | LBitmap := Self.ToBitmap;
348 | try
349 | Result := TJPEGimage.Create;
350 | Result.Assign(LBitmap);
351 | finally
352 | LBitmap.Free;
353 | end;
354 | end;
355 |
356 | function TCaptcha.ToStream: TMemoryStream;
357 | begin
358 | Result := TMemoryStream.Create;
359 | Result.LoadFromStream(FImageStream);
360 | Result.Position := 0;
361 | end;
362 |
363 | function TCaptcha.LetterUpperCase: ICaptcha;
364 | begin
365 | Result := Self;
366 | FLetterCase := lcUppercase;
367 | end;
368 |
369 | function TCaptcha.Validate(const AText: string): boolean;
370 | begin
371 | Result := (AText.Trim = FCaptchaText);
372 | end;
373 |
374 | { ECaptchaBuildError }
375 |
376 | constructor ECaptchaBuildError.Create(const Msg: string);
377 | begin
378 | Inherited Create(Msg);
379 | end;
380 |
381 | end.
382 |
--------------------------------------------------------------------------------
/src/Captcha.Intf.pas:
--------------------------------------------------------------------------------
1 | unit Captcha.Intf;
2 |
3 | interface
4 |
5 | uses Captcha.Contract, Captcha.Impl;
6 |
7 | type
8 |
9 | ICaptcha = Captcha.Contract.ICaptcha;
10 |
11 | TCaptchaUtils = class
12 | public
13 | class function New: ICaptcha;
14 | end;
15 |
16 | implementation
17 |
18 | { TCaptcha }
19 |
20 | class function TCaptchaUtils.New: ICaptcha;
21 | begin
22 | Result := TCaptcha.Create;
23 | end;
24 |
25 | end.
26 |
--------------------------------------------------------------------------------