Enclosure files + firmware
This commit is contained in:
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
||||
.DS_Store
|
||||
10
.vscode/extensions.json
vendored
Normal file
10
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||
// for the documentation about the extensions.json format
|
||||
"recommendations": [
|
||||
"platformio.platformio-ide"
|
||||
],
|
||||
"unwantedRecommendations": [
|
||||
"ms-vscode.cpptools-extension-pack"
|
||||
]
|
||||
}
|
||||
437
LICENSE
Normal file
437
LICENSE
Normal file
@@ -0,0 +1,437 @@
|
||||
Attribution-NonCommercial-ShareAlike 4.0 International
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
||||
does not provide legal services or legal advice. Distribution of
|
||||
Creative Commons public licenses does not create a lawyer-client or
|
||||
other relationship. Creative Commons makes its licenses and related
|
||||
information available on an "as-is" basis. Creative Commons gives no
|
||||
warranties regarding its licenses, any material licensed under their
|
||||
terms and conditions, or any related information. Creative Commons
|
||||
disclaims all liability for damages resulting from their use to the
|
||||
fullest extent possible.
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and
|
||||
conditions that creators and other rights holders may use to share
|
||||
original works of authorship and other material subject to copyright
|
||||
and certain other rights specified in the public license below. The
|
||||
following considerations are for informational purposes only, are not
|
||||
exhaustive, and do not form part of our licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are
|
||||
intended for use by those authorized to give the public
|
||||
permission to use material in ways otherwise restricted by
|
||||
copyright and certain other rights. Our licenses are
|
||||
irrevocable. Licensors should read and understand the terms
|
||||
and conditions of the license they choose before applying it.
|
||||
Licensors should also secure all rights necessary before
|
||||
applying our licenses so that the public can reuse the
|
||||
material as expected. Licensors should clearly mark any
|
||||
material not subject to the license. This includes other CC-
|
||||
licensed material, or material used under an exception or
|
||||
limitation to copyright. More considerations for licensors:
|
||||
wiki.creativecommons.org/Considerations_for_licensors
|
||||
|
||||
Considerations for the public: By using one of our public
|
||||
licenses, a licensor grants the public permission to use the
|
||||
licensed material under specified terms and conditions. If
|
||||
the licensor's permission is not necessary for any reason--for
|
||||
example, because of any applicable exception or limitation to
|
||||
copyright--then that use is not regulated by the license. Our
|
||||
licenses grant only permissions under copyright and certain
|
||||
other rights that a licensor has authority to grant. Use of
|
||||
the licensed material may still be restricted for other
|
||||
reasons, including because others have copyright or other
|
||||
rights in the material. A licensor may make special requests,
|
||||
such as asking that all changes be marked or described.
|
||||
Although not required by our licenses, you are encouraged to
|
||||
respect those requests where reasonable. More considerations
|
||||
for the public:
|
||||
wiki.creativecommons.org/Considerations_for_licensees
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
|
||||
Public License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree
|
||||
to be bound by the terms and conditions of this Creative Commons
|
||||
Attribution-NonCommercial-ShareAlike 4.0 International Public License
|
||||
("Public License"). To the extent this Public License may be
|
||||
interpreted as a contract, You are granted the Licensed Rights in
|
||||
consideration of Your acceptance of these terms and conditions, and the
|
||||
Licensor grants You such rights in consideration of benefits the
|
||||
Licensor receives from making the Licensed Material available under
|
||||
these terms and conditions.
|
||||
|
||||
|
||||
Section 1 -- Definitions.
|
||||
|
||||
a. Adapted Material means material subject to Copyright and Similar
|
||||
Rights that is derived from or based upon the Licensed Material
|
||||
and in which the Licensed Material is translated, altered,
|
||||
arranged, transformed, or otherwise modified in a manner requiring
|
||||
permission under the Copyright and Similar Rights held by the
|
||||
Licensor. For purposes of this Public License, where the Licensed
|
||||
Material is a musical work, performance, or sound recording,
|
||||
Adapted Material is always produced where the Licensed Material is
|
||||
synched in timed relation with a moving image.
|
||||
|
||||
b. Adapter's License means the license You apply to Your Copyright
|
||||
and Similar Rights in Your contributions to Adapted Material in
|
||||
accordance with the terms and conditions of this Public License.
|
||||
|
||||
c. BY-NC-SA Compatible License means a license listed at
|
||||
creativecommons.org/compatiblelicenses, approved by Creative
|
||||
Commons as essentially the equivalent of this Public License.
|
||||
|
||||
d. Copyright and Similar Rights means copyright and/or similar rights
|
||||
closely related to copyright including, without limitation,
|
||||
performance, broadcast, sound recording, and Sui Generis Database
|
||||
Rights, without regard to how the rights are labeled or
|
||||
categorized. For purposes of this Public License, the rights
|
||||
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
||||
Rights.
|
||||
|
||||
e. Effective Technological Measures means those measures that, in the
|
||||
absence of proper authority, may not be circumvented under laws
|
||||
fulfilling obligations under Article 11 of the WIPO Copyright
|
||||
Treaty adopted on December 20, 1996, and/or similar international
|
||||
agreements.
|
||||
|
||||
f. Exceptions and Limitations means fair use, fair dealing, and/or
|
||||
any other exception or limitation to Copyright and Similar Rights
|
||||
that applies to Your use of the Licensed Material.
|
||||
|
||||
g. License Elements means the license attributes listed in the name
|
||||
of a Creative Commons Public License. The License Elements of this
|
||||
Public License are Attribution, NonCommercial, and ShareAlike.
|
||||
|
||||
h. Licensed Material means the artistic or literary work, database,
|
||||
or other material to which the Licensor applied this Public
|
||||
License.
|
||||
|
||||
i. Licensed Rights means the rights granted to You subject to the
|
||||
terms and conditions of this Public License, which are limited to
|
||||
all Copyright and Similar Rights that apply to Your use of the
|
||||
Licensed Material and that the Licensor has authority to license.
|
||||
|
||||
j. Licensor means the individual(s) or entity(ies) granting rights
|
||||
under this Public License.
|
||||
|
||||
k. NonCommercial means not primarily intended for or directed towards
|
||||
commercial advantage or monetary compensation. For purposes of
|
||||
this Public License, the exchange of the Licensed Material for
|
||||
other material subject to Copyright and Similar Rights by digital
|
||||
file-sharing or similar means is NonCommercial provided there is
|
||||
no payment of monetary compensation in connection with the
|
||||
exchange.
|
||||
|
||||
l. Share means to provide material to the public by any means or
|
||||
process that requires permission under the Licensed Rights, such
|
||||
as reproduction, public display, public performance, distribution,
|
||||
dissemination, communication, or importation, and to make material
|
||||
available to the public including in ways that members of the
|
||||
public may access the material from a place and at a time
|
||||
individually chosen by them.
|
||||
|
||||
m. Sui Generis Database Rights means rights other than copyright
|
||||
resulting from Directive 96/9/EC of the European Parliament and of
|
||||
the Council of 11 March 1996 on the legal protection of databases,
|
||||
as amended and/or succeeded, as well as other essentially
|
||||
equivalent rights anywhere in the world.
|
||||
|
||||
n. You means the individual or entity exercising the Licensed Rights
|
||||
under this Public License. Your has a corresponding meaning.
|
||||
|
||||
|
||||
Section 2 -- Scope.
|
||||
|
||||
a. License grant.
|
||||
|
||||
1. Subject to the terms and conditions of this Public License,
|
||||
the Licensor hereby grants You a worldwide, royalty-free,
|
||||
non-sublicensable, non-exclusive, irrevocable license to
|
||||
exercise the Licensed Rights in the Licensed Material to:
|
||||
|
||||
a. reproduce and Share the Licensed Material, in whole or
|
||||
in part, for NonCommercial purposes only; and
|
||||
|
||||
b. produce, reproduce, and Share Adapted Material for
|
||||
NonCommercial purposes only.
|
||||
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where
|
||||
Exceptions and Limitations apply to Your use, this Public
|
||||
License does not apply, and You do not need to comply with
|
||||
its terms and conditions.
|
||||
|
||||
3. Term. The term of this Public License is specified in Section
|
||||
6(a).
|
||||
|
||||
4. Media and formats; technical modifications allowed. The
|
||||
Licensor authorizes You to exercise the Licensed Rights in
|
||||
all media and formats whether now known or hereafter created,
|
||||
and to make technical modifications necessary to do so. The
|
||||
Licensor waives and/or agrees not to assert any right or
|
||||
authority to forbid You from making technical modifications
|
||||
necessary to exercise the Licensed Rights, including
|
||||
technical modifications necessary to circumvent Effective
|
||||
Technological Measures. For purposes of this Public License,
|
||||
simply making modifications authorized by this Section 2(a)
|
||||
(4) never produces Adapted Material.
|
||||
|
||||
5. Downstream recipients.
|
||||
|
||||
a. Offer from the Licensor -- Licensed Material. Every
|
||||
recipient of the Licensed Material automatically
|
||||
receives an offer from the Licensor to exercise the
|
||||
Licensed Rights under the terms and conditions of this
|
||||
Public License.
|
||||
|
||||
b. Additional offer from the Licensor -- Adapted Material.
|
||||
Every recipient of Adapted Material from You
|
||||
automatically receives an offer from the Licensor to
|
||||
exercise the Licensed Rights in the Adapted Material
|
||||
under the conditions of the Adapter's License You apply.
|
||||
|
||||
c. No downstream restrictions. You may not offer or impose
|
||||
any additional or different terms or conditions on, or
|
||||
apply any Effective Technological Measures to, the
|
||||
Licensed Material if doing so restricts exercise of the
|
||||
Licensed Rights by any recipient of the Licensed
|
||||
Material.
|
||||
|
||||
6. No endorsement. Nothing in this Public License constitutes or
|
||||
may be construed as permission to assert or imply that You
|
||||
are, or that Your use of the Licensed Material is, connected
|
||||
with, or sponsored, endorsed, or granted official status by,
|
||||
the Licensor or others designated to receive attribution as
|
||||
provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
b. Other rights.
|
||||
|
||||
1. Moral rights, such as the right of integrity, are not
|
||||
licensed under this Public License, nor are publicity,
|
||||
privacy, and/or other similar personality rights; however, to
|
||||
the extent possible, the Licensor waives and/or agrees not to
|
||||
assert any such rights held by the Licensor to the limited
|
||||
extent necessary to allow You to exercise the Licensed
|
||||
Rights, but not otherwise.
|
||||
|
||||
2. Patent and trademark rights are not licensed under this
|
||||
Public License.
|
||||
|
||||
3. To the extent possible, the Licensor waives any right to
|
||||
collect royalties from You for the exercise of the Licensed
|
||||
Rights, whether directly or through a collecting society
|
||||
under any voluntary or waivable statutory or compulsory
|
||||
licensing scheme. In all other cases the Licensor expressly
|
||||
reserves any right to collect such royalties, including when
|
||||
the Licensed Material is used other than for NonCommercial
|
||||
purposes.
|
||||
|
||||
|
||||
Section 3 -- License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the
|
||||
following conditions.
|
||||
|
||||
a. Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified
|
||||
form), You must:
|
||||
|
||||
a. retain the following if it is supplied by the Licensor
|
||||
with the Licensed Material:
|
||||
|
||||
i. identification of the creator(s) of the Licensed
|
||||
Material and any others designated to receive
|
||||
attribution, in any reasonable manner requested by
|
||||
the Licensor (including by pseudonym if
|
||||
designated);
|
||||
|
||||
ii. a copyright notice;
|
||||
|
||||
iii. a notice that refers to this Public License;
|
||||
|
||||
iv. a notice that refers to the disclaimer of
|
||||
warranties;
|
||||
|
||||
v. a URI or hyperlink to the Licensed Material to the
|
||||
extent reasonably practicable;
|
||||
|
||||
b. indicate if You modified the Licensed Material and
|
||||
retain an indication of any previous modifications; and
|
||||
|
||||
c. indicate the Licensed Material is licensed under this
|
||||
Public License, and include the text of, or the URI or
|
||||
hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any
|
||||
reasonable manner based on the medium, means, and context in
|
||||
which You Share the Licensed Material. For example, it may be
|
||||
reasonable to satisfy the conditions by providing a URI or
|
||||
hyperlink to a resource that includes the required
|
||||
information.
|
||||
3. If requested by the Licensor, You must remove any of the
|
||||
information required by Section 3(a)(1)(A) to the extent
|
||||
reasonably practicable.
|
||||
|
||||
b. ShareAlike.
|
||||
|
||||
In addition to the conditions in Section 3(a), if You Share
|
||||
Adapted Material You produce, the following conditions also apply.
|
||||
|
||||
1. The Adapter's License You apply must be a Creative Commons
|
||||
license with the same License Elements, this version or
|
||||
later, or a BY-NC-SA Compatible License.
|
||||
|
||||
2. You must include the text of, or the URI or hyperlink to, the
|
||||
Adapter's License You apply. You may satisfy this condition
|
||||
in any reasonable manner based on the medium, means, and
|
||||
context in which You Share Adapted Material.
|
||||
|
||||
3. You may not offer or impose any additional or different terms
|
||||
or conditions on, or apply any Effective Technological
|
||||
Measures to, Adapted Material that restrict exercise of the
|
||||
rights granted under the Adapter's License You apply.
|
||||
|
||||
|
||||
Section 4 -- Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that
|
||||
apply to Your use of the Licensed Material:
|
||||
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
||||
to extract, reuse, reproduce, and Share all or a substantial
|
||||
portion of the contents of the database for NonCommercial purposes
|
||||
only;
|
||||
|
||||
b. if You include all or a substantial portion of the database
|
||||
contents in a database in which You have Sui Generis Database
|
||||
Rights, then the database in which You have Sui Generis Database
|
||||
Rights (but not its individual contents) is Adapted Material,
|
||||
including for purposes of Section 3(b); and
|
||||
|
||||
c. You must comply with the conditions in Section 3(a) if You Share
|
||||
all or a substantial portion of the contents of the database.
|
||||
|
||||
For the avoidance of doubt, this Section 4 supplements and does not
|
||||
replace Your obligations under this Public License where the Licensed
|
||||
Rights include other Copyright and Similar Rights.
|
||||
|
||||
|
||||
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
||||
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
||||
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
||||
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
||||
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
||||
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
||||
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
||||
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
||||
|
||||
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
||||
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
||||
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
||||
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
||||
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
||||
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
||||
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
||||
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided
|
||||
above shall be interpreted in a manner that, to the extent
|
||||
possible, most closely approximates an absolute disclaimer and
|
||||
waiver of all liability.
|
||||
|
||||
|
||||
Section 6 -- Term and Termination.
|
||||
|
||||
a. This Public License applies for the term of the Copyright and
|
||||
Similar Rights licensed here. However, if You fail to comply with
|
||||
this Public License, then Your rights under this Public License
|
||||
terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated under
|
||||
Section 6(a), it reinstates:
|
||||
|
||||
1. automatically as of the date the violation is cured, provided
|
||||
it is cured within 30 days of Your discovery of the
|
||||
violation; or
|
||||
|
||||
2. upon express reinstatement by the Licensor.
|
||||
|
||||
For the avoidance of doubt, this Section 6(b) does not affect any
|
||||
right the Licensor may have to seek remedies for Your violations
|
||||
of this Public License.
|
||||
|
||||
c. For the avoidance of doubt, the Licensor may also offer the
|
||||
Licensed Material under separate terms or conditions or stop
|
||||
distributing the Licensed Material at any time; however, doing so
|
||||
will not terminate this Public License.
|
||||
|
||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
||||
License.
|
||||
|
||||
|
||||
Section 7 -- Other Terms and Conditions.
|
||||
|
||||
a. The Licensor shall not be bound by any additional or different
|
||||
terms or conditions communicated by You unless expressly agreed.
|
||||
|
||||
b. Any arrangements, understandings, or agreements regarding the
|
||||
Licensed Material not stated herein are separate from and
|
||||
independent of the terms and conditions of this Public License.
|
||||
|
||||
|
||||
Section 8 -- Interpretation.
|
||||
|
||||
a. For the avoidance of doubt, this Public License does not, and
|
||||
shall not be interpreted to, reduce, limit, restrict, or impose
|
||||
conditions on any use of the Licensed Material that could lawfully
|
||||
be made without permission under this Public License.
|
||||
|
||||
b. To the extent possible, if any provision of this Public License is
|
||||
deemed unenforceable, it shall be automatically reformed to the
|
||||
minimum extent necessary to make it enforceable. If the provision
|
||||
cannot be reformed, it shall be severed from this Public License
|
||||
without affecting the enforceability of the remaining terms and
|
||||
conditions.
|
||||
|
||||
c. No term or condition of this Public License will be waived and no
|
||||
failure to comply consented to unless expressly agreed to by the
|
||||
Licensor.
|
||||
|
||||
d. Nothing in this Public License constitutes or may be interpreted
|
||||
as a limitation upon, or waiver of, any privileges and immunities
|
||||
that apply to the Licensor or You, including from the legal
|
||||
processes of any jurisdiction or authority.
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons is not a party to its public
|
||||
licenses. Notwithstanding, Creative Commons may elect to apply one of
|
||||
its public licenses to material it publishes and in those instances
|
||||
will be considered the “Licensor.” The text of the Creative Commons
|
||||
public licenses is dedicated to the public domain under the CC0 Public
|
||||
Domain Dedication. Except for the limited purpose of indicating that
|
||||
material is shared under a Creative Commons public license or as
|
||||
otherwise permitted by the Creative Commons policies published at
|
||||
creativecommons.org/policies, Creative Commons does not authorize the
|
||||
use of the trademark "Creative Commons" or any other trademark or logo
|
||||
of Creative Commons without its prior written consent including,
|
||||
without limitation, in connection with any unauthorized modifications
|
||||
to any of its public licenses or any other arrangements,
|
||||
understandings, or agreements concerning use of licensed material. For
|
||||
the avoidance of doubt, this paragraph does not form part of the
|
||||
public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
||||
20
README.md
20
README.md
@@ -1 +1,19 @@
|
||||
# focus-dial
|
||||
<p align="center">
|
||||
<img src="./images/Focus-Dial_Logo.svg" width="200" >
|
||||
</p>
|
||||
|
||||
Watch the build video ↓
|
||||
|
||||
[<img src="./images/Focus-Dial_Thumbnail.jpg">](https://youtu.be/nZa-Vqu-_fU)
|
||||
|
||||
Tired of constant distractions, I built the Focus Dial—a DIY take on the failed TimeChi crowdfunding project. It helps me work in time blocks by activating a Do Not Disturb mode on my phone and integrates with Home Assistant via webhook triggers to set lighting scenes and block distracting apps at the network level during focus sessions.
|
||||
|
||||
Build instructions → (coming soon)
|
||||
|
||||
[![CC BY-NC-SA 4.0][cc-by-nc-sa-shield]][cc-by-nc-sa]
|
||||
|
||||
[![CC BY-NC-SA 4.0][cc-by-nc-sa-image]][cc-by-nc-sa]
|
||||
|
||||
[cc-by-nc-sa]: http://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
[cc-by-nc-sa-image]: https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png
|
||||
[cc-by-nc-sa-shield]: https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg
|
||||
BIN
cad/Focus Dial.f3z
Normal file
BIN
cad/Focus Dial.f3z
Normal file
Binary file not shown.
BIN
cad/STLs/Bezel.stl
Normal file
BIN
cad/STLs/Bezel.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Bottom Button.stl
Normal file
BIN
cad/STLs/Bottom Button.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Bottom.stl
Normal file
BIN
cad/STLs/Bottom.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Button Cap.stl
Normal file
BIN
cad/STLs/Button Cap.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Button Holder.stl
Normal file
BIN
cad/STLs/Button Holder.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Central Ring.stl
Normal file
BIN
cad/STLs/Central Ring.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Central Shaft.stl
Normal file
BIN
cad/STLs/Central Shaft.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Diffuser Mold.stl
Normal file
BIN
cad/STLs/Diffuser Mold.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Encoder Bottom.stl
Normal file
BIN
cad/STLs/Encoder Bottom.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Face.stl
Normal file
BIN
cad/STLs/Face.stl
Normal file
Binary file not shown.
BIN
cad/STLs/Screen Backing.stl
Normal file
BIN
cad/STLs/Screen Backing.stl
Normal file
Binary file not shown.
34
firmware/include/Animation.h
Normal file
34
firmware/include/Animation.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SSD1306.h>
|
||||
|
||||
#define DEFAULT_FRAME_WIDTH 48
|
||||
#define DEFAULT_FRAME_HEIGHT 48
|
||||
#define DEFAULT_FRAME_DELAY 42
|
||||
|
||||
class Animation
|
||||
{
|
||||
public:
|
||||
Animation(Adafruit_SSD1306 *display);
|
||||
void start(const byte *frames, int frameCount, bool loop, bool reverse, unsigned long durationMs, int width, int height); // Moved reverse parameter
|
||||
void update();
|
||||
bool isRunning();
|
||||
|
||||
private:
|
||||
Adafruit_SSD1306 *oled;
|
||||
const byte *animationFrames;
|
||||
int totalFrames;
|
||||
int currentFrame;
|
||||
int frameWidth;
|
||||
int frameHeight;
|
||||
int frameX;
|
||||
int frameY;
|
||||
bool animationRunning;
|
||||
bool loopAnimation;
|
||||
bool playInReverse;
|
||||
unsigned long animationStartTime;
|
||||
unsigned long lastFrameTime;
|
||||
unsigned long animationDuration;
|
||||
unsigned long frameDelay;
|
||||
};
|
||||
35
firmware/include/Config.h
Normal file
35
firmware/include/Config.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
// --- Hardware ---
|
||||
#define OLED_WIDTH 128
|
||||
#define OLED_HEIGHT 64
|
||||
#define OLED_ADDR 0x3C
|
||||
|
||||
#define LED_PIN 15
|
||||
#define NUM_LEDS 16
|
||||
#define LED_BRIGHTNESS 100
|
||||
|
||||
#define ENCODER_A_PIN 27
|
||||
#define ENCODER_B_PIN 25
|
||||
#define BUTTON_PIN 26
|
||||
|
||||
// --- LED Colors ---
|
||||
#define BLUE 0x0000FF
|
||||
#define AMBER 0xFFBF00
|
||||
#define RED 0xFF0000
|
||||
#define GREEN 0x00FF00
|
||||
#define YELLOW 0xFFFF00
|
||||
#define MAGENTA 0xFF00FF
|
||||
#define TEAL 0x008080
|
||||
|
||||
// --- Defaults ---
|
||||
#define DEFAULT_TIMER 25 // min - Default to 25 minutes if no value in NVS
|
||||
#define MIN_TIMER 5 // min - Minimum timer
|
||||
#define MAX_TIMER 240 // min - Maximum timer (4 hours)
|
||||
|
||||
#define SPLASH_DURATION 2 // sec - 2 seconds splash state
|
||||
#define CHANGE_TIMEOUT 5 // sec - 5 seconds adjust timeout
|
||||
#define SLEEP_TIMOUT 5 // min - 5 minutes to transition to sleep
|
||||
#define PAUSE_TIMEOUT 10 // min - 10 minutes to cancel the timer if stayed paused
|
||||
14
firmware/include/Controllers.h
Normal file
14
firmware/include/Controllers.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
#include "controllers/DisplayController.h"
|
||||
#include "controllers/LEDController.h"
|
||||
#include "controllers/InputController.h"
|
||||
#include "controllers/NetworkController.h"
|
||||
#include <Preferences.h>
|
||||
|
||||
// Declare global controller instances
|
||||
extern DisplayController displayController;
|
||||
extern LEDController ledController;
|
||||
extern InputController inputController;
|
||||
extern NetworkController networkController;
|
||||
extern Preferences preferences;
|
||||
13
firmware/include/State.h
Normal file
13
firmware/include/State.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include "Config.h"
|
||||
|
||||
// Base class
|
||||
class State {
|
||||
public:
|
||||
virtual ~State() {}
|
||||
|
||||
virtual void enter() = 0;
|
||||
virtual void update() = 0;
|
||||
virtual void exit() = 0;
|
||||
};
|
||||
40
firmware/include/StateMachine.h
Normal file
40
firmware/include/StateMachine.h
Normal file
@@ -0,0 +1,40 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "State.h"
|
||||
#include "states/AdjustState.h"
|
||||
#include "states/DoneState.h"
|
||||
#include "states/IdleState.h"
|
||||
#include "states/PausedState.h"
|
||||
#include "states/ProvisionState.h"
|
||||
#include "states/ResetState.h"
|
||||
#include "states/SleepState.h"
|
||||
#include "states/StartupState.h"
|
||||
#include "states/TimerState.h"
|
||||
|
||||
class StateMachine {
|
||||
public:
|
||||
StateMachine();
|
||||
~StateMachine();
|
||||
|
||||
void changeState(State* newState);
|
||||
void update();
|
||||
|
||||
// Static states
|
||||
static AdjustState adjustState;
|
||||
static SleepState sleepState;
|
||||
static DoneState doneState;
|
||||
static IdleState idleState;
|
||||
static PausedState pausedState;
|
||||
static ProvisionState provisionState;
|
||||
static ResetState resetState;
|
||||
static StartupState startupState;
|
||||
static TimerState timerState;
|
||||
|
||||
private:
|
||||
State* currentState; // Pointer to the current state
|
||||
SemaphoreHandle_t stateMutex; // Mutex to protect transitions
|
||||
bool transition = false;
|
||||
};
|
||||
|
||||
extern StateMachine stateMachine; // Global instance of the StateMachine
|
||||
198
firmware/include/bitmaps.h
Normal file
198
firmware/include/bitmaps.h
Normal file
@@ -0,0 +1,198 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
// --- Bitmap icons and UI elements ---
|
||||
|
||||
static const unsigned char PROGMEM icon_wifi_on[] = {0xe0, 0x10, 0xc8, 0x28, 0xa8};
|
||||
static const unsigned char PROGMEM icon_wifi_off[] = {0x88, 0x50, 0x20, 0x50, 0x88};
|
||||
static const unsigned char PROGMEM icon_star[] = {0x92, 0x54, 0x38, 0xfe, 0x38, 0x54, 0x92};
|
||||
static const unsigned char PROGMEM icon_pause[] = {0x3e, 0x00, 0x41, 0x00, 0x80, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x80, 0x80, 0x41, 0x00, 0x3e, 0x00};
|
||||
static const unsigned char PROGMEM icon_reset[] = {0x00, 0x00, 0x00, 0x00, 0x04, 0xf8, 0x18, 0xe0, 0x20, 0xe0, 0x40, 0x90, 0x40, 0x90, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x40, 0x10, 0x40, 0x10, 0x20, 0x20, 0x18, 0xc0, 0x07, 0x00, 0x00, 0x00};
|
||||
static const unsigned char PROGMEM icon_arrow_down[] = {0x20, 0x20, 0x20, 0x20, 0xa8, 0x70, 0x20};
|
||||
static const unsigned char PROGMEM image_change_left[] = {0x0c, 0x1e, 0x1e, 0x3e, 0x3c, 0x3c, 0x3c, 0x3c, 0x78, 0x78, 0x78, 0x78, 0x78, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0x78, 0x78, 0x78, 0x78, 0x78, 0x3c, 0x3c, 0x3c, 0x3c, 0x1e, 0x1e, 0x0c};
|
||||
static const unsigned char PROGMEM image_change_right[] = {0x60, 0xf0, 0xf0, 0xf8, 0x78, 0x78, 0x78, 0x78, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x3e, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x78, 0x78, 0x78, 0x78, 0xf0, 0xf0, 0x60};
|
||||
static const unsigned char PROGMEM provision_logo[] = {0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x80, 0x40, 0x18, 0x30, 0x00, 0x02, 0x00, 0x40, 0x40, 0x20, 0x08, 0x00, 0x03, 0x00, 0x40, 0xc0, 0x43, 0x84, 0x00, 0x12, 0x80, 0x60, 0x80, 0x8c, 0x62, 0x08, 0x0a, 0x40, 0x20, 0x80, 0x10, 0x10, 0x08, 0x06, 0x80, 0x20, 0x80, 0x21, 0x08, 0x3e, 0x03, 0x00, 0x20, 0x80, 0x06, 0xc0, 0x08, 0x06, 0x80, 0x20, 0x80, 0x08, 0x20, 0x08, 0x0a, 0x40, 0x20, 0x80, 0x01, 0x00, 0x00, 0x12, 0x80, 0x20, 0x40, 0x02, 0x80, 0x00, 0x03, 0x00, 0x40, 0x40, 0x01, 0x00, 0x00, 0x02, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00};
|
||||
static const unsigned char PROGMEM focusdial_logo[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xe3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xe3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xe3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xe3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xe3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xe3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x81, 0xf8, 0x1f, 0x8e, 0x38, 0x1f, 0x8f, 0xc0, 0xe0, 0x70, 0x38, 0x00, 0x1f, 0x81, 0xf8, 0x1f, 0x8e, 0x38, 0x1f, 0x8f, 0xc0, 0xe0, 0x70, 0x38, 0x00, 0x1f, 0x81, 0xf8, 0x1f, 0x8e, 0x38, 0x1f, 0x8f, 0xc0, 0xe0, 0x70, 0x38, 0x00, 0xe0, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0xe3, 0x8e, 0x38, 0x00, 0xe0, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0xe3, 0x8e, 0x38, 0x00, 0xe0, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0xe3, 0x8e, 0x38, 0x00, 0xff, 0x8e, 0x38, 0xe0, 0x0e, 0x38, 0xff, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0x00, 0xff, 0x8e, 0x38, 0xe0, 0x0e, 0x38, 0xff, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0x00, 0xff, 0x8e, 0x38, 0xe0, 0x0e, 0x38, 0xff, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0x00, 0xe0, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0x03, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0x00, 0xe0, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0x03, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0x00, 0xe0, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0x03, 0x8e, 0x38, 0xe3, 0x8e, 0x38, 0x00, 0xe0, 0x0f, 0xc0, 0x1f, 0x81, 0xc0, 0xfc, 0x0f, 0xc0, 0xe3, 0x8e, 0x3f, 0xe0, 0xe0, 0x0f, 0xc0, 0x1f, 0x81, 0xc0, 0xfc, 0x0f, 0xc0, 0xe3, 0x8e, 0x3f, 0xe0, 0xe0, 0x0f, 0xc0, 0x1f, 0x81, 0xc0, 0xfc, 0x0f, 0xc0, 0xe3, 0x8e, 0x3f, 0xe0};
|
||||
|
||||
// --- Animation frames ---
|
||||
|
||||
static const byte PROGMEM animation_tick[][288] = {
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 4, 0, 0, 0, 48, 28, 6, 0, 0, 0, 48, 28, 6, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 6, 0, 0, 0, 48, 28, 6, 0, 0, 0, 24, 24, 7, 0, 0, 0, 24, 24, 3, 128, 0, 0, 24, 24, 1, 128, 0, 0, 24, 24, 1, 192, 0, 0, 24, 24, 0, 192, 0, 0, 24, 24, 0, 64, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 48, 28, 6, 0, 0, 0, 24, 24, 6, 0, 0, 0, 24, 24, 7, 0, 0, 0, 24, 24, 3, 128, 0, 0, 24, 24, 1, 192, 0, 0, 24, 24, 0, 224, 0, 0, 24, 24, 0, 99, 0, 0, 24, 24, 0, 119, 0, 0, 24, 24, 0, 62, 0, 0, 24, 24, 0, 28, 0, 0, 56, 12, 0, 8, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 24, 24, 2, 0, 0, 0, 24, 24, 7, 0, 48, 0, 24, 24, 3, 128, 112, 0, 24, 24, 1, 192, 112, 0, 24, 24, 0, 224, 224, 0, 24, 24, 0, 225, 192, 0, 24, 24, 0, 115, 128, 0, 24, 24, 0, 63, 0, 0, 24, 24, 0, 30, 0, 0, 56, 12, 0, 14, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 7, 0, 48, 28, 0, 0, 14, 0, 24, 24, 0, 0, 12, 0, 24, 24, 2, 0, 28, 0, 24, 24, 3, 0, 56, 0, 24, 24, 3, 128, 112, 0, 24, 24, 1, 192, 112, 0, 24, 24, 0, 224, 224, 0, 24, 24, 0, 113, 192, 0, 24, 24, 0, 59, 128, 0, 24, 24, 0, 31, 128, 0, 56, 12, 0, 15, 0, 0, 56, 12, 0, 6, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 1, 128, 112, 12, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 3, 0, 28, 0, 24, 24, 3, 128, 56, 0, 24, 24, 1, 192, 112, 0, 24, 24, 0, 224, 96, 0, 24, 24, 0, 112, 224, 0, 24, 24, 0, 57, 192, 0, 24, 24, 0, 31, 128, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 0, 0, 48, 14, 0, 2, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 192, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 128, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 14, 0, 24, 24, 1, 0, 28, 0, 24, 24, 3, 128, 56, 0, 24, 24, 1, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 224, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 3, 128, 28, 0, 24, 24, 1, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 3, 128, 28, 0, 24, 24, 1, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 3, 128, 28, 0, 24, 24, 1, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 3, 128, 28, 0, 24, 24, 1, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 3, 128, 28, 0, 24, 24, 1, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 3, 128, 28, 0, 24, 24, 1, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 3, 128, 28, 0, 24, 24, 1, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 1, 128, 28, 0, 24, 24, 1, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 0, 0, 28, 0, 24, 24, 0, 192, 56, 0, 24, 24, 0, 224, 112, 0, 24, 24, 0, 112, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 0, 0, 28, 0, 24, 24, 0, 0, 56, 0, 24, 24, 0, 32, 112, 0, 24, 24, 0, 48, 96, 0, 24, 24, 0, 56, 224, 0, 24, 24, 0, 29, 192, 0, 56, 12, 0, 15, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 0, 0, 28, 0, 24, 24, 0, 0, 56, 0, 24, 24, 0, 0, 112, 0, 24, 24, 0, 0, 96, 0, 24, 24, 0, 0, 224, 0, 24, 24, 0, 5, 192, 0, 56, 12, 0, 7, 128, 0, 56, 12, 0, 7, 128, 0, 48, 14, 0, 3, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 14, 0, 24, 24, 0, 0, 28, 0, 24, 24, 0, 0, 28, 0, 24, 24, 0, 0, 56, 0, 24, 24, 0, 0, 112, 0, 24, 24, 0, 0, 96, 0, 24, 24, 0, 0, 96, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 1, 192, 112, 12, 0, 0, 1, 192, 48, 28, 0, 0, 3, 128, 48, 28, 0, 0, 7, 0, 24, 24, 0, 0, 7, 0, 24, 24, 0, 0, 6, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 224, 96, 14, 0, 0, 0, 192, 112, 12, 0, 0, 0, 128, 48, 28, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 224, 0, 0, 15, 128, 1, 240, 0, 0, 28, 0, 0, 120, 0, 0, 56, 0, 0, 30, 0, 0, 240, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 48, 28, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 15, 0, 0, 120, 0, 0, 28, 0, 0, 30, 0, 0, 56, 0, 0, 15, 128, 1, 240, 0, 0, 7, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
|
||||
|
||||
static const byte PROGMEM animation_reset[][288] = {
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 0, 0, 0, 120, 0, 7, 240, 0, 0, 60, 0, 15, 240, 0, 0, 14, 0, 0, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 128, 3, 176, 0, 0, 1, 204, 3, 56, 0, 0, 0, 220, 7, 24, 0, 0, 14, 252, 6, 0, 0, 0, 15, 248, 14, 0, 0, 0, 7, 248, 14, 0, 0, 0, 1, 240, 12, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 3, 0, 28, 0, 0, 30, 15, 0, 120, 0, 0, 14, 30, 1, 240, 0, 0, 0, 120, 7, 192, 0, 0, 0, 127, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 4, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 0, 0, 0, 120, 0, 7, 240, 0, 0, 60, 0, 15, 240, 0, 0, 14, 0, 0, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 128, 3, 176, 0, 0, 1, 204, 3, 56, 0, 0, 0, 220, 7, 24, 0, 0, 14, 252, 6, 0, 0, 0, 15, 248, 14, 0, 0, 0, 7, 248, 14, 0, 0, 0, 1, 240, 12, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 3, 0, 28, 0, 0, 30, 15, 0, 120, 0, 0, 14, 30, 1, 240, 0, 0, 0, 120, 7, 192, 0, 0, 0, 127, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 4, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 0, 0, 0, 120, 0, 7, 240, 0, 0, 60, 0, 15, 240, 0, 0, 14, 0, 0, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 128, 3, 176, 0, 0, 1, 204, 3, 56, 0, 0, 0, 220, 7, 24, 0, 0, 14, 252, 6, 0, 0, 0, 15, 248, 14, 0, 0, 0, 7, 248, 14, 0, 0, 0, 1, 240, 12, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 3, 0, 28, 0, 0, 30, 15, 0, 120, 0, 0, 14, 30, 1, 240, 0, 0, 0, 120, 7, 192, 0, 0, 0, 127, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 4, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 0, 0, 0, 120, 0, 7, 240, 0, 0, 60, 0, 15, 240, 0, 0, 14, 0, 0, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 128, 3, 176, 0, 0, 1, 204, 3, 56, 0, 0, 0, 220, 7, 24, 0, 0, 14, 252, 6, 0, 0, 0, 15, 248, 14, 0, 0, 0, 7, 248, 14, 0, 0, 0, 1, 240, 12, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 3, 0, 28, 0, 0, 30, 15, 0, 120, 0, 0, 14, 30, 1, 240, 0, 0, 0, 120, 7, 192, 0, 0, 0, 127, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 4, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 4, 0, 0, 120, 0, 0, 240, 0, 0, 60, 0, 15, 240, 0, 0, 14, 0, 15, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 132, 3, 176, 0, 0, 1, 220, 3, 48, 0, 0, 0, 220, 7, 16, 0, 0, 14, 248, 6, 0, 0, 0, 15, 248, 14, 0, 0, 0, 7, 240, 14, 0, 0, 0, 0, 240, 12, 0, 0, 0, 0, 32, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 3, 0, 28, 0, 0, 30, 7, 0, 120, 0, 0, 14, 30, 1, 240, 0, 0, 2, 60, 7, 192, 0, 0, 0, 63, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 6, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 240, 15, 192, 0, 0, 15, 128, 1, 240, 0, 0, 6, 0, 0, 120, 0, 0, 0, 0, 0, 60, 0, 15, 224, 0, 0, 14, 0, 15, 224, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 152, 3, 176, 0, 0, 1, 216, 3, 48, 0, 0, 0, 248, 7, 48, 0, 0, 15, 248, 6, 0, 0, 0, 15, 240, 14, 0, 0, 0, 3, 240, 14, 0, 0, 0, 0, 96, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 1, 128, 28, 0, 0, 30, 7, 128, 120, 0, 0, 15, 15, 1, 240, 0, 0, 3, 28, 7, 192, 0, 0, 0, 31, 255, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 2, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 240, 15, 192, 0, 0, 15, 128, 1, 240, 0, 0, 14, 0, 0, 120, 0, 0, 0, 0, 0, 60, 0, 3, 224, 0, 0, 14, 0, 15, 224, 0, 0, 7, 0, 15, 224, 0, 0, 3, 128, 1, 224, 0, 0, 1, 152, 3, 176, 0, 0, 1, 248, 7, 48, 0, 0, 0, 248, 7, 48, 0, 0, 15, 240, 6, 32, 0, 0, 15, 240, 6, 0, 0, 0, 1, 224, 14, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 1, 128, 28, 0, 0, 30, 3, 128, 120, 0, 0, 15, 135, 1, 240, 0, 0, 3, 158, 15, 192, 0, 0, 0, 31, 255, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 240, 15, 192, 0, 0, 15, 128, 1, 240, 0, 0, 6, 0, 0, 120, 0, 0, 0, 0, 0, 60, 0, 7, 224, 0, 0, 14, 0, 15, 224, 0, 0, 7, 0, 13, 224, 0, 0, 3, 128, 1, 240, 0, 0, 1, 152, 3, 176, 0, 0, 1, 216, 3, 48, 0, 0, 0, 248, 7, 48, 0, 0, 15, 240, 6, 0, 0, 0, 15, 240, 14, 0, 0, 0, 1, 240, 14, 0, 0, 0, 0, 96, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 1, 128, 28, 0, 0, 30, 3, 128, 120, 0, 0, 15, 15, 1, 240, 0, 0, 3, 158, 15, 192, 0, 0, 0, 31, 255, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 4, 0, 0, 120, 0, 0, 112, 0, 0, 60, 0, 7, 240, 0, 0, 14, 0, 7, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 128, 3, 176, 0, 0, 1, 220, 3, 48, 0, 0, 0, 216, 7, 48, 0, 0, 14, 248, 6, 0, 0, 0, 7, 248, 14, 0, 0, 0, 3, 240, 14, 0, 0, 0, 0, 240, 12, 0, 0, 0, 0, 32, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 1, 0, 28, 0, 0, 30, 7, 128, 120, 0, 0, 14, 15, 1, 240, 0, 0, 2, 60, 7, 192, 0, 0, 0, 127, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 1, 0, 1, 240, 0, 0, 24, 0, 0, 120, 0, 3, 248, 0, 0, 28, 0, 7, 248, 0, 0, 14, 0, 0, 248, 0, 0, 7, 0, 1, 248, 0, 0, 3, 0, 1, 184, 0, 0, 1, 128, 3, 176, 0, 0, 1, 192, 3, 16, 0, 0, 0, 204, 7, 0, 0, 0, 2, 124, 6, 0, 0, 0, 7, 124, 6, 0, 0, 0, 7, 248, 14, 0, 0, 0, 1, 248, 12, 0, 0, 0, 0, 240, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 1, 128, 0, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 7, 0, 120, 0, 0, 12, 62, 0, 224, 0, 0, 0, 248, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 127, 248, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 255, 255, 128, 0, 0, 0, 240, 15, 192, 0, 0, 126, 0, 1, 240, 0, 1, 254, 0, 0, 120, 0, 1, 252, 0, 0, 60, 0, 0, 124, 0, 0, 14, 0, 0, 252, 0, 0, 7, 0, 1, 220, 0, 0, 3, 128, 1, 216, 0, 0, 1, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 224, 6, 0, 0, 0, 0, 100, 6, 0, 0, 0, 3, 110, 14, 0, 0, 0, 3, 252, 12, 0, 0, 0, 1, 252, 12, 0, 0, 0, 0, 248, 12, 0, 0, 0, 0, 120, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 24, 60, 0, 120, 0, 0, 3, 252, 1, 240, 0, 0, 3, 240, 15, 192, 0, 0, 1, 255, 255, 0, 0, 0, 0, 255, 248, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 31, 255, 0, 0, 0, 127, 128, 15, 192, 0, 0, 127, 128, 1, 240, 0, 0, 31, 0, 0, 120, 0, 0, 63, 0, 0, 28, 0, 0, 119, 0, 0, 14, 0, 0, 230, 0, 0, 7, 0, 1, 198, 0, 0, 3, 0, 1, 128, 0, 0, 1, 128, 3, 128, 0, 0, 1, 192, 3, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 224, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 48, 12, 0, 0, 0, 3, 54, 12, 0, 0, 0, 3, 190, 12, 0, 0, 0, 1, 252, 12, 0, 0, 0, 0, 252, 12, 0, 0, 0, 0, 120, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 96, 0, 0, 14, 0, 0, 0, 240, 0, 28, 0, 0, 15, 248, 0, 120, 0, 0, 7, 128, 1, 224, 0, 0, 7, 240, 7, 192, 0, 0, 3, 255, 255, 0, 0, 0, 1, 191, 248, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 7, 248, 0, 0, 0, 31, 231, 255, 128, 0, 0, 3, 224, 15, 192, 0, 0, 15, 224, 1, 240, 0, 0, 31, 192, 0, 120, 0, 0, 57, 128, 0, 60, 0, 0, 115, 128, 0, 14, 0, 0, 225, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 1, 192, 0, 0, 1, 128, 3, 128, 0, 0, 1, 192, 7, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 224, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 3, 176, 12, 0, 0, 0, 1, 182, 12, 0, 0, 0, 1, 254, 12, 0, 0, 0, 0, 254, 12, 0, 0, 0, 0, 124, 12, 0, 0, 0, 0, 120, 14, 0, 0, 0, 0, 48, 6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 192, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 128, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 63, 192, 0, 14, 0, 0, 63, 192, 0, 28, 0, 0, 30, 128, 0, 120, 0, 0, 31, 128, 1, 240, 0, 0, 15, 240, 15, 192, 0, 0, 13, 255, 255, 0, 0, 0, 6, 31, 248, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 3, 224, 0, 0, 0, 0, 1, 252, 248, 0, 0, 0, 0, 252, 255, 0, 0, 0, 3, 248, 15, 192, 0, 0, 7, 120, 1, 240, 0, 0, 30, 112, 0, 120, 0, 0, 56, 224, 0, 28, 0, 0, 112, 64, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 0, 1, 128, 0, 0, 1, 128, 3, 128, 0, 0, 1, 192, 3, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 1, 48, 12, 0, 0, 0, 1, 176, 12, 0, 0, 0, 1, 178, 12, 0, 0, 0, 1, 254, 12, 0, 0, 0, 0, 254, 6, 0, 0, 0, 0, 248, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 128, 0, 240, 0, 0, 3, 128, 0, 255, 0, 0, 7, 0, 0, 127, 0, 0, 14, 0, 0, 120, 0, 0, 28, 0, 0, 126, 0, 0, 120, 0, 0, 63, 128, 0, 224, 0, 0, 51, 240, 7, 192, 0, 0, 48, 255, 255, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 31, 140, 0, 0, 0, 0, 255, 159, 0, 0, 0, 3, 239, 15, 192, 0, 0, 15, 142, 1, 240, 0, 0, 30, 28, 0, 120, 0, 0, 56, 24, 0, 60, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 1, 192, 0, 0, 1, 128, 3, 128, 0, 0, 1, 192, 3, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 224, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 3, 48, 12, 0, 0, 0, 3, 112, 6, 0, 0, 0, 3, 240, 4, 0, 0, 0, 1, 236, 0, 0, 0, 0, 1, 252, 3, 0, 0, 0, 1, 248, 3, 224, 0, 0, 1, 224, 1, 248, 0, 0, 0, 128, 1, 252, 0, 0, 0, 0, 1, 232, 0, 0, 6, 0, 1, 240, 0, 0, 14, 0, 1, 188, 0, 0, 28, 0, 1, 158, 0, 0, 120, 0, 0, 15, 128, 1, 240, 0, 0, 3, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 224, 0, 0, 0, 0, 31, 240, 0, 0, 0, 0, 255, 249, 0, 0, 0, 3, 241, 227, 192, 0, 0, 15, 131, 193, 240, 0, 0, 30, 3, 0, 120, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 1, 192, 0, 0, 1, 128, 3, 128, 0, 0, 1, 192, 3, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 224, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 112, 6, 0, 0, 0, 6, 96, 7, 0, 0, 0, 6, 96, 7, 192, 0, 0, 6, 224, 7, 240, 0, 0, 6, 192, 7, 240, 0, 0, 7, 200, 7, 160, 0, 0, 7, 248, 7, 192, 0, 0, 7, 240, 6, 224, 0, 0, 3, 128, 4, 112, 0, 0, 0, 0, 0, 56, 0, 0, 16, 0, 0, 30, 0, 0, 120, 0, 0, 15, 128, 1, 240, 0, 0, 3, 240, 15, 192, 0, 0, 1, 255, 255, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 254, 0, 0, 0, 3, 224, 31, 0, 0, 0, 7, 0, 252, 112, 0, 0, 30, 0, 96, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 0, 1, 128, 0, 0, 1, 128, 3, 128, 0, 0, 1, 192, 3, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 224, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 48, 15, 0, 0, 0, 0, 112, 15, 192, 0, 0, 0, 112, 31, 224, 0, 0, 0, 96, 30, 224, 0, 0, 4, 224, 27, 0, 0, 0, 12, 192, 27, 128, 0, 0, 13, 192, 1, 128, 0, 0, 13, 128, 0, 192, 0, 0, 31, 128, 0, 224, 0, 0, 31, 0, 0, 112, 0, 0, 31, 224, 0, 56, 0, 0, 31, 192, 0, 30, 0, 0, 24, 0, 0, 15, 128, 1, 192, 0, 0, 3, 240, 7, 192, 0, 0, 0, 255, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 31, 255, 128, 0, 0, 0, 255, 255, 128, 0, 0, 3, 224, 15, 192, 0, 0, 15, 128, 7, 224, 0, 0, 30, 0, 31, 128, 0, 0, 56, 0, 24, 12, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 1, 192, 0, 0, 1, 128, 3, 128, 0, 0, 1, 192, 3, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 224, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 48, 31, 0, 0, 0, 0, 48, 31, 0, 0, 0, 0, 48, 63, 128, 0, 0, 0, 48, 61, 192, 0, 0, 0, 112, 54, 192, 0, 0, 0, 112, 38, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 51, 128, 1, 192, 0, 0, 51, 128, 0, 224, 0, 0, 55, 0, 0, 112, 0, 0, 126, 0, 0, 60, 0, 0, 124, 0, 0, 30, 0, 0, 127, 0, 0, 15, 128, 0, 255, 0, 0, 3, 240, 14, 30, 0, 0, 0, 255, 254, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 31, 248, 96, 0, 0, 0, 255, 255, 96, 0, 0, 3, 240, 15, 240, 0, 0, 15, 128, 1, 240, 0, 0, 30, 0, 1, 248, 0, 0, 56, 0, 7, 248, 0, 0, 112, 0, 3, 0, 0, 0, 224, 0, 0, 3, 0, 1, 192, 0, 0, 3, 128, 1, 128, 0, 0, 1, 128, 3, 128, 0, 0, 1, 192, 3, 0, 0, 0, 0, 192, 7, 0, 0, 0, 0, 224, 6, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 96, 4, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 48, 30, 0, 0, 0, 0, 48, 63, 0, 0, 0, 0, 48, 63, 0, 0, 0, 0, 48, 125, 128, 0, 0, 0, 48, 109, 128, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 1, 128, 1, 192, 0, 0, 67, 128, 0, 224, 0, 0, 231, 0, 0, 112, 0, 0, 206, 0, 0, 56, 0, 1, 220, 0, 0, 30, 0, 1, 248, 0, 0, 15, 128, 3, 240, 0, 0, 3, 240, 3, 240, 0, 0, 0, 255, 243, 248, 0, 0, 0, 31, 240, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 8, 0, 0, 0, 255, 255, 12, 0, 0, 3, 224, 15, 204, 0, 0, 15, 128, 1, 252, 0, 0, 30, 0, 0, 124, 0, 0, 56, 0, 0, 62, 0, 0, 112, 0, 1, 254, 0, 0, 224, 0, 0, 254, 0, 1, 192, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 192, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 224, 6, 0, 0, 0, 0, 96, 14, 0, 0, 0, 0, 96, 30, 0, 0, 0, 0, 48, 63, 0, 0, 0, 0, 48, 127, 0, 0, 0, 0, 48, 125, 128, 0, 0, 0, 48, 77, 128, 0, 0, 0, 48, 13, 128, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 3, 14, 0, 0, 60, 0, 7, 28, 0, 0, 30, 0, 7, 120, 0, 0, 15, 128, 15, 240, 0, 0, 3, 240, 31, 192, 0, 0, 0, 255, 159, 0, 0, 0, 0, 63, 159, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 248, 0, 0, 0, 0, 255, 255, 128, 0, 0, 3, 240, 15, 193, 0, 0, 15, 128, 1, 243, 0, 0, 30, 0, 0, 123, 0, 0, 56, 0, 0, 63, 0, 0, 112, 0, 0, 15, 0, 0, 224, 0, 0, 127, 128, 0, 192, 0, 0, 63, 128, 0, 0, 0, 0, 31, 128, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 96, 31, 0, 0, 0, 0, 96, 63, 128, 0, 0, 0, 96, 127, 128, 0, 0, 0, 112, 13, 128, 0, 0, 0, 48, 13, 128, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 224, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 4, 14, 0, 0, 60, 0, 12, 28, 0, 0, 30, 0, 28, 120, 0, 0, 15, 128, 57, 240, 0, 0, 3, 240, 127, 192, 0, 0, 0, 252, 255, 0, 0, 0, 0, 28, 248, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 15, 128, 1, 240, 0, 0, 30, 0, 0, 120, 64, 0, 56, 0, 0, 60, 192, 0, 48, 0, 0, 14, 192, 0, 0, 0, 0, 7, 192, 0, 128, 0, 0, 11, 192, 3, 128, 0, 0, 31, 192, 7, 128, 0, 0, 31, 192, 31, 128, 0, 0, 3, 192, 63, 128, 0, 0, 0, 128, 55, 192, 0, 0, 0, 0, 14, 192, 0, 0, 0, 32, 14, 192, 0, 0, 0, 48, 12, 128, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 0, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 0, 16, 28, 0, 0, 30, 0, 120, 120, 0, 0, 15, 128, 241, 240, 0, 0, 3, 225, 199, 192, 0, 0, 0, 243, 255, 0, 0, 0, 0, 3, 248, 0, 0, 0, 0, 1, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 240, 15, 192, 0, 0, 15, 128, 1, 240, 0, 0, 30, 0, 0, 120, 0, 0, 24, 0, 0, 28, 0, 0, 0, 0, 0, 14, 32, 0, 192, 0, 0, 7, 112, 3, 192, 0, 0, 3, 240, 15, 192, 0, 0, 1, 224, 31, 192, 0, 0, 15, 224, 19, 192, 0, 0, 15, 224, 7, 192, 0, 0, 7, 224, 6, 192, 0, 0, 0, 224, 6, 64, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 1, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 96, 28, 0, 0, 30, 0, 224, 120, 0, 0, 15, 131, 193, 240, 0, 0, 3, 199, 135, 192, 0, 0, 0, 207, 255, 0, 0, 0, 0, 15, 248, 0, 0, 0, 0, 7, 128, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 240, 15, 192, 0, 0, 15, 128, 1, 240, 0, 0, 6, 0, 0, 120, 0, 0, 0, 0, 0, 60, 0, 0, 224, 0, 0, 14, 0, 7, 224, 0, 0, 7, 0, 15, 224, 0, 0, 3, 152, 9, 224, 0, 0, 1, 184, 3, 224, 0, 0, 1, 248, 3, 96, 0, 0, 14, 240, 7, 96, 0, 0, 15, 240, 6, 32, 0, 0, 7, 240, 14, 0, 0, 0, 1, 224, 14, 0, 0, 0, 0, 96, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 0, 128, 28, 0, 0, 30, 3, 192, 120, 0, 0, 15, 7, 1, 240, 0, 0, 3, 158, 7, 192, 0, 0, 0, 31, 255, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 0, 0, 0, 120, 0, 0, 112, 0, 0, 60, 0, 15, 240, 0, 0, 14, 0, 15, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 136, 3, 176, 0, 0, 1, 220, 3, 48, 0, 0, 0, 220, 7, 48, 0, 0, 14, 248, 6, 0, 0, 0, 15, 248, 14, 0, 0, 0, 3, 240, 14, 0, 0, 0, 0, 240, 12, 0, 0, 0, 0, 32, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 3, 128, 28, 0, 0, 30, 7, 128, 120, 0, 0, 14, 30, 1, 240, 0, 0, 2, 60, 7, 192, 0, 0, 0, 63, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 6, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 0, 0, 0, 120, 0, 7, 240, 0, 0, 60, 0, 15, 240, 0, 0, 14, 0, 0, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 128, 3, 176, 0, 0, 1, 204, 3, 56, 0, 0, 0, 220, 7, 24, 0, 0, 14, 252, 6, 0, 0, 0, 15, 248, 14, 0, 0, 0, 7, 248, 14, 0, 0, 0, 1, 240, 12, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 3, 0, 28, 0, 0, 30, 15, 0, 120, 0, 0, 14, 30, 1, 240, 0, 0, 0, 120, 7, 192, 0, 0, 0, 127, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 4, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 0, 0, 0, 120, 0, 7, 240, 0, 0, 60, 0, 15, 240, 0, 0, 14, 0, 0, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 128, 3, 176, 0, 0, 1, 204, 3, 56, 0, 0, 0, 220, 7, 24, 0, 0, 14, 252, 6, 0, 0, 0, 15, 248, 14, 0, 0, 0, 7, 248, 14, 0, 0, 0, 1, 240, 12, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 3, 0, 28, 0, 0, 30, 15, 0, 120, 0, 0, 14, 30, 1, 240, 0, 0, 0, 120, 7, 192, 0, 0, 0, 127, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 4, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 15, 192, 0, 0, 7, 128, 1, 240, 0, 0, 0, 0, 0, 120, 0, 7, 240, 0, 0, 60, 0, 15, 240, 0, 0, 14, 0, 0, 240, 0, 0, 7, 0, 1, 240, 0, 0, 3, 128, 1, 240, 0, 0, 1, 128, 3, 176, 0, 0, 1, 204, 3, 56, 0, 0, 0, 220, 7, 24, 0, 0, 14, 252, 6, 0, 0, 0, 15, 248, 14, 0, 0, 0, 7, 248, 14, 0, 0, 0, 1, 240, 12, 0, 0, 0, 0, 112, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 224, 3, 0, 0, 0, 0, 192, 3, 128, 0, 0, 1, 192, 1, 128, 0, 0, 3, 128, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 60, 3, 0, 28, 0, 0, 30, 15, 0, 120, 0, 0, 14, 30, 1, 240, 0, 0, 0, 120, 7, 192, 0, 0, 0, 127, 255, 0, 0, 0, 0, 63, 248, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 4, 0, 0, 0}};
|
||||
|
||||
static const byte PROGMEM animation_cancel[][288] = {
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 48, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 2, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 2, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 6, 0, 0, 0, 0, 56, 4, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 24, 28, 0, 0, 0, 0, 16, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 48, 0, 0, 14, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 128, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 128, 3, 128, 0, 0, 1, 192, 1, 192, 0, 0, 3, 128, 0, 224, 0, 0, 7, 0, 0, 112, 0, 0, 14, 0, 0, 56, 0, 0, 28, 0, 0, 28, 0, 0, 56, 0, 0, 14, 0, 0, 112, 0, 0, 7, 0, 0, 224, 0, 0, 3, 128, 1, 192, 0, 0, 1, 192, 3, 128, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 224, 7, 0, 0, 0, 1, 192, 3, 128, 0, 0, 3, 128, 1, 192, 0, 0, 7, 0, 0, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 0, 0, 56, 0, 0, 56, 0, 0, 28, 0, 0, 112, 0, 0, 14, 0, 0, 224, 0, 0, 7, 0, 1, 192, 0, 0, 3, 128, 3, 128, 0, 0, 1, 192, 1, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
|
||||
|
||||
static const byte PROGMEM animation_resume[][288] = {
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 31, 248, 62, 0, 0, 0, 24, 24, 63, 224, 0, 0, 24, 24, 55, 248, 0, 0, 24, 24, 48, 124, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 28, 0, 0, 24, 24, 48, 60, 0, 0, 24, 24, 51, 252, 0, 0, 24, 24, 63, 192, 0, 0, 31, 248, 60, 0, 0, 0, 31, 248, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 31, 192, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 24, 124, 192, 0, 0, 0, 24, 12, 240, 0, 0, 0, 24, 12, 252, 0, 0, 0, 24, 12, 255, 0, 0, 0, 24, 12, 199, 224, 0, 0, 24, 12, 193, 248, 0, 0, 24, 12, 192, 126, 0, 0, 24, 12, 192, 30, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 6, 0, 0, 24, 12, 192, 14, 0, 0, 24, 12, 192, 62, 0, 0, 24, 12, 193, 240, 0, 0, 24, 12, 199, 192, 0, 0, 24, 12, 223, 0, 0, 0, 24, 12, 252, 0, 0, 0, 24, 12, 224, 0, 0, 0, 24, 60, 128, 0, 0, 0, 27, 248, 0, 0, 0, 0, 31, 192, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 63, 128, 0, 0, 0, 0, 55, 224, 0, 0, 0, 0, 49, 248, 0, 0, 0, 0, 48, 63, 0, 0, 0, 0, 48, 15, 128, 0, 0, 0, 48, 7, 224, 0, 0, 0, 48, 7, 248, 0, 0, 0, 48, 7, 190, 0, 0, 0, 48, 7, 143, 128, 0, 0, 48, 7, 131, 224, 0, 0, 48, 7, 1, 248, 0, 0, 48, 7, 0, 124, 0, 0, 48, 7, 0, 31, 0, 0, 48, 7, 0, 7, 0, 0, 48, 7, 0, 3, 0, 0, 48, 7, 0, 3, 0, 0, 48, 7, 0, 3, 0, 0, 48, 7, 0, 3, 0, 0, 48, 7, 0, 3, 0, 0, 48, 7, 0, 15, 0, 0, 48, 7, 0, 60, 0, 0, 48, 15, 0, 240, 0, 0, 48, 15, 3, 192, 0, 0, 48, 15, 15, 128, 0, 0, 48, 15, 62, 0, 0, 0, 48, 15, 248, 0, 0, 0, 48, 15, 224, 0, 0, 0, 48, 15, 128, 0, 0, 0, 48, 62, 0, 0, 0, 0, 48, 248, 0, 0, 0, 0, 51, 224, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 55, 192, 0, 0, 0, 0, 49, 240, 0, 0, 0, 0, 48, 124, 0, 0, 0, 0, 48, 62, 0, 0, 0, 0, 48, 15, 128, 0, 0, 0, 48, 7, 224, 0, 0, 0, 48, 7, 248, 0, 0, 0, 48, 7, 124, 0, 0, 0, 48, 7, 31, 0, 0, 0, 48, 7, 7, 192, 0, 0, 48, 7, 1, 224, 0, 0, 48, 7, 0, 248, 0, 0, 48, 7, 0, 62, 0, 0, 48, 7, 0, 15, 128, 0, 48, 7, 0, 7, 128, 0, 48, 7, 0, 3, 128, 0, 48, 7, 0, 15, 0, 0, 48, 7, 0, 30, 0, 0, 48, 7, 0, 120, 0, 0, 48, 7, 1, 224, 0, 0, 48, 7, 7, 128, 0, 0, 48, 7, 15, 0, 0, 0, 48, 7, 60, 0, 0, 0, 48, 7, 240, 0, 0, 0, 48, 7, 224, 0, 0, 0, 48, 7, 128, 0, 0, 0, 48, 30, 0, 0, 0, 0, 48, 120, 0, 0, 0, 0, 49, 240, 0, 0, 0, 0, 55, 192, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 124, 0, 0, 0, 112, 7, 62, 0, 0, 0, 112, 7, 15, 128, 0, 0, 112, 7, 3, 224, 0, 0, 112, 7, 0, 240, 0, 0, 112, 7, 0, 124, 0, 0, 112, 6, 0, 31, 0, 0, 112, 2, 0, 7, 128, 0, 112, 6, 0, 7, 128, 0, 112, 6, 0, 31, 0, 0, 112, 6, 0, 60, 0, 0, 112, 6, 0, 240, 0, 0, 112, 6, 3, 192, 0, 0, 112, 6, 7, 128, 0, 0, 112, 6, 30, 0, 0, 0, 112, 6, 120, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 124, 0, 0, 0, 112, 7, 62, 0, 0, 0, 112, 7, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 124, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 2, 3, 192, 0, 0, 112, 6, 7, 128, 0, 0, 112, 6, 30, 0, 0, 0, 112, 6, 120, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 0, 124, 0, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 1, 192, 0, 0, 112, 0, 7, 128, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 56, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 30, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 0, 124, 0, 0, 0, 112, 0, 62, 0, 0, 0, 112, 0, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 124, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 30, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 3, 192, 0, 0, 112, 0, 7, 128, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 120, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 60, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 0, 124, 0, 0, 0, 112, 0, 62, 0, 0, 0, 112, 0, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 124, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 30, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 3, 192, 0, 0, 112, 0, 7, 128, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 120, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 60, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 0, 124, 0, 0, 0, 112, 0, 62, 0, 0, 0, 112, 0, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 124, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 30, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 3, 192, 0, 0, 112, 0, 7, 128, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 120, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 60, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 0, 124, 0, 0, 0, 112, 0, 62, 0, 0, 0, 112, 0, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 124, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 30, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 3, 192, 0, 0, 112, 0, 7, 128, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 120, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 60, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 0, 124, 0, 0, 0, 112, 0, 62, 0, 0, 0, 112, 0, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 124, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 30, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 3, 192, 0, 0, 112, 0, 7, 128, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 120, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 60, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 0, 124, 0, 0, 0, 112, 0, 62, 0, 0, 0, 112, 0, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 124, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 30, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 3, 192, 0, 0, 112, 0, 7, 128, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 120, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 60, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 0, 124, 0, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 1, 192, 0, 0, 112, 0, 7, 128, 0, 0, 112, 0, 30, 0, 0, 0, 112, 0, 56, 0, 0, 0, 112, 1, 240, 0, 0, 0, 112, 3, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 30, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 124, 0, 0, 0, 112, 3, 62, 0, 0, 0, 112, 0, 15, 128, 0, 0, 112, 0, 3, 224, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 0, 124, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 60, 0, 0, 112, 0, 0, 240, 0, 0, 112, 0, 3, 192, 0, 0, 112, 0, 7, 128, 0, 0, 112, 2, 30, 0, 0, 0, 112, 6, 120, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 124, 0, 0, 0, 112, 7, 62, 0, 0, 0, 112, 7, 15, 128, 0, 0, 112, 7, 3, 224, 0, 0, 112, 3, 0, 240, 0, 0, 112, 0, 0, 124, 0, 0, 112, 0, 0, 31, 0, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 7, 128, 0, 112, 0, 0, 31, 0, 0, 112, 2, 0, 60, 0, 0, 112, 6, 0, 240, 0, 0, 112, 6, 3, 192, 0, 0, 112, 6, 7, 128, 0, 0, 112, 6, 30, 0, 0, 0, 112, 6, 120, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 119, 192, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 112, 248, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 15, 128, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 124, 0, 0, 0, 112, 7, 62, 0, 0, 0, 112, 7, 15, 128, 0, 0, 112, 7, 3, 224, 0, 0, 112, 7, 0, 240, 0, 0, 112, 7, 0, 124, 0, 0, 112, 6, 0, 31, 0, 0, 112, 6, 0, 7, 128, 0, 112, 6, 0, 7, 128, 0, 112, 6, 0, 31, 0, 0, 112, 6, 0, 60, 0, 0, 112, 6, 0, 240, 0, 0, 112, 6, 3, 192, 0, 0, 112, 6, 7, 128, 0, 0, 112, 6, 30, 0, 0, 0, 112, 6, 120, 0, 0, 0, 112, 7, 240, 0, 0, 0, 112, 7, 192, 0, 0, 0, 112, 15, 0, 0, 0, 0, 112, 62, 0, 0, 0, 0, 112, 120, 0, 0, 0, 0, 113, 224, 0, 0, 0, 0, 119, 128, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 55, 192, 0, 0, 0, 0, 49, 240, 0, 0, 0, 0, 48, 124, 0, 0, 0, 0, 48, 30, 0, 0, 0, 0, 48, 7, 128, 0, 0, 0, 48, 7, 224, 0, 0, 0, 48, 7, 248, 0, 0, 0, 48, 7, 124, 0, 0, 0, 48, 7, 31, 0, 0, 0, 48, 7, 7, 192, 0, 0, 48, 7, 1, 224, 0, 0, 48, 7, 0, 248, 0, 0, 48, 7, 0, 62, 0, 0, 48, 7, 0, 15, 0, 0, 48, 7, 0, 7, 128, 0, 48, 7, 0, 3, 128, 0, 48, 7, 0, 15, 0, 0, 48, 7, 0, 62, 0, 0, 48, 7, 0, 120, 0, 0, 48, 7, 1, 224, 0, 0, 48, 7, 7, 128, 0, 0, 48, 7, 15, 0, 0, 0, 48, 7, 60, 0, 0, 0, 48, 7, 240, 0, 0, 0, 48, 7, 192, 0, 0, 0, 48, 7, 128, 0, 0, 0, 48, 30, 0, 0, 0, 0, 48, 124, 0, 0, 0, 0, 49, 240, 0, 0, 0, 0, 55, 192, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 63, 128, 0, 0, 0, 0, 55, 224, 0, 0, 0, 0, 49, 252, 0, 0, 0, 0, 48, 62, 0, 0, 0, 0, 48, 15, 128, 0, 0, 0, 48, 15, 224, 0, 0, 0, 48, 15, 248, 0, 0, 0, 48, 15, 62, 0, 0, 0, 48, 15, 31, 128, 0, 0, 48, 15, 7, 192, 0, 0, 48, 15, 1, 240, 0, 0, 48, 15, 0, 124, 0, 0, 48, 15, 0, 31, 0, 0, 48, 15, 0, 7, 0, 0, 48, 15, 0, 3, 0, 0, 48, 15, 0, 3, 0, 0, 48, 15, 0, 3, 0, 0, 48, 15, 0, 3, 0, 0, 48, 15, 0, 7, 0, 0, 48, 15, 0, 31, 0, 0, 48, 15, 0, 124, 0, 0, 48, 15, 0, 240, 0, 0, 48, 15, 3, 192, 0, 0, 48, 15, 15, 0, 0, 0, 48, 15, 60, 0, 0, 0, 48, 15, 248, 0, 0, 0, 48, 15, 224, 0, 0, 0, 48, 15, 128, 0, 0, 0, 48, 62, 0, 0, 0, 0, 48, 248, 0, 0, 0, 0, 51, 224, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 31, 192, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 24, 253, 128, 0, 0, 0, 24, 13, 224, 0, 0, 0, 24, 13, 248, 0, 0, 0, 24, 13, 254, 0, 0, 0, 24, 13, 207, 192, 0, 0, 24, 13, 195, 240, 0, 0, 24, 13, 192, 252, 0, 0, 24, 13, 192, 62, 0, 0, 24, 13, 192, 14, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 6, 0, 0, 24, 13, 192, 30, 0, 0, 24, 13, 192, 120, 0, 0, 24, 13, 195, 224, 0, 0, 24, 13, 207, 128, 0, 0, 24, 13, 254, 0, 0, 0, 24, 13, 248, 0, 0, 0, 24, 13, 224, 0, 0, 0, 24, 124, 0, 0, 0, 0, 27, 248, 0, 0, 0, 0, 31, 128, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 31, 252, 120, 0, 0, 0, 24, 28, 127, 128, 0, 0, 24, 28, 127, 240, 0, 0, 24, 28, 97, 252, 0, 0, 24, 28, 96, 28, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 12, 0, 0, 24, 28, 96, 28, 0, 0, 24, 28, 96, 252, 0, 0, 24, 28, 127, 240, 0, 0, 24, 28, 127, 0, 0, 0, 31, 252, 112, 0, 0, 0, 31, 248, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 28, 24, 24, 56, 0, 0, 31, 248, 31, 248, 0, 0, 31, 248, 31, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
|
||||
|
||||
static const byte PROGMEM animation_timer_start[][288] = {
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 252, 3, 224, 15, 255, 255, 240, 0, 240, 31, 255, 255, 224, 0, 56, 63, 255, 255, 192, 0, 28, 63, 255, 255, 128, 0, 12, 127, 255, 255, 128, 0, 14, 127, 255, 255, 0, 0, 6, 255, 255, 255, 0, 0, 7, 255, 255, 255, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 6, 127, 255, 255, 128, 0, 14, 63, 255, 255, 128, 0, 12, 63, 255, 255, 192, 0, 28, 31, 255, 255, 224, 0, 56, 15, 255, 255, 248, 0, 112, 7, 255, 255, 254, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 252, 3, 224, 15, 255, 255, 240, 0, 240, 31, 255, 255, 224, 0, 56, 63, 255, 255, 192, 0, 28, 63, 255, 255, 128, 0, 12, 127, 255, 255, 128, 0, 14, 127, 255, 255, 0, 0, 6, 255, 255, 255, 0, 0, 7, 255, 255, 255, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 6, 127, 255, 255, 128, 0, 14, 63, 255, 255, 128, 0, 12, 63, 255, 255, 192, 0, 28, 31, 255, 255, 224, 0, 56, 15, 255, 255, 248, 0, 112, 7, 255, 255, 254, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 252, 3, 224, 15, 255, 255, 240, 0, 240, 31, 255, 255, 224, 0, 56, 63, 255, 255, 192, 0, 28, 63, 255, 255, 128, 0, 12, 127, 255, 255, 128, 0, 14, 127, 255, 255, 0, 0, 6, 255, 255, 255, 0, 0, 7, 255, 255, 255, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 6, 127, 255, 255, 128, 0, 14, 63, 255, 255, 128, 0, 12, 63, 255, 255, 192, 0, 28, 31, 255, 255, 224, 0, 56, 15, 255, 255, 248, 0, 112, 7, 255, 255, 254, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 252, 3, 224, 15, 255, 255, 240, 0, 240, 31, 255, 255, 224, 0, 56, 63, 255, 255, 192, 0, 28, 63, 255, 255, 128, 0, 12, 127, 255, 255, 128, 0, 14, 127, 255, 255, 0, 0, 6, 255, 255, 255, 0, 0, 7, 255, 255, 255, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 6, 127, 255, 255, 128, 0, 14, 63, 255, 255, 128, 0, 12, 63, 255, 255, 192, 0, 28, 31, 255, 255, 224, 0, 56, 15, 255, 255, 248, 0, 112, 7, 255, 255, 254, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 240, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 254, 3, 224, 15, 255, 255, 248, 0, 240, 31, 255, 255, 240, 0, 56, 63, 255, 255, 224, 0, 28, 63, 255, 255, 224, 0, 12, 127, 255, 255, 192, 0, 14, 127, 255, 255, 192, 0, 6, 255, 255, 255, 128, 0, 6, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 7, 127, 255, 255, 128, 0, 7, 127, 255, 255, 192, 0, 6, 127, 255, 255, 192, 0, 14, 63, 255, 255, 224, 0, 12, 63, 255, 255, 224, 0, 28, 31, 255, 255, 240, 0, 56, 15, 255, 255, 252, 0, 112, 7, 255, 255, 255, 1, 224, 3, 255, 255, 255, 255, 192, 0, 255, 255, 255, 255, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 232, 0, 0, 127, 255, 255, 255, 128, 1, 255, 255, 255, 255, 192, 7, 255, 255, 255, 3, 224, 15, 255, 255, 254, 0, 240, 31, 255, 255, 252, 0, 56, 63, 255, 255, 248, 0, 28, 63, 255, 255, 240, 0, 12, 127, 255, 255, 240, 0, 14, 127, 255, 255, 224, 0, 6, 255, 255, 255, 224, 0, 6, 255, 255, 255, 224, 0, 3, 255, 255, 255, 224, 0, 3, 255, 255, 255, 192, 0, 3, 255, 255, 255, 192, 0, 3, 255, 255, 255, 192, 0, 3, 255, 255, 255, 224, 0, 7, 127, 255, 255, 224, 0, 7, 127, 255, 255, 224, 0, 6, 127, 255, 255, 240, 0, 14, 63, 255, 255, 240, 0, 12, 63, 255, 255, 248, 0, 28, 31, 255, 255, 252, 0, 56, 15, 255, 255, 254, 0, 112, 7, 255, 255, 255, 129, 224, 3, 255, 255, 255, 255, 192, 0, 255, 255, 255, 255, 0, 0, 7, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 240, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 255, 3, 224, 15, 255, 255, 252, 0, 240, 31, 255, 255, 248, 0, 56, 63, 255, 255, 240, 0, 28, 63, 255, 255, 240, 0, 28, 127, 255, 255, 224, 0, 14, 127, 255, 255, 224, 0, 14, 255, 255, 255, 192, 0, 6, 255, 255, 255, 192, 0, 7, 255, 255, 255, 192, 0, 7, 255, 255, 255, 192, 0, 7, 255, 255, 255, 192, 0, 7, 255, 255, 255, 192, 0, 7, 255, 255, 255, 192, 0, 7, 127, 255, 255, 192, 0, 7, 127, 255, 255, 192, 0, 14, 127, 255, 255, 224, 0, 14, 63, 255, 255, 224, 0, 28, 63, 255, 255, 240, 0, 28, 31, 255, 255, 248, 0, 56, 15, 255, 255, 252, 0, 112, 7, 255, 255, 255, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 255, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 248, 15, 224, 15, 255, 255, 224, 7, 240, 31, 255, 255, 192, 1, 184, 63, 255, 255, 128, 0, 220, 63, 255, 255, 0, 0, 204, 127, 255, 255, 0, 0, 110, 127, 255, 254, 0, 0, 102, 255, 255, 254, 0, 0, 38, 255, 255, 254, 0, 0, 51, 255, 255, 254, 0, 0, 51, 255, 255, 254, 0, 0, 51, 255, 255, 252, 0, 0, 51, 255, 255, 254, 0, 0, 51, 255, 255, 254, 0, 0, 55, 127, 255, 254, 0, 0, 103, 127, 255, 254, 0, 0, 102, 127, 255, 255, 0, 0, 110, 63, 255, 255, 0, 0, 204, 63, 255, 255, 128, 1, 220, 31, 255, 255, 192, 1, 184, 15, 255, 255, 224, 3, 240, 7, 255, 255, 248, 15, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 254, 3, 192, 3, 224, 15, 252, 0, 224, 0, 240, 31, 248, 0, 112, 0, 56, 63, 240, 0, 56, 0, 28, 63, 224, 0, 24, 0, 12, 127, 224, 0, 24, 0, 14, 127, 192, 0, 12, 0, 6, 255, 192, 0, 12, 0, 6, 255, 192, 0, 12, 0, 3, 255, 128, 0, 4, 0, 3, 255, 128, 0, 6, 0, 3, 255, 128, 0, 6, 0, 3, 255, 128, 0, 12, 0, 3, 255, 128, 0, 12, 0, 7, 127, 192, 0, 12, 0, 7, 127, 192, 0, 12, 0, 6, 127, 192, 0, 28, 0, 14, 63, 224, 0, 24, 0, 12, 63, 240, 0, 56, 0, 28, 31, 248, 0, 112, 0, 56, 15, 252, 0, 224, 0, 112, 7, 255, 1, 192, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 192, 60, 0, 3, 224, 15, 128, 30, 0, 0, 240, 31, 0, 6, 0, 0, 56, 62, 0, 3, 0, 0, 28, 60, 0, 3, 0, 0, 12, 124, 0, 1, 128, 0, 14, 120, 0, 1, 128, 0, 6, 248, 0, 0, 128, 0, 6, 248, 0, 0, 128, 0, 3, 248, 0, 0, 192, 0, 3, 248, 0, 0, 192, 0, 3, 240, 0, 0, 192, 0, 3, 248, 0, 0, 192, 0, 3, 248, 0, 0, 192, 0, 7, 120, 0, 1, 128, 0, 7, 120, 0, 1, 128, 0, 6, 124, 0, 3, 128, 0, 14, 60, 0, 3, 0, 0, 12, 62, 0, 7, 0, 0, 28, 31, 0, 6, 0, 0, 56, 15, 128, 14, 0, 0, 112, 7, 224, 60, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 255, 255, 255, 255, 0, 3, 255, 255, 255, 255, 192, 7, 128, 248, 0, 3, 224, 14, 0, 60, 0, 0, 240, 28, 0, 12, 0, 0, 56, 56, 0, 6, 0, 0, 28, 48, 0, 6, 0, 0, 12, 112, 0, 3, 0, 0, 14, 96, 0, 3, 0, 0, 6, 224, 0, 1, 128, 0, 6, 224, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 7, 96, 0, 1, 128, 0, 7, 96, 0, 3, 128, 0, 6, 112, 0, 3, 0, 0, 14, 48, 0, 7, 0, 0, 12, 56, 0, 14, 0, 0, 28, 28, 0, 14, 0, 0, 56, 15, 0, 60, 0, 0, 112, 7, 192, 120, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 15, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 128, 124, 0, 3, 224, 14, 0, 30, 0, 0, 240, 28, 0, 7, 0, 0, 56, 56, 0, 3, 128, 0, 28, 48, 0, 1, 128, 0, 12, 112, 0, 1, 192, 0, 14, 96, 0, 0, 192, 0, 6, 224, 0, 0, 192, 0, 6, 224, 0, 0, 224, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 224, 0, 7, 224, 0, 0, 224, 0, 7, 96, 0, 0, 192, 0, 6, 112, 0, 1, 192, 0, 14, 48, 0, 1, 128, 0, 12, 56, 0, 3, 128, 0, 28, 28, 0, 7, 0, 0, 56, 15, 0, 14, 0, 0, 112, 7, 192, 60, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 128, 124, 0, 3, 224, 14, 0, 30, 0, 0, 240, 28, 0, 7, 0, 0, 56, 56, 0, 3, 128, 0, 28, 48, 0, 1, 128, 0, 12, 112, 0, 1, 192, 0, 14, 96, 0, 0, 192, 0, 6, 224, 0, 0, 192, 0, 6, 224, 0, 0, 224, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 224, 0, 7, 224, 0, 0, 224, 0, 7, 96, 0, 0, 192, 0, 6, 112, 0, 1, 192, 0, 14, 48, 0, 1, 128, 0, 12, 56, 0, 3, 128, 0, 28, 28, 0, 7, 0, 0, 56, 15, 0, 14, 0, 0, 112, 7, 192, 60, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 128, 124, 0, 3, 224, 14, 0, 30, 0, 0, 240, 28, 0, 7, 0, 0, 56, 56, 0, 3, 128, 0, 28, 48, 0, 1, 128, 0, 12, 112, 0, 1, 192, 0, 14, 96, 0, 0, 192, 0, 6, 224, 0, 0, 192, 0, 6, 224, 0, 0, 224, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 224, 0, 7, 224, 0, 0, 224, 0, 7, 96, 0, 0, 192, 0, 6, 112, 0, 1, 192, 0, 14, 48, 0, 1, 128, 0, 12, 56, 0, 3, 128, 0, 28, 28, 0, 7, 0, 0, 56, 15, 0, 14, 0, 0, 112, 7, 192, 60, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 128, 124, 0, 3, 224, 14, 0, 30, 0, 0, 240, 28, 0, 7, 0, 0, 56, 56, 0, 3, 128, 0, 28, 48, 0, 1, 128, 0, 12, 112, 0, 1, 192, 0, 14, 96, 0, 0, 192, 0, 6, 224, 0, 0, 192, 0, 6, 224, 0, 0, 224, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 224, 0, 7, 224, 0, 0, 224, 0, 7, 96, 0, 0, 192, 0, 6, 112, 0, 1, 192, 0, 14, 48, 0, 1, 128, 0, 12, 56, 0, 3, 128, 0, 28, 28, 0, 7, 0, 0, 56, 15, 0, 14, 0, 0, 112, 7, 192, 60, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 128, 124, 0, 3, 224, 14, 0, 30, 0, 0, 240, 28, 0, 7, 0, 0, 56, 56, 0, 3, 128, 0, 28, 48, 0, 1, 128, 0, 12, 112, 0, 1, 192, 0, 14, 96, 0, 0, 192, 0, 6, 224, 0, 0, 192, 0, 6, 224, 0, 0, 224, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 224, 0, 7, 224, 0, 0, 224, 0, 7, 96, 0, 0, 192, 0, 6, 112, 0, 1, 192, 0, 14, 48, 0, 1, 128, 0, 12, 56, 0, 3, 128, 0, 28, 28, 0, 7, 0, 0, 56, 15, 0, 14, 0, 0, 112, 7, 192, 60, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 128, 124, 0, 3, 224, 14, 0, 30, 0, 0, 240, 28, 0, 7, 0, 0, 56, 56, 0, 3, 128, 0, 28, 48, 0, 1, 128, 0, 12, 112, 0, 1, 192, 0, 14, 96, 0, 0, 192, 0, 6, 224, 0, 0, 192, 0, 6, 224, 0, 0, 224, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 224, 0, 7, 224, 0, 0, 224, 0, 7, 96, 0, 0, 192, 0, 6, 112, 0, 1, 192, 0, 14, 48, 0, 1, 128, 0, 12, 56, 0, 3, 128, 0, 28, 28, 0, 7, 0, 0, 56, 15, 0, 14, 0, 0, 112, 7, 192, 60, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 128, 124, 0, 3, 224, 14, 0, 30, 0, 0, 240, 28, 0, 7, 0, 0, 56, 56, 0, 3, 128, 0, 28, 48, 0, 1, 128, 0, 12, 112, 0, 1, 192, 0, 14, 96, 0, 0, 192, 0, 6, 224, 0, 0, 192, 0, 6, 224, 0, 0, 224, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 96, 0, 3, 192, 0, 0, 224, 0, 7, 224, 0, 0, 224, 0, 7, 96, 0, 0, 192, 0, 6, 112, 0, 1, 192, 0, 14, 48, 0, 1, 128, 0, 12, 56, 0, 3, 128, 0, 28, 28, 0, 7, 0, 0, 56, 15, 0, 14, 0, 0, 112, 7, 192, 60, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 255, 255, 255, 255, 0, 3, 255, 255, 255, 255, 192, 7, 128, 248, 0, 3, 224, 14, 0, 60, 0, 0, 240, 28, 0, 12, 0, 0, 56, 56, 0, 6, 0, 0, 28, 48, 0, 6, 0, 0, 12, 112, 0, 3, 0, 0, 14, 96, 0, 3, 0, 0, 6, 224, 0, 1, 128, 0, 6, 224, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 3, 192, 0, 1, 128, 0, 7, 96, 0, 1, 128, 0, 7, 96, 0, 3, 128, 0, 6, 112, 0, 3, 0, 0, 14, 48, 0, 7, 0, 0, 12, 56, 0, 14, 0, 0, 28, 28, 0, 14, 0, 0, 56, 15, 0, 60, 0, 0, 112, 7, 192, 120, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 15, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 224, 60, 0, 3, 224, 15, 128, 30, 0, 0, 240, 31, 0, 6, 0, 0, 56, 62, 0, 3, 0, 0, 28, 60, 0, 3, 0, 0, 12, 124, 0, 1, 128, 0, 14, 124, 0, 1, 128, 0, 6, 248, 0, 0, 128, 0, 6, 248, 0, 0, 192, 0, 3, 248, 0, 0, 192, 0, 3, 248, 0, 0, 192, 0, 3, 248, 0, 0, 192, 0, 3, 248, 0, 0, 192, 0, 3, 248, 0, 0, 192, 0, 7, 120, 0, 1, 192, 0, 7, 120, 0, 1, 128, 0, 6, 124, 0, 1, 128, 0, 14, 60, 0, 3, 128, 0, 12, 62, 0, 7, 0, 0, 28, 31, 0, 6, 0, 0, 56, 15, 128, 14, 0, 0, 112, 7, 224, 60, 0, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 252, 7, 128, 3, 224, 15, 248, 1, 192, 0, 240, 31, 224, 0, 224, 0, 56, 63, 224, 0, 96, 0, 28, 63, 192, 0, 48, 0, 12, 127, 192, 0, 48, 0, 14, 127, 128, 0, 24, 0, 6, 255, 128, 0, 24, 0, 6, 255, 128, 0, 24, 0, 3, 255, 0, 0, 8, 0, 3, 255, 0, 0, 8, 0, 3, 255, 0, 0, 12, 0, 3, 255, 0, 0, 24, 0, 3, 255, 0, 0, 24, 0, 7, 127, 128, 0, 24, 0, 7, 127, 128, 0, 24, 0, 6, 127, 128, 0, 56, 0, 14, 63, 192, 0, 48, 0, 12, 63, 224, 0, 112, 0, 28, 31, 224, 0, 224, 0, 56, 15, 248, 1, 192, 0, 112, 7, 254, 3, 128, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 248, 15, 3, 224, 15, 255, 240, 3, 128, 240, 31, 255, 224, 1, 192, 56, 63, 255, 192, 0, 224, 28, 63, 255, 128, 0, 96, 12, 127, 255, 128, 0, 32, 14, 127, 255, 0, 0, 48, 6, 255, 255, 0, 0, 48, 6, 255, 255, 0, 0, 48, 3, 255, 254, 0, 0, 16, 3, 255, 254, 0, 0, 24, 3, 255, 254, 0, 0, 24, 3, 255, 254, 0, 0, 24, 3, 255, 255, 0, 0, 48, 7, 127, 255, 0, 0, 48, 7, 127, 255, 0, 0, 48, 6, 127, 255, 0, 0, 112, 14, 63, 255, 128, 0, 96, 12, 63, 255, 192, 0, 224, 28, 31, 255, 224, 1, 192, 56, 15, 255, 240, 3, 128, 112, 7, 255, 252, 7, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 252, 7, 224, 15, 255, 255, 240, 3, 240, 31, 255, 255, 224, 0, 248, 63, 255, 255, 192, 0, 124, 63, 255, 255, 192, 0, 44, 127, 255, 255, 128, 0, 62, 127, 255, 255, 128, 0, 54, 255, 255, 255, 0, 0, 30, 255, 255, 255, 0, 0, 27, 255, 255, 255, 0, 0, 27, 255, 255, 255, 0, 0, 27, 255, 255, 255, 0, 0, 27, 255, 255, 255, 0, 0, 27, 255, 255, 255, 0, 0, 31, 127, 255, 255, 0, 0, 31, 127, 255, 255, 0, 0, 62, 127, 255, 255, 128, 0, 62, 63, 255, 255, 128, 0, 124, 63, 255, 255, 192, 0, 124, 31, 255, 255, 224, 0, 248, 15, 255, 255, 240, 1, 240, 7, 255, 255, 252, 7, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 232, 0, 0, 127, 255, 255, 255, 128, 1, 255, 255, 255, 255, 192, 7, 255, 255, 255, 3, 224, 15, 255, 255, 254, 0, 240, 31, 255, 255, 252, 0, 56, 63, 255, 255, 248, 0, 28, 63, 255, 255, 240, 0, 12, 127, 255, 255, 240, 0, 14, 127, 255, 255, 224, 0, 6, 255, 255, 255, 224, 0, 6, 255, 255, 255, 224, 0, 3, 255, 255, 255, 224, 0, 3, 255, 255, 255, 192, 0, 3, 255, 255, 255, 192, 0, 3, 255, 255, 255, 192, 0, 3, 255, 255, 255, 224, 0, 7, 127, 255, 255, 224, 0, 7, 127, 255, 255, 224, 0, 6, 127, 255, 255, 240, 0, 14, 63, 255, 255, 240, 0, 12, 63, 255, 255, 248, 0, 28, 31, 255, 255, 252, 0, 56, 15, 255, 255, 254, 0, 112, 7, 255, 255, 255, 129, 224, 3, 255, 255, 255, 255, 192, 0, 255, 255, 255, 255, 0, 0, 7, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 240, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 254, 3, 224, 15, 255, 255, 248, 0, 240, 31, 255, 255, 240, 0, 56, 63, 255, 255, 224, 0, 28, 63, 255, 255, 224, 0, 12, 127, 255, 255, 192, 0, 14, 127, 255, 255, 192, 0, 6, 255, 255, 255, 128, 0, 6, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 3, 255, 255, 255, 128, 0, 7, 127, 255, 255, 128, 0, 7, 127, 255, 255, 192, 0, 6, 127, 255, 255, 192, 0, 14, 63, 255, 255, 224, 0, 12, 63, 255, 255, 224, 0, 28, 31, 255, 255, 240, 0, 56, 15, 255, 255, 252, 0, 112, 7, 255, 255, 255, 1, 224, 3, 255, 255, 255, 255, 192, 0, 255, 255, 255, 255, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 252, 3, 224, 15, 255, 255, 240, 0, 240, 31, 255, 255, 224, 0, 56, 63, 255, 255, 192, 0, 28, 63, 255, 255, 128, 0, 12, 127, 255, 255, 128, 0, 14, 127, 255, 255, 0, 0, 6, 255, 255, 255, 0, 0, 7, 255, 255, 255, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 6, 127, 255, 255, 128, 0, 14, 63, 255, 255, 128, 0, 12, 63, 255, 255, 192, 0, 28, 31, 255, 255, 224, 0, 56, 15, 255, 255, 248, 0, 112, 7, 255, 255, 254, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 252, 3, 224, 15, 255, 255, 240, 0, 240, 31, 255, 255, 224, 0, 56, 63, 255, 255, 192, 0, 28, 63, 255, 255, 128, 0, 12, 127, 255, 255, 128, 0, 14, 127, 255, 255, 0, 0, 6, 255, 255, 255, 0, 0, 7, 255, 255, 255, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 6, 127, 255, 255, 128, 0, 14, 63, 255, 255, 128, 0, 12, 63, 255, 255, 192, 0, 28, 31, 255, 255, 224, 0, 56, 15, 255, 255, 248, 0, 112, 7, 255, 255, 254, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 224, 0, 0, 127, 255, 255, 255, 0, 1, 255, 255, 255, 255, 192, 7, 255, 255, 252, 3, 224, 15, 255, 255, 240, 0, 240, 31, 255, 255, 224, 0, 56, 63, 255, 255, 192, 0, 28, 63, 255, 255, 128, 0, 12, 127, 255, 255, 128, 0, 14, 127, 255, 255, 0, 0, 6, 255, 255, 255, 0, 0, 7, 255, 255, 255, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 254, 0, 0, 3, 255, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 7, 127, 255, 255, 0, 0, 6, 127, 255, 255, 128, 0, 14, 63, 255, 255, 128, 0, 12, 63, 255, 255, 192, 0, 28, 31, 255, 255, 224, 0, 56, 15, 255, 255, 248, 0, 112, 7, 255, 255, 254, 1, 224, 3, 255, 255, 255, 255, 128, 0, 255, 255, 255, 254, 0, 0, 7, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
|
||||
|
||||
static const byte PROGMEM animation_wifi[][288] = {
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 63, 0, 1, 224, 0, 0, 15, 192, 7, 128, 1, 128, 3, 224, 14, 0, 127, 255, 0, 240, 28, 3, 255, 255, 192, 60, 120, 15, 128, 1, 248, 30, 240, 60, 0, 0, 126, 15, 112, 240, 0, 0, 31, 14, 121, 192, 1, 128, 7, 158, 63, 128, 127, 255, 1, 252, 31, 1, 252, 127, 192, 248, 12, 15, 128, 3, 240, 112, 0, 30, 0, 0, 120, 0, 0, 56, 0, 0, 28, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 240, 31, 142, 0, 0, 59, 192, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 63, 0, 1, 224, 0, 0, 15, 192, 7, 128, 1, 128, 3, 224, 14, 0, 127, 255, 0, 240, 28, 3, 255, 255, 192, 60, 120, 15, 128, 1, 248, 30, 240, 60, 0, 0, 126, 15, 112, 240, 0, 0, 31, 14, 121, 192, 1, 128, 7, 158, 63, 128, 127, 255, 1, 252, 31, 1, 252, 127, 192, 248, 12, 15, 128, 3, 240, 112, 0, 30, 0, 0, 120, 0, 0, 56, 0, 0, 28, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 240, 31, 142, 0, 0, 59, 192, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 63, 0, 1, 224, 0, 0, 15, 192, 7, 128, 1, 128, 3, 224, 14, 0, 127, 255, 0, 240, 28, 3, 255, 255, 192, 60, 120, 15, 128, 1, 248, 30, 240, 60, 0, 0, 126, 15, 112, 240, 0, 0, 31, 14, 121, 192, 1, 128, 7, 158, 63, 128, 127, 255, 1, 252, 31, 1, 252, 127, 192, 248, 12, 15, 128, 3, 240, 112, 0, 30, 0, 0, 120, 0, 0, 56, 0, 0, 28, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 240, 31, 142, 0, 0, 59, 192, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 63, 0, 1, 224, 0, 0, 15, 192, 7, 128, 1, 128, 3, 224, 14, 0, 127, 255, 0, 240, 28, 3, 255, 255, 192, 60, 120, 15, 128, 1, 248, 30, 240, 60, 0, 0, 126, 15, 112, 240, 0, 0, 31, 14, 121, 192, 1, 128, 7, 158, 63, 128, 127, 255, 1, 252, 31, 1, 252, 127, 192, 248, 12, 15, 128, 3, 240, 112, 0, 30, 0, 0, 120, 0, 0, 56, 0, 0, 28, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 240, 31, 142, 0, 0, 59, 192, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 63, 0, 1, 224, 0, 0, 15, 192, 7, 128, 1, 128, 3, 224, 14, 0, 127, 255, 0, 240, 28, 3, 255, 255, 192, 60, 120, 15, 128, 1, 248, 30, 240, 60, 0, 0, 126, 15, 112, 240, 0, 0, 31, 14, 121, 192, 63, 254, 7, 158, 63, 129, 255, 255, 129, 252, 31, 7, 192, 7, 224, 248, 12, 31, 0, 0, 248, 112, 0, 60, 0, 0, 60, 0, 0, 112, 3, 224, 30, 0, 0, 224, 63, 252, 7, 0, 0, 112, 254, 127, 14, 0, 0, 59, 224, 7, 220, 0, 0, 31, 128, 1, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 254, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 192, 7, 252, 0, 0, 124, 0, 0, 126, 0, 1, 240, 0, 0, 15, 128, 7, 192, 0, 0, 3, 224, 15, 0, 127, 255, 0, 240, 28, 1, 255, 255, 192, 56, 120, 15, 128, 3, 248, 30, 240, 62, 0, 0, 124, 15, 240, 240, 7, 192, 31, 15, 113, 224, 127, 255, 7, 142, 63, 131, 248, 63, 227, 252, 31, 15, 128, 1, 240, 248, 14, 28, 0, 0, 120, 112, 0, 120, 0, 0, 30, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 240, 15, 142, 0, 0, 59, 128, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 15, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 254, 0, 0, 0, 3, 255, 255, 192, 0, 0, 31, 224, 15, 248, 0, 0, 126, 0, 0, 126, 0, 1, 240, 0, 0, 15, 128, 7, 192, 0, 0, 3, 224, 15, 0, 63, 254, 0, 240, 28, 1, 255, 255, 192, 56, 56, 15, 224, 15, 240, 30, 240, 62, 0, 0, 252, 15, 224, 120, 0, 0, 31, 7, 113, 224, 3, 128, 7, 142, 59, 192, 127, 255, 3, 220, 31, 3, 252, 63, 192, 248, 14, 15, 128, 3, 240, 112, 0, 30, 0, 0, 120, 0, 0, 120, 0, 0, 30, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 248, 31, 142, 0, 0, 59, 192, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 62, 254, 0, 0, 0, 0, 240, 15, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 127, 0, 1, 224, 0, 0, 15, 192, 7, 128, 0, 0, 3, 224, 14, 0, 127, 255, 0, 240, 60, 1, 255, 255, 192, 60, 120, 15, 192, 7, 248, 30, 224, 62, 0, 0, 254, 15, 224, 240, 0, 0, 31, 7, 113, 224, 0, 0, 7, 142, 59, 128, 0, 0, 1, 252, 31, 0, 0, 0, 0, 248, 14, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 224, 0, 0, 0, 0, 127, 255, 0, 0, 0, 1, 224, 15, 192, 0, 0, 7, 128, 3, 224, 0, 0, 14, 0, 0, 112, 0, 0, 28, 15, 248, 56, 0, 0, 28, 127, 254, 56, 0, 0, 14, 240, 15, 112, 0, 0, 7, 192, 3, 224, 0, 0, 3, 128, 129, 192, 0, 0, 0, 15, 248, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 240, 31, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 254, 0, 0, 0, 1, 254, 255, 192, 0, 0, 7, 128, 3, 240, 0, 0, 30, 0, 0, 124, 0, 0, 112, 15, 248, 30, 0, 0, 224, 127, 255, 7, 0, 1, 195, 224, 7, 195, 192, 3, 143, 0, 1, 241, 192, 1, 156, 0, 0, 121, 128, 0, 248, 0, 0, 31, 0, 0, 112, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 240, 0, 0, 0, 0, 62, 124, 0, 0, 0, 0, 127, 254, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 30, 252, 0, 0, 0, 0, 97, 206, 0, 0, 0, 0, 223, 251, 128, 0, 0, 1, 179, 239, 128, 0, 0, 0, 223, 255, 0, 0, 0, 0, 60, 126, 0, 0, 0, 0, 240, 15, 0, 0, 0, 0, 240, 15, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 240, 15, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 49, 156, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 240, 15, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 252, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 224, 7, 192, 0, 0, 15, 1, 193, 240, 0, 0, 28, 63, 252, 120, 0, 0, 56, 252, 127, 156, 0, 0, 115, 192, 7, 206, 0, 0, 63, 0, 0, 252, 0, 0, 30, 0, 0, 120, 0, 0, 8, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 248, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 124, 126, 0, 0, 0, 0, 240, 15, 0, 0, 0, 0, 240, 15, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 7, 255, 255, 224, 0, 0, 31, 128, 3, 248, 0, 0, 124, 0, 0, 62, 0, 1, 240, 0, 0, 15, 128, 3, 192, 63, 254, 3, 192, 7, 1, 255, 255, 192, 224, 30, 7, 192, 7, 240, 120, 28, 30, 0, 0, 252, 56, 28, 120, 0, 0, 62, 56, 14, 240, 0, 0, 15, 112, 7, 192, 0, 0, 7, 224, 3, 128, 0, 0, 1, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 254, 0, 0, 0, 0, 248, 63, 0, 0, 0, 1, 192, 7, 192, 0, 0, 7, 135, 241, 224, 0, 0, 7, 63, 252, 224, 0, 0, 3, 248, 63, 192, 0, 0, 1, 239, 255, 128, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 127, 0, 1, 224, 0, 0, 15, 192, 7, 128, 0, 0, 3, 224, 14, 0, 127, 255, 0, 240, 60, 1, 255, 255, 192, 60, 120, 15, 192, 7, 248, 30, 224, 62, 0, 0, 254, 15, 224, 240, 0, 0, 31, 7, 113, 224, 0, 0, 7, 142, 59, 128, 0, 0, 1, 252, 31, 0, 0, 0, 0, 248, 14, 0, 0, 0, 0, 112, 0, 0, 15, 224, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 240, 31, 192, 0, 0, 7, 128, 3, 240, 0, 0, 30, 0, 0, 120, 0, 0, 60, 7, 240, 60, 0, 0, 56, 63, 254, 30, 0, 0, 60, 252, 127, 60, 0, 0, 31, 224, 7, 248, 0, 0, 15, 128, 1, 240, 0, 0, 2, 0, 0, 64, 0, 0, 0, 0, 128, 0, 0, 0, 0, 15, 248, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 240, 31, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 254, 0, 0, 0, 3, 255, 255, 192, 0, 0, 31, 224, 15, 248, 0, 0, 126, 0, 0, 126, 0, 1, 240, 0, 0, 15, 128, 7, 192, 0, 0, 3, 224, 15, 0, 63, 254, 0, 240, 28, 1, 255, 255, 192, 56, 56, 15, 224, 15, 240, 30, 240, 62, 0, 0, 252, 15, 224, 120, 0, 0, 31, 7, 113, 224, 3, 128, 7, 142, 59, 192, 127, 255, 3, 220, 31, 3, 252, 63, 192, 248, 14, 15, 128, 3, 240, 112, 0, 30, 0, 0, 120, 0, 0, 120, 0, 0, 30, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 248, 31, 142, 0, 0, 59, 192, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 31, 248, 0, 0, 0, 0, 62, 254, 0, 0, 0, 0, 240, 15, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 254, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 192, 7, 252, 0, 0, 124, 0, 0, 126, 0, 1, 240, 0, 0, 15, 128, 7, 192, 0, 0, 3, 224, 15, 0, 127, 255, 0, 240, 28, 1, 255, 255, 192, 56, 120, 15, 128, 3, 248, 30, 240, 62, 0, 0, 124, 15, 240, 240, 7, 192, 31, 15, 113, 224, 127, 255, 7, 142, 63, 131, 248, 63, 227, 252, 31, 15, 128, 1, 240, 248, 14, 28, 0, 0, 120, 112, 0, 120, 0, 0, 30, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 240, 15, 142, 0, 0, 59, 128, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 15, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 63, 0, 1, 224, 0, 0, 15, 192, 7, 128, 1, 128, 3, 224, 14, 0, 127, 255, 0, 240, 28, 3, 255, 255, 192, 60, 120, 15, 128, 1, 248, 30, 240, 60, 0, 0, 126, 15, 112, 240, 0, 0, 31, 14, 121, 192, 63, 254, 7, 158, 63, 129, 255, 255, 129, 252, 31, 7, 192, 7, 224, 248, 12, 31, 0, 0, 248, 112, 0, 60, 0, 0, 60, 0, 0, 112, 3, 224, 30, 0, 0, 224, 63, 252, 7, 0, 0, 112, 254, 127, 14, 0, 0, 59, 224, 7, 220, 0, 0, 31, 128, 1, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 63, 0, 1, 224, 0, 0, 15, 192, 7, 128, 1, 128, 3, 224, 14, 0, 127, 255, 0, 240, 28, 3, 255, 255, 192, 60, 120, 15, 128, 1, 248, 30, 240, 60, 0, 0, 126, 15, 112, 240, 0, 0, 31, 14, 121, 192, 1, 128, 7, 158, 63, 128, 127, 255, 1, 252, 31, 1, 252, 127, 192, 248, 12, 15, 128, 3, 240, 112, 0, 30, 0, 0, 120, 0, 0, 56, 0, 0, 28, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 240, 31, 142, 0, 0, 59, 192, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 63, 0, 1, 224, 0, 0, 15, 192, 7, 128, 1, 128, 3, 224, 14, 0, 127, 255, 0, 240, 28, 3, 255, 255, 192, 60, 120, 15, 128, 1, 248, 30, 240, 60, 0, 0, 126, 15, 112, 240, 0, 0, 31, 14, 121, 192, 1, 128, 7, 158, 63, 128, 127, 255, 1, 252, 31, 1, 252, 127, 192, 248, 12, 15, 128, 3, 240, 112, 0, 30, 0, 0, 120, 0, 0, 56, 0, 0, 28, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 240, 31, 142, 0, 0, 59, 192, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 255, 0, 0, 0, 3, 255, 255, 224, 0, 0, 31, 128, 3, 252, 0, 0, 124, 0, 0, 63, 0, 1, 224, 0, 0, 15, 192, 7, 128, 1, 128, 3, 224, 14, 0, 127, 255, 0, 240, 28, 3, 255, 255, 192, 60, 120, 15, 128, 1, 248, 30, 240, 60, 0, 0, 126, 15, 112, 240, 0, 0, 31, 14, 121, 192, 1, 128, 7, 158, 63, 128, 127, 255, 1, 252, 31, 1, 252, 127, 192, 248, 12, 15, 128, 3, 240, 112, 0, 30, 0, 0, 120, 0, 0, 56, 0, 0, 28, 0, 0, 240, 15, 248, 15, 0, 0, 224, 127, 254, 7, 0, 0, 113, 240, 31, 142, 0, 0, 59, 192, 3, 220, 0, 0, 31, 0, 0, 248, 0, 0, 14, 0, 0, 112, 0, 0, 0, 15, 240, 0, 0, 0, 0, 63, 252, 0, 0, 0, 0, 120, 30, 0, 0, 0, 0, 224, 7, 0, 0, 0, 0, 112, 14, 0, 0, 0, 0, 56, 28, 0, 0, 0, 0, 28, 56, 0, 0, 0, 0, 14, 112, 0, 0, 0, 0, 7, 224, 0, 0, 0, 0, 3, 192, 0, 0, 0, 0, 1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
|
||||
40
firmware/include/controllers/DisplayController.h
Normal file
40
firmware/include/controllers/DisplayController.h
Normal file
@@ -0,0 +1,40 @@
|
||||
#pragma once
|
||||
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SSD1306.h>
|
||||
#include "Animation.h"
|
||||
|
||||
class DisplayController
|
||||
{
|
||||
public:
|
||||
DisplayController(uint8_t oledWidth, uint8_t oledHeight, uint8_t oledAddress = 0x3C);
|
||||
|
||||
void begin();
|
||||
|
||||
void drawSplashScreen();
|
||||
void drawIdleScreen(int duration, bool wifi);
|
||||
void drawTimerScreen(int remainingSeconds);
|
||||
void drawPausedScreen(int remainingSeconds);
|
||||
void drawResetScreen(bool resetSelected);
|
||||
void drawDoneScreen();
|
||||
void drawAdjustScreen(int duration);
|
||||
void drawProvisionScreen();
|
||||
void clear();
|
||||
|
||||
void showAnimation(const byte frames[][288], int frameCount, bool loop = false, bool reverse = false, unsigned long durationMs = 0, int width = 48, int height = 48);
|
||||
void updateAnimation();
|
||||
bool isAnimationRunning();
|
||||
|
||||
void showConfirmation();
|
||||
void showCancel();
|
||||
void showReset();
|
||||
void showConnected();
|
||||
void showTimerDone();
|
||||
void showTimerStart();
|
||||
void showTimerPause();
|
||||
void showTimerResume();
|
||||
|
||||
private:
|
||||
Adafruit_SSD1306 oled;
|
||||
Animation animation;
|
||||
};
|
||||
46
firmware/include/controllers/InputController.h
Normal file
46
firmware/include/controllers/InputController.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <OneButton.h>
|
||||
#include <RotaryEncoder.h>
|
||||
#include <functional>
|
||||
|
||||
class InputController
|
||||
{
|
||||
public:
|
||||
InputController(uint8_t buttonPin, uint8_t encoderPinA, uint8_t encoderPinB);
|
||||
void begin();
|
||||
void update();
|
||||
|
||||
void onPressHandler(std::function<void()> handler);
|
||||
void onDoublePressHandler(std::function<void()> handler);
|
||||
void onLongPressHandler(std::function<void()> handler);
|
||||
void onEncoderRotateHandler(std::function<void(int delta)> handler);
|
||||
|
||||
void releaseHandlers();
|
||||
|
||||
private:
|
||||
OneButton button;
|
||||
RotaryEncoder encoder;
|
||||
|
||||
uint8_t buttonPin;
|
||||
uint8_t encoderPinA;
|
||||
uint8_t encoderPinB;
|
||||
|
||||
std::function<void()> pressHandler = nullptr;
|
||||
std::function<void()> doublePressHandler = nullptr;
|
||||
std::function<void()> longPressHandler = nullptr;
|
||||
std::function<void(int delta)> encoderRotateHandler = nullptr;
|
||||
|
||||
int lastPosition;
|
||||
|
||||
void onButtonClick();
|
||||
void onButtonDoubleClick();
|
||||
void onButtonLongPress();
|
||||
void onEncoderRotate(int delta);
|
||||
|
||||
static void handleEncoderInterrupt();
|
||||
static void handleButtonInterrupt();
|
||||
};
|
||||
|
||||
extern InputController inputController;
|
||||
57
firmware/include/controllers/LedController.h
Normal file
57
firmware/include/controllers/LedController.h
Normal file
@@ -0,0 +1,57 @@
|
||||
#pragma once
|
||||
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
|
||||
class LEDController
|
||||
{
|
||||
public:
|
||||
LEDController(uint8_t ledPin, uint16_t numLeds, uint8_t brightness = 255);
|
||||
|
||||
void begin();
|
||||
void update();
|
||||
|
||||
void startFillAndDecay(uint32_t color, uint32_t totalDuration);
|
||||
void setSpinner(uint32_t color, int cycles);
|
||||
void setBreath(uint32_t color, int cycles, bool endFilled, uint32_t speed);
|
||||
void setSolid(uint32_t color);
|
||||
|
||||
void turnOff();
|
||||
void printDebugInfo();
|
||||
|
||||
private:
|
||||
Adafruit_NeoPixel leds;
|
||||
uint16_t numLeds;
|
||||
uint8_t brightness;
|
||||
int brightnessLevel;
|
||||
|
||||
enum AnimationType
|
||||
{
|
||||
None,
|
||||
FillAndDecay,
|
||||
Spinner,
|
||||
Breath
|
||||
} currentAnimation;
|
||||
unsigned long lastUpdateTime;
|
||||
|
||||
uint32_t animationColor;
|
||||
uint32_t animationDuration;
|
||||
uint32_t animationSpeed;
|
||||
|
||||
int currentStep;
|
||||
int currentCycle;
|
||||
int pixelIndex;
|
||||
int animationCycles;
|
||||
bool endFilled;
|
||||
bool decayStarted;
|
||||
|
||||
// Animation handling methods
|
||||
void handleFillAndDecay();
|
||||
void handleSpinner();
|
||||
void handleBreath();
|
||||
|
||||
// Reset animation state
|
||||
void stopCurrentAnimation();
|
||||
|
||||
// Helper to scale color by brightness
|
||||
uint32_t scaleColor(uint32_t color, uint8_t brightness);
|
||||
};
|
||||
56
firmware/include/controllers/NetworkController.h
Normal file
56
firmware/include/controllers/NetworkController.h
Normal file
@@ -0,0 +1,56 @@
|
||||
#pragma once
|
||||
|
||||
#include <BluetoothA2DPSink.h>
|
||||
#include <WiFiProvisioner.h>
|
||||
#include <Preferences.h>
|
||||
|
||||
class NetworkController
|
||||
{
|
||||
public:
|
||||
NetworkController();
|
||||
void begin();
|
||||
void update();
|
||||
void startProvisioning();
|
||||
void stopProvisioning();
|
||||
void reset();
|
||||
bool isWiFiProvisioned();
|
||||
bool isWiFiConnected();
|
||||
bool isBluetoothPaired();
|
||||
void initializeBluetooth();
|
||||
void startBluetooth();
|
||||
void stopBluetooth();
|
||||
void sendWebhookAction(const String &action);
|
||||
|
||||
private:
|
||||
BluetoothA2DPSink a2dp_sink;
|
||||
Preferences preferences;
|
||||
WiFiProvisioner::WiFiProvisioner wifiProvisioner; // Instance of WiFiProvisioner
|
||||
|
||||
String webhookURL;
|
||||
bool btPaired; // Paired state loaded from NVS
|
||||
bool bluetoothActive;
|
||||
bool bluetoothAttempted;
|
||||
bool provisioningMode;
|
||||
unsigned long lastBluetoothtAttempt;
|
||||
|
||||
void WiFiProvisionerSettings();
|
||||
void saveBluetoothPairedState(bool paired);
|
||||
static void btConnectionStateCallback(esp_a2d_connection_state_t state, void *obj);
|
||||
|
||||
// Tasks
|
||||
TaskHandle_t bluetoothTaskHandle;
|
||||
TaskHandle_t webhookTaskHandle;
|
||||
QueueHandle_t webhookQueue;
|
||||
|
||||
static void bluetoothTask(void *param);
|
||||
static void webhookTask(void *param);
|
||||
bool sendWebhookRequest(const String &action);
|
||||
|
||||
static NetworkController *instance;
|
||||
|
||||
static bool validateInputCallback(const String &input);
|
||||
static void factoryResetCallback();
|
||||
|
||||
bool validateInput(const String &input);
|
||||
void handleFactoryReset();
|
||||
};
|
||||
131
firmware/include/fonts/Org_01.h
Normal file
131
firmware/include/fonts/Org_01.h
Normal file
@@ -0,0 +1,131 @@
|
||||
#pragma once
|
||||
#include <Adafruit_GFX.h>
|
||||
|
||||
// Org_v01 by Orgdot (www.orgdot.com/aliasfonts). A tiny,
|
||||
// stylized font with all characters within a 6 pixel height.
|
||||
|
||||
const uint8_t Org_01Bitmaps[] PROGMEM = {
|
||||
0xE8, 0xA0, 0x57, 0xD5, 0xF5, 0x00, 0xFD, 0x3E, 0x5F, 0x80, 0x88, 0x88,
|
||||
0x88, 0x80, 0xF4, 0xBF, 0x2E, 0x80, 0x80, 0x6A, 0x40, 0x95, 0x80, 0xAA,
|
||||
0x80, 0x5D, 0x00, 0xC0, 0xF0, 0x80, 0x08, 0x88, 0x88, 0x00, 0xFC, 0x63,
|
||||
0x1F, 0x80, 0xF8, 0xF8, 0x7F, 0x0F, 0x80, 0xF8, 0x7E, 0x1F, 0x80, 0x8C,
|
||||
0x7E, 0x10, 0x80, 0xFC, 0x3E, 0x1F, 0x80, 0xFC, 0x3F, 0x1F, 0x80, 0xF8,
|
||||
0x42, 0x10, 0x80, 0xFC, 0x7F, 0x1F, 0x80, 0xFC, 0x7E, 0x1F, 0x80, 0x90,
|
||||
0xB0, 0x2A, 0x22, 0xF0, 0xF0, 0x88, 0xA8, 0xF8, 0x4E, 0x02, 0x00, 0xFD,
|
||||
0x6F, 0x0F, 0x80, 0xFC, 0x7F, 0x18, 0x80, 0xF4, 0x7D, 0x1F, 0x00, 0xFC,
|
||||
0x21, 0x0F, 0x80, 0xF4, 0x63, 0x1F, 0x00, 0xFC, 0x3F, 0x0F, 0x80, 0xFC,
|
||||
0x3F, 0x08, 0x00, 0xFC, 0x2F, 0x1F, 0x80, 0x8C, 0x7F, 0x18, 0x80, 0xF9,
|
||||
0x08, 0x4F, 0x80, 0x78, 0x85, 0x2F, 0x80, 0x8D, 0xB1, 0x68, 0x80, 0x84,
|
||||
0x21, 0x0F, 0x80, 0xFD, 0x6B, 0x5A, 0x80, 0xFC, 0x63, 0x18, 0x80, 0xFC,
|
||||
0x63, 0x1F, 0x80, 0xFC, 0x7F, 0x08, 0x00, 0xFC, 0x63, 0x3F, 0x80, 0xFC,
|
||||
0x7F, 0x29, 0x00, 0xFC, 0x3E, 0x1F, 0x80, 0xF9, 0x08, 0x42, 0x00, 0x8C,
|
||||
0x63, 0x1F, 0x80, 0x8C, 0x62, 0xA2, 0x00, 0xAD, 0x6B, 0x5F, 0x80, 0x8A,
|
||||
0x88, 0xA8, 0x80, 0x8C, 0x54, 0x42, 0x00, 0xF8, 0x7F, 0x0F, 0x80, 0xEA,
|
||||
0xC0, 0x82, 0x08, 0x20, 0x80, 0xD5, 0xC0, 0x54, 0xF8, 0x80, 0xF1, 0xFF,
|
||||
0x8F, 0x99, 0xF0, 0xF8, 0x8F, 0x1F, 0x99, 0xF0, 0xFF, 0x8F, 0x6B, 0xA4,
|
||||
0xF9, 0x9F, 0x10, 0x8F, 0x99, 0x90, 0xF0, 0x55, 0xC0, 0x8A, 0xF9, 0x90,
|
||||
0xF8, 0xFD, 0x63, 0x10, 0xF9, 0x99, 0xF9, 0x9F, 0xF9, 0x9F, 0x80, 0xF9,
|
||||
0x9F, 0x20, 0xF8, 0x88, 0x47, 0x1F, 0x27, 0xC8, 0x42, 0x00, 0x99, 0x9F,
|
||||
0x99, 0x97, 0x8C, 0x6B, 0xF0, 0x96, 0x69, 0x99, 0x9F, 0x10, 0x2E, 0x8F,
|
||||
0x2B, 0x22, 0xF8, 0x89, 0xA8, 0x0F, 0xE0};
|
||||
|
||||
const GFXglyph Org_01Glyphs[] PROGMEM = {{0, 0, 0, 6, 0, 1}, // 0x20 ' '
|
||||
{0, 1, 5, 2, 0, -4}, // 0x21 '!'
|
||||
{1, 3, 1, 4, 0, -4}, // 0x22 '"'
|
||||
{2, 5, 5, 6, 0, -4}, // 0x23 '#'
|
||||
{6, 5, 5, 6, 0, -4}, // 0x24 '$'
|
||||
{10, 5, 5, 6, 0, -4}, // 0x25 '%'
|
||||
{14, 5, 5, 6, 0, -4}, // 0x26 '&'
|
||||
{18, 1, 1, 2, 0, -4}, // 0x27 '''
|
||||
{19, 2, 5, 3, 0, -4}, // 0x28 '('
|
||||
{21, 2, 5, 3, 0, -4}, // 0x29 ')'
|
||||
{23, 3, 3, 4, 0, -3}, // 0x2A '*'
|
||||
{25, 3, 3, 4, 0, -3}, // 0x2B '+'
|
||||
{27, 1, 2, 2, 0, 0}, // 0x2C ','
|
||||
{28, 4, 1, 5, 0, -2}, // 0x2D '-'
|
||||
{29, 1, 1, 2, 0, 0}, // 0x2E '.'
|
||||
{30, 5, 5, 6, 0, -4}, // 0x2F '/'
|
||||
{34, 5, 5, 6, 0, -4}, // 0x30 '0'
|
||||
{38, 1, 5, 2, 0, -4}, // 0x31 '1'
|
||||
{39, 5, 5, 6, 0, -4}, // 0x32 '2'
|
||||
{43, 5, 5, 6, 0, -4}, // 0x33 '3'
|
||||
{47, 5, 5, 6, 0, -4}, // 0x34 '4'
|
||||
{51, 5, 5, 6, 0, -4}, // 0x35 '5'
|
||||
{55, 5, 5, 6, 0, -4}, // 0x36 '6'
|
||||
{59, 5, 5, 6, 0, -4}, // 0x37 '7'
|
||||
{63, 5, 5, 6, 0, -4}, // 0x38 '8'
|
||||
{67, 5, 5, 6, 0, -4}, // 0x39 '9'
|
||||
{71, 1, 4, 2, 0, -3}, // 0x3A ':'
|
||||
{72, 1, 4, 2, 0, -3}, // 0x3B ';'
|
||||
{73, 3, 5, 4, 0, -4}, // 0x3C '<'
|
||||
{75, 4, 3, 5, 0, -3}, // 0x3D '='
|
||||
{77, 3, 5, 4, 0, -4}, // 0x3E '>'
|
||||
{79, 5, 5, 6, 0, -4}, // 0x3F '?'
|
||||
{83, 5, 5, 6, 0, -4}, // 0x40 '@'
|
||||
{87, 5, 5, 6, 0, -4}, // 0x41 'A'
|
||||
{91, 5, 5, 6, 0, -4}, // 0x42 'B'
|
||||
{95, 5, 5, 6, 0, -4}, // 0x43 'C'
|
||||
{99, 5, 5, 6, 0, -4}, // 0x44 'D'
|
||||
{103, 5, 5, 6, 0, -4}, // 0x45 'E'
|
||||
{107, 5, 5, 6, 0, -4}, // 0x46 'F'
|
||||
{111, 5, 5, 6, 0, -4}, // 0x47 'G'
|
||||
{115, 5, 5, 6, 0, -4}, // 0x48 'H'
|
||||
{119, 5, 5, 6, 0, -4}, // 0x49 'I'
|
||||
{123, 5, 5, 6, 0, -4}, // 0x4A 'J'
|
||||
{127, 5, 5, 6, 0, -4}, // 0x4B 'K'
|
||||
{131, 5, 5, 6, 0, -4}, // 0x4C 'L'
|
||||
{135, 5, 5, 6, 0, -4}, // 0x4D 'M'
|
||||
{139, 5, 5, 6, 0, -4}, // 0x4E 'N'
|
||||
{143, 5, 5, 6, 0, -4}, // 0x4F 'O'
|
||||
{147, 5, 5, 6, 0, -4}, // 0x50 'P'
|
||||
{151, 5, 5, 6, 0, -4}, // 0x51 'Q'
|
||||
{155, 5, 5, 6, 0, -4}, // 0x52 'R'
|
||||
{159, 5, 5, 6, 0, -4}, // 0x53 'S'
|
||||
{163, 5, 5, 6, 0, -4}, // 0x54 'T'
|
||||
{167, 5, 5, 6, 0, -4}, // 0x55 'U'
|
||||
{171, 5, 5, 6, 0, -4}, // 0x56 'V'
|
||||
{175, 5, 5, 6, 0, -4}, // 0x57 'W'
|
||||
{179, 5, 5, 6, 0, -4}, // 0x58 'X'
|
||||
{183, 5, 5, 6, 0, -4}, // 0x59 'Y'
|
||||
{187, 5, 5, 6, 0, -4}, // 0x5A 'Z'
|
||||
{191, 2, 5, 3, 0, -4}, // 0x5B '['
|
||||
{193, 5, 5, 6, 0, -4}, // 0x5C '\'
|
||||
{197, 2, 5, 3, 0, -4}, // 0x5D ']'
|
||||
{199, 3, 2, 4, 0, -4}, // 0x5E '^'
|
||||
{200, 5, 1, 6, 0, 1}, // 0x5F '_'
|
||||
{201, 1, 1, 2, 0, -4}, // 0x60 '`'
|
||||
{202, 4, 4, 5, 0, -3}, // 0x61 'a'
|
||||
{204, 4, 5, 5, 0, -4}, // 0x62 'b'
|
||||
{207, 4, 4, 5, 0, -3}, // 0x63 'c'
|
||||
{209, 4, 5, 5, 0, -4}, // 0x64 'd'
|
||||
{212, 4, 4, 5, 0, -3}, // 0x65 'e'
|
||||
{214, 3, 5, 4, 0, -4}, // 0x66 'f'
|
||||
{216, 4, 5, 5, 0, -3}, // 0x67 'g'
|
||||
{219, 4, 5, 5, 0, -4}, // 0x68 'h'
|
||||
{222, 1, 4, 2, 0, -3}, // 0x69 'i'
|
||||
{223, 2, 5, 3, 0, -3}, // 0x6A 'j'
|
||||
{225, 4, 5, 5, 0, -4}, // 0x6B 'k'
|
||||
{228, 1, 5, 2, 0, -4}, // 0x6C 'l'
|
||||
{229, 5, 4, 6, 0, -3}, // 0x6D 'm'
|
||||
{232, 4, 4, 5, 0, -3}, // 0x6E 'n'
|
||||
{234, 4, 4, 5, 0, -3}, // 0x6F 'o'
|
||||
{236, 4, 5, 5, 0, -3}, // 0x70 'p'
|
||||
{239, 4, 5, 5, 0, -3}, // 0x71 'q'
|
||||
{242, 4, 4, 5, 0, -3}, // 0x72 'r'
|
||||
{244, 4, 4, 5, 0, -3}, // 0x73 's'
|
||||
{246, 5, 5, 6, 0, -4}, // 0x74 't'
|
||||
{250, 4, 4, 5, 0, -3}, // 0x75 'u'
|
||||
{252, 4, 4, 5, 0, -3}, // 0x76 'v'
|
||||
{254, 5, 4, 6, 0, -3}, // 0x77 'w'
|
||||
{257, 4, 4, 5, 0, -3}, // 0x78 'x'
|
||||
{259, 4, 5, 5, 0, -3}, // 0x79 'y'
|
||||
{262, 4, 4, 5, 0, -3}, // 0x7A 'z'
|
||||
{264, 3, 5, 4, 0, -4}, // 0x7B '{'
|
||||
{266, 1, 5, 2, 0, -4}, // 0x7C '|'
|
||||
{267, 3, 5, 4, 0, -4}, // 0x7D '}'
|
||||
{269, 5, 3, 6, 0, -3}}; // 0x7E '~'
|
||||
|
||||
const GFXfont Org_01 PROGMEM = {(uint8_t *)Org_01Bitmaps,
|
||||
(GFXglyph *)Org_01Glyphs, 0x20, 0x7E, 7};
|
||||
|
||||
// Approx. 943 bytes
|
||||
123
firmware/include/fonts/Picopixel.h
Normal file
123
firmware/include/fonts/Picopixel.h
Normal file
@@ -0,0 +1,123 @@
|
||||
#pragma once
|
||||
#include <Adafruit_GFX.h>
|
||||
|
||||
// Picopixel by Sebastian Weber. A tiny font
|
||||
// with all characters within a 6 pixel height.
|
||||
|
||||
const uint8_t PicopixelBitmaps[] PROGMEM = {
|
||||
0xE8, 0xB4, 0x57, 0xD5, 0xF5, 0x00, 0x4E, 0x3E, 0x80, 0xA5, 0x4A, 0x4A,
|
||||
0x5A, 0x50, 0xC0, 0x6A, 0x40, 0x95, 0x80, 0xAA, 0x80, 0x5D, 0x00, 0x60,
|
||||
0xE0, 0x80, 0x25, 0x48, 0x56, 0xD4, 0x75, 0x40, 0xC5, 0x4E, 0xC5, 0x1C,
|
||||
0x97, 0x92, 0xF3, 0x1C, 0x53, 0x54, 0xE5, 0x48, 0x55, 0x54, 0x55, 0x94,
|
||||
0xA0, 0x46, 0x64, 0xE3, 0x80, 0x98, 0xC5, 0x04, 0x56, 0xC6, 0x57, 0xDA,
|
||||
0xD7, 0x5C, 0x72, 0x46, 0xD6, 0xDC, 0xF3, 0xCE, 0xF3, 0x48, 0x72, 0xD4,
|
||||
0xB7, 0xDA, 0xF8, 0x24, 0xD4, 0xBB, 0x5A, 0x92, 0x4E, 0x8E, 0xEB, 0x58,
|
||||
0x80, 0x9D, 0xB9, 0x90, 0x56, 0xD4, 0xD7, 0x48, 0x56, 0xD4, 0x40, 0xD7,
|
||||
0x5A, 0x71, 0x1C, 0xE9, 0x24, 0xB6, 0xD4, 0xB6, 0xA4, 0x8C, 0x6B, 0x55,
|
||||
0x00, 0xB5, 0x5A, 0xB5, 0x24, 0xE5, 0x4E, 0xEA, 0xC0, 0x91, 0x12, 0xD5,
|
||||
0xC0, 0x54, 0xF0, 0x90, 0xC7, 0xF0, 0x93, 0x5E, 0x71, 0x80, 0x25, 0xDE,
|
||||
0x5E, 0x30, 0x6E, 0x80, 0x77, 0x9C, 0x93, 0x5A, 0xB8, 0x45, 0x60, 0x92,
|
||||
0xEA, 0xAA, 0x40, 0xD5, 0x6A, 0xD6, 0x80, 0x55, 0x00, 0xD7, 0x40, 0x75,
|
||||
0x90, 0xE8, 0x71, 0xE0, 0xBA, 0x40, 0xB5, 0x80, 0xB5, 0x00, 0x8D, 0x54,
|
||||
0xAA, 0x80, 0xAC, 0xE0, 0xE5, 0x70, 0x6A, 0x26, 0xFC, 0xC8, 0xAC, 0x5A};
|
||||
|
||||
const GFXglyph PicopixelGlyphs[] PROGMEM = {{0, 0, 0, 2, 0, 1}, // 0x20 ' '
|
||||
{0, 1, 5, 2, 0, -4}, // 0x21 '!'
|
||||
{1, 3, 2, 4, 0, -4}, // 0x22 '"'
|
||||
{2, 5, 5, 6, 0, -4}, // 0x23 '#'
|
||||
{6, 3, 6, 4, 0, -4}, // 0x24 '$'
|
||||
{9, 3, 5, 4, 0, -4}, // 0x25 '%'
|
||||
{11, 4, 5, 5, 0, -4}, // 0x26 '&'
|
||||
{14, 1, 2, 2, 0, -4}, // 0x27 '''
|
||||
{15, 2, 5, 3, 0, -4}, // 0x28 '('
|
||||
{17, 2, 5, 3, 0, -4}, // 0x29 ')'
|
||||
{19, 3, 3, 4, 0, -3}, // 0x2A '*'
|
||||
{21, 3, 3, 4, 0, -3}, // 0x2B '+'
|
||||
{23, 2, 2, 3, 0, 0}, // 0x2C ','
|
||||
{24, 3, 1, 4, 0, -2}, // 0x2D '-'
|
||||
{25, 1, 1, 2, 0, 0}, // 0x2E '.'
|
||||
{26, 3, 5, 4, 0, -4}, // 0x2F '/'
|
||||
{28, 3, 5, 4, 0, -4}, // 0x30 '0'
|
||||
{30, 2, 5, 3, 0, -4}, // 0x31 '1'
|
||||
{32, 3, 5, 4, 0, -4}, // 0x32 '2'
|
||||
{34, 3, 5, 4, 0, -4}, // 0x33 '3'
|
||||
{36, 3, 5, 4, 0, -4}, // 0x34 '4'
|
||||
{38, 3, 5, 4, 0, -4}, // 0x35 '5'
|
||||
{40, 3, 5, 4, 0, -4}, // 0x36 '6'
|
||||
{42, 3, 5, 4, 0, -4}, // 0x37 '7'
|
||||
{44, 3, 5, 4, 0, -4}, // 0x38 '8'
|
||||
{46, 3, 5, 4, 0, -4}, // 0x39 '9'
|
||||
{48, 1, 3, 2, 0, -3}, // 0x3A ':'
|
||||
{49, 2, 4, 3, 0, -3}, // 0x3B ';'
|
||||
{50, 2, 3, 3, 0, -3}, // 0x3C '<'
|
||||
{51, 3, 3, 4, 0, -3}, // 0x3D '='
|
||||
{53, 2, 3, 3, 0, -3}, // 0x3E '>'
|
||||
{54, 3, 5, 4, 0, -4}, // 0x3F '?'
|
||||
{56, 3, 5, 4, 0, -4}, // 0x40 '@'
|
||||
{58, 3, 5, 4, 0, -4}, // 0x41 'A'
|
||||
{60, 3, 5, 4, 0, -4}, // 0x42 'B'
|
||||
{62, 3, 5, 4, 0, -4}, // 0x43 'C'
|
||||
{64, 3, 5, 4, 0, -4}, // 0x44 'D'
|
||||
{66, 3, 5, 4, 0, -4}, // 0x45 'E'
|
||||
{68, 3, 5, 4, 0, -4}, // 0x46 'F'
|
||||
{70, 3, 5, 4, 0, -4}, // 0x47 'G'
|
||||
{72, 3, 5, 4, 0, -4}, // 0x48 'H'
|
||||
{74, 1, 5, 2, 0, -4}, // 0x49 'I'
|
||||
{75, 3, 5, 4, 0, -4}, // 0x4A 'J'
|
||||
{77, 3, 5, 4, 0, -4}, // 0x4B 'K'
|
||||
{79, 3, 5, 4, 0, -4}, // 0x4C 'L'
|
||||
{81, 5, 5, 6, 0, -4}, // 0x4D 'M'
|
||||
{85, 4, 5, 5, 0, -4}, // 0x4E 'N'
|
||||
{88, 3, 5, 4, 0, -4}, // 0x4F 'O'
|
||||
{90, 3, 5, 4, 0, -4}, // 0x50 'P'
|
||||
{92, 3, 6, 4, 0, -4}, // 0x51 'Q'
|
||||
{95, 3, 5, 4, 0, -4}, // 0x52 'R'
|
||||
{97, 3, 5, 4, 0, -4}, // 0x53 'S'
|
||||
{99, 3, 5, 4, 0, -4}, // 0x54 'T'
|
||||
{101, 3, 5, 4, 0, -4}, // 0x55 'U'
|
||||
{103, 3, 5, 4, 0, -4}, // 0x56 'V'
|
||||
{105, 5, 5, 6, 0, -4}, // 0x57 'W'
|
||||
{109, 3, 5, 4, 0, -4}, // 0x58 'X'
|
||||
{111, 3, 5, 4, 0, -4}, // 0x59 'Y'
|
||||
{113, 3, 5, 4, 0, -4}, // 0x5A 'Z'
|
||||
{115, 2, 5, 3, 0, -4}, // 0x5B '['
|
||||
{117, 3, 5, 4, 0, -4}, // 0x5C '\'
|
||||
{119, 2, 5, 3, 0, -4}, // 0x5D ']'
|
||||
{121, 3, 2, 4, 0, -4}, // 0x5E '^'
|
||||
{122, 4, 1, 4, 0, 1}, // 0x5F '_'
|
||||
{123, 2, 2, 3, 0, -4}, // 0x60 '`'
|
||||
{124, 3, 4, 4, 0, -3}, // 0x61 'a'
|
||||
{126, 3, 5, 4, 0, -4}, // 0x62 'b'
|
||||
{128, 3, 3, 4, 0, -2}, // 0x63 'c'
|
||||
{130, 3, 5, 4, 0, -4}, // 0x64 'd'
|
||||
{132, 3, 4, 4, 0, -3}, // 0x65 'e'
|
||||
{134, 2, 5, 3, 0, -4}, // 0x66 'f'
|
||||
{136, 3, 5, 4, 0, -3}, // 0x67 'g'
|
||||
{138, 3, 5, 4, 0, -4}, // 0x68 'h'
|
||||
{140, 1, 5, 2, 0, -4}, // 0x69 'i'
|
||||
{141, 2, 6, 3, 0, -4}, // 0x6A 'j'
|
||||
{143, 3, 5, 4, 0, -4}, // 0x6B 'k'
|
||||
{145, 2, 5, 3, 0, -4}, // 0x6C 'l'
|
||||
{147, 5, 3, 6, 0, -2}, // 0x6D 'm'
|
||||
{149, 3, 3, 4, 0, -2}, // 0x6E 'n'
|
||||
{151, 3, 3, 4, 0, -2}, // 0x6F 'o'
|
||||
{153, 3, 4, 4, 0, -2}, // 0x70 'p'
|
||||
{155, 3, 4, 4, 0, -2}, // 0x71 'q'
|
||||
{157, 2, 3, 3, 0, -2}, // 0x72 'r'
|
||||
{158, 3, 4, 4, 0, -3}, // 0x73 's'
|
||||
{160, 2, 5, 3, 0, -4}, // 0x74 't'
|
||||
{162, 3, 3, 4, 0, -2}, // 0x75 'u'
|
||||
{164, 3, 3, 4, 0, -2}, // 0x76 'v'
|
||||
{166, 5, 3, 6, 0, -2}, // 0x77 'w'
|
||||
{168, 3, 3, 4, 0, -2}, // 0x78 'x'
|
||||
{170, 3, 4, 4, 0, -2}, // 0x79 'y'
|
||||
{172, 3, 4, 4, 0, -3}, // 0x7A 'z'
|
||||
{174, 3, 5, 4, 0, -4}, // 0x7B '{'
|
||||
{176, 1, 6, 2, 0, -4}, // 0x7C '|'
|
||||
{177, 3, 5, 4, 0, -4}, // 0x7D '}'
|
||||
{179, 4, 2, 5, 0, -3}}; // 0x7E '~'
|
||||
|
||||
const GFXfont Picopixel PROGMEM = {(uint8_t *)PicopixelBitmaps,
|
||||
(GFXglyph *)PicopixelGlyphs, 0x20, 0x7E, 7};
|
||||
|
||||
// Approx. 852 bytes
|
||||
16
firmware/include/states/AdjustState.h
Normal file
16
firmware/include/states/AdjustState.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
class AdjustState : public State
|
||||
{
|
||||
public:
|
||||
void enter() override;
|
||||
void update() override;
|
||||
void exit() override;
|
||||
void adjustTimer(int duration);
|
||||
|
||||
private:
|
||||
int adjustDuration;
|
||||
unsigned long lastActivity;
|
||||
};
|
||||
15
firmware/include/states/DoneState.h
Normal file
15
firmware/include/states/DoneState.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
class DoneState : public State
|
||||
{
|
||||
public:
|
||||
DoneState();
|
||||
void enter() override;
|
||||
void update() override;
|
||||
void exit() override;
|
||||
|
||||
private:
|
||||
unsigned long doneEnter;
|
||||
};
|
||||
17
firmware/include/states/IdleState.h
Normal file
17
firmware/include/states/IdleState.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
class IdleState : public State
|
||||
{
|
||||
public:
|
||||
IdleState();
|
||||
void enter() override;
|
||||
void update() override;
|
||||
void exit() override;
|
||||
void setTimer(int duration);
|
||||
|
||||
private:
|
||||
int defaultDuration;
|
||||
unsigned long lastActivity;
|
||||
};
|
||||
19
firmware/include/states/PausedState.h
Normal file
19
firmware/include/states/PausedState.h
Normal file
@@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
class PausedState : public State
|
||||
{
|
||||
public:
|
||||
PausedState();
|
||||
void enter() override;
|
||||
void update() override;
|
||||
void exit() override;
|
||||
|
||||
void setPause(int duration, unsigned long elapsedTime);
|
||||
|
||||
private:
|
||||
int duration;
|
||||
unsigned long pauseEnter;
|
||||
unsigned long elapsedTime;
|
||||
};
|
||||
11
firmware/include/states/ProvisionState.h
Normal file
11
firmware/include/states/ProvisionState.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
class ProvisionState : public State
|
||||
{
|
||||
public:
|
||||
void enter() override;
|
||||
void update() override;
|
||||
void exit() override;
|
||||
};
|
||||
13
firmware/include/states/ResetState.h
Normal file
13
firmware/include/states/ResetState.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
class ResetState : public State
|
||||
{
|
||||
public:
|
||||
void enter() override;
|
||||
void update() override;
|
||||
void exit() override;
|
||||
|
||||
unsigned long resetStartTime = 0;
|
||||
};
|
||||
11
firmware/include/states/SleepState.h
Normal file
11
firmware/include/states/SleepState.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
class SleepState : public State
|
||||
{
|
||||
public:
|
||||
void enter() override;
|
||||
void update() override;
|
||||
void exit() override;
|
||||
};
|
||||
15
firmware/include/states/StartupState.h
Normal file
15
firmware/include/states/StartupState.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
class StartupState : public State
|
||||
{
|
||||
public:
|
||||
StartupState();
|
||||
void enter() override;
|
||||
void update() override;
|
||||
void exit() override;
|
||||
|
||||
private:
|
||||
unsigned long startEnter;
|
||||
};
|
||||
20
firmware/include/states/TimerState.h
Normal file
20
firmware/include/states/TimerState.h
Normal file
@@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
class TimerState : public State
|
||||
{
|
||||
public:
|
||||
TimerState();
|
||||
|
||||
void enter() override;
|
||||
void update() override;
|
||||
void exit() override;
|
||||
|
||||
void setTimer(int duration, unsigned long elapsedTime);
|
||||
|
||||
private:
|
||||
int duration;
|
||||
unsigned long startTime;
|
||||
unsigned long elapsedTime;
|
||||
};
|
||||
46
firmware/lib/README
Normal file
46
firmware/lib/README
Normal file
@@ -0,0 +1,46 @@
|
||||
|
||||
This directory is intended for project specific (private) libraries.
|
||||
PlatformIO will compile them to static libraries and link into executable file.
|
||||
|
||||
The source code of each library should be placed in an own separate directory
|
||||
("lib/your_library_name/[here are source files]").
|
||||
|
||||
For example, see a structure of the following two libraries `Foo` and `Bar`:
|
||||
|
||||
|--lib
|
||||
| |
|
||||
| |--Bar
|
||||
| | |--docs
|
||||
| | |--examples
|
||||
| | |--src
|
||||
| | |- Bar.c
|
||||
| | |- Bar.h
|
||||
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
||||
| |
|
||||
| |--Foo
|
||||
| | |- Foo.c
|
||||
| | |- Foo.h
|
||||
| |
|
||||
| |- README --> THIS FILE
|
||||
|
|
||||
|- platformio.ini
|
||||
|--src
|
||||
|- main.c
|
||||
|
||||
and a contents of `src/main.c`:
|
||||
```
|
||||
#include <Foo.h>
|
||||
#include <Bar.h>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
PlatformIO Library Dependency Finder will find automatically dependent
|
||||
libraries scanning project source files.
|
||||
|
||||
More information about PlatformIO Library Dependency Finder
|
||||
- https://docs.platformio.org/page/librarymanager/ldf.html
|
||||
5
firmware/partitions.csv
Normal file
5
firmware/partitions.csv
Normal file
@@ -0,0 +1,5 @@
|
||||
# Name, Type, SubType, Offset, Size, Flags
|
||||
nvs, data, nvs, 0x9000, 0x5000,
|
||||
otadata, data, ota, 0xe000, 0x2000,
|
||||
app0, app, ota_0, 0x10000, 0x7C0000,
|
||||
spiffs, data, spiffs, 0x7D0000,0x30000,
|
||||
|
82
firmware/src/Animation.cpp
Normal file
82
firmware/src/Animation.cpp
Normal file
@@ -0,0 +1,82 @@
|
||||
#include "Animation.h"
|
||||
|
||||
Animation::Animation(Adafruit_SSD1306* display) : oled(display), animationRunning(false), playInReverse(false) {}
|
||||
|
||||
void Animation::start(const byte* frames, int frameCount, bool loop, bool reverse, unsigned long durationMs, int width, int height) {
|
||||
animationFrames = frames;
|
||||
totalFrames = frameCount;
|
||||
loopAnimation = loop;
|
||||
playInReverse = reverse; // Set reverse playback flag
|
||||
animationRunning = true;
|
||||
|
||||
// Initialize current frame correctly based on direction
|
||||
currentFrame = playInReverse ? totalFrames - 1 : 0;
|
||||
|
||||
frameWidth = width;
|
||||
frameHeight = height;
|
||||
frameDelay = DEFAULT_FRAME_DELAY;
|
||||
|
||||
if (durationMs == 0) {
|
||||
animationDuration = totalFrames * frameDelay;
|
||||
} else {
|
||||
animationDuration = durationMs;
|
||||
}
|
||||
|
||||
animationStartTime = millis();
|
||||
lastFrameTime = millis();
|
||||
|
||||
frameX = (oled->width() - frameWidth) / 2;
|
||||
frameY = (oled->height() - frameHeight) / 2;
|
||||
|
||||
oled->clearDisplay();
|
||||
oled->drawBitmap(frameX, frameY, &animationFrames[currentFrame * 288], frameWidth, frameHeight, 1);
|
||||
oled->display();
|
||||
}
|
||||
|
||||
void Animation::update() {
|
||||
if (!animationRunning) return;
|
||||
|
||||
unsigned long currentTime = millis();
|
||||
|
||||
if (currentTime - animationStartTime >= animationDuration) {
|
||||
animationRunning = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if it's time to advance to the next frame
|
||||
if (currentTime - lastFrameTime >= frameDelay) {
|
||||
lastFrameTime = currentTime;
|
||||
|
||||
// Adjust current frame based on direction
|
||||
if (playInReverse) {
|
||||
currentFrame--;
|
||||
if (currentFrame < 0) {
|
||||
if (loopAnimation) {
|
||||
currentFrame = totalFrames - 1; // Wrap around to last frame
|
||||
} else {
|
||||
animationRunning = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
currentFrame++;
|
||||
if (currentFrame >= totalFrames) {
|
||||
if (loopAnimation) {
|
||||
currentFrame = 0; // Wrap around to first frame
|
||||
} else {
|
||||
animationRunning = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Display the current frame
|
||||
oled->clearDisplay();
|
||||
oled->drawBitmap(frameX, frameY, &animationFrames[currentFrame * 288], frameWidth, frameHeight, 1);
|
||||
oled->display();
|
||||
}
|
||||
}
|
||||
|
||||
bool Animation::isRunning() {
|
||||
return animationRunning;
|
||||
}
|
||||
47
firmware/src/StateMachine.cpp
Normal file
47
firmware/src/StateMachine.cpp
Normal file
@@ -0,0 +1,47 @@
|
||||
#include "StateMachine.h"
|
||||
|
||||
// Global state machine instance
|
||||
StateMachine stateMachine;
|
||||
|
||||
// Initialize static states
|
||||
AdjustState StateMachine::adjustState;
|
||||
SleepState StateMachine::sleepState;
|
||||
DoneState StateMachine::doneState;
|
||||
IdleState StateMachine::idleState;
|
||||
PausedState StateMachine::pausedState;
|
||||
ProvisionState StateMachine::provisionState;
|
||||
ResetState StateMachine::resetState;
|
||||
StartupState StateMachine::startupState;
|
||||
TimerState StateMachine::timerState;
|
||||
|
||||
StateMachine::StateMachine() {
|
||||
currentState = &startupState; // Start with StartupState
|
||||
stateMutex = xSemaphoreCreateMutex(); // Initialize the mutex
|
||||
}
|
||||
|
||||
// Clean up the state and delete the mutex
|
||||
StateMachine::~StateMachine() {
|
||||
if (stateMutex != NULL) {
|
||||
vSemaphoreDelete(stateMutex); // Delete the mutex
|
||||
}
|
||||
}
|
||||
|
||||
void StateMachine::changeState(State* newState) {
|
||||
// Lock the mutex
|
||||
if (xSemaphoreTake(stateMutex, portMAX_DELAY) == pdTRUE) {
|
||||
transition = true;
|
||||
if (currentState != nullptr) {
|
||||
currentState->exit();
|
||||
}
|
||||
currentState = newState; // Assign the new state (static state)
|
||||
currentState->enter();
|
||||
transition = false;
|
||||
xSemaphoreGive(stateMutex); // Release the mutex
|
||||
}
|
||||
}
|
||||
|
||||
void StateMachine::update() {
|
||||
if (!transition && currentState != nullptr) {
|
||||
currentState->update(); // Call update on the current state
|
||||
}
|
||||
}
|
||||
458
firmware/src/controllers/DisplayController.cpp
Normal file
458
firmware/src/controllers/DisplayController.cpp
Normal file
@@ -0,0 +1,458 @@
|
||||
#include "controllers/DisplayController.h"
|
||||
|
||||
#include "fonts/Picopixel.h"
|
||||
#include "fonts/Org_01.h"
|
||||
#include "bitmaps.h"
|
||||
|
||||
DisplayController::DisplayController(uint8_t oledWidth, uint8_t oledHeight, uint8_t oledAddress)
|
||||
: oled(oledWidth, oledHeight, &Wire, -1), animation(&oled) {}
|
||||
|
||||
void DisplayController::begin() {
|
||||
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
|
||||
Serial.println(F("SSD1306 allocation failed"));
|
||||
for (;;); // Loop forever if initialization fails
|
||||
}
|
||||
|
||||
// oled.ssd1306_command(SSD1306_SETCONTRAST);
|
||||
// oled.ssd1306_command(128);
|
||||
|
||||
oled.clearDisplay();
|
||||
oled.display();
|
||||
Serial.println("DisplayController initialized.");
|
||||
}
|
||||
|
||||
void DisplayController::drawSplashScreen() {
|
||||
oled.clearDisplay();
|
||||
|
||||
oled.drawBitmap(16, 3, focusdial_logo, 99, 45, 1);
|
||||
oled.setTextColor(1);
|
||||
oled.setTextSize(1);
|
||||
oled.setFont(&Picopixel);
|
||||
oled.setCursor(21, 60);
|
||||
oled.print("YOUTUBE/ @SALIMBENBOUZ");
|
||||
|
||||
oled.display();
|
||||
}
|
||||
|
||||
void DisplayController::drawIdleScreen(int duration, bool wifi) {
|
||||
if (isAnimationRunning()) return;
|
||||
|
||||
static unsigned long lastBlinkTime = 0;
|
||||
static bool blinkState = true;
|
||||
|
||||
unsigned long currentTime = millis();
|
||||
|
||||
// Toggle blink state if WiFi is off
|
||||
if (!wifi && (currentTime - lastBlinkTime >= 500)) {
|
||||
blinkState = !blinkState;
|
||||
lastBlinkTime = currentTime;
|
||||
}
|
||||
|
||||
oled.clearDisplay();
|
||||
|
||||
// "PRESS TO START"
|
||||
oled.setFont(&Picopixel);
|
||||
oled.setTextSize(1);
|
||||
oled.setTextColor(1);
|
||||
oled.setCursor(40, 58);
|
||||
oled.print("PRESS TO START");
|
||||
oled.drawRoundRect(35, 51, 60, 11, 1, 1);
|
||||
|
||||
// Display WiFi icon based on WiFi state
|
||||
if (wifi) {
|
||||
oled.drawBitmap(70, 3, icon_wifi_on, 5, 5, 1);
|
||||
oled.setCursor(54, 7);
|
||||
oled.print("WIFI");
|
||||
} else if (blinkState) {
|
||||
oled.drawBitmap(70, 3, icon_wifi_off, 5, 5, 1);
|
||||
oled.setCursor(54, 7);
|
||||
oled.print("WIFI");
|
||||
}
|
||||
|
||||
char left[3], right[3];
|
||||
int xLeft = 1;
|
||||
int xRight = 73;
|
||||
|
||||
if (duration < 60) {
|
||||
sprintf(left, "%02d", duration);
|
||||
strcpy(right, "00");
|
||||
} else {
|
||||
int hours = duration / 60;
|
||||
int minutes = duration % 60;
|
||||
sprintf(left, "%02d", hours);
|
||||
sprintf(right, "%02d", minutes);
|
||||
}
|
||||
|
||||
// Adjust position if the first character is '1'
|
||||
if (left[0] == '1') {
|
||||
xLeft += 20;
|
||||
}
|
||||
if (right[0] == '1') {
|
||||
xRight += 20;
|
||||
}
|
||||
|
||||
oled.setTextSize(5);
|
||||
oled.setFont(&Org_01);
|
||||
oled.setCursor(xLeft, 36);
|
||||
oled.print(left);
|
||||
|
||||
oled.setCursor(xRight, 36);
|
||||
oled.print(right);
|
||||
|
||||
// Separator dots
|
||||
oled.fillRect(62, 21, 5, 5, 1);
|
||||
oled.fillRect(62, 31, 5, 5, 1);
|
||||
|
||||
oled.display();
|
||||
}
|
||||
|
||||
void DisplayController::drawTimerScreen(int remainingSeconds) {
|
||||
if (isAnimationRunning()) return;
|
||||
|
||||
oled.clearDisplay();
|
||||
|
||||
if (remainingSeconds < 0) {
|
||||
remainingSeconds = 0;
|
||||
}
|
||||
|
||||
int hours = remainingSeconds / 3600;
|
||||
int minutes = (remainingSeconds % 3600) / 60;
|
||||
int seconds = remainingSeconds % 60;
|
||||
|
||||
char left[3], right[3], secondsStr[3];
|
||||
int xLeft = 1;
|
||||
int xRight = 73;
|
||||
|
||||
// Format left and right
|
||||
if (hours > 0) {
|
||||
sprintf(left, "%02d", hours);
|
||||
sprintf(right, "%02d", minutes);
|
||||
} else {
|
||||
sprintf(left, "%02d", minutes);
|
||||
sprintf(right, "%02d", seconds);
|
||||
}
|
||||
|
||||
// Adjust position if the first character is '1'
|
||||
if (left[0] == '1') {
|
||||
xLeft += 20;
|
||||
}
|
||||
if (right[0] == '1') {
|
||||
xRight += 20;
|
||||
}
|
||||
|
||||
// Draw the left value (hours or minutes)
|
||||
oled.setTextColor(1);
|
||||
oled.setTextSize(5);
|
||||
oled.setFont(&Org_01);
|
||||
oled.setCursor(xLeft, 36);
|
||||
oled.print(left);
|
||||
|
||||
// Draw the right value (minutes or seconds)
|
||||
oled.setCursor(xRight, 36);
|
||||
oled.print(right);
|
||||
|
||||
// Separator dots
|
||||
oled.fillRect(62, 31, 5, 5, 1);
|
||||
oled.fillRect(62, 21, 5, 5, 1);
|
||||
|
||||
sprintf(secondsStr, "%02d", seconds);
|
||||
|
||||
int xSeconds = 54;
|
||||
if (secondsStr[0] == '1') {
|
||||
xSeconds += 8; // Offset by 8 if the first char is '1'
|
||||
}
|
||||
|
||||
oled.setTextSize(2);
|
||||
oled.setCursor(xSeconds, 58);
|
||||
oled.print(secondsStr);
|
||||
|
||||
// Draw icons and labels
|
||||
oled.drawBitmap(61, 3, icon_star, 7, 7, 1);
|
||||
oled.setTextSize(1);
|
||||
oled.setCursor(27, 54);
|
||||
oled.print(hours > 0 ? "H" : "M");
|
||||
oled.setCursor(98, 54);
|
||||
oled.print(hours > 0 ? "M" : "S");
|
||||
|
||||
oled.display();
|
||||
}
|
||||
|
||||
void DisplayController::drawPausedScreen(int remainingSeconds) {
|
||||
if (isAnimationRunning()) return;
|
||||
|
||||
oled.clearDisplay();
|
||||
|
||||
if (remainingSeconds < 0) {
|
||||
remainingSeconds = 0;
|
||||
}
|
||||
|
||||
int hours = remainingSeconds / 3600;
|
||||
int minutes = (remainingSeconds % 3600) / 60;
|
||||
int seconds = remainingSeconds % 60;
|
||||
|
||||
char left[3], right[3];
|
||||
int xLeft = 1;
|
||||
int xRight = 73;
|
||||
|
||||
// Format left and right
|
||||
if (hours > 0) {
|
||||
sprintf(left, "%02d", hours);
|
||||
sprintf(right, "%02d", minutes);
|
||||
} else {
|
||||
sprintf(left, "%02d", minutes);
|
||||
sprintf(right, "%02d", seconds);
|
||||
}
|
||||
|
||||
// Adjust position if the first character is '1'
|
||||
if (left[0] == '1') {
|
||||
xLeft += 20;
|
||||
}
|
||||
if (right[0] == '1') {
|
||||
xRight += 20;
|
||||
}
|
||||
|
||||
if ((millis() / 400) % 2 == 0) {
|
||||
oled.setTextColor(1);
|
||||
oled.setTextSize(5);
|
||||
oled.setFont(&Org_01);
|
||||
oled.setCursor(xLeft, 36);
|
||||
oled.print(left);
|
||||
oled.setCursor(xRight, 36);
|
||||
oled.print(right);
|
||||
|
||||
oled.fillRect(62, 31, 5, 5, 1);
|
||||
oled.fillRect(62, 22, 5, 5, 1);
|
||||
|
||||
oled.setFont(&Org_01);
|
||||
oled.setTextSize(1);
|
||||
oled.setCursor(27, 54);
|
||||
oled.print(hours > 0 ? "H" : "M");
|
||||
oled.setCursor(98, 54);
|
||||
oled.print(hours > 0 ? "M" : "S");
|
||||
}
|
||||
|
||||
// Draw label and icon
|
||||
oled.drawRoundRect(47, 51, 35, 11, 1, 1);
|
||||
oled.setTextColor(1);
|
||||
oled.setTextSize(1);
|
||||
oled.setFont(&Picopixel);
|
||||
oled.setCursor(53, 58);
|
||||
oled.print("PAUSED");
|
||||
oled.drawBitmap(60, 2, icon_pause, 9, 9, 1);
|
||||
|
||||
oled.display();
|
||||
}
|
||||
|
||||
void DisplayController::drawResetScreen(bool resetSelected) {
|
||||
if (isAnimationRunning()) return;
|
||||
oled.clearDisplay();
|
||||
|
||||
// Static UI elements
|
||||
oled.setTextColor(1);
|
||||
oled.setTextSize(2);
|
||||
oled.setFont(&Picopixel);
|
||||
oled.setCursor(54, 15);
|
||||
oled.print("RESET");
|
||||
oled.setTextSize(1);
|
||||
oled.setCursor(20, 30);
|
||||
oled.print("ALL STORED SETTINGS WILL ");
|
||||
oled.setCursor(21, 40);
|
||||
oled.print("BE PERMANENTLY ERASED.");
|
||||
oled.drawBitmap(35, 4, icon_reset, 13, 16, 1);
|
||||
|
||||
// Change only the rectangle fill and text color based on selection
|
||||
if (resetSelected) {
|
||||
// "RESET" filled, "CANCEL" outlined
|
||||
oled.fillRoundRect(67, 49, 37, 11, 1, 1);
|
||||
oled.setTextColor(0);
|
||||
oled.setCursor(76, 56);
|
||||
oled.print("RESET");
|
||||
|
||||
oled.drawRoundRect(24, 49, 37, 11, 1, 1);
|
||||
oled.setTextColor(1);
|
||||
oled.setCursor(31, 56);
|
||||
oled.print("CANCEL");
|
||||
} else {
|
||||
// "CANCEL" filled, "RESET" outlined
|
||||
oled.fillRoundRect(24, 49, 37, 11, 1, 1);
|
||||
oled.setTextColor(0);
|
||||
oled.setCursor(31, 56);
|
||||
oled.print("CANCEL");
|
||||
|
||||
oled.drawRoundRect(67, 49, 37, 11, 1, 1);
|
||||
oled.setTextColor(1);
|
||||
oled.setCursor(76, 56);
|
||||
oled.print("RESET");
|
||||
}
|
||||
|
||||
oled.display();
|
||||
}
|
||||
|
||||
void DisplayController::drawDoneScreen() {
|
||||
if (isAnimationRunning()) return;
|
||||
|
||||
static unsigned long lastBlinkTime = 0;
|
||||
static bool blinkState = true;
|
||||
|
||||
unsigned long currentTime = millis();
|
||||
|
||||
// Toggle blink every 500 ms
|
||||
if (currentTime - lastBlinkTime >= 500) {
|
||||
blinkState = !blinkState;
|
||||
lastBlinkTime = currentTime;
|
||||
}
|
||||
|
||||
oled.clearDisplay();
|
||||
|
||||
if (blinkState) {
|
||||
oled.setTextColor(1);
|
||||
oled.setTextSize(5);
|
||||
oled.setFont(&Org_01);
|
||||
oled.setCursor(1, 36);
|
||||
oled.print("00");
|
||||
oled.setCursor(73, 36);
|
||||
oled.print("00");
|
||||
oled.fillRect(62, 31, 5, 5, 1);
|
||||
oled.fillRect(62, 21, 5, 5, 1);
|
||||
}
|
||||
|
||||
// Draw label and icon
|
||||
oled.fillRoundRect(46, 51, 35, 11, 1, 1);
|
||||
oled.setTextColor(0);
|
||||
oled.setTextSize(1);
|
||||
oled.setFont(&Picopixel);
|
||||
oled.setCursor(56, 58);
|
||||
oled.print("DONE");
|
||||
oled.drawBitmap(61, 3, icon_star, 7, 7, 1);
|
||||
|
||||
oled.display();
|
||||
}
|
||||
|
||||
|
||||
void DisplayController::drawAdjustScreen(int duration) {
|
||||
if (isAnimationRunning()) return;
|
||||
|
||||
oled.clearDisplay();
|
||||
|
||||
oled.setTextColor(1);
|
||||
oled.setTextSize(4);
|
||||
oled.setFont(&Org_01);
|
||||
|
||||
int hours = duration / 60;
|
||||
int minutes = duration % 60;
|
||||
|
||||
char hourStr[3];
|
||||
char minuteStr[3];
|
||||
|
||||
// Format hour and minute strings with leading zeros
|
||||
sprintf(hourStr, "%02d", hours);
|
||||
sprintf(minuteStr, "%02d", minutes);
|
||||
|
||||
// Default positions for hours and minutes
|
||||
int xHour = 13;
|
||||
int xMinute = 72;
|
||||
|
||||
// Check the first character and adjust position if '1'
|
||||
if (hourStr[0] == '1') {
|
||||
xHour += 15;
|
||||
}
|
||||
if (minuteStr[0] == '1') {
|
||||
xMinute += 15;
|
||||
}
|
||||
|
||||
// Display hours
|
||||
oled.setCursor(xHour, 37);
|
||||
oled.print(hourStr);
|
||||
|
||||
// Display minutes
|
||||
oled.setCursor(xMinute, 37);
|
||||
oled.print(minuteStr);
|
||||
|
||||
// Display labels
|
||||
oled.setTextSize(1);
|
||||
oled.setCursor(26, 55);
|
||||
oled.print("HRS");
|
||||
oled.setCursor(86, 55);
|
||||
oled.print("MIN");
|
||||
|
||||
// Additional UI elements
|
||||
oled.drawBitmap(0, 12, image_change_left, 7, 40, 1);
|
||||
oled.drawRoundRect(36, 1, 57, 11, 1, 1);
|
||||
oled.drawBitmap(121, 12, image_change_right, 7, 40, 1);
|
||||
oled.setFont(&Picopixel);
|
||||
oled.setCursor(41, 8);
|
||||
oled.print("PRESS TO SAVE");
|
||||
oled.drawBitmap(103, 3, icon_arrow_down, 5, 7, 1);
|
||||
oled.drawBitmap(21, 3, icon_arrow_down, 5, 7, 1);
|
||||
|
||||
oled.display();
|
||||
}
|
||||
|
||||
|
||||
void DisplayController::drawProvisionScreen() {
|
||||
if (isAnimationRunning()) return;
|
||||
|
||||
oled.clearDisplay();
|
||||
|
||||
oled.setTextColor(1);
|
||||
oled.setTextSize(1);
|
||||
oled.setFont(&Picopixel);
|
||||
oled.setCursor(12, 38);
|
||||
oled.print("PLEASE CONNECT TO BLUETOOTH");
|
||||
oled.setCursor(14, 48);
|
||||
oled.print("AND THIS FOCUSDIAL NETWORK");
|
||||
oled.setCursor(35, 58);
|
||||
oled.print("TO PROVISION WIFI");
|
||||
oled.drawBitmap(39, 4, provision_logo, 51, 23, 1);
|
||||
|
||||
oled.display();
|
||||
}
|
||||
|
||||
void DisplayController::clear() {
|
||||
oled.clearDisplay();
|
||||
oled.display();
|
||||
}
|
||||
|
||||
void DisplayController::showAnimation(const byte frames[][288], int frameCount, bool loop, bool reverse, unsigned long durationMs, int width, int height) {
|
||||
animation.start(&frames[0][0], frameCount, loop, reverse, durationMs, width, height); // Pass array as pointer
|
||||
}
|
||||
|
||||
void DisplayController::updateAnimation() {
|
||||
animation.update();
|
||||
}
|
||||
|
||||
bool DisplayController::isAnimationRunning() {
|
||||
return animation.isRunning();
|
||||
}
|
||||
|
||||
void DisplayController::showConfirmation() {
|
||||
showAnimation(animation_tick, 20);
|
||||
}
|
||||
|
||||
void DisplayController::showCancel() {
|
||||
showAnimation(animation_cancel, 18, false, true);
|
||||
}
|
||||
|
||||
void DisplayController::showReset() {
|
||||
showAnimation(animation_reset, 28, true, false);
|
||||
}
|
||||
|
||||
void DisplayController::showConnected() {
|
||||
showAnimation(animation_wifi, 28);
|
||||
}
|
||||
|
||||
void DisplayController::showTimerStart() {
|
||||
showAnimation(animation_timer_start, 20, false, true);
|
||||
}
|
||||
|
||||
void DisplayController::showTimerDone() {
|
||||
showAnimation(animation_timer_start, 20);
|
||||
}
|
||||
|
||||
void DisplayController::showTimerPause() {
|
||||
showAnimation(animation_resume, 18, false, true);
|
||||
}
|
||||
|
||||
void DisplayController::showTimerResume() {
|
||||
showAnimation(animation_resume, 18);
|
||||
}
|
||||
141
firmware/src/controllers/InputController.cpp
Normal file
141
firmware/src/controllers/InputController.cpp
Normal file
@@ -0,0 +1,141 @@
|
||||
#include "controllers/InputController.h"
|
||||
#include <Arduino.h>
|
||||
|
||||
static InputController *instancePtr = nullptr; // Global pointer for the ISR
|
||||
|
||||
void InputController::handleEncoderInterrupt()
|
||||
{
|
||||
if (instancePtr)
|
||||
{
|
||||
instancePtr->encoder.tick();
|
||||
}
|
||||
}
|
||||
|
||||
void InputController::handleButtonInterrupt()
|
||||
{
|
||||
if (instancePtr)
|
||||
{
|
||||
instancePtr->button.tick();
|
||||
}
|
||||
}
|
||||
|
||||
InputController::InputController(uint8_t buttonPin, uint8_t encoderPinA, uint8_t encoderPinB)
|
||||
: button(buttonPin, true),
|
||||
encoder(encoderPinA, encoderPinB, RotaryEncoder::LatchMode::TWO03),
|
||||
lastPosition(0),
|
||||
buttonPin(buttonPin),
|
||||
encoderPinA(encoderPinA),
|
||||
encoderPinB(encoderPinB)
|
||||
{
|
||||
|
||||
// Attach click, double-click, and long-press handlers using OneButton library
|
||||
button.attachClick([](void *scope)
|
||||
{ static_cast<InputController *>(scope)->onButtonClick(); }, this);
|
||||
button.attachDoubleClick([](void *scope)
|
||||
{ static_cast<InputController *>(scope)->onButtonDoubleClick(); }, this);
|
||||
button.attachLongPressStart([](void *scope)
|
||||
{ static_cast<InputController *>(scope)->onButtonLongPress(); }, this);
|
||||
|
||||
instancePtr = this; // Set the global instance pointer to this instance
|
||||
}
|
||||
|
||||
void InputController::begin()
|
||||
{
|
||||
button.setDebounceMs(20);
|
||||
button.setClickMs(150);
|
||||
button.setPressMs(400);
|
||||
lastPosition = encoder.getPosition();
|
||||
|
||||
pinMode(buttonPin, INPUT_PULLUP);
|
||||
pinMode(encoderPinA, INPUT_PULLUP);
|
||||
pinMode(encoderPinB, INPUT_PULLUP);
|
||||
|
||||
// Set up interrupts for encoder handling
|
||||
attachInterrupt(digitalPinToInterrupt(encoderPinA), handleEncoderInterrupt, CHANGE);
|
||||
attachInterrupt(digitalPinToInterrupt(encoderPinB), handleEncoderInterrupt, CHANGE);
|
||||
|
||||
// Set up interrupt for button handling
|
||||
attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonInterrupt, CHANGE); // Interrupt on button state change
|
||||
}
|
||||
|
||||
void InputController::update()
|
||||
{
|
||||
button.tick();
|
||||
encoder.tick();
|
||||
|
||||
// Check encoder position and calculate delta
|
||||
int currentPosition = encoder.getPosition();
|
||||
int delta = currentPosition - lastPosition;
|
||||
|
||||
if (delta != 0)
|
||||
{
|
||||
onEncoderRotate(delta);
|
||||
lastPosition = currentPosition;
|
||||
}
|
||||
}
|
||||
|
||||
// Register state-specific handlers
|
||||
void InputController::onPressHandler(std::function<void()> handler)
|
||||
{
|
||||
pressHandler = handler;
|
||||
}
|
||||
|
||||
void InputController::onDoublePressHandler(std::function<void()> handler)
|
||||
{
|
||||
doublePressHandler = handler;
|
||||
}
|
||||
|
||||
void InputController::onLongPressHandler(std::function<void()> handler)
|
||||
{
|
||||
longPressHandler = handler;
|
||||
}
|
||||
|
||||
void InputController::onEncoderRotateHandler(std::function<void(int delta)> handler)
|
||||
{
|
||||
encoderRotateHandler = handler;
|
||||
}
|
||||
|
||||
// Method to release all handlers
|
||||
void InputController::releaseHandlers()
|
||||
{
|
||||
pressHandler = nullptr;
|
||||
doublePressHandler = nullptr;
|
||||
longPressHandler = nullptr;
|
||||
encoderRotateHandler = nullptr;
|
||||
|
||||
button.reset(); // Reset button state machine
|
||||
lastPosition = encoder.getPosition(); // Reset encoder position tracking
|
||||
}
|
||||
|
||||
// Internal event handlers that call the registered state handlers
|
||||
void InputController::onButtonClick()
|
||||
{
|
||||
if (pressHandler != nullptr)
|
||||
{
|
||||
pressHandler();
|
||||
}
|
||||
}
|
||||
|
||||
void InputController::onButtonDoubleClick()
|
||||
{
|
||||
if (doublePressHandler != nullptr)
|
||||
{
|
||||
doublePressHandler();
|
||||
}
|
||||
}
|
||||
|
||||
void InputController::onButtonLongPress()
|
||||
{
|
||||
if (longPressHandler != nullptr)
|
||||
{
|
||||
longPressHandler();
|
||||
}
|
||||
}
|
||||
|
||||
void InputController::onEncoderRotate(int delta)
|
||||
{
|
||||
if (encoderRotateHandler != nullptr)
|
||||
{
|
||||
encoderRotateHandler(delta); // Pass delta to the handler
|
||||
}
|
||||
}
|
||||
241
firmware/src/controllers/LedController.cpp
Normal file
241
firmware/src/controllers/LedController.cpp
Normal file
@@ -0,0 +1,241 @@
|
||||
#include "controllers/LedController.h"
|
||||
|
||||
LEDController::LEDController(uint8_t ledPin, uint16_t numLeds, uint8_t brightness)
|
||||
: leds(numLeds, ledPin),
|
||||
numLeds(numLeds),
|
||||
brightness(brightness),
|
||||
currentAnimation(None),
|
||||
lastUpdateTime(0),
|
||||
currentStep(0),
|
||||
currentCycle(0),
|
||||
decayStarted(false) {}
|
||||
|
||||
void LEDController::begin()
|
||||
{
|
||||
leds.begin();
|
||||
leds.setBrightness(brightness);
|
||||
leds.show();
|
||||
}
|
||||
|
||||
void LEDController::update()
|
||||
{
|
||||
switch (currentAnimation)
|
||||
{
|
||||
case FillAndDecay:
|
||||
handleFillAndDecay();
|
||||
break;
|
||||
case Spinner:
|
||||
handleSpinner();
|
||||
break;
|
||||
case Breath:
|
||||
handleBreath();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void LEDController::startFillAndDecay(uint32_t color, uint32_t totalDuration)
|
||||
{
|
||||
stopCurrentAnimation();
|
||||
currentAnimation = FillAndDecay;
|
||||
animationColor = color;
|
||||
animationDuration = totalDuration;
|
||||
currentStep = 0;
|
||||
pixelIndex = 0;
|
||||
brightnessLevel = brightness;
|
||||
lastUpdateTime = millis();
|
||||
}
|
||||
|
||||
void LEDController::setSpinner(uint32_t color, int cycles)
|
||||
{
|
||||
stopCurrentAnimation();
|
||||
currentAnimation = Spinner;
|
||||
animationColor = color;
|
||||
animationCycles = cycles;
|
||||
currentCycle = 0;
|
||||
currentStep = 0;
|
||||
lastUpdateTime = millis();
|
||||
}
|
||||
|
||||
void LEDController::setBreath(uint32_t color, int cycles, bool endFilled, uint32_t speed)
|
||||
{
|
||||
stopCurrentAnimation();
|
||||
currentAnimation = Breath;
|
||||
animationColor = color;
|
||||
animationCycles = cycles;
|
||||
this->endFilled = endFilled;
|
||||
animationSpeed = speed;
|
||||
currentCycle = 0;
|
||||
currentStep = 0;
|
||||
lastUpdateTime = millis();
|
||||
}
|
||||
|
||||
void LEDController::setSolid(uint32_t color)
|
||||
{
|
||||
stopCurrentAnimation();
|
||||
leds.fill(color);
|
||||
leds.show();
|
||||
}
|
||||
|
||||
void LEDController::turnOff()
|
||||
{
|
||||
stopCurrentAnimation();
|
||||
leds.clear();
|
||||
leds.show();
|
||||
}
|
||||
|
||||
uint32_t LEDController::scaleColor(uint32_t color, uint8_t brightnessLevel)
|
||||
{
|
||||
uint8_t r = (color >> 16 & 0xFF) * brightnessLevel / 255;
|
||||
uint8_t g = (color >> 8 & 0xFF) * brightnessLevel / 255;
|
||||
uint8_t b = (color & 0xFF) * brightnessLevel / 255;
|
||||
return leds.Color(r, g, b);
|
||||
}
|
||||
|
||||
void LEDController::handleFillAndDecay()
|
||||
{
|
||||
uint32_t fillDuration = 300; // Initial fill duration
|
||||
uint32_t decayDuration = animationDuration - fillDuration;
|
||||
uint32_t totalSteps = (numLeds + 1) * brightness;
|
||||
uint32_t stepDuration = decayDuration / totalSteps;
|
||||
|
||||
if (currentStep < numLeds)
|
||||
{
|
||||
// Quick fill phase
|
||||
uint32_t stepDurationFill = fillDuration / numLeds;
|
||||
if (millis() - lastUpdateTime >= stepDurationFill)
|
||||
{
|
||||
leds.setPixelColor(currentStep, scaleColor(animationColor, brightness));
|
||||
leds.show();
|
||||
currentStep++;
|
||||
lastUpdateTime = millis();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Initialize decay phase
|
||||
if (!decayStarted)
|
||||
{
|
||||
decayStarted = true;
|
||||
pixelIndex = 1;
|
||||
brightnessLevel = brightness;
|
||||
lastUpdateTime = millis();
|
||||
}
|
||||
|
||||
// Decay phase
|
||||
if (millis() - lastUpdateTime >= stepDuration)
|
||||
{
|
||||
lastUpdateTime = millis();
|
||||
|
||||
if (brightnessLevel > 0)
|
||||
{
|
||||
brightnessLevel--;
|
||||
leds.setPixelColor(pixelIndex, scaleColor(animationColor, brightnessLevel));
|
||||
leds.show();
|
||||
}
|
||||
else
|
||||
{
|
||||
leds.setPixelColor(pixelIndex, 0);
|
||||
leds.show();
|
||||
pixelIndex++;
|
||||
brightnessLevel = brightness;
|
||||
}
|
||||
|
||||
if (pixelIndex > numLeds)
|
||||
{
|
||||
stopCurrentAnimation();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LEDController::handleSpinner()
|
||||
{
|
||||
uint32_t stepDuration = 100;
|
||||
if (millis() - lastUpdateTime >= stepDuration)
|
||||
{
|
||||
leds.clear();
|
||||
for (int i = 0; i < numLeds; i++)
|
||||
{
|
||||
leds.setPixelColor((i + currentStep) % numLeds, scaleColor(animationColor, i * 255 / numLeds));
|
||||
}
|
||||
leds.show();
|
||||
currentStep++;
|
||||
lastUpdateTime = millis();
|
||||
|
||||
if (currentStep >= numLeds)
|
||||
{
|
||||
currentStep = 0;
|
||||
currentCycle++;
|
||||
if (animationCycles != -1 && currentCycle >= animationCycles)
|
||||
{
|
||||
stopCurrentAnimation();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LEDController::handleBreath()
|
||||
{
|
||||
if (millis() - lastUpdateTime >= animationSpeed)
|
||||
{
|
||||
uint8_t fadeBrightness = (currentStep <= 127) ? currentStep * 2 : (255 - currentStep) * 2;
|
||||
|
||||
for (int i = 0; i < numLeds; i++)
|
||||
{
|
||||
leds.setPixelColor(i, scaleColor(animationColor, fadeBrightness));
|
||||
}
|
||||
leds.show();
|
||||
currentStep++;
|
||||
|
||||
if (currentStep >= 255)
|
||||
{
|
||||
currentStep = 0;
|
||||
currentCycle++;
|
||||
|
||||
// Adjust the number of cycles if `endFilled` is true
|
||||
int effectiveCycles = animationCycles;
|
||||
if (endFilled && effectiveCycles > 0)
|
||||
{
|
||||
effectiveCycles--;
|
||||
}
|
||||
|
||||
if (effectiveCycles != -1 && currentCycle >= effectiveCycles)
|
||||
{
|
||||
if (endFilled)
|
||||
{
|
||||
// Additional half cycle to fill the LEDs
|
||||
for (int i = 0; i < numLeds; i++)
|
||||
{
|
||||
leds.setPixelColor(i, animationColor);
|
||||
}
|
||||
leds.show();
|
||||
}
|
||||
else
|
||||
{
|
||||
turnOff();
|
||||
}
|
||||
stopCurrentAnimation();
|
||||
}
|
||||
}
|
||||
lastUpdateTime = millis();
|
||||
}
|
||||
}
|
||||
|
||||
void LEDController::stopCurrentAnimation()
|
||||
{
|
||||
currentAnimation = None;
|
||||
currentStep = 0;
|
||||
currentCycle = 0;
|
||||
pixelIndex = 0;
|
||||
brightnessLevel = brightness;
|
||||
decayStarted = false;
|
||||
lastUpdateTime = millis();
|
||||
}
|
||||
|
||||
void LEDController::printDebugInfo()
|
||||
{
|
||||
Serial.printf("Anim: %d, Step: %d, Cycle: %d, PixelIdx: %d, Leds numb: %d, Brightness: %d, Color: 0x%06X, Dur: %lu, Speed: %lu, Cycles: %d, EndFilled: %d\n",
|
||||
currentAnimation, currentStep, currentCycle, pixelIndex, numLeds, brightness, animationColor, animationDuration, animationSpeed, animationCycles, endFilled);
|
||||
}
|
||||
511
firmware/src/controllers/NetworkController.cpp
Normal file
511
firmware/src/controllers/NetworkController.cpp
Normal file
@@ -0,0 +1,511 @@
|
||||
#include "Config.h"
|
||||
#include "controllers/NetworkController.h"
|
||||
|
||||
#include <WiFi.h>
|
||||
#include <WiFiClientSecure.h>
|
||||
#include <HTTPClient.h>
|
||||
#include <BluetoothA2DPSink.h>
|
||||
#include <esp_bt.h>
|
||||
|
||||
NetworkController *NetworkController::instance = nullptr;
|
||||
|
||||
NetworkController::NetworkController()
|
||||
: a2dp_sink(),
|
||||
btPaired(false),
|
||||
bluetoothActive(false),
|
||||
bluetoothAttempted(false),
|
||||
lastBluetoothtAttempt(0),
|
||||
bluetoothTaskHandle(nullptr),
|
||||
webhookQueue(nullptr),
|
||||
webhookTaskHandle(nullptr),
|
||||
provisioningMode(false)
|
||||
{
|
||||
|
||||
instance = this;
|
||||
}
|
||||
|
||||
void NetworkController::begin()
|
||||
{
|
||||
WiFiProvisionerSettings();
|
||||
|
||||
if (isWiFiProvisioned())
|
||||
{
|
||||
Serial.println("Stored WiFi credentials found. Connecting...");
|
||||
wifiProvisioner.connectToWiFi();
|
||||
}
|
||||
|
||||
// Load bluetooth paired state from nvs
|
||||
preferences.begin("network", true);
|
||||
btPaired = preferences.getBool("bt_paired", false);
|
||||
preferences.end();
|
||||
|
||||
if (btPaired)
|
||||
{
|
||||
Serial.println("Previously paired with a device. Initializing Bluetooth.");
|
||||
initializeBluetooth(); // Initialize Bluetooth if previously paired
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("No previous Bluetooth pairing found. Skipping Bluetooth initialization.");
|
||||
}
|
||||
|
||||
// Load Webhook URL from NVS under the "focusdial" namespace
|
||||
preferences.begin("focusdial", true);
|
||||
webhookURL = preferences.getString("webhook_url", "");
|
||||
preferences.end();
|
||||
|
||||
if (!webhookURL.isEmpty())
|
||||
{
|
||||
Serial.println("Loaded Webhook URL: " + webhookURL);
|
||||
}
|
||||
|
||||
if (webhookQueue == nullptr)
|
||||
{
|
||||
webhookQueue = xQueueCreate(5, sizeof(char *));
|
||||
}
|
||||
|
||||
if (webhookTaskHandle == nullptr)
|
||||
{
|
||||
xTaskCreatePinnedToCore(webhookTask, "Webhook Task", 4096, this, 0, &webhookTaskHandle, 1);
|
||||
Serial.println("Persistent webhook task started.");
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkController::update()
|
||||
{
|
||||
if (WiFi.status() != WL_CONNECTED)
|
||||
{
|
||||
WiFi.reconnect();
|
||||
}
|
||||
}
|
||||
|
||||
bool NetworkController::isWiFiProvisioned()
|
||||
{
|
||||
// Check for stored WiFi credentials
|
||||
preferences.begin("network", true);
|
||||
String storedSSID = preferences.getString("ssid", "");
|
||||
preferences.end();
|
||||
|
||||
return !storedSSID.isEmpty(); // Return true if credentials are found
|
||||
}
|
||||
|
||||
bool NetworkController::isWiFiConnected()
|
||||
{
|
||||
return (WiFi.status() == WL_CONNECTED);
|
||||
}
|
||||
|
||||
bool NetworkController::isBluetoothPaired()
|
||||
{
|
||||
return btPaired;
|
||||
}
|
||||
|
||||
void NetworkController::startProvisioning()
|
||||
{
|
||||
Serial.println("Starting provisioning mode...");
|
||||
btPaired = false; // Reset paired state for new provisioning
|
||||
bluetoothActive = true; // Enable Bluetooth for pairing
|
||||
provisioningMode = true; // Indicate we are in provisioning mode
|
||||
initializeBluetooth();
|
||||
wifiProvisioner.setupAccessPointAndServer();
|
||||
}
|
||||
|
||||
void NetworkController::stopProvisioning()
|
||||
{
|
||||
Serial.println("Stopping provisioning mode...");
|
||||
bluetoothActive = false; // Disable Bluetooth after provisioning
|
||||
provisioningMode = false; // Exit provisioning mode
|
||||
stopBluetooth();
|
||||
}
|
||||
|
||||
void NetworkController::reset()
|
||||
{
|
||||
wifiProvisioner.resetCredentials();
|
||||
if (btPaired)
|
||||
{
|
||||
a2dp_sink.clean_last_connection();
|
||||
saveBluetoothPairedState(false);
|
||||
}
|
||||
Serial.println("Reset complete. WiFi credentials and paired state cleared.");
|
||||
}
|
||||
|
||||
void NetworkController::initializeBluetooth()
|
||||
{
|
||||
if (bluetoothTaskHandle == nullptr)
|
||||
{
|
||||
|
||||
// Configure the A2DP sink with empty callbacks to use it for the trigger only
|
||||
a2dp_sink.set_stream_reader(nullptr, false);
|
||||
a2dp_sink.set_raw_stream_reader(nullptr);
|
||||
a2dp_sink.set_on_volumechange(nullptr);
|
||||
a2dp_sink.set_avrc_connection_state_callback(nullptr);
|
||||
a2dp_sink.set_avrc_metadata_callback(nullptr);
|
||||
a2dp_sink.set_avrc_rn_playstatus_callback(nullptr);
|
||||
a2dp_sink.set_avrc_rn_track_change_callback(nullptr);
|
||||
a2dp_sink.set_avrc_rn_play_pos_callback(nullptr);
|
||||
a2dp_sink.set_spp_active(false);
|
||||
a2dp_sink.set_output_active(false);
|
||||
a2dp_sink.set_rssi_active(false);
|
||||
|
||||
a2dp_sink.set_on_connection_state_changed(btConnectionStateCallback, this);
|
||||
|
||||
Serial.println("Bluetooth A2DP Sink configured.");
|
||||
|
||||
// Create task for handling Bluetooth
|
||||
xTaskCreate(bluetoothTask, "Bluetooth Task", 4096, this, 0, &bluetoothTaskHandle);
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkController::startBluetooth()
|
||||
{
|
||||
if (btPaired)
|
||||
{ // Only start if paired
|
||||
bluetoothActive = true;
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkController::stopBluetooth()
|
||||
{
|
||||
bluetoothActive = false; // Stop Bluetooth activity
|
||||
}
|
||||
|
||||
void NetworkController::btConnectionStateCallback(esp_a2d_connection_state_t state, void *obj)
|
||||
{
|
||||
auto *self = static_cast<NetworkController *>(obj);
|
||||
|
||||
if (state == ESP_A2D_CONNECTION_STATE_CONNECTED)
|
||||
{
|
||||
Serial.println("Bluetooth device connected.");
|
||||
|
||||
// Save paired state only in provisioning mode
|
||||
if (self->provisioningMode)
|
||||
{
|
||||
self->saveBluetoothPairedState(true);
|
||||
self->btPaired = true;
|
||||
Serial.println("Paired state saved during provisioning.");
|
||||
}
|
||||
}
|
||||
else if (state == ESP_A2D_CONNECTION_STATE_DISCONNECTED)
|
||||
{
|
||||
Serial.println("Bluetooth device disconnected.");
|
||||
// No need to set flags; task loop will handle reconnection logic based on is_connected()
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkController::saveBluetoothPairedState(bool paired)
|
||||
{
|
||||
preferences.begin("network", false);
|
||||
preferences.putBool("bt_paired", paired);
|
||||
preferences.end();
|
||||
btPaired = paired;
|
||||
Serial.println("Bluetooth pairing state saved in NVS.");
|
||||
}
|
||||
|
||||
void NetworkController::bluetoothTask(void *param)
|
||||
{
|
||||
NetworkController *self = static_cast<NetworkController *>(param);
|
||||
|
||||
while (true)
|
||||
{
|
||||
// If in provisioning mode, start Bluetooth only once
|
||||
if (self->provisioningMode)
|
||||
{
|
||||
if (!self->bluetoothAttempted)
|
||||
{
|
||||
Serial.println("Starting Bluetooth for provisioning...");
|
||||
self->a2dp_sink.start("Focus Dial", true);
|
||||
self->bluetoothAttempted = true; // Mark as attempted to prevent repeated starts
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Normal operation mode
|
||||
if (self->bluetoothActive && !self->bluetoothAttempted)
|
||||
{
|
||||
Serial.println("Starting Bluetooth...");
|
||||
self->a2dp_sink.start("Focus Dial", true); // Auto-reconnect enabled
|
||||
self->bluetoothAttempted = true;
|
||||
self->lastBluetoothtAttempt = millis(); // Record the time of the start attempt
|
||||
}
|
||||
|
||||
// If Bluetooth is active but not connected, attempt reconnect every 2 seconds
|
||||
if (self->bluetoothActive && !self->a2dp_sink.is_connected() && (millis() - self->lastBluetoothtAttempt >= 2000))
|
||||
{
|
||||
Serial.println("Attempting Bluetooth reconnect...");
|
||||
self->a2dp_sink.start("Focus Dial", true);
|
||||
self->lastBluetoothtAttempt = millis(); // Update last attempt time
|
||||
}
|
||||
|
||||
// If Bluetooth is not supposed to be active but is connected, disconnect
|
||||
if (!self->bluetoothActive && self->a2dp_sink.is_connected())
|
||||
{
|
||||
Serial.println("Stopping Bluetooth...");
|
||||
self->a2dp_sink.disconnect();
|
||||
self->bluetoothAttempted = false; // Allow re-attempt later
|
||||
}
|
||||
}
|
||||
|
||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkController::sendWebhookAction(const String &action)
|
||||
{
|
||||
if (webhookQueue == nullptr)
|
||||
{
|
||||
webhookQueue = xQueueCreate(5, sizeof(char *));
|
||||
}
|
||||
|
||||
char *actionCopy = strdup(action.c_str());
|
||||
if (actionCopy == nullptr)
|
||||
{
|
||||
Serial.println("Failed to allocate memory for webhook action.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (xQueueSend(webhookQueue, &actionCopy, 0) == pdPASS)
|
||||
{
|
||||
Serial.println("Webhook action enqueued: " + String(actionCopy));
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Failed to enqueue webhook action: Queue is full.");
|
||||
free(actionCopy); // Free the memory if not enqueued
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkController::webhookTask(void *param)
|
||||
{
|
||||
NetworkController *self = static_cast<NetworkController *>(param);
|
||||
char *action;
|
||||
|
||||
while (true)
|
||||
{
|
||||
// Wait for a webhook action to arrive in the queue
|
||||
if (xQueueReceive(self->webhookQueue, &action, portMAX_DELAY) == pdPASS)
|
||||
{
|
||||
Serial.println("Processing webhook action: " + String(action));
|
||||
|
||||
// Send the webhook request and check the response
|
||||
bool success = self->sendWebhookRequest(String(action));
|
||||
if (success)
|
||||
{
|
||||
Serial.println("Webhook action sent successfully.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Failed to send webhook action.");
|
||||
}
|
||||
|
||||
free(action); // Free the allocated memory for action
|
||||
|
||||
Serial.println("Finished processing webhook action.");
|
||||
}
|
||||
|
||||
// Small delay to yield
|
||||
vTaskDelay(10 / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
|
||||
bool NetworkController::sendWebhookRequest(const String &action)
|
||||
{
|
||||
if (webhookURL.isEmpty())
|
||||
{
|
||||
Serial.println("Webhook URL is not set. Cannot send action.");
|
||||
return false;
|
||||
}
|
||||
|
||||
std::unique_ptr<WiFiClient> client;
|
||||
if (webhookURL.startsWith("https://"))
|
||||
{
|
||||
client.reset(new WiFiClientSecure());
|
||||
if (!client)
|
||||
{
|
||||
Serial.println("Memory allocation for WiFiClientSecure failed.");
|
||||
return false;
|
||||
}
|
||||
static_cast<WiFiClientSecure *>(client.get())->setInsecure(); // Not verifying server certificate
|
||||
}
|
||||
else
|
||||
{
|
||||
client.reset(new WiFiClient());
|
||||
if (!client)
|
||||
{
|
||||
Serial.println("Memory allocation for WiFiClient failed.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
HTTPClient http;
|
||||
bool result = false;
|
||||
|
||||
if (http.begin(*client, webhookURL))
|
||||
{
|
||||
http.addHeader("Content-Type", "application/json");
|
||||
|
||||
String jsonPayload = "{\"action\":\"" + action + "\"}";
|
||||
|
||||
// Send the POST request
|
||||
int httpResponseCode = http.POST(jsonPayload);
|
||||
|
||||
if (httpResponseCode > 0)
|
||||
{
|
||||
String response = http.getString();
|
||||
Serial.println("HTTP Response code: " + String(httpResponseCode));
|
||||
Serial.println("Response: " + response);
|
||||
result = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Error in sending POST: " + String(httpResponseCode));
|
||||
}
|
||||
|
||||
http.end(); // Close the connection
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Unable to connect to server.");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void NetworkController::WiFiProvisionerSettings()
|
||||
{
|
||||
wifiProvisioner.enableSerialDebug(true);
|
||||
wifiProvisioner.AP_NAME = "Focus Dial";
|
||||
wifiProvisioner.SVG_LOGO =
|
||||
R"rawliteral(
|
||||
<svg width="297" height="135" viewBox="0 0 99 45" xmlns="http://www.w3.org/2000/svg" style="margin:1rem auto;">
|
||||
<g fill="currentColor">
|
||||
<path d="m54 15h3v3h-3z"/>
|
||||
<path d="m54 3h3v3h-3z"/>
|
||||
<path d="m60 9v3h-6v3h-3v6h-3v-6h-3v-3h-6v-3h6v-3h3v-6h3v6h3v3z"/>
|
||||
<path d="m42 3h3v3h-3z"/><path d="m42 15h3v3h-3z"/>
|
||||
<path d="m21 30v12h-3v-9h-3v-3z"/><path d="m18 42v3h-6v-12h3v9z"/>
|
||||
<path d="m84 33h3v12h-3z"/><path d="m48 33h3v3h6v6h-3v-3h-6z"/>
|
||||
<path d="m99 42v3h-9v-15h3v12z"/><path d="m27 42h6v3h-6z"/><path d="m36 30h3v12h-3z"/>
|
||||
<path d="m48 42h6v3h-6z"/><path d="m81 30h3v3h-3z"/><path d="m24 33h3v9h-3z"/><path d="m51 30h6v3h-6z"/>
|
||||
<path d="m39 42h3v3h-3z"/><path d="m0 33h3v3h6v3h-6v6h-3z"/><path d="m3 30h6v3h-6z"/><path d="m72 30h3v15h-3z"/>
|
||||
<path d="m42 30h3v12h-3z"/><path d="m66 33h3v9h-3z"/><path d="m78 33h3v12h-3z"/><path d="m63 42h3v3h-6v-15h6v3h-3z"/>
|
||||
<path d="m27 30h6v3h-6z"/>
|
||||
</g>
|
||||
</svg>
|
||||
<style> /* Override lib defaults */
|
||||
:root {
|
||||
--theme-color: #4caf50;
|
||||
--font-color: #fff;
|
||||
--card-background: #171717;
|
||||
--black: #080808;
|
||||
}
|
||||
body {
|
||||
background-color: var(--black);
|
||||
}
|
||||
input {
|
||||
background-color: #2b2b2b;
|
||||
}
|
||||
.error input[type="text"],
|
||||
.error input[type="password"] {
|
||||
background-color: #3e0707;
|
||||
}
|
||||
input[type="text"]:disabled ,input[type="password"]:disabled ,input[type="radio"]:disabled {
|
||||
color:var(--black);
|
||||
}
|
||||
</style>)rawliteral";
|
||||
|
||||
wifiProvisioner.HTML_TITLE = "Focus Dial - Provisioning";
|
||||
wifiProvisioner.PROJECT_TITLE = " Focus Dial — Setup";
|
||||
wifiProvisioner.PROJECT_INFO = R"rawliteral(
|
||||
1. Connect to Bluetooth if you want to use the phone automation trigger.
|
||||
2. Select a WiFi network to save and allow Focus Dial to trigger webhook automations.
|
||||
3. Enter the webhook URL below to trigger it when a focus session starts.)rawliteral";
|
||||
|
||||
wifiProvisioner.FOOTER_INFO = R"rawliteral(
|
||||
Focus Dial - Made by <a href="https://youtube.com/@salimbenbouz" target="_blank">Salim Benbouziyane</a>)rawliteral";
|
||||
|
||||
wifiProvisioner.CONNECTION_SUCCESSFUL =
|
||||
"Provision Complete. Focus Dial will now start and status led will turn to blue.";
|
||||
|
||||
wifiProvisioner.RESET_CONFIRMATION_TEXT =
|
||||
"This will erase all settings and require re-provisioning. Confirm on the device.";
|
||||
|
||||
wifiProvisioner.setShowInputField(true);
|
||||
wifiProvisioner.INPUT_TEXT = "Webhook URL to Trigger Automation:";
|
||||
wifiProvisioner.INPUT_PLACEHOLDER = "e.g., https://example.com/webhook";
|
||||
wifiProvisioner.INPUT_INVALID_LENGTH = "The URL appears incomplete. Please enter the valid URL to trigger the automation.";
|
||||
wifiProvisioner.INPUT_NOT_VALID = "The URL entered is not valid. Please verify it and try again.";
|
||||
|
||||
// Set the static methods as callbacks
|
||||
wifiProvisioner.setInputCheckCallback(validateInputCallback);
|
||||
wifiProvisioner.setFactoryResetCallback(factoryResetCallback);
|
||||
}
|
||||
|
||||
// Static method for input validation callback
|
||||
bool NetworkController::validateInputCallback(const String &input)
|
||||
{
|
||||
if (instance)
|
||||
{
|
||||
return instance->validateInput(input);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Static method for factory reset callback
|
||||
void NetworkController::factoryResetCallback()
|
||||
{
|
||||
if (instance)
|
||||
{
|
||||
instance->handleFactoryReset();
|
||||
}
|
||||
}
|
||||
|
||||
bool NetworkController::validateInput(const String &input)
|
||||
{
|
||||
String modifiedInput = input;
|
||||
|
||||
// Check if URL starts with "http://" or "https://"
|
||||
if (!(modifiedInput.startsWith("http://") || modifiedInput.startsWith("https://")))
|
||||
{
|
||||
// If none supplied assume "http://"
|
||||
modifiedInput = "http://" + modifiedInput;
|
||||
Serial.println("Protocol missing, defaulting to http://");
|
||||
}
|
||||
|
||||
// Basic validation
|
||||
int protocolEnd = modifiedInput.indexOf("://") + 3;
|
||||
int dotPosition = modifiedInput.indexOf('.', protocolEnd);
|
||||
|
||||
bool isValid = (dotPosition != -1);
|
||||
|
||||
Serial.print("Validating input: ");
|
||||
Serial.println(modifiedInput);
|
||||
|
||||
// Save URL to NVS here if valid
|
||||
if (isValid)
|
||||
{
|
||||
Serial.println("URL is valid. Saving to NVS...");
|
||||
|
||||
if (preferences.begin("focusdial", false))
|
||||
{ // false means open for writing
|
||||
preferences.putString("webhook_url", modifiedInput);
|
||||
preferences.end();
|
||||
webhookURL = modifiedInput;
|
||||
Serial.println("Webhook URL saved: " + webhookURL);
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Failed to open NVS for writing.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Invalid URL. Not saving to NVS.");
|
||||
}
|
||||
|
||||
return isValid;
|
||||
}
|
||||
|
||||
void NetworkController::handleFactoryReset()
|
||||
{
|
||||
Serial.println("Factory reset initiated.");
|
||||
reset();
|
||||
}
|
||||
31
firmware/src/main.cpp
Normal file
31
firmware/src/main.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
#include <Arduino.h>
|
||||
#include "Config.h"
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
// Global instances of controllers
|
||||
DisplayController displayController(OLED_WIDTH, OLED_HEIGHT, OLED_ADDR);
|
||||
LEDController ledController(LED_PIN, NUM_LEDS, LED_BRIGHTNESS);
|
||||
InputController inputController(BUTTON_PIN, ENCODER_A_PIN, ENCODER_B_PIN);
|
||||
NetworkController networkController;
|
||||
Preferences preferences;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
|
||||
// Initialize controllers
|
||||
inputController.begin();
|
||||
displayController.begin();
|
||||
ledController.begin();
|
||||
networkController.begin();
|
||||
|
||||
// Startup state
|
||||
stateMachine.changeState(&StateMachine::startupState);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Update state machine
|
||||
stateMachine.update();
|
||||
// If any animation needs to run
|
||||
displayController.updateAnimation();
|
||||
}
|
||||
57
firmware/src/states/AdjustState.cpp
Normal file
57
firmware/src/states/AdjustState.cpp
Normal file
@@ -0,0 +1,57 @@
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
void AdjustState::enter()
|
||||
{
|
||||
Serial.println("Entering Adjust State");
|
||||
|
||||
lastActivity = millis();
|
||||
ledController.setSolid(AMBER);
|
||||
|
||||
// Register state-specific handlers
|
||||
inputController.onPressHandler([this]()
|
||||
{
|
||||
Serial.println("Adjust State: Button pressed");
|
||||
|
||||
StateMachine::idleState.setTimer(this->adjustDuration);
|
||||
displayController.showConfirmation();
|
||||
stateMachine.changeState(&StateMachine::idleState); });
|
||||
|
||||
inputController.onEncoderRotateHandler([this](int delta)
|
||||
{
|
||||
Serial.println("Adjust State: Encoder turned");
|
||||
Serial.println(delta);
|
||||
|
||||
// Update duration with delta and enforce bounds
|
||||
this->adjustDuration += (delta * 5);
|
||||
if (this->adjustDuration < MIN_TIMER) {
|
||||
this->adjustDuration = MIN_TIMER;
|
||||
} else if (this->adjustDuration > MAX_TIMER) {
|
||||
this->adjustDuration = MAX_TIMER;
|
||||
}
|
||||
|
||||
this->lastActivity = millis(); });
|
||||
}
|
||||
|
||||
void AdjustState::update()
|
||||
{
|
||||
inputController.update();
|
||||
displayController.drawAdjustScreen(adjustDuration);
|
||||
|
||||
if (millis() - lastActivity >= (CHANGE_TIMEOUT * 1000))
|
||||
{
|
||||
// Transition to Idle
|
||||
stateMachine.changeState(&StateMachine::idleState);
|
||||
}
|
||||
}
|
||||
|
||||
void AdjustState::exit()
|
||||
{
|
||||
Serial.println("Exiting Adjust State");
|
||||
inputController.releaseHandlers();
|
||||
}
|
||||
|
||||
void AdjustState::adjustTimer(int duration)
|
||||
{
|
||||
adjustDuration = duration;
|
||||
}
|
||||
41
firmware/src/states/DoneState.cpp
Normal file
41
firmware/src/states/DoneState.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
DoneState::DoneState() : doneEnter(0) {}
|
||||
|
||||
void DoneState::enter()
|
||||
{
|
||||
Serial.println("Entering Done State");
|
||||
|
||||
doneEnter = millis();
|
||||
ledController.setBreath(GREEN, -1, true, 2);
|
||||
|
||||
// Register state-specific handlers
|
||||
inputController.onPressHandler([]()
|
||||
{
|
||||
Serial.println("Done State: Button pressed");
|
||||
stateMachine.changeState(&StateMachine::idleState); });
|
||||
|
||||
// Send 'Stop' webhook
|
||||
networkController.sendWebhookAction("stop");
|
||||
}
|
||||
|
||||
void DoneState::update()
|
||||
{
|
||||
inputController.update();
|
||||
ledController.update();
|
||||
|
||||
displayController.drawDoneScreen();
|
||||
|
||||
if (millis() - doneEnter >= (CHANGE_TIMEOUT * 1000))
|
||||
{
|
||||
// Transition to Idle after timeout
|
||||
stateMachine.changeState(&StateMachine::idleState);
|
||||
}
|
||||
}
|
||||
|
||||
void DoneState::exit()
|
||||
{
|
||||
Serial.println("Exiting Done State");
|
||||
inputController.releaseHandlers();
|
||||
}
|
||||
87
firmware/src/states/IdleState.cpp
Normal file
87
firmware/src/states/IdleState.cpp
Normal file
@@ -0,0 +1,87 @@
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
IdleState::IdleState() : defaultDuration(0), lastActivity(0)
|
||||
{
|
||||
|
||||
if (nvs_flash_init() != ESP_OK)
|
||||
{
|
||||
Serial.println("NVS Flash Init Failed");
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("NVS initialized successfully.");
|
||||
}
|
||||
|
||||
// Load the default duration
|
||||
if (preferences.begin("focusdial", true))
|
||||
{
|
||||
defaultDuration = preferences.getInt("timer", DEFAULT_TIMER);
|
||||
preferences.end();
|
||||
}
|
||||
}
|
||||
|
||||
void IdleState::enter()
|
||||
{
|
||||
Serial.println("Entering Idle State");
|
||||
ledController.setBreath(BLUE, -1, false, 5);
|
||||
|
||||
// Register state-specific handlers
|
||||
inputController.onPressHandler([this]()
|
||||
{
|
||||
Serial.println("Idle State: Button pressed");
|
||||
StateMachine::timerState.setTimer(this->defaultDuration, 0);
|
||||
displayController.showTimerStart();
|
||||
stateMachine.changeState(&StateMachine::timerState); // Start timer
|
||||
});
|
||||
|
||||
inputController.onLongPressHandler([this]()
|
||||
{
|
||||
Serial.println("Idle State: Button long pressed");
|
||||
stateMachine.changeState(&StateMachine::resetState); // Transition to Reset State
|
||||
});
|
||||
|
||||
inputController.onEncoderRotateHandler([this](int delta)
|
||||
{
|
||||
Serial.println("Idle State: Encoder turned");
|
||||
StateMachine::adjustState.adjustTimer(this->defaultDuration);
|
||||
stateMachine.changeState(&StateMachine::adjustState); // Transition to Adjust State
|
||||
});
|
||||
|
||||
lastActivity = millis(); // Activity timer
|
||||
}
|
||||
|
||||
void IdleState::update()
|
||||
{
|
||||
static unsigned long lastUpdateTime = 0;
|
||||
|
||||
// Controllers updates
|
||||
inputController.update();
|
||||
ledController.update();
|
||||
networkController.update();
|
||||
|
||||
displayController.drawIdleScreen(defaultDuration, networkController.isWiFiConnected());
|
||||
|
||||
// Check if sleep timeout is reached
|
||||
if (millis() - lastActivity >= (SLEEP_TIMOUT * 60 * 1000))
|
||||
{
|
||||
Serial.println("Idle State: Activity timeout");
|
||||
stateMachine.changeState(&StateMachine::sleepState); // Transition to Sleep State
|
||||
}
|
||||
}
|
||||
|
||||
void IdleState::exit()
|
||||
{
|
||||
Serial.println("Exiting Idle State");
|
||||
inputController.releaseHandlers();
|
||||
ledController.turnOff();
|
||||
}
|
||||
|
||||
void IdleState::setTimer(int duration)
|
||||
{
|
||||
defaultDuration = duration;
|
||||
|
||||
preferences.begin("focusdial", true);
|
||||
preferences.putInt("timer", defaultDuration);
|
||||
preferences.end();
|
||||
}
|
||||
71
firmware/src/states/PausedState.cpp
Normal file
71
firmware/src/states/PausedState.cpp
Normal file
@@ -0,0 +1,71 @@
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
PausedState::PausedState() : duration(0), elapsedTime(0), pauseEnter(0) {}
|
||||
|
||||
void PausedState::enter()
|
||||
{
|
||||
Serial.println("Entering Paused State");
|
||||
pauseEnter = millis(); // Record the time when the pause started
|
||||
ledController.setBreath(YELLOW, -1, false, 20);
|
||||
|
||||
// Register state-specific handlers
|
||||
inputController.onPressHandler([this]()
|
||||
{
|
||||
Serial.println("Paused State: Button Pressed");
|
||||
|
||||
// Send 'Start' webhook (resume)
|
||||
networkController.sendWebhookAction("start");
|
||||
|
||||
// Transition back to TimerState with the stored duration and elapsed time
|
||||
StateMachine::timerState.setTimer(duration, elapsedTime);
|
||||
displayController.showTimerResume();
|
||||
stateMachine.changeState(&StateMachine::timerState); // Transition back to Timer State
|
||||
});
|
||||
|
||||
inputController.onDoublePressHandler([]()
|
||||
{
|
||||
Serial.println("Paused State: Button Double Pressed");
|
||||
|
||||
// Send 'Stop' webhook (canceled)
|
||||
networkController.sendWebhookAction("stop");
|
||||
displayController.showCancel();
|
||||
stateMachine.changeState(&StateMachine::idleState); // Transition back to Idle State
|
||||
});
|
||||
}
|
||||
|
||||
void PausedState::update()
|
||||
{
|
||||
inputController.update();
|
||||
ledController.update();
|
||||
|
||||
// Redraw the paused screen with remaining time
|
||||
int remainingTime = (duration * 60) - elapsedTime;
|
||||
displayController.drawPausedScreen(remainingTime);
|
||||
|
||||
unsigned long currentTime = millis();
|
||||
|
||||
// Check if the pause timeout has been reached
|
||||
if (currentTime - pauseEnter >= (PAUSE_TIMEOUT * 60 * 1000))
|
||||
{
|
||||
// Timeout reached, transition to Idle State
|
||||
Serial.println("Paused State: Timout");
|
||||
|
||||
// Send 'Stop' webhook (timeout)
|
||||
networkController.sendWebhookAction("stop");
|
||||
displayController.showCancel();
|
||||
stateMachine.changeState(&StateMachine::idleState); // Transition back to Idle State
|
||||
}
|
||||
}
|
||||
|
||||
void PausedState::exit()
|
||||
{
|
||||
Serial.println("Exiting Paused State");
|
||||
inputController.releaseHandlers();
|
||||
}
|
||||
|
||||
void PausedState::setPause(int duration, unsigned long elapsedTime)
|
||||
{
|
||||
this->duration = duration;
|
||||
this->elapsedTime = elapsedTime;
|
||||
}
|
||||
29
firmware/src/states/ProvisionState.cpp
Normal file
29
firmware/src/states/ProvisionState.cpp
Normal file
@@ -0,0 +1,29 @@
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
void ProvisionState::enter()
|
||||
{
|
||||
Serial.println("Entering Provision State");
|
||||
inputController.releaseHandlers();
|
||||
displayController.drawProvisionScreen();
|
||||
ledController.setSolid(AMBER);
|
||||
networkController.startProvisioning();
|
||||
}
|
||||
|
||||
void ProvisionState::update()
|
||||
{
|
||||
ledController.update();
|
||||
if (networkController.isWiFiProvisioned() && networkController.isWiFiConnected())
|
||||
{
|
||||
Serial.println("Provisioning Complete, WiFi Connected");
|
||||
displayController.showConnected();
|
||||
networkController.stopProvisioning();
|
||||
stateMachine.changeState(&StateMachine::idleState);
|
||||
}
|
||||
}
|
||||
|
||||
void ProvisionState::exit()
|
||||
{
|
||||
Serial.println("Exiting Provision State");
|
||||
networkController.stopProvisioning();
|
||||
}
|
||||
54
firmware/src/states/ResetState.cpp
Normal file
54
firmware/src/states/ResetState.cpp
Normal file
@@ -0,0 +1,54 @@
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
bool resetSelected = false; // button selection
|
||||
|
||||
void ResetState::enter()
|
||||
{
|
||||
Serial.println("Entering Reset State");
|
||||
|
||||
ledController.setBreath(MAGENTA, -1, false, 10);
|
||||
|
||||
// Register state-specific handlers
|
||||
inputController.onEncoderRotateHandler([this](int delta)
|
||||
{
|
||||
if (delta > 0) {
|
||||
resetSelected = true; // Select "RESET"
|
||||
} else if (delta < 0) {
|
||||
resetSelected = false; // Select "CANCEL"
|
||||
} });
|
||||
|
||||
inputController.onPressHandler([this]()
|
||||
{
|
||||
if (resetSelected) {
|
||||
Serial.println("Reset State: RESET button pressed, rebooting.");
|
||||
displayController.showReset();
|
||||
networkController.reset();
|
||||
resetStartTime = millis();
|
||||
} else {
|
||||
Serial.println("Reset State: CANCEL button pressed, returning to Idle.");
|
||||
displayController.showCancel();
|
||||
stateMachine.changeState(&StateMachine::idleState);
|
||||
} });
|
||||
}
|
||||
|
||||
void ResetState::update()
|
||||
{
|
||||
|
||||
inputController.update();
|
||||
ledController.update();
|
||||
displayController.drawResetScreen(resetSelected);
|
||||
|
||||
if (resetStartTime > 0 && (millis() - resetStartTime >= 1000))
|
||||
{
|
||||
Serial.println("Restarting ...");
|
||||
ESP.restart(); // Restart after 1 second
|
||||
}
|
||||
}
|
||||
|
||||
void ResetState::exit()
|
||||
{
|
||||
Serial.println("Exiting Reset State");
|
||||
inputController.releaseHandlers();
|
||||
ledController.turnOff();
|
||||
}
|
||||
37
firmware/src/states/SleepState.cpp
Normal file
37
firmware/src/states/SleepState.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
void SleepState::enter()
|
||||
{
|
||||
Serial.println("Entering Sleep State");
|
||||
|
||||
ledController.turnOff();
|
||||
displayController.clear();
|
||||
|
||||
// Register state-specific handlers
|
||||
inputController.onPressHandler([]()
|
||||
{
|
||||
Serial.println("Sleep State: Button pressed");
|
||||
stateMachine.changeState(&StateMachine::idleState); });
|
||||
|
||||
inputController.onLongPressHandler([]()
|
||||
{
|
||||
Serial.println("Sleep State: long pressed");
|
||||
stateMachine.changeState(&StateMachine::idleState); });
|
||||
|
||||
inputController.onEncoderRotateHandler([this](int delta)
|
||||
{
|
||||
Serial.println("Sleep State: Encoder turned");
|
||||
stateMachine.changeState(&StateMachine::idleState); });
|
||||
}
|
||||
|
||||
void SleepState::update()
|
||||
{
|
||||
inputController.update();
|
||||
}
|
||||
|
||||
void SleepState::exit()
|
||||
{
|
||||
Serial.println("Exiting Sleep State");
|
||||
inputController.releaseHandlers();
|
||||
}
|
||||
37
firmware/src/states/StartupState.cpp
Normal file
37
firmware/src/states/StartupState.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
StartupState::StartupState() : startEnter(0) {}
|
||||
|
||||
void StartupState::enter()
|
||||
{
|
||||
Serial.println("Entering Splash State");
|
||||
|
||||
displayController.drawSplashScreen();
|
||||
ledController.setSpinner(TEAL, -1);
|
||||
|
||||
startEnter = millis();
|
||||
}
|
||||
|
||||
void StartupState::update()
|
||||
{
|
||||
ledController.update();
|
||||
|
||||
if (millis() - startEnter >= (SPLASH_DURATION * 1000))
|
||||
{
|
||||
if (networkController.isWiFiProvisioned())
|
||||
{
|
||||
stateMachine.changeState(&StateMachine::idleState); // Transition to Idle
|
||||
}
|
||||
else
|
||||
{
|
||||
stateMachine.changeState(&StateMachine::provisionState); // Trigger Provision
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void StartupState::exit()
|
||||
{
|
||||
ledController.turnOff();
|
||||
Serial.println("Exiting Splash State");
|
||||
}
|
||||
77
firmware/src/states/TimerState.cpp
Normal file
77
firmware/src/states/TimerState.cpp
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "StateMachine.h"
|
||||
#include "Controllers.h"
|
||||
|
||||
TimerState::TimerState() : duration(0), elapsedTime(0), startTime(0) {}
|
||||
|
||||
void TimerState::enter()
|
||||
{
|
||||
Serial.println("Entering Timer State");
|
||||
|
||||
// Start time based on the elapsed time
|
||||
startTime = millis() - (elapsedTime * 1000);
|
||||
|
||||
displayController.drawTimerScreen(duration * 60);
|
||||
ledController.startFillAndDecay(RED, ((duration * 60) - elapsedTime) * 1000);
|
||||
|
||||
// Register state-specific handlers
|
||||
inputController.onPressHandler([this]()
|
||||
{
|
||||
Serial.println("Timer State: Button Pressed");
|
||||
|
||||
// Send 'Stop' webhook (pause)
|
||||
networkController.sendWebhookAction("stop");
|
||||
displayController.showTimerPause();
|
||||
|
||||
// Transition to PausedState and set elapsed time
|
||||
StateMachine::pausedState.setPause(this->duration, this->elapsedTime); // Save current elapsed time
|
||||
stateMachine.changeState(&StateMachine::pausedState); // Transition to Paused State
|
||||
});
|
||||
|
||||
inputController.onDoublePressHandler([this]()
|
||||
{
|
||||
Serial.println("Timer State: Button Double Pressed");
|
||||
|
||||
// Send 'Stop' webhook (canceled)
|
||||
networkController.sendWebhookAction("stop");
|
||||
displayController.showCancel();
|
||||
stateMachine.changeState(&StateMachine::idleState); // Transition to IdleState
|
||||
});
|
||||
|
||||
networkController.startBluetooth();
|
||||
networkController.sendWebhookAction("start");
|
||||
}
|
||||
|
||||
void TimerState::update()
|
||||
{
|
||||
inputController.update();
|
||||
ledController.update();
|
||||
|
||||
unsigned long currentTime = millis();
|
||||
elapsedTime = (currentTime - startTime) / 1000;
|
||||
|
||||
int remainingSeconds = duration * 60 - elapsedTime;
|
||||
|
||||
displayController.drawTimerScreen(remainingSeconds);
|
||||
|
||||
// Check if the timer is done
|
||||
if (remainingSeconds <= 0)
|
||||
{
|
||||
Serial.println("Timer State: Done");
|
||||
displayController.showTimerDone();
|
||||
stateMachine.changeState(&StateMachine::doneState); // Transition to Done State
|
||||
}
|
||||
}
|
||||
|
||||
void TimerState::exit()
|
||||
{
|
||||
inputController.releaseHandlers();
|
||||
networkController.stopBluetooth();
|
||||
ledController.turnOff();
|
||||
Serial.println("Exiting Timer State");
|
||||
}
|
||||
|
||||
void TimerState::setTimer(int duration, unsigned long elapsedTime)
|
||||
{
|
||||
this->duration = duration;
|
||||
this->elapsedTime = elapsedTime;
|
||||
}
|
||||
11
firmware/test/README
Normal file
11
firmware/test/README
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
This directory is intended for PlatformIO Test Runner and project tests.
|
||||
|
||||
Unit Testing is a software testing method by which individual units of
|
||||
source code, sets of one or more MCU program modules together with associated
|
||||
control data, usage procedures, and operating procedures, are tested to
|
||||
determine whether they are fit for use. Unit testing finds problems early
|
||||
in the development cycle.
|
||||
|
||||
More information about PlatformIO Unit Testing:
|
||||
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html
|
||||
1
images/Focus-Dial_Logo.svg
Normal file
1
images/Focus-Dial_Logo.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 99 45" xmlns="http://www.w3.org/2000/svg"><g fill="#939598"><path d="m54 15h3v3h-3z"/><path d="m54 3h3v3h-3z"/><path d="m60 9v3h-6v3h-3v6h-3v-6h-3v-3h-6v-3h6v-3h3v-6h3v6h3v3z"/><path d="m42 3h3v3h-3z"/><path d="m42 15h3v3h-3z"/><path d="m21 30v12h-3v-9h-3v-3z"/><path d="m18 42v3h-6v-12h3v9z"/><path d="m84 33h3v12h-3z"/><path d="m48 33h3v3h6v6h-3v-3h-6z"/><path d="m99 42v3h-9v-15h3v12z"/><path d="m27 42h6v3h-6z"/><path d="m36 30h3v12h-3z"/><path d="m48 42h6v3h-6z"/><path d="m81 30h3v3h-3z"/><path d="m24 33h3v9h-3z"/><path d="m51 30h6v3h-6z"/><path d="m39 42h3v3h-3z"/><path d="m0 33h3v3h6v3h-6v6h-3z"/><path d="m3 30h6v3h-6z"/><path d="m72 30h3v15h-3z"/><path d="m42 30h3v12h-3z"/><path d="m66 33h3v9h-3z"/><path d="m78 33h3v12h-3z"/><path d="m63 42h3v3h-6v-15h6v3h-3z"/><path d="m27 30h6v3h-6z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 830 B |
BIN
images/Focus-Dial_Thumbnail.jpg
Normal file
BIN
images/Focus-Dial_Thumbnail.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 299 KiB |
36
platformio.ini
Normal file
36
platformio.ini
Normal file
@@ -0,0 +1,36 @@
|
||||
; PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[platformio]
|
||||
default_envs = adafruit_qtpy_esp32
|
||||
src_dir = firmware/src
|
||||
include_dir = firmware/include
|
||||
lib_dir = firmware/lib
|
||||
data_dir = firmware/data
|
||||
test_dir = firmware/test
|
||||
|
||||
[env:adafruit_qtpy_esp32]
|
||||
build_flags = -Os
|
||||
platform = espressif32
|
||||
board = adafruit_qtpy_esp32
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
mathertel/OneButton@^2.6.1
|
||||
mathertel/RotaryEncoder@^1.5.3
|
||||
adafruit/Adafruit GFX Library@^1.11.10
|
||||
adafruit/Adafruit NeoPixel@^1.12.3
|
||||
adafruit/Adafruit SSD1306@^2.5.11
|
||||
santerilindfors/WiFiProvisioner@^1.0.0
|
||||
https://github.com/pschatzmann/ESP32-A2DP
|
||||
https://github.com/pschatzmann/arduino-audio-tools.git
|
||||
|
||||
board_build.flash_size = 8MB
|
||||
board_build.partitions = firmware/partitions.csv
|
||||
monitor_speed = 115200
|
||||
BIN
resources/ref/Adafruit QT Py ESP32-Pico Pinout.pdf
Normal file
BIN
resources/ref/Adafruit QT Py ESP32-Pico Pinout.pdf
Normal file
Binary file not shown.
BIN
resources/ref/Encoder_per56.pdf
Normal file
BIN
resources/ref/Encoder_per56.pdf
Normal file
Binary file not shown.
91
resources/unifi_script.sh
Normal file
91
resources/unifi_script.sh
Normal file
@@ -0,0 +1,91 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Enable or disable logging based on an input argument (0 = no debug, 1 = debug)
|
||||
debug=$7 # Pass 1 for debugging, 0 for no debugging
|
||||
|
||||
if [[ $debug -eq 1 ]]; then
|
||||
# Enable logging
|
||||
exec > /config/scripts/unifi_traffic_rules.log 2>&1
|
||||
else
|
||||
exec > /dev/null 2>&1 # Disable logging if debug is not enabled
|
||||
fi
|
||||
|
||||
unifi_username=$2
|
||||
unifi_password=$3
|
||||
unifi_controller=$4
|
||||
target_rule_id=$5 # The rule ID you're targeting
|
||||
action=$6 # 'enable' or 'disable'
|
||||
cookie=$(mktemp)
|
||||
headers=$(mktemp)
|
||||
|
||||
curl_cmd="curl -s -S --cookie ${cookie} --cookie-jar ${cookie} --insecure "
|
||||
|
||||
unifi_login() {
|
||||
# Log in to the UniFi controller and capture CSRF token from headers
|
||||
if [[ $debug -eq 1 ]]; then echo "Logging in to UniFi Controller..."; fi
|
||||
login_response=$(${curl_cmd} -H "Content-Type: application/json" -D ${headers} -d "{\"password\":\"$unifi_password\",\"username\":\"$unifi_username\"}" $unifi_controller/api/auth/login)
|
||||
if [[ $debug -eq 1 ]]; then echo "Login Response: $login_response"; fi
|
||||
csrf_token=$(awk -v IGNORECASE=1 -v FS=': ' '/^X-CSRF-Token/ {print $2}' "${headers}" | tr -d '\r')
|
||||
if [[ $debug -eq 1 ]]; then echo "CSRF Token: $csrf_token"; fi
|
||||
}
|
||||
|
||||
unifi_logout() {
|
||||
# Log out from the UniFi controller
|
||||
if [[ $debug -eq 1 ]]; then echo "Logging out of UniFi Controller..."; fi
|
||||
logout_response=$(${curl_cmd} $unifi_controller/api/auth/logout)
|
||||
if [[ $debug -eq 1 ]]; then echo "Logout Response: $logout_response"; fi
|
||||
}
|
||||
|
||||
get_traffic_rules() {
|
||||
# Fetch traffic rules
|
||||
if [[ $debug -eq 1 ]]; then echo "Fetching traffic rules..."; fi
|
||||
traffic_rules_response=$(${curl_cmd} "$unifi_controller/proxy/network/v2/api/site/default/trafficrules" -H "Content-Type: application/json" --compressed)
|
||||
if [[ $debug -eq 1 ]]; then echo "Traffic Rules Response: $traffic_rules_response"; fi
|
||||
}
|
||||
|
||||
find_and_modify_rule() {
|
||||
# Extract the rule that matches the target rule ID
|
||||
if [[ $debug -eq 1 ]]; then echo "Searching for rule with ID: $target_rule_id"; fi
|
||||
rule=$(echo "$traffic_rules_response" | jq --arg rule_id "$target_rule_id" '.[] | select(._id == $rule_id)')
|
||||
|
||||
if [ -z "$rule" ]; then
|
||||
echo "No matching rule found with ID: $target_rule_id"
|
||||
exit 1
|
||||
else
|
||||
# Set the action based on 'enable' or 'disable'
|
||||
if [ "$action" == "enable" ]; then
|
||||
new_enabled_value=true
|
||||
elif [ "$action" == "disable" ]; then
|
||||
new_enabled_value=false
|
||||
else
|
||||
echo "Error: Action must be 'enable' or 'disable'."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Modify the rule by setting 'enabled' to true or false
|
||||
if [[ $debug -eq 1 ]]; then echo "Found rule: $rule"; fi
|
||||
updated_rule=$(echo "$rule" | jq --argjson action "$new_enabled_value" '.enabled = $action')
|
||||
|
||||
# Send PUT request to modify the rule, including CSRF token in the headers
|
||||
if [[ $debug -eq 1 ]]; then echo "Modifying rule with ID: $target_rule_id"; fi
|
||||
|
||||
modify_response=$(${curl_cmd} "$unifi_controller/proxy/network/v2/api/site/default/trafficrules/$target_rule_id" -X PUT \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-CSRF-Token: $csrf_token" \
|
||||
-d "$updated_rule" --compressed)
|
||||
|
||||
if [[ $debug -eq 1 ]]; then echo "Modify Response: $modify_response"; fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Ensure all required parameters are provided
|
||||
if [[ $# < 7 ]]; then
|
||||
echo "Error: Must include parameters [fwrule] [username] [password] [UDM address] [rule_id] [enable or disable] [0=debug off, 1=debug on]."
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# Log in, get traffic rules, find the rule by ID, modify it, and log out
|
||||
unifi_login
|
||||
get_traffic_rules
|
||||
find_and_modify_rule
|
||||
unifi_logout
|
||||
Reference in New Issue
Block a user