├── .gitattributes
├── .gitignore
├── README.md
├── delphispacecomputer.dpr
├── delphispacecomputer.dproj
├── delphispacecomputer.res
├── fonts
├── Font License.txt
├── Horta demo.otf
├── Klingon-pIqaD-HaSta.ttf
├── LCARS.ttf
└── pIqaD-HaSta-licence.txt
├── forms.maincomputergui.dfm
├── forms.maincomputergui.pas
├── graphics
├── 27356-earth-animation.json
├── Emblem.ico
├── Emblem.svg
├── delphi_con_barker_demo.gif
├── lcars_heartbeat.json
├── lf20_xGeRTh.json
└── scanner_red.json
├── links_used_in_demo.txt
├── slides
└── DelphiCon 2021 Ian Barker.pptx
└── sounds
├── alert08.mp3
├── alert09.mp3
├── communications_end_transmission.mp3
├── computer_work_beep.mp3
├── computerbeep_74.mp3
├── consolewarning.mp3
└── engage.mp3
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Uncomment these types if you want even more clean repository. But be careful.
2 | # It can make harm to an existing project source. Read explanations below.
3 | #
4 | # Resource files are binaries containing manifest, project icon and version info.
5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files.
6 | #*.res
7 | #
8 | # Type library file (binary). In old Delphi versions it should be stored.
9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored.
10 | #*.tlb
11 | #
12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7.
13 | # Uncomment this if you are not using diagrams or use newer Delphi version.
14 | #*.ddp
15 | #
16 | # Visual LiveBindings file. Added in Delphi XE2.
17 | # Uncomment this if you are not using LiveBindings Designer.
18 | #*.vlb
19 | #
20 | # Deployment Manager configuration file for your project. Added in Delphi XE2.
21 | # Uncomment this if it is not mobile development and you do not use remote debug feature.
22 | #*.deployproj
23 | #
24 | # C++ object files produced when C/C++ Output file generation is configured.
25 | # Uncomment this if you are not using external objects (zlib library for example).
26 | #*.obj
27 | #
28 |
29 | # Delphi compiler-generated binaries (safe to delete)
30 | *.exe
31 | *.dll
32 | *.bpl
33 | *.bpi
34 | *.dcp
35 | *.so
36 | *.apk
37 | *.drc
38 | *.map
39 | *.dres
40 | *.rsm
41 | *.tds
42 | *.dcu
43 | *.lib
44 | *.a
45 | *.o
46 | *.ocx
47 |
48 | # Delphi autogenerated files (duplicated info)
49 | *.cfg
50 | *.hpp
51 | *Resource.rc
52 |
53 | # Delphi local files (user-specific info)
54 | *.local
55 | *.identcache
56 | *.projdata
57 | *.tvsconfig
58 | *.dsk
59 |
60 | # Delphi history and backups
61 | __history/
62 | __recovery/
63 | *.~*
64 |
65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi)
66 | *.stat
67 |
68 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss
69 | modules/
70 | slides/~$DelphiCon 2021 Ian Barker.pptx
71 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # A 'starship computer console from the future' - example of using Skia4Delphi
2 |
3 | Original code: **Ian Barker**
4 |
5 | [https://github.com/checkdigits](https://github.com/checkdigits)
6 |
7 | [https://about.me/IanBarker](https://about.me/IanBarker)
8 |
9 | 
10 |
11 | __Needs__ Skia4Delphi installed [https://github.com/viniciusfbb/skia4delphi](https://github.com/viniciusfbb/skia4delphi)
12 |
13 | Project originally written with [Delphi 11.](https://www.embarcadero.com/products/delphi)
14 |
15 | To accompany Ian's session at DelphiCon 2021 - [https://delphicon.embarcadero.com](https://delphicon.embarcadero.com)
16 |
17 | Updated to work with version 3.0 and above.
18 | Note that this is a VCL project and therefore the animations can't be transparent which was a change in v3 of Skia4Delphi.
19 |
20 |
21 |
--------------------------------------------------------------------------------
/delphispacecomputer.dpr:
--------------------------------------------------------------------------------
1 | program delphispacecomputer;
2 |
3 | uses
4 | Vcl.Forms,
5 | forms.maincomputergui in 'forms.maincomputergui.pas' {MainComputerGUI};
6 |
7 | {$R *.res}
8 |
9 | begin
10 | Application.Initialize;
11 | Application.MainFormOnTaskbar := True;
12 | Application.CreateForm(TMainComputerGUI, MainComputerGUI);
13 | Application.Run;
14 | end.
15 |
--------------------------------------------------------------------------------
/delphispacecomputer.dproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | {33C6A244-27E2-4FC1-B1E0-294BD6055E64}
4 | 19.5
5 | VCL
6 | True
7 | Debug
8 | Win32
9 | 1
10 | Application
11 | delphispacecomputer.dpr
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 | Base
29 | true
30 |
31 |
32 | true
33 | Cfg_1
34 | true
35 | true
36 |
37 |
38 | true
39 | Base
40 | true
41 |
42 |
43 | true
44 | Cfg_2
45 | true
46 | true
47 |
48 |
49 | .\$(Platform)\$(Config)
50 | .\$(Platform)\$(Config)
51 | false
52 | false
53 | false
54 | false
55 | false
56 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)
57 | $(BDS)\bin\delphi_PROJECTICON.ico
58 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
59 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
60 | delphispacecomputer
61 | SKIA;$(DCC_Define)
62 | true
63 | 3
64 | 1033
65 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=3.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=3.0;Comments=Written by Ian Barker.
66 |
67 |
68 | RaizeComponentsVcl;vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RaizeComponentsVclDb;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)
69 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
70 | Debug
71 | true
72 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=Written by Ian Barker.
73 | 1033
74 | $(BDS)\bin\default_app.manifest
75 | graphics\Emblem.ico
76 |
77 |
78 | RaizeComponentsVcl;vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RaizeComponentsVclDb;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)
79 |
80 |
81 | DEBUG;$(DCC_Define)
82 | true
83 | false
84 | true
85 | true
86 | true
87 | true
88 | true
89 |
90 |
91 | false
92 | true
93 | PerMonitorV2
94 | true
95 | 1033
96 | graphics\Emblem.ico
97 | 3
98 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=3.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=Written by Ian Barker.
99 |
100 |
101 | false
102 | RELEASE;$(DCC_Define)
103 | 0
104 | 0
105 |
106 |
107 | true
108 | PerMonitorV2
109 |
110 |
111 |
112 | MainSource
113 |
114 |
115 |
116 | dfm
117 |
118 |
119 | Base
120 |
121 |
122 | Cfg_1
123 | Base
124 |
125 |
126 | Cfg_2
127 | Base
128 |
129 |
130 |
131 | Delphi.Personality.12
132 | Application
133 |
134 |
135 |
136 | delphispacecomputer.dpr
137 |
138 |
139 | Embarcadero C++Builder Office 2000 Servers Package
140 | Embarcadero C++Builder Office XP Servers Package
141 | Microsoft Office 2000 Sample Automation Server Wrapper Components
142 | Microsoft Office XP Sample Automation Server Wrapper Components
143 |
144 |
145 |
146 |
147 |
148 | .\
149 | 0
150 | sk4d.dll
151 | true
152 |
153 |
154 |
155 |
156 | .\
157 | 0
158 | sk4d.dll
159 | true
160 |
161 |
162 |
163 |
164 | .\
165 | 0
166 | sk4d.dll
167 | true
168 |
169 |
170 |
171 |
172 | .\
173 | 0
174 | sk4d.dll
175 | true
176 |
177 |
178 |
179 |
180 | .\
181 | 0
182 | sk4d.dll
183 | true
184 |
185 |
186 |
187 |
188 | .\
189 | 0
190 | sk4d.dll
191 | true
192 |
193 |
194 |
195 |
196 | .\
197 | 0
198 | sk4d.dll
199 | true
200 |
201 |
202 |
203 |
204 | .\
205 | 0
206 | sk4d.dll
207 | true
208 |
209 |
210 |
211 |
212 |
213 | 1
214 |
215 |
216 | Contents\MacOS
217 | 1
218 |
219 |
220 | 0
221 |
222 |
223 |
224 |
225 | classes
226 | 64
227 |
228 |
229 | classes
230 | 64
231 |
232 |
233 |
234 |
235 | res\xml
236 | 1
237 |
238 |
239 | res\xml
240 | 1
241 |
242 |
243 |
244 |
245 | library\lib\armeabi-v7a
246 | 1
247 |
248 |
249 |
250 |
251 | library\lib\armeabi
252 | 1
253 |
254 |
255 | library\lib\armeabi
256 | 1
257 |
258 |
259 |
260 |
261 | library\lib\armeabi-v7a
262 | 1
263 |
264 |
265 |
266 |
267 | library\lib\mips
268 | 1
269 |
270 |
271 | library\lib\mips
272 | 1
273 |
274 |
275 |
276 |
277 | library\lib\armeabi-v7a
278 | 1
279 |
280 |
281 | library\lib\arm64-v8a
282 | 1
283 |
284 |
285 |
286 |
287 | library\lib\armeabi-v7a
288 | 1
289 |
290 |
291 |
292 |
293 | res\drawable
294 | 1
295 |
296 |
297 | res\drawable
298 | 1
299 |
300 |
301 |
302 |
303 | res\values
304 | 1
305 |
306 |
307 | res\values
308 | 1
309 |
310 |
311 |
312 |
313 | res\values-v21
314 | 1
315 |
316 |
317 | res\values-v21
318 | 1
319 |
320 |
321 |
322 |
323 | res\values
324 | 1
325 |
326 |
327 | res\values
328 | 1
329 |
330 |
331 |
332 |
333 | res\drawable
334 | 1
335 |
336 |
337 | res\drawable
338 | 1
339 |
340 |
341 |
342 |
343 | res\drawable-xxhdpi
344 | 1
345 |
346 |
347 | res\drawable-xxhdpi
348 | 1
349 |
350 |
351 |
352 |
353 | res\drawable-xxxhdpi
354 | 1
355 |
356 |
357 | res\drawable-xxxhdpi
358 | 1
359 |
360 |
361 |
362 |
363 | res\drawable-ldpi
364 | 1
365 |
366 |
367 | res\drawable-ldpi
368 | 1
369 |
370 |
371 |
372 |
373 | res\drawable-mdpi
374 | 1
375 |
376 |
377 | res\drawable-mdpi
378 | 1
379 |
380 |
381 |
382 |
383 | res\drawable-hdpi
384 | 1
385 |
386 |
387 | res\drawable-hdpi
388 | 1
389 |
390 |
391 |
392 |
393 | res\drawable-xhdpi
394 | 1
395 |
396 |
397 | res\drawable-xhdpi
398 | 1
399 |
400 |
401 |
402 |
403 | res\drawable-mdpi
404 | 1
405 |
406 |
407 | res\drawable-mdpi
408 | 1
409 |
410 |
411 |
412 |
413 | res\drawable-hdpi
414 | 1
415 |
416 |
417 | res\drawable-hdpi
418 | 1
419 |
420 |
421 |
422 |
423 | res\drawable-xhdpi
424 | 1
425 |
426 |
427 | res\drawable-xhdpi
428 | 1
429 |
430 |
431 |
432 |
433 | res\drawable-xxhdpi
434 | 1
435 |
436 |
437 | res\drawable-xxhdpi
438 | 1
439 |
440 |
441 |
442 |
443 | res\drawable-xxxhdpi
444 | 1
445 |
446 |
447 | res\drawable-xxxhdpi
448 | 1
449 |
450 |
451 |
452 |
453 | res\drawable-small
454 | 1
455 |
456 |
457 | res\drawable-small
458 | 1
459 |
460 |
461 |
462 |
463 | res\drawable-normal
464 | 1
465 |
466 |
467 | res\drawable-normal
468 | 1
469 |
470 |
471 |
472 |
473 | res\drawable-large
474 | 1
475 |
476 |
477 | res\drawable-large
478 | 1
479 |
480 |
481 |
482 |
483 | res\drawable-xlarge
484 | 1
485 |
486 |
487 | res\drawable-xlarge
488 | 1
489 |
490 |
491 |
492 |
493 | res\values
494 | 1
495 |
496 |
497 | res\values
498 | 1
499 |
500 |
501 |
502 |
503 | 1
504 |
505 |
506 | Contents\MacOS
507 | 1
508 |
509 |
510 | 0
511 |
512 |
513 |
514 |
515 | Contents\MacOS
516 | 1
517 | .framework
518 |
519 |
520 | Contents\MacOS
521 | 1
522 | .framework
523 |
524 |
525 | Contents\MacOS
526 | 1
527 | .framework
528 |
529 |
530 | 0
531 |
532 |
533 |
534 |
535 | 1
536 | .dylib
537 |
538 |
539 | 1
540 | .dylib
541 |
542 |
543 | 1
544 | .dylib
545 |
546 |
547 | Contents\MacOS
548 | 1
549 | .dylib
550 |
551 |
552 | Contents\MacOS
553 | 1
554 | .dylib
555 |
556 |
557 | Contents\MacOS
558 | 1
559 | .dylib
560 |
561 |
562 | 0
563 | .dll;.bpl
564 |
565 |
566 |
567 |
568 | 1
569 | .dylib
570 |
571 |
572 | 1
573 | .dylib
574 |
575 |
576 | 1
577 | .dylib
578 |
579 |
580 | Contents\MacOS
581 | 1
582 | .dylib
583 |
584 |
585 | Contents\MacOS
586 | 1
587 | .dylib
588 |
589 |
590 | Contents\MacOS
591 | 1
592 | .dylib
593 |
594 |
595 | 0
596 | .bpl
597 |
598 |
599 |
600 |
601 | 0
602 |
603 |
604 | 0
605 |
606 |
607 | 0
608 |
609 |
610 | 0
611 |
612 |
613 | 0
614 |
615 |
616 | Contents\Resources\StartUp\
617 | 0
618 |
619 |
620 | Contents\Resources\StartUp\
621 | 0
622 |
623 |
624 | Contents\Resources\StartUp\
625 | 0
626 |
627 |
628 | 0
629 |
630 |
631 |
632 |
633 | 1
634 |
635 |
636 | 1
637 |
638 |
639 |
640 |
641 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
642 | 1
643 |
644 |
645 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
646 | 1
647 |
648 |
649 |
650 |
651 | ..\
652 | 1
653 |
654 |
655 | ..\
656 | 1
657 |
658 |
659 | ..\
660 | 1
661 |
662 |
663 |
664 |
665 | Contents
666 | 1
667 |
668 |
669 | Contents
670 | 1
671 |
672 |
673 | Contents
674 | 1
675 |
676 |
677 |
678 |
679 | Contents\Resources
680 | 1
681 |
682 |
683 | Contents\Resources
684 | 1
685 |
686 |
687 | Contents\Resources
688 | 1
689 |
690 |
691 |
692 |
693 | library\lib\armeabi-v7a
694 | 1
695 |
696 |
697 | library\lib\arm64-v8a
698 | 1
699 |
700 |
701 | 1
702 |
703 |
704 | 1
705 |
706 |
707 | 1
708 |
709 |
710 | 1
711 |
712 |
713 | Contents\MacOS
714 | 1
715 |
716 |
717 | Contents\MacOS
718 | 1
719 |
720 |
721 | Contents\MacOS
722 | 1
723 |
724 |
725 | 0
726 |
727 |
728 |
729 |
730 | library\lib\armeabi-v7a
731 | 1
732 |
733 |
734 |
735 |
736 | 1
737 |
738 |
739 | 1
740 |
741 |
742 |
743 |
744 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
745 | 1
746 |
747 |
748 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
749 | 1
750 |
751 |
752 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
753 | 1
754 |
755 |
756 |
757 |
758 | ..\
759 | 1
760 |
761 |
762 | ..\
763 | 1
764 |
765 |
766 | ..\
767 | 1
768 |
769 |
770 |
771 |
772 | 1
773 |
774 |
775 | 1
776 |
777 |
778 | 1
779 |
780 |
781 |
782 |
783 | ..\$(PROJECTNAME).launchscreen
784 | 64
785 |
786 |
787 | ..\$(PROJECTNAME).launchscreen
788 | 64
789 |
790 |
791 |
792 |
793 | 1
794 |
795 |
796 | 1
797 |
798 |
799 | 1
800 |
801 |
802 |
803 |
804 | Assets
805 | 1
806 |
807 |
808 | Assets
809 | 1
810 |
811 |
812 |
813 |
814 | Assets
815 | 1
816 |
817 |
818 | Assets
819 | 1
820 |
821 |
822 |
823 |
824 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
825 | 1
826 |
827 |
828 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
829 | 1
830 |
831 |
832 |
833 |
834 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
835 | 1
836 |
837 |
838 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
839 | 1
840 |
841 |
842 |
843 |
844 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
845 | 1
846 |
847 |
848 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
849 | 1
850 |
851 |
852 |
853 |
854 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
855 | 1
856 |
857 |
858 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
859 | 1
860 |
861 |
862 |
863 |
864 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
865 | 1
866 |
867 |
868 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
869 | 1
870 |
871 |
872 |
873 |
874 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
875 | 1
876 |
877 |
878 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
879 | 1
880 |
881 |
882 |
883 |
884 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
885 | 1
886 |
887 |
888 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
889 | 1
890 |
891 |
892 |
893 |
894 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
895 | 1
896 |
897 |
898 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
899 | 1
900 |
901 |
902 |
903 |
904 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
905 | 1
906 |
907 |
908 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
909 | 1
910 |
911 |
912 |
913 |
914 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
915 | 1
916 |
917 |
918 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
919 | 1
920 |
921 |
922 |
923 |
924 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
925 | 1
926 |
927 |
928 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
929 | 1
930 |
931 |
932 |
933 |
934 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
935 | 1
936 |
937 |
938 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
939 | 1
940 |
941 |
942 |
943 |
944 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
945 | 1
946 |
947 |
948 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
949 | 1
950 |
951 |
952 |
953 |
954 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
955 | 1
956 |
957 |
958 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
959 | 1
960 |
961 |
962 |
963 |
964 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
965 | 1
966 |
967 |
968 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
969 | 1
970 |
971 |
972 |
973 |
974 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
975 | 1
976 |
977 |
978 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
979 | 1
980 |
981 |
982 |
983 |
984 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
985 | 1
986 |
987 |
988 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
989 | 1
990 |
991 |
992 |
993 |
994 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
995 | 1
996 |
997 |
998 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
999 | 1
1000 |
1001 |
1002 |
1003 |
1004 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1005 | 1
1006 |
1007 |
1008 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1009 | 1
1010 |
1011 |
1012 |
1013 |
1014 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1015 | 1
1016 |
1017 |
1018 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
1019 | 1
1020 |
1021 |
1022 |
1023 |
1024 |
1025 |
1026 |
1027 |
1028 |
1029 |
1030 |
1031 |
1032 |
1033 |
1034 |
1035 |
1036 | True
1037 | False
1038 |
1039 |
1040 | 12
1041 |
1042 |
1043 |
1044 |
1045 |
1046 |
--------------------------------------------------------------------------------
/delphispacecomputer.res:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/delphispacecomputer.res
--------------------------------------------------------------------------------
/fonts/Font License.txt:
--------------------------------------------------------------------------------
1 | Shareware/ Font License
2 |
3 | Pixel Sagas Freeware Fonts EULA (End User License Agreement) and Software Inclusion Agreement
4 |
5 | "Purchaser" and "User" may be used interchangeably in this agreement.
6 |
7 | "Pixel Sagas" and "Neale Davidson" may be used interchangeably in this agreement. These all refer to the intellectual and legal property of Neale Davidson.
8 |
9 | Usage
10 |
11 | Pixel Saga's Shareware Fonts are free to use for personal, non-commercial purposes. No payment is necessary to use Pixel Saga's Freeware Fonts for personal use, and there is no limit to the amount of prints, pages, or other medium to be produced using them. However, you cannot offer the font for commercial sale, or offer for direct download. The inclusion of the font name and/or site URL in the credits or documentation when it is used is appreciated, but this is not mandatory.
12 |
13 | Payment
14 |
15 | Payment is not required for the use of Pixel Saga's Shareware Fonts. Commercial use requires a modest fee which can be paid through the pixelsagas.com web site through Paypal.com's services. The transaction receipt for any shareware "commercial license" purchase will suffice as proof of license.
16 |
17 | Support
18 |
19 | Font installation help is available at http://www.pixelsagas.com. If you experience problems with any Pixel Saga's Freeware font (such as spacing issues or missing characters), please verify that you have the correct and current version of the fonts. In the case of Freeware fonts, downloading the font directly from the Pixel Sagas site will ensure that the font files have not been altered.
20 |
21 | Software Inclusion Agreement
22 |
23 | Pixel Saga's software products are protected by copyright laws and International copyright treaties, as well as other intellectual property laws and treaties. All Pixel Saga's software products are licensed, not sold.
24 |
25 | 1) GRANT OF LICENSE
26 |
27 | This document grants the user the following rights:
28 |
29 | Installation and Use. The user may install and use an unlimited number of copies of the software product. The user may not offer Pixel Sagas freeware fonts for direct download unless the user has received explicit, written permission from Neale Davidson. Otherwise please direct users to the http://www.pixelsagas.com website. Pixel Sagas freeware fonts may, however, be embedded for web, publication, or general software use.
30 |
31 | 2) WARRANTIES
32 |
33 | None
34 |
35 | Pixel Sagas expressly disclaims any warranty for the software product. The software product and any related documentation is provided "as is" without warranty of any kind, either express or implied, including, without limitation, the implied warranties or merchantability, fitness for a particular purpose, or non-infringement. The entire risk arising out of use or performance of the software product remains with the user.
36 |
37 | No Liability For Consequential Damages.
38 |
39 | In no event shall Neale Davidson or Pixel Sagas be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use this product, even if Pixel Sagas has been advised of the possibility of such damages.
40 |
41 | 3) MISCELLANEOUS
42 |
43 | Should the user have any questions concerning this document or you desire to contact Neale Davidson for any reason, please email jaynz@pixelsagas.com .
44 |
45 | Governing Law
46 |
47 | This agreement is governed by and subject to the laws of the United States of America.
48 |
--------------------------------------------------------------------------------
/fonts/Horta demo.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/fonts/Horta demo.otf
--------------------------------------------------------------------------------
/fonts/Klingon-pIqaD-HaSta.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/fonts/Klingon-pIqaD-HaSta.ttf
--------------------------------------------------------------------------------
/fonts/LCARS.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/fonts/LCARS.ttf
--------------------------------------------------------------------------------
/fonts/pIqaD-HaSta-licence.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2005-07-17, Mike Neff (qa'vaj) (darqang99@gmail.com),
2 | with Reserved Font Name pIqaD HaSta.
3 | Copyright (c) 2009-07-01, Michael Everson (evertype.com),
4 | with Reserved Font Name Klingon pIqaD HaSta.
5 |
6 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
7 | This license is copied below, and is also available with a FAQ at:
8 | http://scripts.sil.org/OFL
9 |
10 |
11 | -----------------------------------------------------------
12 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
13 | -----------------------------------------------------------
14 |
15 | PREAMBLE
16 | The goals of the Open Font License (OFL) are to stimulate worldwide
17 | development of collaborative font projects, to support the font creation
18 | efforts of academic and linguistic communities, and to provide a free and
19 | open framework in which fonts may be shared and improved in partnership
20 | with others.
21 |
22 | The OFL allows the licensed fonts to be used, studied, modified and
23 | redistributed freely as long as they are not sold by themselves. The
24 | fonts, including any derivative works, can be bundled, embedded,
25 | redistributed and/or sold with any software provided that any reserved
26 | names are not used by derivative works. The fonts and derivatives,
27 | however, cannot be released under any other type of license. The
28 | requirement for fonts to remain under this license does not apply
29 | to any document created using the fonts or their derivatives.
30 |
31 | DEFINITIONS
32 | "Font Software" refers to the set of files released by the Copyright
33 | Holder(s) under this license and clearly marked as such. This may
34 | include source files, build scripts and documentation.
35 |
36 | "Reserved Font Name" refers to any names specified as such after the
37 | copyright statement(s).
38 |
39 | "Original Version" refers to the collection of Font Software components as
40 | distributed by the Copyright Holder(s).
41 |
42 | "Modified Version" refers to any derivative made by adding to, deleting,
43 | or substituting -- in part or in whole -- any of the components of the
44 | Original Version, by changing formats or by porting the Font Software to a
45 | new environment.
46 |
47 | "Author" refers to any designer, engineer, programmer, technical
48 | writer or other person who contributed to the Font Software.
49 |
50 | PERMISSION & CONDITIONS
51 | Permission is hereby granted, free of charge, to any person obtaining
52 | a copy of the Font Software, to use, study, copy, merge, embed, modify,
53 | redistribute, and sell modified and unmodified copies of the Font
54 | Software, subject to the following conditions:
55 |
56 | 1) Neither the Font Software nor any of its individual components,
57 | in Original or Modified Versions, may be sold by itself.
58 |
59 | 2) Original or Modified Versions of the Font Software may be bundled,
60 | redistributed and/or sold with any software, provided that each copy
61 | contains the above copyright notice and this license. These can be
62 | included either as stand-alone text files, human-readable headers or
63 | in the appropriate machine-readable metadata fields within text or
64 | binary files as long as those fields can be easily viewed by the user.
65 |
66 | 3) No Modified Version of the Font Software may use the Reserved Font
67 | Name(s) unless explicit written permission is granted by the corresponding
68 | Copyright Holder. This restriction only applies to the primary font name as
69 | presented to the users.
70 |
71 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
72 | Software shall not be used to promote, endorse or advertise any
73 | Modified Version, except to acknowledge the contribution(s) of the
74 | Copyright Holder(s) and the Author(s) or with their explicit written
75 | permission.
76 |
77 | 5) The Font Software, modified or unmodified, in part or in whole,
78 | must be distributed entirely under this license, and must not be
79 | distributed under any other license. The requirement for fonts to
80 | remain under this license does not apply to any document created
81 | using the Font Software.
82 |
83 | TERMINATION
84 | This license becomes null and void if any of the above conditions are
85 | not met.
86 |
87 | DISCLAIMER
88 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
89 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
90 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
91 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
92 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
93 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
94 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
95 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
96 | OTHER DEALINGS IN THE FONT SOFTWARE.
97 |
--------------------------------------------------------------------------------
/forms.maincomputergui.pas:
--------------------------------------------------------------------------------
1 | unit forms.maincomputergui;
2 |
3 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 | // The following compiler define controls whether or not this demo uses AWS
5 | // Polly to generate text to speech using AI
6 | //
7 | // If you do NOT have an AWS account then disable the define like so: {.$DEFINE USESPEECH}
8 | // If you DO have an AWS account then ENABLE the define like so: {$DEFINE USESPEECH}
9 | //
10 | // If you DO have an AWS account set up then you will need to install the AWS
11 | // components from Appercept which can be found here: https://getitnow.embarcadero.com/?q=Appercept
12 | // or here https://www.appercept.com/appercept-aws-sdk-for-delphi
13 | //
14 | // ** AND ** you also need to have a file in your user folder like so:
15 | //
16 | // C:\Users\**YOUR USER NAME**\.aws\credentials
17 | //
18 | // The file needs to contain the following entries:
19 | //
20 | // [default]
21 | // aws_access_key_id=** YOUR AWS ACCESS KEY NAME **
22 | // aws_secret_access_key=** YOUR AWS API/SDK SECRET **
23 | //
24 | //
25 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26 |
27 | {.$DEFINE USESPEECH}
28 |
29 | interface
30 |
31 | uses
32 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
33 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Skia.Vcl, Vcl.ExtCtrls, Vcl.StdCtrls,
34 | Vcl.MPlayer, Skia
35 | {$IFDEF USESPEECH}, AWS.Polly{$ENDIF}
36 | ;
37 |
38 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
40 | // %%%%
41 | // %%%% Original Author:
42 | // %%%% Ian Barker.
43 | // %%%% https://about.me/IanBarker
44 | // %%%% https://github.com/checkdigits
45 | // %%%%
46 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 | // %%%% Example of how to use SkiaForDelphi to do some cool things.
49 | // %%%%
50 | // %%%% Based on the Skia4Delphi VCL example here:
51 | // %%%% https://github.com/viniciusfbb/skia4delphi/tree/main/Samples/Basic/VCL
52 | // %%%%
53 | // %%%% Animations from
54 | // %%%% https://lottiefiles.com
55 | // %%%% Sounds from
56 | // %%%% https://www.trekcore.com/audio/
57 | // %%%% Fonts from
58 | // %%%% Main "Trek type" font https://fontlibrary.org/en/font/horta
59 | // %%%% Klingon font https://www.evertype.com/fonts/tlh/
60 | // %%%% license https://www.evertype.com/fonts/tlh/klingon-piqad-hasta-licence.html
61 | // %%%%
62 | // %%%% 'Federation' Logo from: https://kopi-svg.blogspot.com/2016/04/33-star-trek-svg-free-images.html?m=1
63 | // %%%%
64 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67 |
68 | type Beeps = (BeepRedAlert, BeepBlaaaa, BeepBeeBop, BeepIncoming, BeepComputerWork, BeepConsoleWarning, BeepEngage);
69 |
70 |
71 | type
72 | TMainComputerGUI = class(TForm)
73 | PlanetAnim: TSkAnimatedImage;
74 | CountdownAnim: TSkAnimatedImage;
75 | WireframeGlobeAnim: TSkAnimatedImage;
76 | WarpVectorAnim: TSkAnimatedImage;
77 | RadarSweepAnim: TSkAnimatedImage;
78 | HeartbeatAnim: TSkAnimatedImage;
79 | ScanningAnim: TSkAnimatedImage;
80 | FederationLogo: TSkSvg;
81 | Shape1: TShape;
82 | Shape2: TShape;
83 | Shape3: TShape;
84 | Shape4: TShape;
85 | Shape5: TShape;
86 | Shape6: TShape;
87 | Shape7: TShape;
88 | Shape8: TShape;
89 | Shape9: TShape;
90 | Shape10: TShape;
91 | Shape11: TShape;
92 | Shape12: TShape;
93 | Shape13: TShape;
94 | Shape14: TShape;
95 | Shape15: TShape;
96 | Shape16: TShape;
97 | Shape17: TShape;
98 | Shape18: TShape;
99 | Shape19: TShape;
100 | Shape20: TShape;
101 | Shape21: TShape;
102 | Shape22: TShape;
103 | Shape23: TShape;
104 | Shape24: TShape;
105 | Shape25: TShape;
106 | Label1: TLabel;
107 | Label2: TLabel;
108 | Label3: TLabel;
109 | Label4: TLabel;
110 | Label5: TLabel;
111 | AlertLabel: TLabel;
112 | Image1: TImage;
113 | Timer1: TTimer;
114 | MediaPlayer1: TMediaPlayer;
115 | MediaPlayer2: TMediaPlayer;
116 | procedure FormActivate(Sender: TObject);
117 | procedure FormCreate(Sender: TObject);
118 | procedure Timer1Timer(Sender: TObject);
119 | procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
120 | procedure Shape19MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
121 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
122 | procedure FederationLogoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
123 | procedure Shape25MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
124 | private
125 | HasNotPlayedRedAlert, PlaySounds: Boolean;
126 | {$IFDEF USESPEECH}
127 | SpeechClient: IPollyClient;
128 | SpeechCount: integer;
129 | Speaking: boolean;
130 | UseFemaleVoice: boolean;
131 | {$ENDIF}
132 | procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest;
133 | procedure DoSpaceText;
134 | function RandomLineOfNumbers: string;
135 | function RandomLineOfText: string;
136 | function RandomKlingonString(const DesiredLength: integer): string;
137 | procedure PlaySound(const WhichSound: Beeps);
138 | {$IFDEF USESPEECH}
139 | procedure Speak(const TheText: string);
140 | procedure CleanupSpeechFiles;
141 | {$ENDIF}
142 | end;
143 |
144 | var
145 | MainComputerGUI: TMainComputerGUI;
146 |
147 | implementation
148 | uses
149 | System.Types,
150 | System.UITypes,
151 | {$IFDEF USESPEECH}System.IOUtils,{$ENDIF}
152 | System.Math;
153 |
154 | {$R *.dfm}
155 |
156 | {$IFDEF USESPEECH}
157 | const ComputerSpeech: array[0..4] of string = (
158 | 'All shipwide systems are operating within normal parameters.',
159 | 'The starboard niscelles require plasma venting',
160 | 'Ensign McKeeth is not currently on board the ship',
161 | 'There is an incoming message from a planet situated three light years from our current location.',
162 | 'Captain, the ships doctor is attempting to bypass the security lock outs'
163 | );
164 |
165 | const cSpeechFileTemplate ='PollySpeak%s.mp3';
166 | {$ENDIF}
167 |
168 | procedure TMainComputerGUI.FederationLogoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
169 | begin
170 | Close;
171 | end;
172 |
173 | procedure TMainComputerGUI.FormActivate(Sender: TObject);
174 | begin
175 | if Tag = 0 then
176 | begin
177 | Tag := 1;
178 | DoSpaceText;
179 | Timer1.Enabled := True;
180 | PlaySound(BeepEngage);
181 | end;
182 | end;
183 |
184 | procedure TMainComputerGUI.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
185 | begin
186 | {$IFDEF USESPEECH}CleanupSpeechFiles;{$ENDIF}
187 | end;
188 |
189 | procedure TMainComputerGUI.FormCreate(Sender: TObject);
190 | begin
191 | HasNotPlayedRedAlert := True;
192 | PlaySounds := True;
193 | {$IFDEF USESPEECH}
194 | SpeechClient := TPollyClient.Create;
195 | SpeechCount := 0;
196 | Speaking := False;
197 | UseFemaleVoice := True;
198 | {$ENDIF}
199 | end;
200 |
201 | procedure TMainComputerGUI.PlaySound(const WhichSound: Beeps);
202 |
203 | const
204 | cSounds: array[BeepRedAlert..BeepEngage] of string = (
205 | 'alert09.mp3',
206 | 'alert08.mp3',
207 | 'communications_end_transmission.mp3',
208 | 'computerbeep_74.mp3',
209 | 'computer_work_beep.mp3',
210 | 'consolewarning.mp3',
211 | 'engage.mp3'
212 | );
213 | begin
214 | // We use the TMediaPlayer to play the sounds rather than sndPlaySound
215 | // just because MP3s are more likely to work that way and we don't need
216 | // asynchronous playback.
217 |
218 | // Only play the (very jarring) red alert sound once.
219 | if WhichSound = BeepRedAlert then HasNotPlayedRedAlert := False;
220 |
221 | // Clicking on the bottom left LCARS area toggles the sound off or on
222 | if PlaySounds then
223 | begin
224 | MediaPlayer1.Close;
225 | MediaPlayer1.FileName := '..\..\sounds\' + cSounds[WhichSound];
226 | MediaPlayer1.Open;
227 | MediaPlayer1.Play;
228 | end;
229 | end;
230 |
231 | function TMainComputerGUI.RandomKlingonString(const DesiredLength: integer): string;
232 | var
233 | Klingon: char;
234 | begin
235 | Result := '';
236 | for var count := 1 to DesiredLength do
237 | begin
238 | if Random(5) mod 5 = 0 then
239 | Result := Concat(Result, ' ')
240 | else
241 | begin
242 | Klingon := Char($F8D0 + Random(25));
243 | Result := Result + Klingon;
244 | end;
245 | end;
246 | end;
247 |
248 | function TMainComputerGUI.RandomLineOfNumbers: string;
249 | var
250 | iWidth: integer;
251 | iSpaces: integer;
252 | iIndex: integer;
253 |
254 | const
255 | cSpaces: array[0..5] of integer = (4, 6, 4, 8, 4, 4);
256 |
257 | begin
258 | Result := '';
259 | for var iLoop := 0 to 10 do
260 | begin
261 | iSpaces := cSpaces[iLoop mod 6];
262 | Result := Result + Format('%.4f%s', [Random, StringOfChar(' ', iSpaces)]);
263 | end;
264 | end;
265 |
266 | function TMainComputerGUI.RandomLineOfText: string;
267 |
268 | const
269 | cChanceOfSpaces = 4;
270 | cChanceOfNumbers = 3;
271 | cMaxLengthOfLine = 95;
272 | begin
273 | Result := '';
274 | for var iLoop := 0 to cMaxLengthOfLine do
275 | if Random(cChanceOfSpaces) mod cChanceOfSpaces = 0 then
276 | Result := Concat(Result, ' ')
277 | else
278 | if Random(cChanceOfNumbers) mod cChanceOfNumbers = 0 then
279 | Result := Concat(Result, Chr(48 + Random(10)))
280 | else
281 | Result := Concat(Result, Chr(65 + Random(25)));
282 | end;
283 |
284 | procedure TMainComputerGUI.Shape19MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
285 | begin
286 | {$IFDEF USESPEECH}Speak(ComputerSpeech[Random(High(ComputerSpeech))]);{$ENDIF}
287 | end;
288 |
289 | procedure TMainComputerGUI.Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
290 | begin
291 | // Clicking on the bottom left LCARS area toggles the sound off or on
292 | PlaySounds := Not PlaySounds;
293 | if PlaySounds then AlertLabel.Caption := 'ALERTS ON' else AlertLabel.Caption := 'ALERTS OFF';
294 | end;
295 |
296 | procedure TMainComputerGUI.Shape25MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
297 | begin
298 | {$IFDEF USESPEECH}UseFemaleVoice := not UseFemaleVoice;{$ENDIF}
299 | end;
300 |
301 | procedure TMainComputerGUI.Timer1Timer(Sender: TObject);
302 | begin
303 | // Cause the random text to be repainted every 1.5 seconds
304 | Timer1.Enabled := False;
305 | DoSpaceText;
306 | Timer1.Enabled := True;
307 | end;
308 |
309 | procedure TMainComputerGUI.WMNCHitTest(var Msg: TWMNCHitTest);
310 | begin
311 | // We have no title bar - so we need to check for click and hold mouse
312 | // movements to trigger the form dragging but only if it's near the top
313 | // border shape.
314 | inherited;
315 | if Msg.Result = htClient then
316 | begin
317 | var Pt := ScreenToClient(SmallPointToPoint(Msg.Pos));
318 | if Pt.Y < (Shape22.Height + Shape22.Top) then Msg.Result := htCaption;
319 | end;
320 | end;
321 |
322 | {$IFDEF USESPEECH}
323 | procedure TMainComputerGUI.CleanupSpeechFiles;
324 | begin
325 | for var AFile in TDirectory.GetFiles(ExtractFilePath(ParamStr(0)), Format(cSpeechFileTemplate, ['*'])) do
326 | DeleteFile(AFile);
327 | end;
328 | {$ENDIF}
329 |
330 | procedure TMainComputerGUI.DoSpaceText;
331 | var
332 | LBitmap: TBitmap;
333 | const
334 | cYellowText = $FFFBD768;
335 | cWhiteText = TAlphaColors.White;
336 | cBackground = TAlphaColors.Black;
337 | begin
338 | LBitmap := TBitmap.Create;
339 | try
340 | LBitmap.SetSize(745, 202);
341 | LBitmap.SkiaDraw(
342 | procedure (const ACanvas: ISkCanvas)
343 | var
344 | LTypeface: ISkTypeface;
345 | LFont: ISkFont;
346 | LPaint: ISkPaint;
347 | begin
348 | // Create the drawing surface for the text
349 | ACanvas.Clear(cBackground);
350 | LPaint := TSkPaint.Create;
351 |
352 | // Now load a custom 'Klingon' font and use that to print some random Klingon
353 | const FontFolder = '..\..\fonts\';
354 | LTypeface := TSkTypeface.MakeFromFile(FontFolder + 'Klingon-pIqaD-HaSta.ttf');
355 | LFont := TSkFont.Create(LTypeface, 28);
356 | LFont.Typeface := LTypeface;
357 | LFont.Size := 28;
358 | LPaint.Color := TAlphaColors.Tomato;
359 | LPaint.Style := TSkPaintStyle.Fill; // Fills can be grad fills for cool text!
360 | ACanvas.DrawSimpleText(RandomKlingonString(19), 10, 25, LFont, LPaint);
361 |
362 | // Now to load a "Trek" type font to emulate the computer interface's text
363 | LTypeface := TSkTypeface.MakeFromFile(FontFolder + 'LCARS.ttf');
364 | LFont := TSkFont.Create(LTypeface, 16);
365 | LPaint.Color := TAlphaColor(cYellowText);
366 | LPaint.Style := TSkPaintStyle.Fill; // Solid fill
367 |
368 | // First some random 'planetary' statistics in yellow
369 | ACanvas.DrawSimpleText(Format('Saturation %d%% Lead %d%%', [Random(100), Random(100)]), 500, 25, LFont, LPaint);
370 | ACanvas.DrawSimpleText(Format('Titanium %d%% Ore %d%%', [Random(100), Random(100)]), 500, 45, LFont, LPaint);
371 | ACanvas.DrawSimpleText(Format('Cadnium %d%%', [Random(100)]), 500, 65, LFont, LPaint);
372 | ACanvas.DrawSimpleText('Planet Class: M', 500, 85, LFont, LPaint);
373 |
374 | // Now a few rows of random numbers - the movies like screenfuls of junky numbers :)
375 | for var i := 0 to 3 do
376 | ACanvas.DrawSimpleText(RandomLineOfText, 10, 45 + (i * 20), LFont, LPaint);
377 | LPaint.Color := cWhiteText;
378 | for var iRow := 4 to 7 do
379 | begin
380 | ACanvas.DrawSimpleText(RandomLineOfNumbers, 10, 45 + (iRow * 20), LFont, LPaint);
381 | end;
382 |
383 | // Now let's show some worrying command text from The Main Bridge
384 | LTypeface := TSkTypeface.MakeFromFile(FontFolder + 'Horta demo.otf');
385 | LFont := TSkFont.Create(LTypeface, 32);
386 | LPaint.Style := TSkPaintStyle.Fill;
387 | var CaptainsOrders1, CaptainsOrders2: string;
388 | if Random(2) Mod 2 = 0 then
389 | begin
390 | CaptainsOrders1 := 'RED ALERT';
391 | CaptainsOrders2 := 'ALL CREW TO STATIONS';
392 | LPaint.Color := TAlphaColors.Crimson;
393 | if HasNotPlayedRedAlert then PlaySound(BeepRedAlert);
394 | end
395 | else
396 | begin
397 | CaptainsOrders1 := 'ENSIGN BARKER';
398 | CaptainsOrders2 := 'REPORT TO THE BRIDGE';
399 | LPaint.Color := TAlphaColors.Cadetblue; // Starfleet Cadet Blue ;)
400 | if Random(3) Mod 3 = 0 then PlaySound(Beeps(RandomRange(Ord(BeepIncoming), Ord(BeepEngage))));
401 | {$IFDEF USESPEECH}
402 | if (Random(4) Mod 4 = 0) and (SpeechCount < 20) then
403 | begin
404 | Inc(SpeechCount); // Used to prevent you accidentally using all your free AWS allowance
405 | Speak(ComputerSpeech[Random(High(ComputerSpeech))]);
406 | end;
407 | {$ENDIF}
408 | end;
409 |
410 | ACanvas.DrawSimpleText(Format(CaptainsOrders1, [Random(100), Random(100)]), 500, 145, LFont, LPaint);
411 | ACanvas.DrawSimpleText(Format(CaptainsOrders2, [Random(100), Random(100)]), 500, 175, LFont, LPaint);
412 | end);
413 | Image1.Width := Ceil(LBitmap.Width {$IF CompilerVersion >= 33}/ Image1.ScaleFactor{$ENDIF});
414 | Image1.Height := Ceil(LBitmap.Height {$IF CompilerVersion >= 33}/ Image1.ScaleFactor{$ENDIF});
415 | Image1.Picture.Bitmap := LBitmap;
416 | finally
417 | LBitmap.Free;
418 | end;
419 | end;
420 |
421 | {$IFDEF USESPEECH}
422 | procedure TMainComputerGUI.Speak(const TheText: string);
423 | var
424 | LRequest: IPollySynthesizeSpeechRequest;
425 | LResponse: IPollySynthesizeSpeechResponse;
426 | LAudioFile: TFileStream;
427 | LFileName: string;
428 | begin
429 | LRequest := TPollySynthesizeSpeechRequest.Create;
430 | LRequest.Engine := 'neural'; // can also be --> LRequest.Engine := 'standard'
431 | LRequest.LanguageCode := 'en-US';
432 | LRequest.OutputFormat := 'mp3';
433 | LRequest.Text := TheText;
434 | if UseFemaleVoice then
435 | LRequest.VoiceId := 'Joanna'
436 | else
437 | LRequest.VoiceId := 'Joey';
438 | LResponse := SpeechClient.SynthesizeSpeech(LRequest);
439 | if LResponse.IsSuccessful then
440 | begin
441 | LFileName := ExtractFilePath(ParamStr(0)) + Format(cSpeechFileTemplate, [FormatDateTime('yyyymmddhhnnsszzz', Now)]);
442 | LAudioFile := TFileStream.Create(LFileName, fmCreate);
443 | try
444 | LAudioFile.CopyFrom(LResponse.AudioStream);
445 | finally
446 | LAudioFile.Free;
447 | end;
448 | MediaPlayer2.Close;
449 | MediaPlayer2.FileName := LFileName;
450 | MediaPlayer2.Open;
451 | MediaPlayer2.Play;
452 | end
453 | else
454 | if LResponse.StatusText.ToLower.Contains('forbidden') then
455 | ShowMessage('AWS access was denied. Have you set up your AWS account? [' + LResponse.StatusText + ']')
456 | else
457 | ShowMessage('AWS error: ' + LResponse.StatusText);
458 | end;
459 | {$ENDIF}
460 |
461 | end.
462 |
--------------------------------------------------------------------------------
/graphics/Emblem.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/graphics/Emblem.ico
--------------------------------------------------------------------------------
/graphics/Emblem.svg:
--------------------------------------------------------------------------------
1 |
2 |
63 |
--------------------------------------------------------------------------------
/graphics/delphi_con_barker_demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/graphics/delphi_con_barker_demo.gif
--------------------------------------------------------------------------------
/graphics/lcars_heartbeat.json:
--------------------------------------------------------------------------------
1 | {"v":"5.7.6","fr":30,"ip":0,"op":450,"w":512,"h":512,"nm":"Icon_101","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"2 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2,"l":2},"a":{"a":0,"k":[256,256,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[167,6.659],[138.952,6.659],[124.928,60.54],[110.903,-60.54],[82.855,29.06],[68.831,-4.44],[54.807,17.354],[40.783,-15.741],[26.758,6.659],[-1.29,6.659],[-13.991,6.659],[-26.758,6.659],[-40.783,60.54],[-54.807,-60.54],[-82.855,29.06],[-96.879,-4.44],[-110.903,17.354],[-124.927,-15.741],[-138.952,6.659],[-167,6.659]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9529411764705882,0.3215686274509804,0.027450980392156862,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[256,216.449],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":73,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":59,"s":[-360]}],"ix":3,"x":"var $bm_rt;\n$bm_rt = loopOut('Cycle', 0);"},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2,"l":2},"a":{"a":0,"k":[256,256,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[40.232,-52.487],[4.252,-4.252],[0,0],[0,0],[3.559,4.645],[-48.026,48.034],[-52.52,-40.892],[-48.277,-48.277]],"o":[[-3.559,4.645],[0,0],[0,0],[-4.252,-4.252],[-40.224,-52.487],[48.285,-48.285],[52.521,-40.892],[48.034,48.034]],"v":[[188.496,18.888],[176.784,32.254],[0,209.046],[-176.792,32.254],[-188.504,18.888],[-176.792,-157.077],[0,-168.154],[176.784,-157.077]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8117647058823529,0.3764705882352941,0.13333333333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[256.001,249.62],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":15,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":79,"s":[-360]}],"ix":3,"x":"var $bm_rt;\n$bm_rt = loopOut('Cycle', 0);"},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":450,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/graphics/scanner_red.json:
--------------------------------------------------------------------------------
1 | {"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.21","a":"Nirmal","k":"Scan, QR Code, scanning, finding","d":"Scan matrix ","tc":"black"},"fr":30,"ip":0,"op":60,"w":328,"h":208,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164,104,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.968,3.968],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[62.275,-8.435],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 38","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.322,1.322],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.083,-2.181],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 37","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.886,3.886],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-59.762,-20.978],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 36","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.631,2.631],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-48.644,6.809],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 35","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.114,1.114],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.833,23.479],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 34","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[4.258,4.258],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.735,79.987],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 33","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.423,2.423],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.302,61.641],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 32","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[5.14,5.14],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.109,65.273],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 31","np":3,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.533,1.533],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[40.978,73.699],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 30","np":3,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.236,1.236],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-25.473,76.203],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 29","np":3,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.371,2.371],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-74.917,76.012],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 28","np":3,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.563,2.563],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-97.174,54.134],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 27","np":3,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.692,2.692],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-61.117,53.441],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 26","np":3,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.429,2.429],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-22.604,56.719],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 25","np":3,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.123,3.123],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.221,52.898],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 24","np":3,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.08,3.08],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[64.483,42.268],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 23","np":3,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.155,3.155],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.426,26.394],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 22","np":3,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.388,1.388],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.115,24.374],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 21","np":3,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[4.02,4.02],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[75.183,14.323],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 20","np":3,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.204,2.204],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.86,28.191],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 19","np":3,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.256,3.256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-33.177,23.792],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 18","np":3,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.327,2.327],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-79.485,15.371],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 17","np":3,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.312,3.312],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-104.756,4.876],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 16","np":3,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.18,1.18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-75.133,-14.376],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 15","np":3,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.32,3.32],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.457,-28.839],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 14","np":3,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.702,1.702],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.743,-12.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 13","np":3,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.304,2.304],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.103,-13.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 12","np":3,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.102,2.102],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.85,-17.324],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 11","np":3,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.429,3.429],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.882,-28.785],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 10","np":3,"cix":2,"bm":0,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.88,3.88],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-86.665,-49.397],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 9","np":3,"cix":2,"bm":0,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.247,3.247],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-34.697,-42.894],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 8","np":3,"cix":2,"bm":0,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[4.116,4.116],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.79,-50.037],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7","np":3,"cix":2,"bm":0,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.483,2.483],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.637,-60.325],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"bm":0,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.144,2.144],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.804,-82.09],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"bm":0,"ix":34,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.658,2.658],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.112,-73.498],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"bm":0,"ix":35,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.556,2.556],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-41.862,-73.928],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"bm":0,"ix":36,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.154,3.154],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-79.45,-76.66],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"bm":0,"ix":37,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.065,3.065],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-119.276,-70.263],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":38,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[163.258,63.649,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-163.5,-68],[164.5,-68]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.842815577984,0.842815577984,0.842815577984,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0.617739021778,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"rp","c":{"a":0,"k":39,"ix":1},"o":{"a":0,"k":0,"ix":2},"m":1,"ix":2,"tr":{"ty":"tr","p":{"a":0,"k":[0,6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[267.826,71.985,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-163.5,-68],[164.5,-68]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.842815577984,0.842815577984,0.842815577984,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0.617739021778,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"rp","c":{"a":0,"k":88,"ix":1},"o":{"a":0,"k":0,"ix":2},"m":1,"ix":2,"tr":{"ty":"tr","p":{"a":0,"k":[0,6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Bar","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[164,0,0],"to":[0,34.667,0],"ti":[0,0,0]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[164,208,0],"to":[0,0,0],"ti":[0,34.667,0]},{"t":60.0000024438501,"s":[164,0,0]}],"ix":2},"a":{"a":0,"k":[-0.059,-10.747,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[328,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.8156862745098039,0.00784313725490196,0.10588235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.059,-10.747],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,111.338],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Pre-comp 1","hd":true,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164,104,0],"ix":2},"a":{"a":0,"k":[164,104,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":328,"h":208,"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Trail","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.059,-10.747,0],"ix":2},"a":{"a":0,"k":[0,-43.747,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1.062,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[-100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0.123,0]},"t":10,"s":[-100,-150,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,0.938,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[-100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,-0.123,0]},"t":40,"s":[-100,150,100]},{"t":60.0000024438501,"s":[-100,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[328,60],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":60,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0,0,0,0.504,0.2901960784313726,0.2901960784313726,0.2901960784313726,1,0.2901960784313726,0.2901960784313726,0.2901960784313726,0,0.2901960784313726,0.2901960784313726,0.2901960784313726,1,0],"ix":9}},"s":{"a":0,"k":[0,-65],"ix":5},"e":{"a":0,"k":[0,30],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.2901960784313726,0.2901960784313726,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":true},{"ty":"tr","p":{"a":0,"k":[-0.059,-10.747],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,111.338],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/links_used_in_demo.txt:
--------------------------------------------------------------------------------
1 | Star_Trek_PADD.jpg (361×276)
2 | https://upload.wikimedia.org/wikipedia/en/8/88/Star_Trek_PADD.jpg
3 |
4 | Skia Graphics Engine - Wikipedia
5 | https://en.wikipedia.org/wiki/Skia_Graphics_Engine
6 |
7 | About Skia | Skia
8 | https://skia.org/about/
9 |
10 | Skottie - Lottie Animation Player | Skia
11 | https://skia.org/docs/user/modules/skottie/
12 |
13 | viniciusfbb/skia4delphi: Skia4Delphi is a cross-platform 2D graphics API for Delphi platforms based on Google's Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.
14 | https://github.com/viniciusfbb/skia4delphi
15 |
16 | skia4delphi/LOTTIE.md at main · viniciusfbb/skia4delphi
17 | https://github.com/viniciusfbb/skia4delphi/blob/main/Documents/LOTTIE.md
18 |
19 | Star Trek fonts | Memory Alpha | Fandom
20 | https://memory-alpha.fandom.com/wiki/Star_Trek_fonts
21 |
22 | https://upload.wikimedia.org/wikipedia/commons/9/9a/Emblem.svg
23 | https://upload.wikimedia.org/wikipedia/commons/9/9a/Emblem.svg
24 |
25 | lcars - Google Search
26 | https://www.google.com/search?q=lcars
27 |
28 | Star_Trek_PADD.jpg (361×276)
29 | https://upload.wikimedia.org/wikipedia/en/8/88/Star_Trek_PADD.jpg
30 |
31 | TrekCore.com
32 | https://www.trekcore.com/audio/
33 |
34 | Free Lottie Animation Files, Tools & Plugins - LottieFiles
35 | https://lottiefiles.com/
36 |
37 | checkdigits/spacecomputer: A 'starship computer console from the future' - example of using Skia4Delphi
38 | https://github.com/checkdigits/spacecomputer
39 |
40 | Move Your UI to the 23rd Century - Building a Data Dashboard with Delphi and Skia. Engage! - DelphiCon 2021 by Embarcadero
41 | https://delphicon.embarcadero.com/talks/move-your-ui-to-the-23rd-century-building-a-data-dashboard-with-delphi-and-skia-engage/
42 |
43 | Evertype: Klingon pIqaD fonts
44 | https://www.evertype.com/fonts/tlh/
45 |
46 | ConScript Unicode Registry
47 | https://www.evertype.com/standards/csur/klingon.html
48 |
49 |
--------------------------------------------------------------------------------
/slides/DelphiCon 2021 Ian Barker.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/slides/DelphiCon 2021 Ian Barker.pptx
--------------------------------------------------------------------------------
/sounds/alert08.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/alert08.mp3
--------------------------------------------------------------------------------
/sounds/alert09.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/alert09.mp3
--------------------------------------------------------------------------------
/sounds/communications_end_transmission.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/communications_end_transmission.mp3
--------------------------------------------------------------------------------
/sounds/computer_work_beep.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/computer_work_beep.mp3
--------------------------------------------------------------------------------
/sounds/computerbeep_74.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/computerbeep_74.mp3
--------------------------------------------------------------------------------
/sounds/consolewarning.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/consolewarning.mp3
--------------------------------------------------------------------------------
/sounds/engage.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/engage.mp3
--------------------------------------------------------------------------------