├── .gitignore
├── .metadata
├── COPYING
├── README.md
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── nicolassiplis
│ │ │ │ └── cyberpwned
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ └── values
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
└── icon
│ └── icon.png
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
└── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ └── Icon-App-83.5x83.5@2x.png
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Info.plist
│ └── Runner-Bridging-Header.h
├── lib
├── cell.dart
├── main.dart
├── path.dart
├── score.dart
├── sequence.dart
└── util.dart
├── media
└── screenshot
│ ├── error.jpg
│ └── solved.jpg
├── pubspec.lock
└── pubspec.yaml
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | .vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | **/ios/Flutter/.last_build_id
26 | .dart_tool/
27 | .flutter-plugins
28 | .flutter-plugins-dependencies
29 | .packages
30 | .pub-cache/
31 | .pub/
32 | /build/
33 |
34 | # Web related
35 | lib/generated_plugin_registrant.dart
36 |
37 | # Symbolication related
38 | app.*.symbols
39 |
40 | # Obfuscation related
41 | app.*.map.json
42 |
43 | windows/
44 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 78910062997c3a836feee883712c241a5fd22983
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/COPYING:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 |
3 | Version 3, 29 June 2007
4 |
5 |
6 | Copyright (C) 2007 Free Software Foundation, Inc.
7 |
8 | Everyone is permitted to copy and distribute verbatim copies
9 |
10 | of this license document, but changing it is not allowed.
11 |
12 |
13 |
14 | Preamble
15 |
16 |
17 |
18 | The GNU General Public License is a free, copyleft license for
19 |
20 | software and other kinds of works.
21 |
22 |
23 |
24 | The licenses for most software and other practical works are designed
25 |
26 | to take away your freedom to share and change the works. By contrast,
27 |
28 | the GNU General Public License is intended to guarantee your freedom to
29 |
30 | share and change all versions of a program--to make sure it remains free
31 |
32 | software for all its users. We, the Free Software Foundation, use the
33 |
34 | GNU General Public License for most of our software; it applies also to
35 |
36 | any other work released this way by its authors. You can apply it to
37 |
38 | your programs, too.
39 |
40 |
41 |
42 | When we speak of free software, we are referring to freedom, not
43 |
44 | price. Our General Public Licenses are designed to make sure that you
45 |
46 | have the freedom to distribute copies of free software (and charge for
47 |
48 | them if you wish), that you receive source code or can get it if you
49 |
50 | want it, that you can change the software or use pieces of it in new
51 |
52 | free programs, and that you know you can do these things.
53 |
54 |
55 |
56 | To protect your rights, we need to prevent others from denying you
57 |
58 | these rights or asking you to surrender the rights. Therefore, you have
59 |
60 | certain responsibilities if you distribute copies of the software, or if
61 |
62 | you modify it: responsibilities to respect the freedom of others.
63 |
64 |
65 |
66 | For example, if you distribute copies of such a program, whether
67 |
68 | gratis or for a fee, you must pass on to the recipients the same
69 |
70 | freedoms that you received. You must make sure that they, too, receive
71 |
72 | or can get the source code. And you must show them these terms so they
73 |
74 | know their rights.
75 |
76 |
77 |
78 | Developers that use the GNU GPL protect your rights with two steps:
79 |
80 | (1) assert copyright on the software, and (2) offer you this License
81 |
82 | giving you legal permission to copy, distribute and/or modify it.
83 |
84 |
85 |
86 | For the developers' and authors' protection, the GPL clearly explains
87 |
88 | that there is no warranty for this free software. For both users' and
89 |
90 | authors' sake, the GPL requires that modified versions be marked as
91 |
92 | changed, so that their problems will not be attributed erroneously to
93 |
94 | authors of previous versions.
95 |
96 |
97 |
98 | Some devices are designed to deny users access to install or run
99 |
100 | modified versions of the software inside them, although the manufacturer
101 |
102 | can do so. This is fundamentally incompatible with the aim of
103 |
104 | protecting users' freedom to change the software. The systematic
105 |
106 | pattern of such abuse occurs in the area of products for individuals to
107 |
108 | use, which is precisely where it is most unacceptable. Therefore, we
109 |
110 | have designed this version of the GPL to prohibit the practice for those
111 |
112 | products. If such problems arise substantially in other domains, we
113 |
114 | stand ready to extend this provision to those domains in future versions
115 |
116 | of the GPL, as needed to protect the freedom of users.
117 |
118 |
119 |
120 | Finally, every program is threatened constantly by software patents.
121 |
122 | States should not allow patents to restrict development and use of
123 |
124 | software on general-purpose computers, but in those that do, we wish to
125 |
126 | avoid the special danger that patents applied to a free program could
127 |
128 | make it effectively proprietary. To prevent this, the GPL assures that
129 |
130 | patents cannot be used to render the program non-free.
131 |
132 |
133 |
134 | The precise terms and conditions for copying, distribution and
135 |
136 | modification follow.
137 |
138 |
139 |
140 | TERMS AND CONDITIONS
141 |
142 |
143 |
144 | 0. Definitions.
145 |
146 |
147 |
148 | "This License" refers to version 3 of the GNU General Public License.
149 |
150 |
151 |
152 | "Copyright" also means copyright-like laws that apply to other kinds of
153 |
154 | works, such as semiconductor masks.
155 |
156 |
157 |
158 | "The Program" refers to any copyrightable work licensed under this
159 |
160 | License. Each licensee is addressed as "you". "Licensees" and
161 |
162 | "recipients" may be individuals or organizations.
163 |
164 |
165 |
166 | To "modify" a work means to copy from or adapt all or part of the work
167 |
168 | in a fashion requiring copyright permission, other than the making of an
169 |
170 | exact copy. The resulting work is called a "modified version" of the
171 |
172 | earlier work or a work "based on" the earlier work.
173 |
174 |
175 |
176 | A "covered work" means either the unmodified Program or a work based
177 |
178 | on the Program.
179 |
180 |
181 |
182 | To "propagate" a work means to do anything with it that, without
183 |
184 | permission, would make you directly or secondarily liable for
185 |
186 | infringement under applicable copyright law, except executing it on a
187 |
188 | computer or modifying a private copy. Propagation includes copying,
189 |
190 | distribution (with or without modification), making available to the
191 |
192 | public, and in some countries other activities as well.
193 |
194 |
195 |
196 | To "convey" a work means any kind of propagation that enables other
197 |
198 | parties to make or receive copies. Mere interaction with a user through
199 |
200 | a computer network, with no transfer of a copy, is not conveying.
201 |
202 |
203 |
204 | An interactive user interface displays "Appropriate Legal Notices"
205 |
206 | to the extent that it includes a convenient and prominently visible
207 |
208 | feature that (1) displays an appropriate copyright notice, and (2)
209 |
210 | tells the user that there is no warranty for the work (except to the
211 |
212 | extent that warranties are provided), that licensees may convey the
213 |
214 | work under this License, and how to view a copy of this License. If
215 |
216 | the interface presents a list of user commands or options, such as a
217 |
218 | menu, a prominent item in the list meets this criterion.
219 |
220 |
221 |
222 | 1. Source Code.
223 |
224 |
225 |
226 | The "source code" for a work means the preferred form of the work
227 |
228 | for making modifications to it. "Object code" means any non-source
229 |
230 | form of a work.
231 |
232 |
233 |
234 | A "Standard Interface" means an interface that either is an official
235 |
236 | standard defined by a recognized standards body, or, in the case of
237 |
238 | interfaces specified for a particular programming language, one that
239 |
240 | is widely used among developers working in that language.
241 |
242 |
243 |
244 | The "System Libraries" of an executable work include anything, other
245 |
246 | than the work as a whole, that (a) is included in the normal form of
247 |
248 | packaging a Major Component, but which is not part of that Major
249 |
250 | Component, and (b) serves only to enable use of the work with that
251 |
252 | Major Component, or to implement a Standard Interface for which an
253 |
254 | implementation is available to the public in source code form. A
255 |
256 | "Major Component", in this context, means a major essential component
257 |
258 | (kernel, window system, and so on) of the specific operating system
259 |
260 | (if any) on which the executable work runs, or a compiler used to
261 |
262 | produce the work, or an object code interpreter used to run it.
263 |
264 |
265 |
266 | The "Corresponding Source" for a work in object code form means all
267 |
268 | the source code needed to generate, install, and (for an executable
269 |
270 | work) run the object code and to modify the work, including scripts to
271 |
272 | control those activities. However, it does not include the work's
273 |
274 | System Libraries, or general-purpose tools or generally available free
275 |
276 | programs which are used unmodified in performing those activities but
277 |
278 | which are not part of the work. For example, Corresponding Source
279 |
280 | includes interface definition files associated with source files for
281 |
282 | the work, and the source code for shared libraries and dynamically
283 |
284 | linked subprograms that the work is specifically designed to require,
285 |
286 | such as by intimate data communication or control flow between those
287 |
288 | subprograms and other parts of the work.
289 |
290 |
291 |
292 | The Corresponding Source need not include anything that users
293 |
294 | can regenerate automatically from other parts of the Corresponding
295 |
296 | Source.
297 |
298 |
299 |
300 | The Corresponding Source for a work in source code form is that
301 |
302 | same work.
303 |
304 |
305 |
306 | 2. Basic Permissions.
307 |
308 |
309 |
310 | All rights granted under this License are granted for the term of
311 |
312 | copyright on the Program, and are irrevocable provided the stated
313 |
314 | conditions are met. This License explicitly affirms your unlimited
315 |
316 | permission to run the unmodified Program. The output from running a
317 |
318 | covered work is covered by this License only if the output, given its
319 |
320 | content, constitutes a covered work. This License acknowledges your
321 |
322 | rights of fair use or other equivalent, as provided by copyright law.
323 |
324 |
325 |
326 | You may make, run and propagate covered works that you do not
327 |
328 | convey, without conditions so long as your license otherwise remains
329 |
330 | in force. You may convey covered works to others for the sole purpose
331 |
332 | of having them make modifications exclusively for you, or provide you
333 |
334 | with facilities for running those works, provided that you comply with
335 |
336 | the terms of this License in conveying all material for which you do
337 |
338 | not control copyright. Those thus making or running the covered works
339 |
340 | for you must do so exclusively on your behalf, under your direction
341 |
342 | and control, on terms that prohibit them from making any copies of
343 |
344 | your copyrighted material outside their relationship with you.
345 |
346 |
347 |
348 | Conveying under any other circumstances is permitted solely under
349 |
350 | the conditions stated below. Sublicensing is not allowed; section 10
351 |
352 | makes it unnecessary.
353 |
354 |
355 |
356 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
357 |
358 |
359 |
360 | No covered work shall be deemed part of an effective technological
361 |
362 | measure under any applicable law fulfilling obligations under article
363 |
364 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
365 |
366 | similar laws prohibiting or restricting circumvention of such
367 |
368 | measures.
369 |
370 |
371 |
372 | When you convey a covered work, you waive any legal power to forbid
373 |
374 | circumvention of technological measures to the extent such circumvention
375 |
376 | is effected by exercising rights under this License with respect to
377 |
378 | the covered work, and you disclaim any intention to limit operation or
379 |
380 | modification of the work as a means of enforcing, against the work's
381 |
382 | users, your or third parties' legal rights to forbid circumvention of
383 |
384 | technological measures.
385 |
386 |
387 |
388 | 4. Conveying Verbatim Copies.
389 |
390 |
391 |
392 | You may convey verbatim copies of the Program's source code as you
393 |
394 | receive it, in any medium, provided that you conspicuously and
395 |
396 | appropriately publish on each copy an appropriate copyright notice;
397 |
398 | keep intact all notices stating that this License and any
399 |
400 | non-permissive terms added in accord with section 7 apply to the code;
401 |
402 | keep intact all notices of the absence of any warranty; and give all
403 |
404 | recipients a copy of this License along with the Program.
405 |
406 |
407 |
408 | You may charge any price or no price for each copy that you convey,
409 |
410 | and you may offer support or warranty protection for a fee.
411 |
412 |
413 |
414 | 5. Conveying Modified Source Versions.
415 |
416 |
417 |
418 | You may convey a work based on the Program, or the modifications to
419 |
420 | produce it from the Program, in the form of source code under the
421 |
422 | terms of section 4, provided that you also meet all of these conditions:
423 |
424 |
425 |
426 | a) The work must carry prominent notices stating that you modified
427 |
428 | it, and giving a relevant date.
429 |
430 |
431 |
432 | b) The work must carry prominent notices stating that it is
433 |
434 | released under this License and any conditions added under section
435 |
436 | 7. This requirement modifies the requirement in section 4 to
437 |
438 | "keep intact all notices".
439 |
440 |
441 |
442 | c) You must license the entire work, as a whole, under this
443 |
444 | License to anyone who comes into possession of a copy. This
445 |
446 | License will therefore apply, along with any applicable section 7
447 |
448 | additional terms, to the whole of the work, and all its parts,
449 |
450 | regardless of how they are packaged. This License gives no
451 |
452 | permission to license the work in any other way, but it does not
453 |
454 | invalidate such permission if you have separately received it.
455 |
456 |
457 |
458 | d) If the work has interactive user interfaces, each must display
459 |
460 | Appropriate Legal Notices; however, if the Program has interactive
461 |
462 | interfaces that do not display Appropriate Legal Notices, your
463 |
464 | work need not make them do so.
465 |
466 |
467 |
468 | A compilation of a covered work with other separate and independent
469 |
470 | works, which are not by their nature extensions of the covered work,
471 |
472 | and which are not combined with it such as to form a larger program,
473 |
474 | in or on a volume of a storage or distribution medium, is called an
475 |
476 | "aggregate" if the compilation and its resulting copyright are not
477 |
478 | used to limit the access or legal rights of the compilation's users
479 |
480 | beyond what the individual works permit. Inclusion of a covered work
481 |
482 | in an aggregate does not cause this License to apply to the other
483 |
484 | parts of the aggregate.
485 |
486 |
487 |
488 | 6. Conveying Non-Source Forms.
489 |
490 |
491 |
492 | You may convey a covered work in object code form under the terms
493 |
494 | of sections 4 and 5, provided that you also convey the
495 |
496 | machine-readable Corresponding Source under the terms of this License,
497 |
498 | in one of these ways:
499 |
500 |
501 |
502 | a) Convey the object code in, or embodied in, a physical product
503 |
504 | (including a physical distribution medium), accompanied by the
505 |
506 | Corresponding Source fixed on a durable physical medium
507 |
508 | customarily used for software interchange.
509 |
510 |
511 |
512 | b) Convey the object code in, or embodied in, a physical product
513 |
514 | (including a physical distribution medium), accompanied by a
515 |
516 | written offer, valid for at least three years and valid for as
517 |
518 | long as you offer spare parts or customer support for that product
519 |
520 | model, to give anyone who possesses the object code either (1) a
521 |
522 | copy of the Corresponding Source for all the software in the
523 |
524 | product that is covered by this License, on a durable physical
525 |
526 | medium customarily used for software interchange, for a price no
527 |
528 | more than your reasonable cost of physically performing this
529 |
530 | conveying of source, or (2) access to copy the
531 |
532 | Corresponding Source from a network server at no charge.
533 |
534 |
535 |
536 | c) Convey individual copies of the object code with a copy of the
537 |
538 | written offer to provide the Corresponding Source. This
539 |
540 | alternative is allowed only occasionally and noncommercially, and
541 |
542 | only if you received the object code with such an offer, in accord
543 |
544 | with subsection 6b.
545 |
546 |
547 |
548 | d) Convey the object code by offering access from a designated
549 |
550 | place (gratis or for a charge), and offer equivalent access to the
551 |
552 | Corresponding Source in the same way through the same place at no
553 |
554 | further charge. You need not require recipients to copy the
555 |
556 | Corresponding Source along with the object code. If the place to
557 |
558 | copy the object code is a network server, the Corresponding Source
559 |
560 | may be on a different server (operated by you or a third party)
561 |
562 | that supports equivalent copying facilities, provided you maintain
563 |
564 | clear directions next to the object code saying where to find the
565 |
566 | Corresponding Source. Regardless of what server hosts the
567 |
568 | Corresponding Source, you remain obligated to ensure that it is
569 |
570 | available for as long as needed to satisfy these requirements.
571 |
572 |
573 |
574 | e) Convey the object code using peer-to-peer transmission, provided
575 |
576 | you inform other peers where the object code and Corresponding
577 |
578 | Source of the work are being offered to the general public at no
579 |
580 | charge under subsection 6d.
581 |
582 |
583 |
584 | A separable portion of the object code, whose source code is excluded
585 |
586 | from the Corresponding Source as a System Library, need not be
587 |
588 | included in conveying the object code work.
589 |
590 |
591 |
592 | A "User Product" is either (1) a "consumer product", which means any
593 |
594 | tangible personal property which is normally used for personal, family,
595 |
596 | or household purposes, or (2) anything designed or sold for incorporation
597 |
598 | into a dwelling. In determining whether a product is a consumer product,
599 |
600 | doubtful cases shall be resolved in favor of coverage. For a particular
601 |
602 | product received by a particular user, "normally used" refers to a
603 |
604 | typical or common use of that class of product, regardless of the status
605 |
606 | of the particular user or of the way in which the particular user
607 |
608 | actually uses, or expects or is expected to use, the product. A product
609 |
610 | is a consumer product regardless of whether the product has substantial
611 |
612 | commercial, industrial or non-consumer uses, unless such uses represent
613 |
614 | the only significant mode of use of the product.
615 |
616 |
617 |
618 | "Installation Information" for a User Product means any methods,
619 |
620 | procedures, authorization keys, or other information required to install
621 |
622 | and execute modified versions of a covered work in that User Product from
623 |
624 | a modified version of its Corresponding Source. The information must
625 |
626 | suffice to ensure that the continued functioning of the modified object
627 |
628 | code is in no case prevented or interfered with solely because
629 |
630 | modification has been made.
631 |
632 |
633 |
634 | If you convey an object code work under this section in, or with, or
635 |
636 | specifically for use in, a User Product, and the conveying occurs as
637 |
638 | part of a transaction in which the right of possession and use of the
639 |
640 | User Product is transferred to the recipient in perpetuity or for a
641 |
642 | fixed term (regardless of how the transaction is characterized), the
643 |
644 | Corresponding Source conveyed under this section must be accompanied
645 |
646 | by the Installation Information. But this requirement does not apply
647 |
648 | if neither you nor any third party retains the ability to install
649 |
650 | modified object code on the User Product (for example, the work has
651 |
652 | been installed in ROM).
653 |
654 |
655 |
656 | The requirement to provide Installation Information does not include a
657 |
658 | requirement to continue to provide support service, warranty, or updates
659 |
660 | for a work that has been modified or installed by the recipient, or for
661 |
662 | the User Product in which it has been modified or installed. Access to a
663 |
664 | network may be denied when the modification itself materially and
665 |
666 | adversely affects the operation of the network or violates the rules and
667 |
668 | protocols for communication across the network.
669 |
670 |
671 |
672 | Corresponding Source conveyed, and Installation Information provided,
673 |
674 | in accord with this section must be in a format that is publicly
675 |
676 | documented (and with an implementation available to the public in
677 |
678 | source code form), and must require no special password or key for
679 |
680 | unpacking, reading or copying.
681 |
682 |
683 |
684 | 7. Additional Terms.
685 |
686 |
687 |
688 | "Additional permissions" are terms that supplement the terms of this
689 |
690 | License by making exceptions from one or more of its conditions.
691 |
692 | Additional permissions that are applicable to the entire Program shall
693 |
694 | be treated as though they were included in this License, to the extent
695 |
696 | that they are valid under applicable law. If additional permissions
697 |
698 | apply only to part of the Program, that part may be used separately
699 |
700 | under those permissions, but the entire Program remains governed by
701 |
702 | this License without regard to the additional permissions.
703 |
704 |
705 |
706 | When you convey a copy of a covered work, you may at your option
707 |
708 | remove any additional permissions from that copy, or from any part of
709 |
710 | it. (Additional permissions may be written to require their own
711 |
712 | removal in certain cases when you modify the work.) You may place
713 |
714 | additional permissions on material, added by you to a covered work,
715 |
716 | for which you have or can give appropriate copyright permission.
717 |
718 |
719 |
720 | Notwithstanding any other provision of this License, for material you
721 |
722 | add to a covered work, you may (if authorized by the copyright holders of
723 |
724 | that material) supplement the terms of this License with terms:
725 |
726 |
727 |
728 | a) Disclaiming warranty or limiting liability differently from the
729 |
730 | terms of sections 15 and 16 of this License; or
731 |
732 |
733 |
734 | b) Requiring preservation of specified reasonable legal notices or
735 |
736 | author attributions in that material or in the Appropriate Legal
737 |
738 | Notices displayed by works containing it; or
739 |
740 |
741 |
742 | c) Prohibiting misrepresentation of the origin of that material, or
743 |
744 | requiring that modified versions of such material be marked in
745 |
746 | reasonable ways as different from the original version; or
747 |
748 |
749 |
750 | d) Limiting the use for publicity purposes of names of licensors or
751 |
752 | authors of the material; or
753 |
754 |
755 |
756 | e) Declining to grant rights under trademark law for use of some
757 |
758 | trade names, trademarks, or service marks; or
759 |
760 |
761 |
762 | f) Requiring indemnification of licensors and authors of that
763 |
764 | material by anyone who conveys the material (or modified versions of
765 |
766 | it) with contractual assumptions of liability to the recipient, for
767 |
768 | any liability that these contractual assumptions directly impose on
769 |
770 | those licensors and authors.
771 |
772 |
773 |
774 | All other non-permissive additional terms are considered "further
775 |
776 | restrictions" within the meaning of section 10. If the Program as you
777 |
778 | received it, or any part of it, contains a notice stating that it is
779 |
780 | governed by this License along with a term that is a further
781 |
782 | restriction, you may remove that term. If a license document contains
783 |
784 | a further restriction but permits relicensing or conveying under this
785 |
786 | License, you may add to a covered work material governed by the terms
787 |
788 | of that license document, provided that the further restriction does
789 |
790 | not survive such relicensing or conveying.
791 |
792 |
793 |
794 | If you add terms to a covered work in accord with this section, you
795 |
796 | must place, in the relevant source files, a statement of the
797 |
798 | additional terms that apply to those files, or a notice indicating
799 |
800 | where to find the applicable terms.
801 |
802 |
803 |
804 | Additional terms, permissive or non-permissive, may be stated in the
805 |
806 | form of a separately written license, or stated as exceptions;
807 |
808 | the above requirements apply either way.
809 |
810 |
811 |
812 | 8. Termination.
813 |
814 |
815 |
816 | You may not propagate or modify a covered work except as expressly
817 |
818 | provided under this License. Any attempt otherwise to propagate or
819 |
820 | modify it is void, and will automatically terminate your rights under
821 |
822 | this License (including any patent licenses granted under the third
823 |
824 | paragraph of section 11).
825 |
826 |
827 |
828 | However, if you cease all violation of this License, then your
829 |
830 | license from a particular copyright holder is reinstated (a)
831 |
832 | provisionally, unless and until the copyright holder explicitly and
833 |
834 | finally terminates your license, and (b) permanently, if the copyright
835 |
836 | holder fails to notify you of the violation by some reasonable means
837 |
838 | prior to 60 days after the cessation.
839 |
840 |
841 |
842 | Moreover, your license from a particular copyright holder is
843 |
844 | reinstated permanently if the copyright holder notifies you of the
845 |
846 | violation by some reasonable means, this is the first time you have
847 |
848 | received notice of violation of this License (for any work) from that
849 |
850 | copyright holder, and you cure the violation prior to 30 days after
851 |
852 | your receipt of the notice.
853 |
854 |
855 |
856 | Termination of your rights under this section does not terminate the
857 |
858 | licenses of parties who have received copies or rights from you under
859 |
860 | this License. If your rights have been terminated and not permanently
861 |
862 | reinstated, you do not qualify to receive new licenses for the same
863 |
864 | material under section 10.
865 |
866 |
867 |
868 | 9. Acceptance Not Required for Having Copies.
869 |
870 |
871 |
872 | You are not required to accept this License in order to receive or
873 |
874 | run a copy of the Program. Ancillary propagation of a covered work
875 |
876 | occurring solely as a consequence of using peer-to-peer transmission
877 |
878 | to receive a copy likewise does not require acceptance. However,
879 |
880 | nothing other than this License grants you permission to propagate or
881 |
882 | modify any covered work. These actions infringe copyright if you do
883 |
884 | not accept this License. Therefore, by modifying or propagating a
885 |
886 | covered work, you indicate your acceptance of this License to do so.
887 |
888 |
889 |
890 | 10. Automatic Licensing of Downstream Recipients.
891 |
892 |
893 |
894 | Each time you convey a covered work, the recipient automatically
895 |
896 | receives a license from the original licensors, to run, modify and
897 |
898 | propagate that work, subject to this License. You are not responsible
899 |
900 | for enforcing compliance by third parties with this License.
901 |
902 |
903 |
904 | An "entity transaction" is a transaction transferring control of an
905 |
906 | organization, or substantially all assets of one, or subdividing an
907 |
908 | organization, or merging organizations. If propagation of a covered
909 |
910 | work results from an entity transaction, each party to that
911 |
912 | transaction who receives a copy of the work also receives whatever
913 |
914 | licenses to the work the party's predecessor in interest had or could
915 |
916 | give under the previous paragraph, plus a right to possession of the
917 |
918 | Corresponding Source of the work from the predecessor in interest, if
919 |
920 | the predecessor has it or can get it with reasonable efforts.
921 |
922 |
923 |
924 | You may not impose any further restrictions on the exercise of the
925 |
926 | rights granted or affirmed under this License. For example, you may
927 |
928 | not impose a license fee, royalty, or other charge for exercise of
929 |
930 | rights granted under this License, and you may not initiate litigation
931 |
932 | (including a cross-claim or counterclaim in a lawsuit) alleging that
933 |
934 | any patent claim is infringed by making, using, selling, offering for
935 |
936 | sale, or importing the Program or any portion of it.
937 |
938 |
939 |
940 | 11. Patents.
941 |
942 |
943 |
944 | A "contributor" is a copyright holder who authorizes use under this
945 |
946 | License of the Program or a work on which the Program is based. The
947 |
948 | work thus licensed is called the contributor's "contributor version".
949 |
950 |
951 |
952 | A contributor's "essential patent claims" are all patent claims
953 |
954 | owned or controlled by the contributor, whether already acquired or
955 |
956 | hereafter acquired, that would be infringed by some manner, permitted
957 |
958 | by this License, of making, using, or selling its contributor version,
959 |
960 | but do not include claims that would be infringed only as a
961 |
962 | consequence of further modification of the contributor version. For
963 |
964 | purposes of this definition, "control" includes the right to grant
965 |
966 | patent sublicenses in a manner consistent with the requirements of
967 |
968 | this License.
969 |
970 |
971 |
972 | Each contributor grants you a non-exclusive, worldwide, royalty-free
973 |
974 | patent license under the contributor's essential patent claims, to
975 |
976 | make, use, sell, offer for sale, import and otherwise run, modify and
977 |
978 | propagate the contents of its contributor version.
979 |
980 |
981 |
982 | In the following three paragraphs, a "patent license" is any express
983 |
984 | agreement or commitment, however denominated, not to enforce a patent
985 |
986 | (such as an express permission to practice a patent or covenant not to
987 |
988 | sue for patent infringement). To "grant" such a patent license to a
989 |
990 | party means to make such an agreement or commitment not to enforce a
991 |
992 | patent against the party.
993 |
994 |
995 |
996 | If you convey a covered work, knowingly relying on a patent license,
997 |
998 | and the Corresponding Source of the work is not available for anyone
999 |
1000 | to copy, free of charge and under the terms of this License, through a
1001 |
1002 | publicly available network server or other readily accessible means,
1003 |
1004 | then you must either (1) cause the Corresponding Source to be so
1005 |
1006 | available, or (2) arrange to deprive yourself of the benefit of the
1007 |
1008 | patent license for this particular work, or (3) arrange, in a manner
1009 |
1010 | consistent with the requirements of this License, to extend the patent
1011 |
1012 | license to downstream recipients. "Knowingly relying" means you have
1013 |
1014 | actual knowledge that, but for the patent license, your conveying the
1015 |
1016 | covered work in a country, or your recipient's use of the covered work
1017 |
1018 | in a country, would infringe one or more identifiable patents in that
1019 |
1020 | country that you have reason to believe are valid.
1021 |
1022 |
1023 |
1024 | If, pursuant to or in connection with a single transaction or
1025 |
1026 | arrangement, you convey, or propagate by procuring conveyance of, a
1027 |
1028 | covered work, and grant a patent license to some of the parties
1029 |
1030 | receiving the covered work authorizing them to use, propagate, modify
1031 |
1032 | or convey a specific copy of the covered work, then the patent license
1033 |
1034 | you grant is automatically extended to all recipients of the covered
1035 |
1036 | work and works based on it.
1037 |
1038 |
1039 |
1040 | A patent license is "discriminatory" if it does not include within
1041 |
1042 | the scope of its coverage, prohibits the exercise of, or is
1043 |
1044 | conditioned on the non-exercise of one or more of the rights that are
1045 |
1046 | specifically granted under this License. You may not convey a covered
1047 |
1048 | work if you are a party to an arrangement with a third party that is
1049 |
1050 | in the business of distributing software, under which you make payment
1051 |
1052 | to the third party based on the extent of your activity of conveying
1053 |
1054 | the work, and under which the third party grants, to any of the
1055 |
1056 | parties who would receive the covered work from you, a discriminatory
1057 |
1058 | patent license (a) in connection with copies of the covered work
1059 |
1060 | conveyed by you (or copies made from those copies), or (b) primarily
1061 |
1062 | for and in connection with specific products or compilations that
1063 |
1064 | contain the covered work, unless you entered into that arrangement,
1065 |
1066 | or that patent license was granted, prior to 28 March 2007.
1067 |
1068 |
1069 |
1070 | Nothing in this License shall be construed as excluding or limiting
1071 |
1072 | any implied license or other defenses to infringement that may
1073 |
1074 | otherwise be available to you under applicable patent law.
1075 |
1076 |
1077 |
1078 | 12. No Surrender of Others' Freedom.
1079 |
1080 |
1081 |
1082 | If conditions are imposed on you (whether by court order, agreement or
1083 |
1084 | otherwise) that contradict the conditions of this License, they do not
1085 |
1086 | excuse you from the conditions of this License. If you cannot convey a
1087 |
1088 | covered work so as to satisfy simultaneously your obligations under this
1089 |
1090 | License and any other pertinent obligations, then as a consequence you may
1091 |
1092 | not convey it at all. For example, if you agree to terms that obligate you
1093 |
1094 | to collect a royalty for further conveying from those to whom you convey
1095 |
1096 | the Program, the only way you could satisfy both those terms and this
1097 |
1098 | License would be to refrain entirely from conveying the Program.
1099 |
1100 |
1101 |
1102 | 13. Use with the GNU Affero General Public License.
1103 |
1104 |
1105 |
1106 | Notwithstanding any other provision of this License, you have
1107 |
1108 | permission to link or combine any covered work with a work licensed
1109 |
1110 | under version 3 of the GNU Affero General Public License into a single
1111 |
1112 | combined work, and to convey the resulting work. The terms of this
1113 |
1114 | License will continue to apply to the part which is the covered work,
1115 |
1116 | but the special requirements of the GNU Affero General Public License,
1117 |
1118 | section 13, concerning interaction through a network will apply to the
1119 |
1120 | combination as such.
1121 |
1122 |
1123 |
1124 | 14. Revised Versions of this License.
1125 |
1126 |
1127 |
1128 | The Free Software Foundation may publish revised and/or new versions of
1129 |
1130 | the GNU General Public License from time to time. Such new versions will
1131 |
1132 | be similar in spirit to the present version, but may differ in detail to
1133 |
1134 | address new problems or concerns.
1135 |
1136 |
1137 |
1138 | Each version is given a distinguishing version number. If the
1139 |
1140 | Program specifies that a certain numbered version of the GNU General
1141 |
1142 | Public License "or any later version" applies to it, you have the
1143 |
1144 | option of following the terms and conditions either of that numbered
1145 |
1146 | version or of any later version published by the Free Software
1147 |
1148 | Foundation. If the Program does not specify a version number of the
1149 |
1150 | GNU General Public License, you may choose any version ever published
1151 |
1152 | by the Free Software Foundation.
1153 |
1154 |
1155 |
1156 | If the Program specifies that a proxy can decide which future
1157 |
1158 | versions of the GNU General Public License can be used, that proxy's
1159 |
1160 | public statement of acceptance of a version permanently authorizes you
1161 |
1162 | to choose that version for the Program.
1163 |
1164 |
1165 |
1166 | Later license versions may give you additional or different
1167 |
1168 | permissions. However, no additional obligations are imposed on any
1169 |
1170 | author or copyright holder as a result of your choosing to follow a
1171 |
1172 | later version.
1173 |
1174 |
1175 |
1176 | 15. Disclaimer of Warranty.
1177 |
1178 |
1179 |
1180 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
1181 |
1182 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
1183 |
1184 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
1185 |
1186 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
1187 |
1188 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1189 |
1190 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
1191 |
1192 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
1193 |
1194 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
1195 |
1196 |
1197 |
1198 | 16. Limitation of Liability.
1199 |
1200 |
1201 |
1202 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
1203 |
1204 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
1205 |
1206 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
1207 |
1208 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
1209 |
1210 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
1211 |
1212 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
1213 |
1214 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
1215 |
1216 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
1217 |
1218 | SUCH DAMAGES.
1219 |
1220 |
1221 |
1222 | 17. Interpretation of Sections 15 and 16.
1223 |
1224 |
1225 |
1226 | If the disclaimer of warranty and limitation of liability provided
1227 |
1228 | above cannot be given local legal effect according to their terms,
1229 |
1230 | reviewing courts shall apply local law that most closely approximates
1231 |
1232 | an absolute waiver of all civil liability in connection with the
1233 |
1234 | Program, unless a warranty or assumption of liability accompanies a
1235 |
1236 | copy of the Program in return for a fee.
1237 |
1238 |
1239 |
1240 | END OF TERMS AND CONDITIONS
1241 |
1242 |
1243 |
1244 | How to Apply These Terms to Your New Programs
1245 |
1246 |
1247 |
1248 | If you develop a new program, and you want it to be of the greatest
1249 |
1250 | possible use to the public, the best way to achieve this is to make it
1251 |
1252 | free software which everyone can redistribute and change under these terms.
1253 |
1254 |
1255 |
1256 | To do so, attach the following notices to the program. It is safest
1257 |
1258 | to attach them to the start of each source file to most effectively
1259 |
1260 | state the exclusion of warranty; and each file should have at least
1261 |
1262 | the "copyright" line and a pointer to where the full notice is found.
1263 |
1264 |
1265 |
1266 |
1267 |
1268 | Copyright (C)
1269 |
1270 |
1271 |
1272 | This program is free software: you can redistribute it and/or modify
1273 |
1274 | it under the terms of the GNU General Public License as published by
1275 |
1276 | the Free Software Foundation, either version 3 of the License, or
1277 |
1278 | (at your option) any later version.
1279 |
1280 |
1281 |
1282 | This program is distributed in the hope that it will be useful,
1283 |
1284 | but WITHOUT ANY WARRANTY; without even the implied warranty of
1285 |
1286 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1287 |
1288 | GNU General Public License for more details.
1289 |
1290 |
1291 |
1292 | You should have received a copy of the GNU General Public License
1293 |
1294 | along with this program. If not, see .
1295 |
1296 |
1297 |
1298 | Also add information on how to contact you by electronic and paper mail.
1299 |
1300 |
1301 |
1302 | If the program does terminal interaction, make it output a short
1303 |
1304 | notice like this when it starts in an interactive mode:
1305 |
1306 |
1307 |
1308 | Copyright (C)
1309 |
1310 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
1311 |
1312 | This is free software, and you are welcome to redistribute it
1313 |
1314 | under certain conditions; type `show c' for details.
1315 |
1316 |
1317 |
1318 | The hypothetical commands `show w' and `show c' should show the appropriate
1319 |
1320 | parts of the General Public License. Of course, your program's commands
1321 |
1322 | might be different; for a GUI interface, you would use an "about box".
1323 |
1324 |
1325 |
1326 | You should also get your employer (if you work as a programmer) or school,
1327 |
1328 | if any, to sign a "copyright disclaimer" for the program, if necessary.
1329 |
1330 | For more information on this, and how to apply and follow the GNU GPL, see
1331 |
1332 | .
1333 |
1334 |
1335 |
1336 | The GNU General Public License does not permit incorporating your program
1337 |
1338 | into proprietary programs. If your program is a subroutine library, you
1339 |
1340 | may consider it more useful to permit linking proprietary applications with
1341 |
1342 | the library. If this is what you want to do, use the GNU Lesser General
1343 |
1344 | Public License instead of this License. But first, please read
1345 |
1346 | .
1347 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Cyberpwned
2 |
3 | Cyberpunk 2077 Hacking Minigame Resolver - Play Store: https://play.google.com/store/apps/details?id=com.nicolassiplis.cyberpwned
4 |
5 | ## Requirements
6 | - Flutter
7 | - Currently tested with version 2.0
8 | - https://flutter.dev/
9 | - A personal Firebase project
10 | - Required to get a valid google-services.json file
11 | - https://support.google.com/firebase/answer/7015592?hl=en
12 | - Android Studio/IntelliJ with Flutter plugin
13 | - Not entirely required, but should allow you to test the app without having to side-load it into your phone
14 |
15 | ## Installing and running
16 |
17 | Make sure you copy your google-services.json file to android/app, otherwise you'll get a build error and won't be able to compile the application.
18 |
19 | There are several ways of trying out the app:
20 | * From the command line, you can do ```flutter build apk``` which should generate an app-release.apk file in build/outputs/apk/release. You should then be able to side-load the app into your phone.
21 | * If you're using Android Studio/IntelliJ with the Flutter plugin installed, take a look at the following guide: https://flutter.dev/docs/get-started/test-drive?tab=androidstudio#run-the-app. Assuming you're using an emulator, you'll need to configure a webcam to actually test the app: https://stackoverflow.com/a/30792615/4572619.
22 | * If you'd like to run the application on your device without having to side-load it: https://stackoverflow.com/a/54526682/4572619
23 | * If you're willing to side-load the APK file, download it from: https://github.com/nicolas-siplis/cyberpwned/releases
24 |
25 | 
26 |
27 | 
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | local.properties
13 | app/google-services.json
14 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | def keystoreProperties = new Properties()
29 | def keystorePropertiesFile = rootProject.file('key.properties')
30 | if (keystorePropertiesFile.exists()) {
31 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
32 | }
33 |
34 | rootProject.buildDir = '../build'
35 | subprojects {
36 | project.buildDir = "${rootProject.buildDir}/${project.name}"
37 | }
38 | subprojects {
39 | project.evaluationDependsOn(':app')
40 | }
41 | subprojects {
42 | afterEvaluate { project ->
43 | if (project.hasProperty('android')) {
44 | project.android {
45 | if (namespace == null) {
46 | namespace "com.nicolassiplis.cyberpwned"
47 | }
48 | }
49 | }
50 | }
51 | }
52 |
53 | android {
54 |
55 | namespace "com.nicolassiplis.cyberpwned"
56 |
57 | sourceSets {
58 | main.java.srcDirs += 'src/main/kotlin'
59 | }
60 |
61 | lintOptions {
62 | disable 'InvalidPackage'
63 | }
64 |
65 | defaultConfig {
66 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
67 | applicationId "com.nicolassiplis.cyberpwned"
68 | minSdkVersion 23
69 | targetSdkVersion 34
70 | compileSdkVersion 34
71 | versionCode flutterVersionCode.toInteger()
72 | versionName flutterVersionName
73 | }
74 |
75 | signingConfigs {
76 | release {
77 | keyAlias keystoreProperties['keyAlias']
78 | keyPassword keystoreProperties['keyPassword']
79 | storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
80 | storePassword keystoreProperties['storePassword']
81 | }
82 | }
83 |
84 | buildTypes {
85 | release {
86 | signingConfig signingConfigs.release
87 | shrinkResources false
88 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
89 | }
90 | }
91 | }
92 |
93 | flutter {
94 | source '../..'
95 | }
96 |
97 | dependencies {
98 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
99 | }
100 |
101 | apply plugin: 'com.google.gms.google-services' // Google Services plugin
--------------------------------------------------------------------------------
/android/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -keep class io.flutter.plugin.editing.** { *; }
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
8 |
13 |
14 |
21 |
25 |
29 |
34 |
38 |
39 |
40 |
41 |
42 |
43 |
45 |
48 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/nicolassiplis/cyberpwned/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.nicolassiplis.cyberpwned
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.9.23'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:7.4.2'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | classpath 'com.google.gms:google-services:4.4.1' // Google Services plugin
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | google()
18 | jcenter()
19 | }
20 | }
21 |
22 | rootProject.buildDir = '../build'
23 | subprojects {
24 | project.buildDir = "${rootProject.buildDir}/${project.name}"
25 | }
26 | subprojects {
27 | project.evaluationDependsOn(':app')
28 | }
29 |
30 | tasks.register("clean", Delete) {
31 | delete rootProject.buildDir
32 | }
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 | android.enableR8=true
5 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-all.zip
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/assets/icon/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/assets/icon/icon.png
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
16 | /* End PBXBuildFile section */
17 |
18 | /* Begin PBXCopyFilesBuildPhase section */
19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
20 | isa = PBXCopyFilesBuildPhase;
21 | buildActionMask = 2147483647;
22 | dstPath = "";
23 | dstSubfolderSpec = 10;
24 | files = (
25 | );
26 | name = "Embed Frameworks";
27 | runOnlyForDeploymentPostprocessing = 0;
28 | };
29 | /* End PBXCopyFilesBuildPhase section */
30 |
31 | /* Begin PBXFileReference section */
32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
45 | /* End PBXFileReference section */
46 |
47 | /* Begin PBXFrameworksBuildPhase section */
48 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
49 | isa = PBXFrameworksBuildPhase;
50 | buildActionMask = 2147483647;
51 | files = (
52 | );
53 | runOnlyForDeploymentPostprocessing = 0;
54 | };
55 | /* End PBXFrameworksBuildPhase section */
56 |
57 | /* Begin PBXGroup section */
58 | 9740EEB11CF90186004384FC /* Flutter */ = {
59 | isa = PBXGroup;
60 | children = (
61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
65 | );
66 | name = Flutter;
67 | sourceTree = "";
68 | };
69 | 97C146E51CF9000F007C117D = {
70 | isa = PBXGroup;
71 | children = (
72 | 9740EEB11CF90186004384FC /* Flutter */,
73 | 97C146F01CF9000F007C117D /* Runner */,
74 | 97C146EF1CF9000F007C117D /* Products */,
75 | );
76 | sourceTree = "";
77 | };
78 | 97C146EF1CF9000F007C117D /* Products */ = {
79 | isa = PBXGroup;
80 | children = (
81 | 97C146EE1CF9000F007C117D /* Runner.app */,
82 | );
83 | name = Products;
84 | sourceTree = "";
85 | };
86 | 97C146F01CF9000F007C117D /* Runner */ = {
87 | isa = PBXGroup;
88 | children = (
89 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
92 | 97C147021CF9000F007C117D /* Info.plist */,
93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
97 | );
98 | path = Runner;
99 | sourceTree = "";
100 | };
101 | /* End PBXGroup section */
102 |
103 | /* Begin PBXNativeTarget section */
104 | 97C146ED1CF9000F007C117D /* Runner */ = {
105 | isa = PBXNativeTarget;
106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
107 | buildPhases = (
108 | 9740EEB61CF901F6004384FC /* Run Script */,
109 | 97C146EA1CF9000F007C117D /* Sources */,
110 | 97C146EB1CF9000F007C117D /* Frameworks */,
111 | 97C146EC1CF9000F007C117D /* Resources */,
112 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
114 | );
115 | buildRules = (
116 | );
117 | dependencies = (
118 | );
119 | name = Runner;
120 | productName = Runner;
121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
122 | productType = "com.apple.product-type.application";
123 | };
124 | /* End PBXNativeTarget section */
125 |
126 | /* Begin PBXProject section */
127 | 97C146E61CF9000F007C117D /* Project object */ = {
128 | isa = PBXProject;
129 | attributes = {
130 | LastUpgradeCheck = 1020;
131 | ORGANIZATIONNAME = "";
132 | TargetAttributes = {
133 | 97C146ED1CF9000F007C117D = {
134 | CreatedOnToolsVersion = 7.3.1;
135 | LastSwiftMigration = 1100;
136 | };
137 | };
138 | };
139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
140 | compatibilityVersion = "Xcode 9.3";
141 | developmentRegion = en;
142 | hasScannedForEncodings = 0;
143 | knownRegions = (
144 | en,
145 | Base,
146 | );
147 | mainGroup = 97C146E51CF9000F007C117D;
148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
149 | projectDirPath = "";
150 | projectRoot = "";
151 | targets = (
152 | 97C146ED1CF9000F007C117D /* Runner */,
153 | );
154 | };
155 | /* End PBXProject section */
156 |
157 | /* Begin PBXResourcesBuildPhase section */
158 | 97C146EC1CF9000F007C117D /* Resources */ = {
159 | isa = PBXResourcesBuildPhase;
160 | buildActionMask = 2147483647;
161 | files = (
162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
166 | );
167 | runOnlyForDeploymentPostprocessing = 0;
168 | };
169 | /* End PBXResourcesBuildPhase section */
170 |
171 | /* Begin PBXShellScriptBuildPhase section */
172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
173 | isa = PBXShellScriptBuildPhase;
174 | buildActionMask = 2147483647;
175 | files = (
176 | );
177 | inputPaths = (
178 | );
179 | name = "Thin Binary";
180 | outputPaths = (
181 | );
182 | runOnlyForDeploymentPostprocessing = 0;
183 | shellPath = /bin/sh;
184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
185 | };
186 | 9740EEB61CF901F6004384FC /* Run Script */ = {
187 | isa = PBXShellScriptBuildPhase;
188 | buildActionMask = 2147483647;
189 | files = (
190 | );
191 | inputPaths = (
192 | );
193 | name = "Run Script";
194 | outputPaths = (
195 | );
196 | runOnlyForDeploymentPostprocessing = 0;
197 | shellPath = /bin/sh;
198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
199 | };
200 | /* End PBXShellScriptBuildPhase section */
201 |
202 | /* Begin PBXSourcesBuildPhase section */
203 | 97C146EA1CF9000F007C117D /* Sources */ = {
204 | isa = PBXSourcesBuildPhase;
205 | buildActionMask = 2147483647;
206 | files = (
207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
209 | );
210 | runOnlyForDeploymentPostprocessing = 0;
211 | };
212 | /* End PBXSourcesBuildPhase section */
213 |
214 | /* Begin PBXVariantGroup section */
215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
216 | isa = PBXVariantGroup;
217 | children = (
218 | 97C146FB1CF9000F007C117D /* Base */,
219 | );
220 | name = Main.storyboard;
221 | sourceTree = "";
222 | };
223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
224 | isa = PBXVariantGroup;
225 | children = (
226 | 97C147001CF9000F007C117D /* Base */,
227 | );
228 | name = LaunchScreen.storyboard;
229 | sourceTree = "";
230 | };
231 | /* End PBXVariantGroup section */
232 |
233 | /* Begin XCBuildConfiguration section */
234 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
235 | isa = XCBuildConfiguration;
236 | buildSettings = {
237 | ALWAYS_SEARCH_USER_PATHS = NO;
238 | CLANG_ANALYZER_NONNULL = YES;
239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
240 | CLANG_CXX_LIBRARY = "libc++";
241 | CLANG_ENABLE_MODULES = YES;
242 | CLANG_ENABLE_OBJC_ARC = YES;
243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
244 | CLANG_WARN_BOOL_CONVERSION = YES;
245 | CLANG_WARN_COMMA = YES;
246 | CLANG_WARN_CONSTANT_CONVERSION = YES;
247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
249 | CLANG_WARN_EMPTY_BODY = YES;
250 | CLANG_WARN_ENUM_CONVERSION = YES;
251 | CLANG_WARN_INFINITE_RECURSION = YES;
252 | CLANG_WARN_INT_CONVERSION = YES;
253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
258 | CLANG_WARN_STRICT_PROTOTYPES = YES;
259 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
260 | CLANG_WARN_UNREACHABLE_CODE = YES;
261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
263 | COPY_PHASE_STRIP = NO;
264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
265 | ENABLE_NS_ASSERTIONS = NO;
266 | ENABLE_STRICT_OBJC_MSGSEND = YES;
267 | GCC_C_LANGUAGE_STANDARD = gnu99;
268 | GCC_NO_COMMON_BLOCKS = YES;
269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
271 | GCC_WARN_UNDECLARED_SELECTOR = YES;
272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
273 | GCC_WARN_UNUSED_FUNCTION = YES;
274 | GCC_WARN_UNUSED_VARIABLE = YES;
275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
276 | MTL_ENABLE_DEBUG_INFO = NO;
277 | SDKROOT = iphoneos;
278 | SUPPORTED_PLATFORMS = iphoneos;
279 | TARGETED_DEVICE_FAMILY = "1,2";
280 | VALIDATE_PRODUCT = YES;
281 | };
282 | name = Profile;
283 | };
284 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
285 | isa = XCBuildConfiguration;
286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
287 | buildSettings = {
288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
289 | CLANG_ENABLE_MODULES = YES;
290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
291 | ENABLE_BITCODE = NO;
292 | FRAMEWORK_SEARCH_PATHS = (
293 | "$(inherited)",
294 | "$(PROJECT_DIR)/Flutter",
295 | );
296 | INFOPLIST_FILE = Runner/Info.plist;
297 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
298 | LIBRARY_SEARCH_PATHS = (
299 | "$(inherited)",
300 | "$(PROJECT_DIR)/Flutter",
301 | );
302 | PRODUCT_BUNDLE_IDENTIFIER = com.nicolassiplis.cyberpwned;
303 | PRODUCT_NAME = "$(TARGET_NAME)";
304 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
305 | SWIFT_VERSION = 5.0;
306 | VERSIONING_SYSTEM = "apple-generic";
307 | };
308 | name = Profile;
309 | };
310 | 97C147031CF9000F007C117D /* Debug */ = {
311 | isa = XCBuildConfiguration;
312 | buildSettings = {
313 | ALWAYS_SEARCH_USER_PATHS = NO;
314 | CLANG_ANALYZER_NONNULL = YES;
315 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
316 | CLANG_CXX_LIBRARY = "libc++";
317 | CLANG_ENABLE_MODULES = YES;
318 | CLANG_ENABLE_OBJC_ARC = YES;
319 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
320 | CLANG_WARN_BOOL_CONVERSION = YES;
321 | CLANG_WARN_COMMA = YES;
322 | CLANG_WARN_CONSTANT_CONVERSION = YES;
323 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
324 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
325 | CLANG_WARN_EMPTY_BODY = YES;
326 | CLANG_WARN_ENUM_CONVERSION = YES;
327 | CLANG_WARN_INFINITE_RECURSION = YES;
328 | CLANG_WARN_INT_CONVERSION = YES;
329 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
330 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
331 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
332 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
333 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
334 | CLANG_WARN_STRICT_PROTOTYPES = YES;
335 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
336 | CLANG_WARN_UNREACHABLE_CODE = YES;
337 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
338 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
339 | COPY_PHASE_STRIP = NO;
340 | DEBUG_INFORMATION_FORMAT = dwarf;
341 | ENABLE_STRICT_OBJC_MSGSEND = YES;
342 | ENABLE_TESTABILITY = YES;
343 | GCC_C_LANGUAGE_STANDARD = gnu99;
344 | GCC_DYNAMIC_NO_PIC = NO;
345 | GCC_NO_COMMON_BLOCKS = YES;
346 | GCC_OPTIMIZATION_LEVEL = 0;
347 | GCC_PREPROCESSOR_DEFINITIONS = (
348 | "DEBUG=1",
349 | "$(inherited)",
350 | );
351 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
352 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
353 | GCC_WARN_UNDECLARED_SELECTOR = YES;
354 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
355 | GCC_WARN_UNUSED_FUNCTION = YES;
356 | GCC_WARN_UNUSED_VARIABLE = YES;
357 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
358 | MTL_ENABLE_DEBUG_INFO = YES;
359 | ONLY_ACTIVE_ARCH = YES;
360 | SDKROOT = iphoneos;
361 | TARGETED_DEVICE_FAMILY = "1,2";
362 | };
363 | name = Debug;
364 | };
365 | 97C147041CF9000F007C117D /* Release */ = {
366 | isa = XCBuildConfiguration;
367 | buildSettings = {
368 | ALWAYS_SEARCH_USER_PATHS = NO;
369 | CLANG_ANALYZER_NONNULL = YES;
370 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
371 | CLANG_CXX_LIBRARY = "libc++";
372 | CLANG_ENABLE_MODULES = YES;
373 | CLANG_ENABLE_OBJC_ARC = YES;
374 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
375 | CLANG_WARN_BOOL_CONVERSION = YES;
376 | CLANG_WARN_COMMA = YES;
377 | CLANG_WARN_CONSTANT_CONVERSION = YES;
378 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
379 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
380 | CLANG_WARN_EMPTY_BODY = YES;
381 | CLANG_WARN_ENUM_CONVERSION = YES;
382 | CLANG_WARN_INFINITE_RECURSION = YES;
383 | CLANG_WARN_INT_CONVERSION = YES;
384 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
385 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
386 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
387 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
388 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
389 | CLANG_WARN_STRICT_PROTOTYPES = YES;
390 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
391 | CLANG_WARN_UNREACHABLE_CODE = YES;
392 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
393 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
394 | COPY_PHASE_STRIP = NO;
395 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
396 | ENABLE_NS_ASSERTIONS = NO;
397 | ENABLE_STRICT_OBJC_MSGSEND = YES;
398 | GCC_C_LANGUAGE_STANDARD = gnu99;
399 | GCC_NO_COMMON_BLOCKS = YES;
400 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
401 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
402 | GCC_WARN_UNDECLARED_SELECTOR = YES;
403 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
404 | GCC_WARN_UNUSED_FUNCTION = YES;
405 | GCC_WARN_UNUSED_VARIABLE = YES;
406 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
407 | MTL_ENABLE_DEBUG_INFO = NO;
408 | SDKROOT = iphoneos;
409 | SUPPORTED_PLATFORMS = iphoneos;
410 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
411 | TARGETED_DEVICE_FAMILY = "1,2";
412 | VALIDATE_PRODUCT = YES;
413 | };
414 | name = Release;
415 | };
416 | 97C147061CF9000F007C117D /* Debug */ = {
417 | isa = XCBuildConfiguration;
418 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
419 | buildSettings = {
420 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
421 | CLANG_ENABLE_MODULES = YES;
422 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
423 | ENABLE_BITCODE = NO;
424 | FRAMEWORK_SEARCH_PATHS = (
425 | "$(inherited)",
426 | "$(PROJECT_DIR)/Flutter",
427 | );
428 | INFOPLIST_FILE = Runner/Info.plist;
429 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
430 | LIBRARY_SEARCH_PATHS = (
431 | "$(inherited)",
432 | "$(PROJECT_DIR)/Flutter",
433 | );
434 | PRODUCT_BUNDLE_IDENTIFIER = com.nicolassiplis.cyberpwned;
435 | PRODUCT_NAME = "$(TARGET_NAME)";
436 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
437 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
438 | SWIFT_VERSION = 5.0;
439 | VERSIONING_SYSTEM = "apple-generic";
440 | };
441 | name = Debug;
442 | };
443 | 97C147071CF9000F007C117D /* Release */ = {
444 | isa = XCBuildConfiguration;
445 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
446 | buildSettings = {
447 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
448 | CLANG_ENABLE_MODULES = YES;
449 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
450 | ENABLE_BITCODE = NO;
451 | FRAMEWORK_SEARCH_PATHS = (
452 | "$(inherited)",
453 | "$(PROJECT_DIR)/Flutter",
454 | );
455 | INFOPLIST_FILE = Runner/Info.plist;
456 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
457 | LIBRARY_SEARCH_PATHS = (
458 | "$(inherited)",
459 | "$(PROJECT_DIR)/Flutter",
460 | );
461 | PRODUCT_BUNDLE_IDENTIFIER = com.nicolassiplis.cyberpwned;
462 | PRODUCT_NAME = "$(TARGET_NAME)";
463 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
464 | SWIFT_VERSION = 5.0;
465 | VERSIONING_SYSTEM = "apple-generic";
466 | };
467 | name = Release;
468 | };
469 | /* End XCBuildConfiguration section */
470 |
471 | /* Begin XCConfigurationList section */
472 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
473 | isa = XCConfigurationList;
474 | buildConfigurations = (
475 | 97C147031CF9000F007C117D /* Debug */,
476 | 97C147041CF9000F007C117D /* Release */,
477 | 249021D3217E4FDB00AE95B9 /* Profile */,
478 | );
479 | defaultConfigurationIsVisible = 0;
480 | defaultConfigurationName = Release;
481 | };
482 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
483 | isa = XCConfigurationList;
484 | buildConfigurations = (
485 | 97C147061CF9000F007C117D /* Debug */,
486 | 97C147071CF9000F007C117D /* Release */,
487 | 249021D4217E4FDB00AE95B9 /* Profile */,
488 | );
489 | defaultConfigurationIsVisible = 0;
490 | defaultConfigurationName = Release;
491 | };
492 | /* End XCConfigurationList section */
493 | };
494 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
495 | }
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | cyberpwned
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 | NSCameraUsageDescription
31 | UIViewControllerBasedStatusBarAppearance
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/lib/cell.dart:
--------------------------------------------------------------------------------
1 | import 'package:Cyberpwned/path.dart';
2 | import 'package:Cyberpwned/score.dart';
3 | import 'package:Cyberpwned/util.dart';
4 | import 'package:flutter/material.dart';
5 |
6 | import 'dart:ui';
7 |
8 | import 'package:flutter/widgets.dart';
9 | import 'package:google_fonts/google_fonts.dart';
10 |
11 | class CellGroup implements Iterable> {
12 | Map state;
13 |
14 | CellGroup(this._group, this.state);
15 |
16 | List> _group = [];
17 |
18 | void clear() {
19 | _group.clear();
20 | }
21 |
22 | Map> asMap() {
23 | return _group.asMap();
24 | }
25 |
26 | List map(T Function(List) f) {
27 | return _group.map(f).toList();
28 | }
29 |
30 | bool any(bool Function(List) f) {
31 | return _group.any(f);
32 | }
33 |
34 | bool remove(List elm) {
35 | return _group.remove(elm);
36 | }
37 |
38 | List removeAt(int idx) {
39 | return _group.removeAt(idx);
40 | }
41 |
42 | void add(List elm) {
43 | _group.add(elm);
44 | }
45 |
46 | void insert(int idx, List elm) {
47 | _group.insert(idx, elm);
48 | }
49 |
50 | void addAll(Iterable> it) {
51 | _group.addAll(it);
52 | }
53 |
54 | bool get isNotEmpty { return _group.isNotEmpty; }
55 | bool get isEmpty { return _group.isEmpty; }
56 | int get length { return _group.length; }
57 |
58 |
59 | @override
60 | String toString() {
61 | return _group.toString();
62 | }
63 |
64 | String get(int r, int c) {
65 | return _group[r][c];
66 | }
67 |
68 | List getRow(int r) {
69 | return _group[r];
70 | }
71 |
72 | void set(int r, int c, String v) {
73 | _group[r][c] = v;
74 | }
75 |
76 | @override
77 | Iterable cast() {
78 | // TODO: implement cast
79 | throw UnimplementedError();
80 | }
81 |
82 | @override
83 | bool contains(Object element) {
84 | return _group.contains(element);
85 | }
86 |
87 | @override
88 | Iterable elementAt(int index) {
89 | return _group.elementAt(index);
90 | }
91 |
92 | @override
93 | bool every(bool Function(Iterable element) test) {
94 | return _group.every(test);
95 | }
96 |
97 | @override
98 | Iterable expand(Iterable Function(Iterable element) f) {
99 | return _group.expand(f);
100 | }
101 |
102 | @override
103 | Iterable get first => _group.first;
104 |
105 | @override
106 | Iterable firstWhere(bool Function(Iterable element) test, {Iterable Function() orElse}) {
107 | return _group.firstWhere(test, orElse: orElse);
108 | }
109 |
110 | @override
111 | T fold(T initialValue, T Function(T previousValue, Iterable element) combine) {
112 | return _group.fold(initialValue, combine);
113 | }
114 |
115 | @override
116 | Iterable> followedBy(Iterable> other) {
117 | return _group.followedBy(other);
118 | }
119 |
120 | @override
121 | void forEach(void Function(Iterable element) f) {
122 | _group.forEach(f);
123 | }
124 |
125 | @override
126 | // TODO: implement iterator
127 | Iterator> get iterator => _group.iterator;
128 |
129 | @override
130 | String join([String separator = ""]) {
131 | return _group.join(separator);
132 | }
133 |
134 | @override
135 | // TODO: implement last
136 | Iterable get last => _group.last;
137 |
138 | @override
139 | Iterable lastWhere(bool Function(Iterable element) test, {Iterable Function() orElse}) {
140 | return _group.lastWhere(test, orElse: orElse);
141 | }
142 |
143 | @override
144 | Iterable reduce(Iterable Function(Iterable value, Iterable element) combine) {
145 | return _group.reduce((value, element) => combine(value, element));
146 | }
147 |
148 | @override
149 | // TODO: implement single
150 | Iterable get single => _group.single;
151 |
152 | @override
153 | Iterable singleWhere(bool Function(Iterable element) test, {Iterable Function() orElse}) {
154 | return _group.singleWhere(test, orElse: orElse);
155 | }
156 |
157 | @override
158 | Iterable> skip(int count) {
159 | return _group.skip(count);
160 | }
161 |
162 | @override
163 | Iterable> skipWhile(bool Function(Iterable value) test) {
164 | return _group.skipWhile(test);
165 | }
166 |
167 | @override
168 | Iterable> take(int count) {
169 | return _group.take(count);
170 | }
171 |
172 | @override
173 | Iterable> takeWhile(bool Function(Iterable value) test) {
174 | return _group.takeWhile(test);
175 | }
176 |
177 | @override
178 | List> toList({bool growable = true}) {
179 | return _group.toList(growable: growable);
180 | }
181 |
182 | @override
183 | Set> toSet() {
184 | return _group.toSet();
185 | }
186 |
187 | @override
188 | Iterable> where(bool Function(Iterable element) test) {
189 | return _group.where(test);
190 | }
191 |
192 | @override
193 | Iterable whereType() {
194 | return _group.whereType();
195 | }
196 | }
197 |
198 | enum CellType { MATRIX, SEQUENCE, TOGGLE }
199 |
200 | class DisplayCell {
201 | int x;
202 | int y;
203 | int bufferSize;
204 | TraversedPath solution;
205 | bool showIndex = false;
206 | List sequences;
207 | CellGroup matrix;
208 | CellType _cellType;
209 | bool solutionFound;
210 |
211 | DisplayCell.forMatrix(this.x, this.y, this.bufferSize, this.sequences, this.solution, this.matrix, {this.showIndex = true}) {
212 | this._cellType = CellType.MATRIX;
213 | }
214 |
215 | DisplayCell.forSequence(this.x, this.y, this.bufferSize, this.sequences, this.solution, this.matrix, this.solutionFound, {this.showIndex = false}) {
216 | this._cellType = CellType.SEQUENCE;
217 | }
218 |
219 | DisplayCell.forToggle(this.x, this.y, this.bufferSize, this.sequences, this.solution, this.matrix, {this.showIndex = false}) {
220 | this._cellType = CellType.TOGGLE;
221 | }
222 |
223 | String _isPartOfSolution() {
224 | if (bufferSize == null) return null;
225 | if (solution.coords.length > bufferSize) return null;
226 | for (int i = 0; i < solution.coords.length; i++) {
227 | if (solution.coords[i][0] == x && solution.coords[i][1] == y) {
228 | return (i + 1).toString();
229 | }
230 | }
231 | return null;
232 | }
233 |
234 | Color _colorForCell() {
235 | if (bufferSize == null) return AppColor.getDeactivated();
236 | if (_cellType == CellType.SEQUENCE) {
237 | if (!(matrix.state[sequences.where((e) => e != "").toList().toString()] == null || matrix.state[sequences.where((e) => e != "").toList().toString()])) {
238 | return AppColor.getDeactivated();
239 | }
240 | }
241 | if (solution.coords.isEmpty) return AppColor.getInteractable();
242 | if (solution.coords.length > bufferSize || !solutionFound) return AppColor.getInteractable();
243 |
244 | if (_cellType == CellType.SEQUENCE) {
245 | if (SequenceScore(sequences.where((element) => element.isNotEmpty && element != "-"), bufferSize).isCompletedBy(solution, matrix)) {
246 | return AppColor.getSuccess();
247 | }
248 | return AppColor.getFailure();
249 | } else if (_cellType != CellType.SEQUENCE) {
250 | return (_isPartOfSolution() != null) ? AppColor.getSuccess() : AppColor.getFailure();
251 | }
252 | return AppColor.getInteractable();
253 | }
254 | List _items = ['1C', '55', 'FF', '7A', 'BD', 'E9', '-'];
255 |
256 | Widget render({String elm, Color color, onTap, void Function() callback}) {
257 | if (matrix == null) {
258 | return InkWell(
259 | onTap: onTap,
260 | child: AnimatedContainer(
261 | decoration: BoxDecoration(color: color?.withOpacity(0.3) ?? _colorForCell().withOpacity(0.3),
262 | border: _cellType == CellType.MATRIX
263 | ? Border.all(color: color ?? _colorForCell(), width: 2)
264 | : Border.symmetric(horizontal: BorderSide(color: color ?? _colorForCell(), width: 2))),
265 | duration: Duration(milliseconds: 300),
266 | child: Text(
267 | elm ?? (showIndex ? (_isPartOfSolution() ?? matrix.get(x, y)) : (_cellType == CellType.MATRIX ? matrix.get(x, y) : sequences[y])),
268 | textAlign: TextAlign.center,
269 | style: TextStyle(
270 | color: color ?? _colorForCell(),
271 | fontSize: 22,
272 | fontWeight: FontWeight.bold,
273 | fontFamily: GoogleFonts
274 | .rajdhani()
275 | .fontFamily))));
276 | }
277 | TextStyle style = TextStyle(
278 | color: _colorForCell(),
279 | fontSize: 22,
280 | fontWeight: FontWeight.bold,
281 | fontFamily: GoogleFonts.rajdhani().fontFamily);
282 | var value = y >= sequences.length ? "" : sequences[y];
283 | value = value == "" ? "-" : value;
284 | return InkWell(
285 | onTap: onTap,
286 | child: AnimatedContainer(
287 | decoration: BoxDecoration(color: color?.withOpacity(0.3) ?? _colorForCell().withOpacity(0.3), border: _cellType == CellType.MATRIX ? Border.all(color: color ?? _colorForCell(), width: 2) : Border.symmetric(horizontal: BorderSide(color: color ?? _colorForCell(), width: 2))),
288 | duration: Duration(milliseconds: 300),
289 | child: DropdownButtonHideUnderline(child: DropdownButton(
290 | value: value,
291 | style: style,
292 | isExpanded: true,
293 | iconSize: 0,
294 | onChanged: (String newValue) {
295 | if (_items.contains(newValue)) {
296 | if (y >= sequences.length) {
297 | this.sequences.add(newValue);
298 | } else {
299 | this.sequences[y] = newValue;
300 | }
301 | }
302 | if (callback != null) callback();
303 | },
304 | items: _items.map((String each) {
305 | return DropdownMenuItem(
306 | value: each,
307 | child: Container(alignment: Alignment.center, child: Text(each, style: style, textAlign: TextAlign.center)),
308 | );
309 | }).toList()))));
310 | }
311 | }
312 |
313 | enum OrderType { MATRIX, SEQUENCE }
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:Cyberpwned/path.dart';
2 | import 'package:Cyberpwned/sequence.dart';
3 | import 'package:Cyberpwned/util.dart';
4 | import 'package:Cyberpwned/cell.dart';
5 | import 'package:app_review/app_review.dart';
6 |
7 | import 'dart:async';
8 | import 'dart:math';
9 |
10 | import 'package:firebase_ml_vision/firebase_ml_vision.dart';
11 | import 'package:flutter/foundation.dart';
12 | import 'package:flutter/material.dart';
13 | import 'package:flutter/services.dart';
14 | import 'package:image_picker/image_picker.dart';
15 | import 'package:google_fonts/google_fonts.dart';
16 | import 'package:shared_preferences/shared_preferences.dart';
17 |
18 | import 'dart:io' show File, Platform;
19 |
20 | import 'package:url_launcher/url_launcher.dart';
21 |
22 | /// If the current platform is desktop, override the default platform to
23 | /// a supported platform (iOS for macOS, Android for Linux and Windows).
24 | /// Otherwise, do nothing.
25 | void _setTargetPlatformForDesktop() {
26 | TargetPlatform targetPlatform;
27 | if (Platform.isMacOS) {
28 | targetPlatform = TargetPlatform.iOS;
29 | } else if (Platform.isLinux || Platform.isWindows) {
30 | targetPlatform = TargetPlatform.android;
31 | }
32 | if (targetPlatform != null) {
33 | debugDefaultTargetPlatformOverride = targetPlatform;
34 | }
35 | }
36 |
37 | Future main() async {
38 | if (!kIsWeb) _setTargetPlatformForDesktop();
39 |
40 | runApp(MaterialApp(
41 | theme: ThemeData(primarySwatch: Colors.amber, fontFamily: GoogleFonts.rajdhani().fontFamily, textTheme: GoogleFonts.solwayTextTheme()),
42 | home: MyApp(),
43 | debugShowCheckedModeBanner: false));
44 | }
45 |
46 | class MyApp extends StatefulWidget {
47 | @override
48 | _MyAppState createState() =>_MyAppState();
49 | }
50 |
51 | class CyberpunkButtonPainter extends CustomPainter {
52 | final Color strokeColor;
53 | final PaintingStyle paintingStyle;
54 | final double strokeWidth;
55 |
56 | CyberpunkButtonPainter({this.strokeColor, this.strokeWidth = 3, this.paintingStyle = PaintingStyle.fill});
57 |
58 | @override
59 | void paint(Canvas canvas, Size size) {
60 | Paint fillPaint = Paint()
61 | ..color = strokeColor.withOpacity(0.3)
62 | ..strokeWidth = strokeWidth
63 | ..style = PaintingStyle.fill;
64 |
65 | Paint strokePaint = Paint()
66 | ..color = strokeColor.withOpacity(1)
67 | ..strokeWidth = strokeWidth
68 | ..style = PaintingStyle.stroke;
69 |
70 | if (this.paintingStyle == PaintingStyle.fill) canvas.drawPath(getTrianglePath(size.width, size.height), fillPaint);
71 | canvas.drawPath(getTrianglePath(size.width, size.height), strokePaint);
72 | }
73 |
74 | Path getTrianglePath(double x, double y) {
75 | return Path()..lineTo(x, 0)..lineTo(x, y / 30 * 25)..lineTo(x / 30 * 28.5, y)..lineTo(0, y)..lineTo(0, 0);
76 | }
77 |
78 | @override
79 | bool shouldRepaint(CyberpunkButtonPainter oldDelegate) {
80 | return oldDelegate.strokeColor != strokeColor || oldDelegate.paintingStyle != paintingStyle || oldDelegate.strokeWidth != strokeWidth;
81 | }
82 | }
83 |
84 | class _MyAppState extends State {
85 | Map _error = {};
86 |
87 | CellGroup _matrix;
88 | CellGroup _sequences;
89 |
90 | bool _solutionFound = false;
91 |
92 | String appID = "";
93 |
94 | bool _firstScan = true;
95 |
96 | @override
97 | void initState() {
98 | _matrix = CellGroup([], _sequencesState);
99 |
100 | _sequences = CellGroup([], _sequencesState);
101 | verifyValidMatrix();
102 | loadBufferSize();
103 | super.initState();
104 | }
105 |
106 | void loadBufferSize() async {
107 | _bufferSize = (await SharedPreferences.getInstance()).getInt("bufferSize");
108 | if (_bufferSize != null) {
109 | _bufferSizeController = TextEditingController(text: _bufferSize.toString());
110 | } else {
111 | _bufferSizeController = TextEditingController();
112 | }
113 | _error["MISSING BUFFER SIZE"] = _bufferSize == null ? "Specify buffer size before calculating path." : "";
114 | setState(() {});
115 | }
116 |
117 | final TextRecognizer _textRecognizer = FirebaseVision.instance.textRecognizer();
118 |
119 | int _bufferSize;
120 | TextEditingController _bufferSizeController;
121 |
122 | final List _validHex = ["1C", "FF", "E9", "BD", "55", "7A"];
123 |
124 | Future _calculatePath() async {
125 | if (_solutionFound) return;
126 | _solution = TraversedPath([]);
127 | _solutionFound = false;
128 | setState(() {});
129 | if (Solution.calculationEnabled(_error, _bufferSize, _matrix, _sequences)) {
130 | _computeSolution("CALCULATING OPTIMAL PATH...", "path");
131 | }
132 | }
133 |
134 | Future _parseGroup(String entity, String processingMsg, CellGroup result, bool square, bool both) async {
135 | try {
136 | var file = await ImagePicker().getImage(source: ImageSource.camera);
137 | if (file == null) {
138 | return;
139 | }
140 |
141 | _processing[entity] = processingMsg;
142 | _error["SCREEN SCAN ERROR"] = "";
143 | _error["${entity.toUpperCase()} SCAN ERROR"] = "";
144 | _error["exception"] = "";
145 | _solution = TraversedPath([]);
146 | _solutionFound = false;
147 | if (!both) result.clear();
148 | _sequencesState.clear();
149 | setState(() {});
150 |
151 | final FirebaseVisionImage visionImage = FirebaseVisionImage.fromFilePath(file.path);
152 | final VisionText visionText = await _textRecognizer.processImage(visionImage);
153 | List captures = [];
154 | visionText.blocks.where((block) => block.text.split(" ").any((possibleHex) => _validHex.contains(possibleHex))).forEach((block) =>
155 | block.lines.map((l) => l.elements).forEach((elms) =>
156 | elms.forEach((e) {
157 | if (_validHex.contains(e.text.substring(0, min(e.text.length, 2)))) captures.add(SequenceCapture.fromElement(e, square));
158 | })));
159 |
160 | await File(file.path).delete();
161 |
162 | if (both) {
163 | _matrix.clear();
164 | _sequences.clear();
165 | _matrix.addAll(SequenceGroup(captures, true, both).get().map((s) => s.sequence));
166 | _sequences.addAll(SequenceGroup(captures, false, both).get().map((s) => s.sequence));
167 | _error["MATRIX SCAN ERROR"] = "";
168 | _error["SEQUENCE SCAN ERROR"] = "";
169 | } else {
170 | result.clear();
171 | var x = SequenceGroup(captures, square, both).get().map((s) => s.sequence);
172 | result.addAll(x);
173 | }
174 |
175 | if (_matrix.length == 0 || (_matrix.any((row) => row.length != _matrix.length))) {
176 | var e = Exception("Invalid matrix size: ${_matrix.map((r) => r.length).fold(0, (a, b) => a + b)} elements parsed.");
177 | _matrix.clear();
178 | throw e;
179 | }
180 |
181 | if (_sequences.length == 0) {
182 | var e = Exception("No sequences parsed.");
183 | _sequences.clear();
184 | throw e;
185 | }
186 |
187 | if (_bufferSize != null && both) {
188 | _computeSolution("CALCULATING OPTIMAL PATH...", "path");
189 | }
190 | } on Exception catch(e) {
191 | if (result != null) result.clear();
192 | _error["${entity.toUpperCase()} SCAN ERROR"] = Solution.parseError(entity);
193 | _error["exception"] = e.toString();
194 | }
195 | _processing[entity] = null;
196 | _firstScan = false;
197 | verifyValidMatrix();
198 | }
199 |
200 | void verifyValidMatrix() {
201 | if (_matrix.any((row) => row.any((e) => !_validHex.contains(e)))) {
202 | _error["INCOMPLETE MATRIX"] = "Some matrix elements couldn't be parsed. Any matrix value can be tapped and changed. You can also re-scan the matrix.";
203 | } else {
204 | _error["INCOMPLETE MATRIX"] = "";
205 | }
206 | setState(() {});
207 | }
208 |
209 | _launchURL() async {
210 | const url = 'https://www.buymeacoffee.com/nicolas.siplis';
211 | if (await canLaunch(url)) {
212 | await launch(url, forceWebView: true, enableJavaScript: true);
213 | } else {
214 | throw 'Could not launch $url';
215 | }
216 | }
217 |
218 |
219 | Map _processing = {};
220 |
221 | RawMaterialButton _parseButton(String text, String entity, Color strokeColor, Future Function() onPressed, {fontSize: 20.0, padding: 5.0, opacity: 0.95}) {
222 | return RawMaterialButton(
223 | child: CustomPaint(
224 | painter: CyberpunkButtonPainter(strokeColor: strokeColor, paintingStyle: PaintingStyle.stroke),
225 | child: Padding(
226 | padding: EdgeInsets.all(padding),
227 | child: Text(_processing[entity] ?? text,
228 | style: TextStyle(
229 | color: strokeColor,
230 | fontWeight: FontWeight.bold,
231 | fontSize: fontSize,
232 | fontFamily: GoogleFonts.rajdhani().fontFamily)))),
233 | onPressed: onPressed);
234 | }
235 |
236 | TraversedPath _solution = TraversedPath([]);
237 | Map _sequencesState = {};
238 |
239 | @override
240 | Widget build(BuildContext context) {
241 | return MaterialApp(
242 | home: Scaffold(
243 | appBar: AppBar(
244 | centerTitle: true,
245 | backgroundColor: Colors.black,
246 | title: Text('CYBERPWNED',
247 | style: TextStyle(
248 | color: AppColor.getNeutral(), fontFamily: GoogleFonts.rajdhani().fontFamily, fontWeight: FontWeight.bold, fontSize: 25)),
249 | ),
250 | body: Container(
251 | color: Colors.black,
252 | child: ListView(
253 | children: [
254 | Padding(
255 | padding: EdgeInsets.symmetric(horizontal: 0),
256 | child: TextField(
257 | textAlignVertical: TextAlignVertical.center,
258 | maxLines: 1,
259 | textAlign: TextAlign.center,
260 | controller: _bufferSizeController,
261 | style: TextStyle(
262 | color: AppColor.getNeutral(), fontSize: 20, fontWeight: FontWeight.bold, fontFamily: GoogleFonts.rajdhani().fontFamily),
263 | decoration: new InputDecoration(
264 | filled: true,
265 | hoverColor: (_bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral()).withOpacity(0.3),
266 | focusColor: (_bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral()).withOpacity(0.3),
267 | fillColor: (_bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral()).withOpacity(0.3),
268 | enabledBorder: OutlineInputBorder(
269 | borderSide: BorderSide(color: _bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral(), width: 2),
270 | ),
271 | focusedBorder: OutlineInputBorder(
272 | borderSide: BorderSide(color: _bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral(), width: 2)),
273 | labelText: "BUFFER SIZE",
274 | labelStyle: TextStyle(
275 | fontSize: 20,
276 | height: 1.75,
277 | fontWeight: FontWeight.bold,
278 | color: _bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral(),
279 | fontFamily: GoogleFonts.rajdhani().fontFamily,
280 | )),
281 | keyboardType: TextInputType.number,
282 | cursorColor: Colors.white,
283 | inputFormatters: [FilteringTextInputFormatter.digitsOnly],
284 | onSubmitted: (buffer) async {
285 | int newBuffer = int.tryParse(buffer, radix: 10);
286 | _error["MISSING BUFFER SIZE"] = newBuffer != null ? "" : "Specify buffer size before calculating path.";
287 | if (newBuffer != _bufferSize) {
288 | _solutionFound = false;
289 | _bufferSize = newBuffer;
290 | (await SharedPreferences.getInstance()).setInt("bufferSize", newBuffer);
291 | _solution = TraversedPath([]);
292 | }
293 | setState(() {});
294 | })),
295 | SizedBox(height: 8),
296 | Padding(
297 | padding: EdgeInsets.all(0),
298 | child: _parseButton(_processing["Screen"] ?? 'SCAN BREACH SCREEN', "Sequences", _matrix.isEmpty ? AppColor.getInteractable() : AppColor.getNeutral(),
299 | () => _parseGroup("Screen", "SCANNING SCREEN...", null, false, true), fontSize: 25.0, padding: 10.0, opacity: 1.0)),
300 | SizedBox(height: 8),
301 | Padding(
302 | padding: EdgeInsets.all(0),
303 | child: (_matrix.isNotEmpty || !_firstScan) ? AnimatedContainer(
304 | duration: Duration(milliseconds: 10000),
305 | child: _parseButton('RE-SCAN CODE MATRIX', "Matrix", _matrix.any((r) => r.contains("?")) ? AppColor.getInteractable() : AppColor.getNeutral(),
306 | () => _parseGroup("Matrix", "SCANNING CODE MATRIX...", _matrix, true, false))) : Container()),
307 | Padding(
308 | padding: EdgeInsets.all(0),
309 | child: Table(
310 | children: _matrix
311 | .asMap() // Need to know row's index
312 | .entries
313 | .map((row) => TableRow(
314 | children: row.value
315 | .asMap() // Need to know column's index
316 | .entries
317 | .map((column) => Padding(
318 | padding: EdgeInsets.all(2),
319 | child: Padding(
320 | padding: EdgeInsets.all(0),
321 | // Color cell depending on whether the coordinate is part of the optimal path
322 | // If the coordinate is part of the optimal path, show when it should be visited instead of displaying its value
323 | child: matrixCell(row.key, column.key, _bufferSize, _solution, _matrix.get(row.key, column.key)))))
324 | .toList()))
325 | .toList())),
326 | Padding(
327 | padding: EdgeInsets.all(0),
328 | child: (_sequences.isNotEmpty || !_firstScan) ? _parseButton('RE-SCAN SEQUENCES', "Sequences", AppColor.getInteractable(),
329 | () => _parseGroup("Sequence", "SCANNING SEQUENCES...", _sequences, false, false)) : Container()),
330 | Padding(
331 | padding: EdgeInsets.all(0),
332 | child: Table(
333 | children: _sequences
334 | .map((seq) =>
335 | // Make all rows the same length to prevent rendering error. TODO: Find a layout which removes the need for doing this
336 | seq + List.filled(max(5, _sequences.map((r) => r.length).fold(0, max)) - seq.length, ""))
337 | .toList()
338 | .asMap()
339 | .entries
340 | .map((sequence) => TableRow(
341 | children: ([MapEntry(-1, "")] + (sequence.value.asMap().entries.toList()))
342 | .map((elm) => elm.key >= 0
343 | ? Padding(
344 | padding: EdgeInsets.symmetric(vertical: 2),
345 | child: DisplayCell.forSequence(sequence.key, elm.key, _bufferSize, _sequences.getRow(sequence.key), _solution, _matrix, _solutionFound)
346 | .render(callback: () {
347 | _solutionFound = false;
348 | setState((){});
349 | }))
350 | : Padding(
351 | padding: EdgeInsets.symmetric(vertical: 2),
352 | child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [Container(height: 52.0, width: 52.0, child: DisplayCell.forToggle(null, null, _bufferSize, null, _solution, null).render(
353 | elm: _sequencesState[sequence.value.where((e) => e != "").toList().toString()] ?? true ? "✓" : "✗",
354 | color: _sequencesState[sequence.value.where((e) => e != "").toList().toString()] ?? true
355 | ? AppColor.getInteractable()
356 | : AppColor.getDeactivated(),
357 | onTap: () async {
358 | _solutionFound = false;
359 | var key = sequence.value.where((e) => e != "" && e != "-").toList().toString();
360 | var enabled = _sequencesState[key];
361 | _sequencesState[key] = !(enabled == null || enabled);
362 | setState(() {});
363 | }))])))
364 | .toList()))
365 | .toList())),
366 | Padding(
367 | padding: EdgeInsets.all(0),
368 | child: Row(
369 | crossAxisAlignment: CrossAxisAlignment.center,
370 | mainAxisAlignment: MainAxisAlignment.center,
371 | children: [
372 | Expanded(flex: 10, child: _parseButton(
373 | _processing["path"] ??
374 | (_error.keys.where((key) => _error[key] != "").map((key) => key + " ↓").toList() + ["CALCULATE PATH"])[0],
375 | "Path",
376 | _processing["path"] != null
377 | ? AppColor.getInteractable()
378 | : _error.keys.where((k) => _error[k] != "").length > 0
379 | ? AppColor.getFailure()
380 | : _solutionFound
381 | ? AppColor.getSuccess()
382 | : AppColor.getNeutral(),
383 | () => _calculatePath(), fontSize: 25.0))
384 | ])),
385 | Padding(
386 | padding: EdgeInsets.all(0),
387 | child: Text(Solution.allErrors(_error),
388 | style: TextStyle(
389 | color: AppColor.getFailure(), fontSize: Solution.allErrors(_error).isEmpty ? 0 : 20, fontWeight: FontWeight.bold, fontFamily: GoogleFonts.rajdhani().fontFamily),
390 | textAlign: TextAlign.justify)),
391 | _parseButton(
392 | "☕",
393 | "Donate",
394 | Colors.transparent,
395 | () => _launchURL())
396 | ],
397 | ),
398 | )),
399 | );
400 | }
401 |
402 | int _reviewCounter = 0;
403 |
404 | void _computeSolution(String processingMsg, String processingKey) {
405 | _processing[processingKey] = processingMsg;
406 | setState(() {});
407 | compute(Solution.calculateSolution, {
408 | "bufferSize": _bufferSize,
409 | "matrix": _matrix,
410 | "sequences": CellGroup(
411 | _sequences.map((row) => row.where((element) => element != "" && element != "-").toList()).where((element) => _sequencesState[element.toString()] == null || _sequencesState[element.toString()]).toList(), _sequencesState)
412 | }).then((solution) {
413 | _solution = solution;
414 | _solutionFound = true;
415 | _processing[processingKey] = null;
416 | _reviewCounter++;
417 | setState(() {});
418 | if (_reviewCounter % 2 == 0) {
419 | AppReview.requestReview.then((onValue) => setState(() {}));
420 | }
421 | }, onError: (error) {
422 | _error["CALCULATION ERROR"] = error.toString();
423 | });
424 | }
425 |
426 | Color _colorForCell(int bufferSize, TraversedPath solution, int x, int y, String dropdownValue) {
427 | if (dropdownValue == "?") return AppColor.getInteractable();
428 | if (bufferSize == null) return AppColor.getDeactivated();
429 | return (_isPartOfSolution(bufferSize, solution, x, y, dropdownValue) != null) ? AppColor.getSuccess() : (_solutionFound ? AppColor.getFailure() : AppColor.getNeutral());
430 | }
431 |
432 | String _isPartOfSolution(int bufferSize, TraversedPath solution, int x, int y, String dropdownValue) {
433 | if (!_solutionFound) return null;
434 | if (bufferSize == null) return null;
435 | if (solution.coords.length > bufferSize) return null;
436 | for (int i = 0; i < solution.coords.length; i++) {
437 | if (solution.coords[i][0] == x && solution.coords[i][1] == y) {
438 | return (i + 1).toString();
439 | }
440 | }
441 | return null;
442 | }
443 |
444 | List _items = ['1C', '55', 'FF', '7A', 'BD', 'E9', '?'];
445 | Widget matrixCell(int x, int y, int bufferSize, TraversedPath solution, String dropdownValue) {
446 | TextStyle style = TextStyle(
447 | color: _colorForCell(bufferSize, solution, x, y, dropdownValue),
448 | fontSize: 22,
449 | fontWeight: FontWeight.bold,
450 | fontFamily: GoogleFonts.rajdhani().fontFamily);
451 | String isPart = _isPartOfSolution(bufferSize, solution, x, y, dropdownValue);
452 | return AnimatedContainer(duration: Duration(milliseconds: 1000), child: SizedBox(height: 27, child: DecoratedBox(
453 | decoration: BoxDecoration(color: _colorForCell(bufferSize, solution, x, y, dropdownValue).withOpacity(0), border: Border.all(color: _colorForCell(bufferSize, solution, x, y, dropdownValue), width: 1)),
454 | child: DropdownButtonHideUnderline(child: DropdownButton(
455 | value: _isPartOfSolution(bufferSize, solution, x, y, dropdownValue) ?? dropdownValue,
456 | style: style,
457 | isExpanded: true,
458 | iconSize: 0,
459 | onChanged: (String newValue) {
460 | dropdownValue = newValue;
461 | if (_items.contains(newValue)) {
462 | _matrix.set(x, y, newValue);
463 | }
464 | verifyValidMatrix();
465 | },
466 | items: (isPart != null ? [isPart] : _items).map((String value) {
467 | return DropdownMenuItem(
468 | value: value,
469 | child: Container(alignment: Alignment.center, child: Text("${isPart != null ? _matrix.get(x, y) : value}${isPart == null ? '' : '/$isPart'}", style: style, textAlign: TextAlign.center)),
470 | );
471 | }).toList(),
472 | ))
473 | )));
474 | }
475 |
476 | }
477 |
--------------------------------------------------------------------------------
/lib/path.dart:
--------------------------------------------------------------------------------
1 | import 'package:Cyberpwned/score.dart';
2 | import 'package:Cyberpwned/cell.dart';
3 |
4 | class DuplicateCoordinateException implements Exception {}
5 |
6 | class TraversedPath {
7 | final List> coords;
8 |
9 | TraversedPath(this.coords);
10 |
11 | TraversedPath operator +(TraversedPath other) {
12 | List> newCoords = coords + other.coords;
13 | for (List otherCoord in other.coords) {
14 | for (List coord in coords) {
15 | if (coord[0] == otherCoord[0] && coord[1] == otherCoord[1]) {
16 | throw DuplicateCoordinateException();
17 | }
18 | }
19 | }
20 | return TraversedPath(newCoords);
21 | }
22 |
23 | @override
24 | String toString() {
25 | return coords.toString();
26 | }
27 | }
28 |
29 | class PathGenerator {
30 | int bufferSize;
31 | CellGroup matrix;
32 | CellGroup sequences;
33 |
34 | PathGenerator(this.matrix, this.sequences, this.bufferSize);
35 |
36 | List completedPaths = [];
37 |
38 | List> _candidateCoords(int turn, List coordinate) {
39 | List> coords = (turn % 2 == 0
40 | ? matrix.asMap().entries.map((column) => [coordinate[0], column.key])
41 | : matrix.asMap().entries.map((row) => [row.key, coordinate[1]]))
42 | .toList();
43 | return coords;
44 | }
45 |
46 | void _walkPaths(List partialPathsStack, int turn, List> candidates, {List ls}) {
47 | TraversedPath path = partialPathsStack.removeAt(partialPathsStack.length - 1);
48 | candidates = candidates.where((candidate) => !path.coords.any((coord) => coord[0] == candidate[0] && coord[1] == candidate[1])).toList();
49 | for (List coord in candidates) {
50 | TraversedPath newPath;
51 | newPath = path + TraversedPath([coord]);
52 |
53 | PathScore score = PathScore(matrix, newPath, sequences, bufferSize);
54 | if (score.compute() == score.maxScore()) {
55 | completedPaths = [newPath];
56 | throw PathCompletedException();
57 | }
58 |
59 | if (score.compute() == score.minScore()) {
60 | ls.add(newPath);
61 | continue;
62 | }
63 |
64 | if (newPath.coords.length == bufferSize) {
65 | completedPaths.add(newPath);
66 | } else {
67 | partialPathsStack.add(newPath);
68 | _walkPaths(partialPathsStack, turn + 1, _candidateCoords(turn + 1, coord), ls: ls);
69 | }
70 | }
71 | }
72 |
73 | List generate() {
74 | completedPaths.clear();
75 | if (bufferSize == 0) {
76 | return [TraversedPath([])];
77 | }
78 | List ls = [];
79 | if (completedPaths.length == 0) {
80 | try {
81 | _walkPaths([TraversedPath([])], 0, _candidateCoords(0, [0, 0]), ls: ls);
82 | } on PathCompletedException {
83 | return completedPaths;
84 | }
85 | }
86 | return completedPaths;
87 | }
88 | }
89 |
90 | class PathCompletedException implements Exception{}
--------------------------------------------------------------------------------
/lib/score.dart:
--------------------------------------------------------------------------------
1 | import 'package:Cyberpwned/cell.dart';
2 | import 'package:Cyberpwned/path.dart';
3 |
4 | import 'dart:math';
5 |
6 | class SequenceScore {
7 | List sequence;
8 | int bufferSize;
9 | int rewardLevel;
10 | int progress = 0;
11 | int maxProgress;
12 | int score = 0;
13 |
14 | SequenceScore(Iterable sequence, this.bufferSize, {int progress: 0, int rewardLevel: 0}) {
15 | this.sequence = sequence.toList();
16 | this.rewardLevel = rewardLevel;
17 | this.progress = progress;
18 | this.score = 0;
19 | this.maxProgress = this.sequence.length;
20 | }
21 |
22 | int compute(String compare) {
23 | if (_completed() || compare == null) {
24 | if (progress == maxProgress) {
25 | score = maxScore();
26 | } else if (bufferSize < maxProgress - progress) {
27 | score = minScore();
28 | }
29 | return score;
30 | }
31 |
32 | if (progress > 0 && sequence[progress] != compare && sequence[progress - 1] == compare) {
33 | bufferSize--;
34 | if (bufferSize < maxProgress - progress) {
35 | score = minScore();
36 | }
37 | return score;
38 | }
39 |
40 | int oldProgress = progress;
41 | progress += sequence[progress] == compare ? _increase() : _decrease(compare);
42 | score += (progress - oldProgress) * pow(10, rewardLevel);
43 | bufferSize--;
44 | return score;
45 | }
46 |
47 | bool isCompletedBy(TraversedPath path, CellGroup matrix) {
48 | if (path.coords.isEmpty) return null;
49 | path.coords.forEach((coord) => compute(matrix.get(coord[0], coord[1])));
50 | return compute(null) == maxScore();
51 | }
52 |
53 | int maxScore() {
54 | // Can be adjusted to maximize either:
55 | // a) highest quality rewards, possibly lesser quantity
56 | return pow(10, rewardLevel + 1);
57 | // b) highest amount of rewards, possibly lesser quality
58 | // this.score = 100 * (this.rewardLevel + 1);
59 | }
60 |
61 | int minScore() {
62 | return -((rewardLevel+1) * (rewardLevel + 2) ~/ 2);
63 | }
64 |
65 | // When the head of the sequence matches the targeted node, increase the score by 1
66 | // If the sequence has been completed, set the score depending on the reward level
67 | int _increase() {
68 | if (_completed()) return 0;
69 | return 1;
70 | }
71 |
72 | // When an incorrect value is matched against the current head of the sequence, the score is decreased by 1 (can't go below 0)
73 | // If it's not possible to complete the sequence, set the score to a negative value depending on the reward
74 | int _decrease(String compare) {
75 | if (_completed()) return 0;
76 | if (progress == 0) return 0;
77 | int i = progress;
78 | while (i != 0 && sequence[--i] != compare) {}
79 | if (sequence[i] == compare) {
80 | return -progress + i + 1;
81 | } else {
82 | return -progress;
83 | }
84 | }
85 |
86 | // A sequence is considered completed if no further progress is possible or necessary
87 | bool _completed() {
88 | return progress == maxProgress || bufferSize == null || bufferSize < maxProgress - progress;
89 | }
90 | }
91 |
92 | class PathScore {
93 | int score;
94 | TraversedPath path;
95 | int bufferSize;
96 | List sequenceScores = List();
97 | CellGroup matrix;
98 | static Map previousScores = {};
99 |
100 | PathScore(this.matrix, this.path, CellGroup sequences, this.bufferSize) {
101 | sequences.asMap().forEach((rewardLevel, sequence) => sequenceScores.add(SequenceScore(sequence, bufferSize, rewardLevel: rewardLevel)));
102 | }
103 |
104 | int compute() {
105 | if (score != null) {
106 | return score;
107 | }
108 | path.coords.forEach((coord) {
109 | int row = coord[0];
110 | int column = coord[1];
111 | sequenceScores.forEach((seqScore) => seqScore.compute(matrix.get(row, column)));
112 | });
113 | score = sequenceScores.map((seq) => seq.compute(null)).fold(0, (a, b) => a + b);
114 | return score;
115 | }
116 |
117 | int maxScore() {
118 | return sequenceScores.map((score) => score.maxScore()).fold(0, (a, b) => a + b);
119 | }
120 |
121 | int minScore() {
122 | return sequenceScores.map((score) => score.minScore()).fold(0, (a, b) => a + b);
123 | }
124 | }
--------------------------------------------------------------------------------
/lib/sequence.dart:
--------------------------------------------------------------------------------
1 | import 'dart:math';
2 |
3 | class IncompleteSequenceException implements Exception {}
4 |
5 | class SequenceGroup {
6 | List _group = [];
7 |
8 | final bool square;
9 | final bool both;
10 | bool ordered = false;
11 |
12 | SequenceGroup(this._group, this.square, this.both);
13 |
14 | void _complete(List partial, int size) {
15 | if (!square) return;
16 | if (partial.map((s) => s.sequence.length).fold(0, (a, b) => a + b) == size) return;
17 | if (partial.length < 2) return;
18 | partial.sort((a, b) => a.left.compareTo(b.left));
19 | partial.add(SequenceCapture(partial.last.right + 1, partial.last.right + 1 + partial.last.length(), partial.last.bottom, partial.last.top, ["?"], square));
20 | if (partial.length == size) return;
21 | partial.insert(0, SequenceCapture(partial.first.left - partial.first.length(), partial.first.left - 1, partial.first.bottom, partial.first.top, ["?"], square));
22 | _complete(partial, size);
23 | }
24 |
25 | void _divide(square) {
26 | _group.sort((a, b) => -(a.right.compareTo(b.right)));
27 | int idx;
28 | double maxDiff = 0;
29 | for (int i = 1; i < _group.length; i++) {
30 | double diff = (_group[i].right - _group[i - 1].right).abs();
31 | if (diff > maxDiff) {
32 | idx = i;
33 | maxDiff = diff;
34 | }
35 | }
36 | _group = square ? _group.sublist(idx) : _group.sublist(0, idx);
37 | }
38 |
39 | void _order() {
40 | if (_group.length == 0) throw Exception("No elements were parsed, please try again.");
41 |
42 | _deduplicate(square);
43 |
44 | if (both) _divide(square);
45 |
46 | int size = sqrt(_group.map((s) => s.sequence.length).fold(0, (a, b) => a + b)).round();
47 |
48 | if (square) sortGroup(size); else _group.sort((a, b) => a.top.compareTo(b.top));
49 |
50 | List result = [];
51 | List partial = [];
52 | for (int i = 0; i < _group.length; i++) {
53 | SequenceCapture current = _group[i];
54 | partial.sort((a, b) => a.left.compareTo(b.left));
55 | if (square && partial.map((s) => s.sequence.length).fold(0, (a, b) => a + b) == size) {
56 | result.add(partial.reduce((a, b) => a + b));
57 | partial.clear();
58 | } else if (partial.isNotEmpty && partial.map((p) => p.bottom).reduce(max) < current.top) {
59 | _complete(partial, size);
60 | result.add(partial.reduce((a, b) => a + b));
61 | partial.clear();
62 | }
63 | partial.add(current);
64 | }
65 | if (partial.isNotEmpty) {
66 | _complete(partial, size);
67 | result.insert(0, partial.reduce((a, b) => a + b));
68 | }
69 | _group.clear();
70 | _group.addAll(result);
71 | ordered = true;
72 | }
73 |
74 | sortGroup(int size) {
75 | var keypoints = _group;
76 | List points = [];
77 | int hold = 0;
78 | List rowPoints = [];
79 | while (keypoints.length > 0) {
80 | keypoints.sort((p, q) => (p.left + p.top).compareTo(q.left + q.top));
81 | var a = Vector([keypoints[0].left, keypoints[0].top, 0]);
82 | keypoints.sort((p, q) => (p.left/p.top).compareTo(q.left/q.top));
83 | var b = Vector([keypoints.last.left, keypoints.last.top, 0]);
84 | List remainingPoints = [];
85 |
86 | keypoints.sort((a, b) => a.top.compareTo(b.top));
87 | for (SequenceCapture k in keypoints) {
88 | var p = Vector([k.left, k.top, 0]);
89 | var d = sqrt((k.right - k.left) * (k.bottom - k.top));
90 | var dist = ((p - a).cross(b - a)).euclideanNorm() / b.euclideanNorm();
91 | if (d / 2 + hold > dist) {
92 | rowPoints.add(k);
93 | rowPoints.sort((a, b) => a.left.compareTo(b.left));
94 | } else {
95 | remainingPoints.add(k);
96 | }
97 | }
98 | if ((square && rowPoints.length != size) || (!square && rowPoints.length == 0)) {
99 | hold += 25;
100 | } else {
101 | points.addAll(rowPoints);
102 | rowPoints.clear();
103 | }
104 |
105 | keypoints = remainingPoints;
106 | }
107 | if (rowPoints.isNotEmpty) {
108 | points.addAll(rowPoints);
109 | }
110 | _group.clear();
111 | _group.addAll(points);
112 | }
113 |
114 | void _deduplicate(bool square) {
115 | List result = [];
116 | for (SequenceCapture a in _group) {
117 | var found = false;
118 | for (SequenceCapture b in result) {
119 | if ((a.right - b.right).abs() + (a.top - b.top).abs() < (square ? 125 : 50) ||
120 | (a.bottom - b.bottom).abs() + (a.left - b.left).abs() < (square ? 125 : 50) ||
121 | (a.right - b.right).abs() + (a.bottom - b.bottom).abs() < (square ? 125 : 50) ||
122 | (a.left - b.left).abs() + (a.top - b.top).abs() < (square ? 125 : 50)) {
123 | found = true;
124 | break;
125 | }
126 | }
127 | if (!found) result.add(a);
128 | }
129 | _group.clear();
130 | _group.addAll(result);
131 | }
132 |
133 | List get() {
134 | if (!ordered) _order();
135 | _group.sort((a, b) => a.top.compareTo(b.top)); // Sort result from top to bottom
136 | return _group;
137 | }
138 | }
139 |
140 | class SequenceCapture {
141 | double _left;
142 | double _right;
143 | double _top;
144 | double _bottom;
145 | List sequence;
146 | bool square;
147 |
148 | double get left => _left;
149 |
150 | double get right => _right;
151 |
152 | double get top => _top;
153 |
154 | double get bottom => _bottom;
155 |
156 | SequenceCapture(this._left, this._right, this._bottom, this._top, this.sequence, this.square);
157 |
158 | final List _validHex = ["1C", "FF", "E9", "BD", "55", "7A"];
159 |
160 | SequenceCapture.fromElement(TextElement block, this.square) {
161 | _left = block.boundingBox.left;
162 | _right = block.boundingBox.right;
163 | _top = block.boundingBox.top;
164 | _bottom = block.boundingBox.bottom;
165 | sequence = block.text
166 | .split(" ")
167 | .map((e) => e.length == 4 ? e.substring(0, 2) + " " + e.substring(2, 4) : e.substring(0, min(e.length, 2)))
168 | .join(" ")
169 | .split(" ")
170 | .where((e) => _validHex.contains(e))
171 | .toList();
172 | }
173 |
174 | double height() {
175 | return bottom - top;
176 | }
177 |
178 | double length() {
179 | return (right - left) / sequence.length;
180 | }
181 |
182 | SequenceCapture operator +(SequenceCapture other) {
183 | return SequenceCapture(
184 | min(left, other.left),
185 | max(right, other.right),
186 | max(bottom, other.bottom),
187 | min(top, other.top),
188 | left < other.left
189 | ? sequence + other.sequence
190 | : left > other.left
191 | ? other.sequence + sequence
192 | : right > other.right
193 | ? other.sequence + sequence
194 | : sequence + other.sequence,
195 | square);
196 | }
197 | }
198 |
--------------------------------------------------------------------------------
/lib/util.dart:
--------------------------------------------------------------------------------
1 | import 'package:Cyberpwned/score.dart';
2 | import 'package:Cyberpwned/path.dart';
3 | import 'package:Cyberpwned/cell.dart';
4 |
5 | import 'dart:ui';
6 |
7 | import 'package:flutter/material.dart';
8 |
9 |
10 | class AppColor {
11 |
12 | static Color getDeactivated() {
13 | return Colors.grey;
14 | }
15 |
16 | static Color getInteractable() {
17 | return Colors.blueAccent;
18 | }
19 |
20 | static Color getNeutral() {
21 | return Colors.orange;
22 | }
23 |
24 | static Color getSuccess() {
25 | return Colors.teal;
26 | }
27 |
28 | static Color getFailure() {
29 | return Colors.red;
30 | }
31 | }
32 |
33 | class Solution {
34 | static bool calculationEnabled(Map error, int bufferSize, CellGroup matrix, CellGroup sequences) {
35 | return allErrors(error).isEmpty && bufferSize != null && matrix.isNotEmpty && sequences.isNotEmpty;
36 | }
37 |
38 | static String allErrors(Map _error) {
39 | String result = "";
40 | for (String key in _error.keys) {
41 | if (_error[key] != "") {
42 | result += "\n" + _error[key];
43 | }
44 | }
45 | return result.trim();
46 | }
47 |
48 | static TraversedPath calculateSolution(map) {
49 | CellGroup matrix = map["matrix"];
50 | CellGroup sequences = map["sequences"];
51 | int bufferSize = map["bufferSize"];
52 | List allPaths = PathGenerator(matrix, sequences, bufferSize).generate();
53 | int maxScore = 0;
54 | TraversedPath maxPath = TraversedPath([]);
55 | for (TraversedPath path in allPaths) {
56 | int newScore = PathScore(matrix, path, sequences, bufferSize).compute();
57 | if (newScore > maxScore) {
58 | maxScore = newScore;
59 | maxPath = path;
60 | }
61 | }
62 | return maxPath;
63 | }
64 |
65 | static String parseError(String s) {
66 | return "$s parsing failed, try to take another picture.";
67 | }
68 | }
--------------------------------------------------------------------------------
/media/screenshot/error.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/media/screenshot/error.jpg
--------------------------------------------------------------------------------
/media/screenshot/solved.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/media/screenshot/solved.jpg
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | app_review:
5 | dependency: "direct main"
6 | description:
7 | name: app_review
8 | sha256: "936f286cd0bee4a1c49eaedeb30bef2252877868ac345506fbe2d67aa3e95c0b"
9 | url: "https://pub.dev"
10 | source: hosted
11 | version: "2.1.2+1"
12 | archive:
13 | dependency: transitive
14 | description:
15 | name: archive
16 | sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d"
17 | url: "https://pub.dev"
18 | source: hosted
19 | version: "3.4.10"
20 | args:
21 | dependency: transitive
22 | description:
23 | name: args
24 | sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
25 | url: "https://pub.dev"
26 | source: hosted
27 | version: "2.4.2"
28 | async:
29 | dependency: transitive
30 | description:
31 | name: async
32 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
33 | url: "https://pub.dev"
34 | source: hosted
35 | version: "2.11.0"
36 | boolean_selector:
37 | dependency: transitive
38 | description:
39 | name: boolean_selector
40 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
41 | url: "https://pub.dev"
42 | source: hosted
43 | version: "2.1.1"
44 | characters:
45 | dependency: transitive
46 | description:
47 | name: characters
48 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
49 | url: "https://pub.dev"
50 | source: hosted
51 | version: "1.3.0"
52 | checked_yaml:
53 | dependency: transitive
54 | description:
55 | name: checked_yaml
56 | sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
57 | url: "https://pub.dev"
58 | source: hosted
59 | version: "2.0.3"
60 | cli_util:
61 | dependency: transitive
62 | description:
63 | name: cli_util
64 | sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19
65 | url: "https://pub.dev"
66 | source: hosted
67 | version: "0.4.1"
68 | clock:
69 | dependency: transitive
70 | description:
71 | name: clock
72 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
73 | url: "https://pub.dev"
74 | source: hosted
75 | version: "1.1.1"
76 | collection:
77 | dependency: transitive
78 | description:
79 | name: collection
80 | sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
81 | url: "https://pub.dev"
82 | source: hosted
83 | version: "1.18.0"
84 | convert:
85 | dependency: transitive
86 | description:
87 | name: convert
88 | sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
89 | url: "https://pub.dev"
90 | source: hosted
91 | version: "3.1.1"
92 | cross_file:
93 | dependency: transitive
94 | description:
95 | name: cross_file
96 | sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32"
97 | url: "https://pub.dev"
98 | source: hosted
99 | version: "0.3.4+1"
100 | crypto:
101 | dependency: transitive
102 | description:
103 | name: crypto
104 | sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
105 | url: "https://pub.dev"
106 | source: hosted
107 | version: "3.0.3"
108 | cupertino_icons:
109 | dependency: "direct main"
110 | description:
111 | name: cupertino_icons
112 | sha256: caac504f942f41dfadcf45229ce8c47065b93919a12739f20d6173a883c5ec73
113 | url: "https://pub.dev"
114 | source: hosted
115 | version: "1.0.2"
116 | fake_async:
117 | dependency: transitive
118 | description:
119 | name: fake_async
120 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
121 | url: "https://pub.dev"
122 | source: hosted
123 | version: "1.3.1"
124 | ffi:
125 | dependency: transitive
126 | description:
127 | name: ffi
128 | sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
129 | url: "https://pub.dev"
130 | source: hosted
131 | version: "2.1.2"
132 | file:
133 | dependency: transitive
134 | description:
135 | name: file
136 | sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
137 | url: "https://pub.dev"
138 | source: hosted
139 | version: "7.0.0"
140 | file_selector_linux:
141 | dependency: transitive
142 | description:
143 | name: file_selector_linux
144 | sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492"
145 | url: "https://pub.dev"
146 | source: hosted
147 | version: "0.9.2+1"
148 | file_selector_macos:
149 | dependency: transitive
150 | description:
151 | name: file_selector_macos
152 | sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6
153 | url: "https://pub.dev"
154 | source: hosted
155 | version: "0.9.3+3"
156 | file_selector_platform_interface:
157 | dependency: transitive
158 | description:
159 | name: file_selector_platform_interface
160 | sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b
161 | url: "https://pub.dev"
162 | source: hosted
163 | version: "2.6.2"
164 | file_selector_windows:
165 | dependency: transitive
166 | description:
167 | name: file_selector_windows
168 | sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0
169 | url: "https://pub.dev"
170 | source: hosted
171 | version: "0.9.3+1"
172 | firebase_core:
173 | dependency: "direct main"
174 | description:
175 | name: firebase_core
176 | sha256: "4b45655ec1b21a1783681f72f840a2e74d298046c2b7c286ab0e4f0efbf93d0a"
177 | url: "https://pub.dev"
178 | source: hosted
179 | version: "2.28.0"
180 | firebase_core_platform_interface:
181 | dependency: transitive
182 | description:
183 | name: firebase_core_platform_interface
184 | sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63
185 | url: "https://pub.dev"
186 | source: hosted
187 | version: "5.0.0"
188 | firebase_core_web:
189 | dependency: transitive
190 | description:
191 | name: firebase_core_web
192 | sha256: "28e30e00748497b9a70db2025942a42c5d752534eb678e9b9b98db056cf404ba"
193 | url: "https://pub.dev"
194 | source: hosted
195 | version: "2.14.0"
196 | flutter:
197 | dependency: "direct main"
198 | description: flutter
199 | source: sdk
200 | version: "0.0.0"
201 | flutter_launcher_icons:
202 | dependency: "direct main"
203 | description:
204 | name: flutter_launcher_icons
205 | sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea"
206 | url: "https://pub.dev"
207 | source: hosted
208 | version: "0.13.1"
209 | flutter_plugin_android_lifecycle:
210 | dependency: transitive
211 | description:
212 | name: flutter_plugin_android_lifecycle
213 | sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da
214 | url: "https://pub.dev"
215 | source: hosted
216 | version: "2.0.17"
217 | flutter_test:
218 | dependency: "direct dev"
219 | description: flutter
220 | source: sdk
221 | version: "0.0.0"
222 | flutter_web_plugins:
223 | dependency: transitive
224 | description: flutter
225 | source: sdk
226 | version: "0.0.0"
227 | google_fonts:
228 | dependency: "direct main"
229 | description:
230 | name: google_fonts
231 | sha256: "6b6f10f0ce3c42f6552d1c70d2c28d764cf22bb487f50f66cca31dcd5194f4d6"
232 | url: "https://pub.dev"
233 | source: hosted
234 | version: "4.0.4"
235 | http:
236 | dependency: transitive
237 | description:
238 | name: http
239 | sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
240 | url: "https://pub.dev"
241 | source: hosted
242 | version: "0.13.6"
243 | http_parser:
244 | dependency: transitive
245 | description:
246 | name: http_parser
247 | sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
248 | url: "https://pub.dev"
249 | source: hosted
250 | version: "4.0.2"
251 | image:
252 | dependency: transitive
253 | description:
254 | name: image
255 | sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e"
256 | url: "https://pub.dev"
257 | source: hosted
258 | version: "4.1.7"
259 | image_picker:
260 | dependency: "direct main"
261 | description:
262 | name: image_picker
263 | sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd"
264 | url: "https://pub.dev"
265 | source: hosted
266 | version: "1.0.7"
267 | image_picker_android:
268 | dependency: transitive
269 | description:
270 | name: image_picker_android
271 | sha256: "42c098e7fb6334746be37cdc30369ade356ed4f14d48b7a0313f95a9159f4321"
272 | url: "https://pub.dev"
273 | source: hosted
274 | version: "0.8.9+5"
275 | image_picker_for_web:
276 | dependency: transitive
277 | description:
278 | name: image_picker_for_web
279 | sha256: "6a1704fdd75022272e7e7a897a9068e9c2ff3cd6a66820bf3ded810633eac954"
280 | url: "https://pub.dev"
281 | source: hosted
282 | version: "3.0.3"
283 | image_picker_ios:
284 | dependency: transitive
285 | description:
286 | name: image_picker_ios
287 | sha256: "917a5cadd67d052554cfb258595e54217de53fac5b52939426e26319a02e6297"
288 | url: "https://pub.dev"
289 | source: hosted
290 | version: "0.8.9+2"
291 | image_picker_linux:
292 | dependency: transitive
293 | description:
294 | name: image_picker_linux
295 | sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa"
296 | url: "https://pub.dev"
297 | source: hosted
298 | version: "0.2.1+1"
299 | image_picker_macos:
300 | dependency: transitive
301 | description:
302 | name: image_picker_macos
303 | sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62"
304 | url: "https://pub.dev"
305 | source: hosted
306 | version: "0.2.1+1"
307 | image_picker_platform_interface:
308 | dependency: transitive
309 | description:
310 | name: image_picker_platform_interface
311 | sha256: "3d2c323daea9d60608f1caf30be32a938916f4975434b8352e6f73dae496da38"
312 | url: "https://pub.dev"
313 | source: hosted
314 | version: "2.9.4"
315 | image_picker_windows:
316 | dependency: transitive
317 | description:
318 | name: image_picker_windows
319 | sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb"
320 | url: "https://pub.dev"
321 | source: hosted
322 | version: "0.2.1+1"
323 | js:
324 | dependency: transitive
325 | description:
326 | name: js
327 | sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
328 | url: "https://pub.dev"
329 | source: hosted
330 | version: "0.7.1"
331 | json_annotation:
332 | dependency: transitive
333 | description:
334 | name: json_annotation
335 | sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
336 | url: "https://pub.dev"
337 | source: hosted
338 | version: "4.8.1"
339 | leak_tracker:
340 | dependency: transitive
341 | description:
342 | name: leak_tracker
343 | sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
344 | url: "https://pub.dev"
345 | source: hosted
346 | version: "10.0.0"
347 | leak_tracker_flutter_testing:
348 | dependency: transitive
349 | description:
350 | name: leak_tracker_flutter_testing
351 | sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
352 | url: "https://pub.dev"
353 | source: hosted
354 | version: "2.0.1"
355 | leak_tracker_testing:
356 | dependency: transitive
357 | description:
358 | name: leak_tracker_testing
359 | sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
360 | url: "https://pub.dev"
361 | source: hosted
362 | version: "2.0.1"
363 | matcher:
364 | dependency: transitive
365 | description:
366 | name: matcher
367 | sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
368 | url: "https://pub.dev"
369 | source: hosted
370 | version: "0.12.16+1"
371 | material_color_utilities:
372 | dependency: transitive
373 | description:
374 | name: material_color_utilities
375 | sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
376 | url: "https://pub.dev"
377 | source: hosted
378 | version: "0.8.0"
379 | meta:
380 | dependency: transitive
381 | description:
382 | name: meta
383 | sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
384 | url: "https://pub.dev"
385 | source: hosted
386 | version: "1.11.0"
387 | mime:
388 | dependency: transitive
389 | description:
390 | name: mime
391 | sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
392 | url: "https://pub.dev"
393 | source: hosted
394 | version: "1.0.5"
395 | package_info_plus:
396 | dependency: transitive
397 | description:
398 | name: package_info_plus
399 | sha256: f62d7253edc197fe3c88d7c2ddab82d68f555e778d55390ccc3537eca8e8d637
400 | url: "https://pub.dev"
401 | source: hosted
402 | version: "1.4.3+1"
403 | package_info_plus_linux:
404 | dependency: transitive
405 | description:
406 | name: package_info_plus_linux
407 | sha256: "04b575f44233d30edbb80a94e57cad9107aada334fc02aabb42b6becd13c43fc"
408 | url: "https://pub.dev"
409 | source: hosted
410 | version: "1.0.5"
411 | package_info_plus_macos:
412 | dependency: transitive
413 | description:
414 | name: package_info_plus_macos
415 | sha256: a2ad8b4acf4cd479d4a0afa5a74ea3f5b1c7563b77e52cc32b3ee6956d5482a6
416 | url: "https://pub.dev"
417 | source: hosted
418 | version: "1.3.0"
419 | package_info_plus_platform_interface:
420 | dependency: transitive
421 | description:
422 | name: package_info_plus_platform_interface
423 | sha256: f7a0c8f1e7e981bc65f8b64137a53fd3c195b18d429fba960babc59a5a1c7ae8
424 | url: "https://pub.dev"
425 | source: hosted
426 | version: "1.0.2"
427 | package_info_plus_web:
428 | dependency: transitive
429 | description:
430 | name: package_info_plus_web
431 | sha256: f0829327eb534789e0a16ccac8936a80beed4e2401c4d3a74f3f39094a822d3b
432 | url: "https://pub.dev"
433 | source: hosted
434 | version: "1.0.6"
435 | package_info_plus_windows:
436 | dependency: transitive
437 | description:
438 | name: package_info_plus_windows
439 | sha256: "79524f11c42dd9078b96d797b3cf79c0a2883a50c4920dc43da8562c115089bc"
440 | url: "https://pub.dev"
441 | source: hosted
442 | version: "2.1.0"
443 | path:
444 | dependency: transitive
445 | description:
446 | name: path
447 | sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
448 | url: "https://pub.dev"
449 | source: hosted
450 | version: "1.9.0"
451 | path_provider:
452 | dependency: transitive
453 | description:
454 | name: path_provider
455 | sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b
456 | url: "https://pub.dev"
457 | source: hosted
458 | version: "2.1.2"
459 | path_provider_android:
460 | dependency: transitive
461 | description:
462 | name: path_provider_android
463 | sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668"
464 | url: "https://pub.dev"
465 | source: hosted
466 | version: "2.2.2"
467 | path_provider_foundation:
468 | dependency: transitive
469 | description:
470 | name: path_provider_foundation
471 | sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
472 | url: "https://pub.dev"
473 | source: hosted
474 | version: "2.3.2"
475 | path_provider_linux:
476 | dependency: transitive
477 | description:
478 | name: path_provider_linux
479 | sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
480 | url: "https://pub.dev"
481 | source: hosted
482 | version: "2.2.1"
483 | path_provider_platform_interface:
484 | dependency: transitive
485 | description:
486 | name: path_provider_platform_interface
487 | sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
488 | url: "https://pub.dev"
489 | source: hosted
490 | version: "2.1.2"
491 | path_provider_windows:
492 | dependency: transitive
493 | description:
494 | name: path_provider_windows
495 | sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
496 | url: "https://pub.dev"
497 | source: hosted
498 | version: "2.2.1"
499 | petitparser:
500 | dependency: transitive
501 | description:
502 | name: petitparser
503 | sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
504 | url: "https://pub.dev"
505 | source: hosted
506 | version: "6.0.2"
507 | platform:
508 | dependency: transitive
509 | description:
510 | name: platform
511 | sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
512 | url: "https://pub.dev"
513 | source: hosted
514 | version: "3.1.4"
515 | plugin_platform_interface:
516 | dependency: transitive
517 | description:
518 | name: plugin_platform_interface
519 | sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
520 | url: "https://pub.dev"
521 | source: hosted
522 | version: "2.1.8"
523 | pointycastle:
524 | dependency: transitive
525 | description:
526 | name: pointycastle
527 | sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29"
528 | url: "https://pub.dev"
529 | source: hosted
530 | version: "3.7.4"
531 | shared_preferences:
532 | dependency: "direct main"
533 | description:
534 | name: shared_preferences
535 | sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
536 | url: "https://pub.dev"
537 | source: hosted
538 | version: "2.2.2"
539 | shared_preferences_android:
540 | dependency: transitive
541 | description:
542 | name: shared_preferences_android
543 | sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
544 | url: "https://pub.dev"
545 | source: hosted
546 | version: "2.2.1"
547 | shared_preferences_foundation:
548 | dependency: transitive
549 | description:
550 | name: shared_preferences_foundation
551 | sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
552 | url: "https://pub.dev"
553 | source: hosted
554 | version: "2.3.5"
555 | shared_preferences_linux:
556 | dependency: transitive
557 | description:
558 | name: shared_preferences_linux
559 | sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
560 | url: "https://pub.dev"
561 | source: hosted
562 | version: "2.3.2"
563 | shared_preferences_platform_interface:
564 | dependency: transitive
565 | description:
566 | name: shared_preferences_platform_interface
567 | sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
568 | url: "https://pub.dev"
569 | source: hosted
570 | version: "2.3.2"
571 | shared_preferences_web:
572 | dependency: transitive
573 | description:
574 | name: shared_preferences_web
575 | sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
576 | url: "https://pub.dev"
577 | source: hosted
578 | version: "2.3.0"
579 | shared_preferences_windows:
580 | dependency: transitive
581 | description:
582 | name: shared_preferences_windows
583 | sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
584 | url: "https://pub.dev"
585 | source: hosted
586 | version: "2.3.2"
587 | sky_engine:
588 | dependency: transitive
589 | description: flutter
590 | source: sdk
591 | version: "0.0.99"
592 | source_span:
593 | dependency: transitive
594 | description:
595 | name: source_span
596 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
597 | url: "https://pub.dev"
598 | source: hosted
599 | version: "1.10.0"
600 | stack_trace:
601 | dependency: transitive
602 | description:
603 | name: stack_trace
604 | sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
605 | url: "https://pub.dev"
606 | source: hosted
607 | version: "1.11.1"
608 | stream_channel:
609 | dependency: transitive
610 | description:
611 | name: stream_channel
612 | sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
613 | url: "https://pub.dev"
614 | source: hosted
615 | version: "2.1.2"
616 | string_scanner:
617 | dependency: transitive
618 | description:
619 | name: string_scanner
620 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
621 | url: "https://pub.dev"
622 | source: hosted
623 | version: "1.2.0"
624 | term_glyph:
625 | dependency: transitive
626 | description:
627 | name: term_glyph
628 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
629 | url: "https://pub.dev"
630 | source: hosted
631 | version: "1.2.1"
632 | test_api:
633 | dependency: transitive
634 | description:
635 | name: test_api
636 | sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
637 | url: "https://pub.dev"
638 | source: hosted
639 | version: "0.6.1"
640 | typed_data:
641 | dependency: transitive
642 | description:
643 | name: typed_data
644 | sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
645 | url: "https://pub.dev"
646 | source: hosted
647 | version: "1.3.2"
648 | url_launcher:
649 | dependency: "direct main"
650 | description:
651 | name: url_launcher
652 | sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e"
653 | url: "https://pub.dev"
654 | source: hosted
655 | version: "6.2.5"
656 | url_launcher_android:
657 | dependency: transitive
658 | description:
659 | name: url_launcher_android
660 | sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745
661 | url: "https://pub.dev"
662 | source: hosted
663 | version: "6.3.0"
664 | url_launcher_ios:
665 | dependency: transitive
666 | description:
667 | name: url_launcher_ios
668 | sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5"
669 | url: "https://pub.dev"
670 | source: hosted
671 | version: "6.2.5"
672 | url_launcher_linux:
673 | dependency: transitive
674 | description:
675 | name: url_launcher_linux
676 | sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
677 | url: "https://pub.dev"
678 | source: hosted
679 | version: "3.1.1"
680 | url_launcher_macos:
681 | dependency: transitive
682 | description:
683 | name: url_launcher_macos
684 | sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234
685 | url: "https://pub.dev"
686 | source: hosted
687 | version: "3.1.0"
688 | url_launcher_platform_interface:
689 | dependency: transitive
690 | description:
691 | name: url_launcher_platform_interface
692 | sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
693 | url: "https://pub.dev"
694 | source: hosted
695 | version: "2.3.2"
696 | url_launcher_web:
697 | dependency: transitive
698 | description:
699 | name: url_launcher_web
700 | sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d"
701 | url: "https://pub.dev"
702 | source: hosted
703 | version: "2.3.0"
704 | url_launcher_windows:
705 | dependency: transitive
706 | description:
707 | name: url_launcher_windows
708 | sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7
709 | url: "https://pub.dev"
710 | source: hosted
711 | version: "3.1.1"
712 | vector_math:
713 | dependency: transitive
714 | description:
715 | name: vector_math
716 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
717 | url: "https://pub.dev"
718 | source: hosted
719 | version: "2.1.4"
720 | vm_service:
721 | dependency: transitive
722 | description:
723 | name: vm_service
724 | sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
725 | url: "https://pub.dev"
726 | source: hosted
727 | version: "13.0.0"
728 | web:
729 | dependency: transitive
730 | description:
731 | name: web
732 | sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
733 | url: "https://pub.dev"
734 | source: hosted
735 | version: "0.5.1"
736 | win32:
737 | dependency: transitive
738 | description:
739 | name: win32
740 | sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4
741 | url: "https://pub.dev"
742 | source: hosted
743 | version: "3.1.4"
744 | xdg_directories:
745 | dependency: transitive
746 | description:
747 | name: xdg_directories
748 | sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
749 | url: "https://pub.dev"
750 | source: hosted
751 | version: "1.0.4"
752 | xml:
753 | dependency: transitive
754 | description:
755 | name: xml
756 | sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
757 | url: "https://pub.dev"
758 | source: hosted
759 | version: "6.5.0"
760 | yaml:
761 | dependency: transitive
762 | description:
763 | name: yaml
764 | sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
765 | url: "https://pub.dev"
766 | source: hosted
767 | version: "3.1.2"
768 | sdks:
769 | dart: "3.3.3"
770 | flutter: ">=3.19.0"
771 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: Cyberpwned
2 | description: Cyberpunk 2077 Hacking Minigame Resolver
3 |
4 | # The following line prevents the package from being accidentally published to
5 | # pub.dev using `pub publish`. This is preferred for private packages.
6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev
7 |
8 | # The following defines the version and build number for your application.
9 | # A version number is three numbers separated by dots, like 1.2.43
10 | # followed by an optional build number separated by a +.
11 | # Both the version and the builder number may be overridden in flutter
12 | # build by specifying --build-name and --build-number, respectively.
13 | # In Android, build-name is used as versionName while build-number used as versionCode.
14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning
15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
16 | # Read more about iOS versioning at
17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
18 | version: 1.8.4+54
19 |
20 | environment:
21 | sdk: "3.3.3"
22 |
23 | dependencies:
24 | flutter:
25 | sdk: flutter
26 | flutter_launcher_icons: ^0.13.1
27 | image_picker: ^1.0.7
28 | firebase_core: ^2.28.0
29 | google_fonts: ^4.0.4
30 | app_review: ^2.1.2+1
31 | url_launcher: ^6.2.5
32 | shared_preferences: ^2.2.2
33 |
34 | # The following adds the Cupertino Icons font to your application.
35 | # Use with the CupertinoIcons class for iOS style icons.
36 | cupertino_icons: ^1.0.0
37 |
38 | dev_dependencies:
39 | flutter_test:
40 | sdk: flutter
41 |
42 | flutter_icons:
43 | android: "launcher_icon"
44 | ios: true
45 | image_path: "assets/icon/icon.png"
46 |
47 | # For information on the generic Dart part of this file, see the
48 | # following page: https://dart.dev/tools/pub/pubspec
49 |
50 | # The following section is specific to Flutter.
51 | flutter:
52 |
53 | # The following line ensures that the Material Icons font is
54 | # included with your application, so that you can use the icons in
55 | # the material Icons class.
56 | uses-material-design: true
57 |
58 | # To add assets to your application, add an assets section, like this:
59 | #assets:
60 | #- assets/asd.jpg
61 | #- assets/dsa.png
62 | # An image asset can refer to one or more resolution-specific "variants", see
63 | # https://flutter.dev/assets-and-images/#resolution-aware.
64 |
65 | # For details regarding adding assets from package dependencies, see
66 | # https://flutter.dev/assets-and-images/#from-packages
67 |
68 | # To add custom fonts to your application, add a fonts section here,
69 | # in this "flutter" section. Each entry in this list should have a
70 | # "family" key with the font family name, and a "fonts" key with a
71 | # list giving the asset and other descriptors for the font. For
72 | # example:
73 | # fonts:
74 | # - family: Schyler
75 | # fonts:
76 | # - asset: fonts/Schyler-Regular.ttf
77 | # - asset: fonts/Schyler-Italic.ttf
78 | # style: italic
79 | # - family: Trajan Pro
80 | # fonts:
81 | # - asset: fonts/TrajanPro.ttf
82 | # - asset: fonts/TrajanPro_Bold.ttf
83 | # weight: 700
84 | #
85 | # For details regarding fonts from package dependencies,
86 | # see https://flutter.dev/custom-fonts/#from-packages
87 |
--------------------------------------------------------------------------------