Yannick Gingras' home on the Web


Revengate development log

Weekly progress reports about the Revengate development.

Website | sources | Google Play | F-Droid | Itch

2022-12-30

I implemented zooming and panning on desktop.

This is a done by combining a viewport with a camera node. The viewport does a good job of remapping the mouse and touch events to its children nodes, but it’s not easy to move it around. The camera is easy to move around and it has a zoom property, but it does not offer any support for remapping events, so I only use it to change the center of the screen. The HUD (health bar and other status info) is outside of the dungeon area viewport and is therefore not affected by zooming and panning. This was a beautiful example of where the Godot node tree metaphor works really well.

I though that it would be a trivial matter to have those on Android given the refactor that Godot just merged in for gestures, but for some reason I don’t get any of those gesture events with my Android builds. It not too hard to hard to make a gesture detector in GDScript, but that would also involves fine tuning what counts as one gesture rather than another. I’m not going down that rabbit hole right now.

I merged the Godot implementation back into the main git repo. There are still a few design docs that should be updated to clarify if they refer to the Python or to the Godot code.

I added the art nouveau steampunk boot splash. Unfortunately, it does not show on Android, which is probably caused by this issue. The game starts really fast on Android anyway so I probably don’t need a boot splash. I will find another way to showcase the artwork without making the players wait for purely aesthetic considerations.

I got a fnatic ministreak keyboard with Kailh silver switches. I took the time to lubricate and install o-rings on all the main keys. I knew this would not be main keyboard since I grew heavily reliant on a trackpoint, but that seemed like a cheaper way to see if I like the silver switches.

In short, I don’t like silvers. I like the short travel and the ease of actuating them. For prose, that’s actually really awesome. For code, I end up making a lot of typos as my fingers feel the board while searching for non-letter keys like the arrows. That means I end up looking at the board more, which defeats the purpose for me.

Specific to the ministreak, the keyboard does not support multiple layout layers and is not reprogrammable on Linux. That’s a show stopper for me. The build is solid otherwise, but spacebar is also too wide for my liking, which forces an exaggerated wrist twist to get the control and alt keys.

2022-12-24

This was a really good week. I finished connecting the dungeon levels via stairs. The bugs came from non-active levels still having active physics layers. It turns out that in Godot, to make something disappear, you have to make it invisible and deactivate all of its physics layers. Using the full Godot collision system for Revengate is obviously overkill since everything in the game is a trivial square, but the API is really nice to use, so I’m keeping it for now.

I added all the pre-game screens. The Godot GUI editor is really good! The styling is particularly well done. It’s a bit of a click fest, but there is a preview screen and you can click on a control than in will instantly populate all the stylable properties for that control on a new editor pane. This is so much better than editing .kv files for Kivy UIs.

The Godot layouts play fairly well with multiple resolutions. While Kivy forces you to nest everything into dynamically resizable containers, Godot has a simpler but equally effective approach. Since most controls in a game are around the perimeter of the screen, Godot offers 8 anchor points around the edge and then let’s you offset in pixels from there. As it turns out, this resizes beautifully with multiple resolutions and in Revengate’s case, it keeps the controls where they should be on a tiny mobile screen. Controls can still be nested into resizable containers, but you don’t have to most of the time.

I made the first Android build. It’s nice that Godot puts that configuration outside of the main project file. That way, the APK signing key does not end up in git. On the other hand, there are some configs for the Android build that would be nice to have under source control. I haven’t figured out yet how to decouple them from the secrets.

After a bit of configuration and 2.5 GBs of dependencies downloaded, I have a one-click option to deploy to any Android phone with USB debugging enabled. Nice!

On this special beautiful cold winter day, may the RNGs bring you all lots of shiny loot.

2022-12-17

I worked on connecting the multiple dungeon levels together via stairs. Turns out that Godot 4 has a really good API for attaching data to tiles, but nothing to attach data to cells. It Godot terminology, that means that I can have new arbitrary fields on all the stair cases, but there is nothing to help me record the destination of a specific set of stairs. So back to storing all of that in an internal dictionary like in Godot 3.

I got it working, but alls monsters are behaving weird on freshly created levels. I think they might be colliding with the ghosts of monsters on the upper levels. I need to dig into that this weekend.

I played some Marvel Snap. It’s a deck builder by one of the designers of Blizzard Hearthstone. It’s pretty good, very fast paced, with a good mobile UI. There are way too many internal resources and currencies, typical of modern free-to-play games, but the deck building part is excellent. That got me thinking: what could deck building games bring to a roguelike (in the dungeon exploration sense, not in the Slay the Spire sense)?

I feel like one key part of what makes deck building fun is that you need to sacrifice. All your cards have big pros and some minor cons, but you can only take 12 of them with you. You need to make an agonizing choice. Having a limited number of slots for armors and rings encapsulates some of that, but most of the time, it’s really obvious which helm is the best, so the choice is not agonizing at all. In many games, there is even a green arrow to help you identify which of your helms are better than the one you are currently wearing.

In a true steampunk fashion, I started thinking of a utility belt where you can store tools and crafted clockwork gadgets. The utility belt has limited slots and all the gadgets can go in any of the slots. You can have as many gadgets as you want in your inventory, but only a limited number of active ones on the belt. Gadgets would have a random chance to trigger during combat, then they have a cool down (rewinding?) period. Besides selecting the gadgets, you don’t have any control on how they activate, that makes the pre-selection important. Gadgets abilities can be mild (+20% regen for 10 turns) or strong (disable a random foe’s electrical abilities for 100 turns). Quick like that, that sounds really fun. It would not be too hard to implement, but the UI component would be critical if you want people to know that their utility belt did the work. On a tiny mobile screen, that could actually be fairly hard. I’m putting this design concept on the back burner for now and I commit to deleting Marvel Snap before the end of next weeks.

2022-12-09

I added taps as controls to move and attack. I also implemented the Travel To command.

Like in the Python implementation of Revengate, Travel To creates a Strategy on the Hero and passed the control to it. As long the strategy is_valid() the game loop calls it rather than querying for input. I really banged my head on my desk to get this to work properly with Kivy and even then, the build I have on Google Play still has the nasty bug that some monster attacks are not detected, causing the hero to keep trying to push his way against a steadfast foe who will invariably beat him to a pulp.

Implementing it with Godot was a breeze. I was careful to have all my signals and state diagrams in front of me and I had the basic case working in less than an hour. I took another day to add the rerouting and cancellation upon being attacked. I cleaned up the main loop a bit in the process and almost completely decoupled the animation synchronization from the turn logic, which should really help when time comes to implement the Monte Carlo simulator.

The new anim synchronization probably does not have enough overlap between actor move animations, which gives a fairly slow feel to the game play. This will need tuning.

I should move the state diagrams to Graphviz. Paper is nice, but it’s not very git-friendly.

I saw the new Tex Shura keyboard up for pre-order. I find this one very tempting and I spent some time de-mapping some of the keys on my bigger Shinobi to see what it would feel like to type with a minimal board. It’s really not bad, having Home and End right on the home row actually feels quite liberating, even if as a two-key combo.

2022-12-03

I added a death animation and integrated the attacks in the monster strategies. I’m playing with some level of overlap between the animations when possible. Before attacking an enemy, I completely wait for them to stop moving otherwise the lunge animation looks off, but for moving around and attacking a stationary enemy, I think it speeds up the game play and it looks really good to have many actors moving all at once.

The tricky part is finding the right level of overlap and Godot Tween animation API is not completely helpful here. I can await for the finished signal on an animation and I can query the animation to know how long it’s been running, but I can’t know much longer it’s supposed to take before it’s finished. That make’s it hard to do something like “overlap 20% of the animations”, so I will probably settle for something like “overlap 100ms all the time”.

On the plus side, it’s awesome to be able to await anywhere, which passes the control back to the engine for drawing pixels. This is way less convoluted than using callbacks, which is what I had to do most of the time with Kivy.

I typed the story of the encounter with a ghost and a cherub (scroll to “What Lurks in the Crypt”, Gitlab is not very good with anchors). This will probably be used as a “cut scene” at the start of a campaign. I tried to hint at silver being a prime choice for fighting ethereal enemies without spelling it out too much.

2022-11-26

I figured how to take advantage of inheritable scenes in Godot. They follow a different inheritance tree than classes, which is a bit confusing, but it does make sense after you do a complete mental switch to the Node composition architecture.

I implemented the two-roll combat with most of the animations. I still need a death animation and a way to turn animations off when running the Monte Carlo simulator.

Godot 4.0-beta5 fixed the move animation flickering. Beta6 just came out, I plan on trying it later today.

I wrote a few stories of encounters with ghosts with a bit of a steampunk twist. I have not typed them yet and I still don’t know if they will be featured in the game. I feel like coding when sitting in front of a keyboard, so I’m surfing the motivation while it lasts rather than typing handwritten notes.

2022-10-15

I can now procedurally generate levels with Godot.

The excellently revamped TileMap editor in Godot4 has a cool API to paint a whole area with a given terrain and it picks tiles of that terrain according to the probabilities that you configured in your TileSet. It supports transition tiles to connect different terrains, but I have not started playing with that yet.

Next up: stairs and keeping track of previous boards, then randomly placing monsters on a new board.

I feel really good about that Godot rewrite.

2022-10-08

Moved to Godot 4. The latest GDScript has a per-element array comparison like Python tuples, which is exactly what I needed to implement multi-metric path finding. The 3-to-4 project importer does not do a very good job, but I had very little code to port so that was not a big deal. I re-implemented Dijkstra and A* in Godot and added path finding to monsters.

Godot has an A* implementation, but since everything in my game is grid based, it seemed more natural to have distance discovery inside the algo than having to register all position with Godot’s built-in before launching a path finding run, especially since the goal of A* is to avoid having to process all the board positions.

There is a bit of animation flickering that started appearing on Godot 4. I’m assuming that this is a remaining bug that will be fixed before 4.0 gets out of beta and I’m ignoring it for now.

I really like the tile map editor in Godot 4. It makes is really easy to have multiple floor and wall tiles and to paint with the tile type, letting the editor randomize the tiles with configurable probabilities. It also makes it easier to attach data to tile types.

I’m ready to start working on procedural level generation next week.

2022-09-17

I’m still working on a Godot proof of concept. This was a good week! Turn logic is working. I played with the TileMap editor and got collisions to work, but monsters are still ignoring them.

I still have to get path finding to work properly. Godot as an A* implementation, but its API is a very verbose and you have to register all the positions with distance metrics with it. I think I will re-implement it to take advantage of the simplicity of square tiles. That will also allow me to keep the same API for the Dijkstra level metrics.

Godot has released the last alpha of 4.0. It looks like the final 4.0 could be out before the end of the month. There are two things that I’m really excited about 4.0.

Looks like pinch-to-zoom is going to be almost free after all!

Next week: progen the game boards.

2022-09-09

Spent the week exploring Godot again. Got some simple grid-based movement working. I reimplemented some functions from the Python random module in GDScript. The biased choice (like random.choices()) was surprisingly easy. Having a built-in binary search that tells you the index where the search failed really helped!

The latest Kivy build is still on Google play. You might have to be part of the testing group to see it.

I’m now fairly confident that the above the last Kivy release. I’m going to push hard for something playable with Godot soon, even if it does not quite get to feature parity with the Kivy implementation.

2022-09-03

The build from last week is still on Google play. At least one tester confirmed that the Game Over Screen crash is no longer happening. You might have to be part of the testing group to see the test builds since I didn’t release the public yet.

I really don’t like pushing to Google Play since the builds don’t show up until someone from Google goes through the game in depth, which takes about 4 or 5 days. They really play the hell out of this. The last report they game me contained almost 500 screenshots with annotations on which messages were not accessible with a screen reader.

I’ve been playing with Godot this week and I really like it! I didn’t really want to learn a new language and possibly have to rewrite everything, but GDScript is insanely close to Python. It’s basically Python without a mark-and-sweep GC and with fixed size numerics to make it easier to pass data to shaders. It’s a little more complicated than that, but still very expressive and it feels just right if you happen to like Python.

I got a tiny game going in a little over 2h by following a video tutorial and to my delight, it was a breeze to make it run on Android. It was just a matter to telling Godot where to find the Android libs and what key to use to sign packages. The tiny game takes only 8s to build and deploy on my phone. Nice!

So now I’m putting the Kivy implementation on hold while I actually do a legit rogue-like proof of concept on Godot. If it goes well, I will probably do a rewrite right away rather than pushing for a complete game with Kivy.

2022-08-27

Wrote the second long narration: the initiation to steampunk magic. It’s a bit too long to be an on-screen narration, so I’m not sure how to use it yet, but I really like the vibes that it sets.

Fixed the game over crash. This one was a segfault, so very little useful info to help me nail it down. It turns out that Kivy does not support changing screens while animations are in progress. There is no easy way to synchronize async animations so the only thing I could come up with is sleeping for a little bit.

I started learning about Godot. It’s a bit of a click fest, but the amount of eye candy you can get for free is really appealing. I’m fairly convince that I will want to reimplement the game on top of it, but I want to make a few proof of concepts first.

Pushed a new less buggy tech demo to Google Play. Should be available to here or here, but you might have to be part of the testing group.

2022-08-19

The Google Play page is finally live! You might have to join the testers group to see it since the app in still in pre-lauch mode. The build that made its way through the approval process is fairly buggy. I will upload something better in the next day or two.

If anyone tries it despite my above warning, there is a feedback survey.

What should be the icon for loot/pick-up? Ideally it would be a Material Design Icon.

Wrote the intro narration on how the hero gets recruited by Lux Co. It’s missing a few paragraphs, but the key elements are there.

Besides learning how Google Play actually works, I fixed a few crashed and I worked on items as progression. There are no XPs in Revengate and I really like it that way. My goal is to provide plenty of items that will boost your stats in various ways, with quest items being more significant than regular loot. This should discourage grinding while still keeping a sense of accomplishment.

The game over screen bug keeps eluding me. I am pretty sure I will have to move away from Kivy sooner or later. Current contenders for the replacement include Godot and Qt, but I want to have at least v0.4 (two full campaigns) up before I start a tech stack change.

2022-08-13

I spent most of the week chasing a weird bug where the game-over popup sometimes does not disappear. I think that this is a Kivy bug, because I tried pretty much everything and it still happens about 25% of the time. I’m officially giving up: Game Over will be a separate screen for now.

Because I spend too much time on the Game Over bug, I didn’t get to clean things up to do an actual play test, but I pushed a tech demo build to Google Play.

Let me know if you try it out!

2022-08-06

I got a new laptop and I actively procrastinated by setting it up and fine tuning everything.

I did a few minor changes to the Revengate mobile experience, like adding a scroll bar for the monster descriptions. I will be uploading the first play test to Google play as soon as I find out why the Game Over popup does not disappear after you click OK, sometime later today or tomorrow. I will update this post with the link once this is done.

Plan for next week

  • scroll bars for monster description
  • bug: selection sometimes triggers the travel-to command
  • upload a play test on Google Play

2022-07-30

I got caught in a wave of low motivation when I started re-aligning stuff on Android. I can repro some of those by shrinking my window on desktop, but for the most part I need to push a new build to my phone, which takes about 30 seconds, just enough for me to zone out. There was also an ugly bug where one move animation from the previous turn would get mixed up with the attack animation in the current turn and the retreat from the attack would place the attacker in-between tiles. I already knew that about myself, but it was made very obvious in the past two weeks: I really enjoy working on combat mechanics, fine tuning pixel placements, not so much.

I the end I overcame the slump by booking a pair coding session to work on the healing animations with my friend Angel Hudgins. That fuel me with enough energy to work on some the pixels stuff in the second half of this week.

The game is still fairly rough, but I’m happy uploading for a broader play test sometime next week. I will probably fix a few easy bugs before that, but I really want to have something out before the end of the week.

Last two week’s summary

  • wrote an online survey for play testers
  • re-aligned labels on mobile
  • healing animation: absorbing HP numbers rather than having them fly off demo
  • bug fix: animating anything related to an already dead actor would crash the game
  • better control of the overlap between movement animations of NPCs through explicit synchronization. Currently set to 70% overlap.
  • resolved the traffic jam problem using Dijkstra walkability metrics

2022-07-06

First time posting here. For the past several months, I’ve been working on Revengate, a rogue-like for Android written in Python. The game is set in a steampunk version of mid-19 century France with deep conflicts between magic and technology.

Game overview

There is a fairly complex backstory and a few campaign outlines, very little of which is actually implemented.

There are many unique monsters that are going to be featured with low resolution images or ascii characters during the normal game play. To increase the immersion without significantly increasing the development complexity, there is also a comprehensive bestiary with more detailed depictions of the monsters, something along the lines of the D&D Monster Manual or the Pathfinder Bestiary.

The game code is free and open source software under the GNU GPL v.3. The artwork uses a variety of GPL-compatible licences, mostly Creative Commons.

There are still many rough edges, but the game should be playable for a single dungeon in a week or two. Actual campaigns will come later.

2022-07-11 – 2022-07-15

-[x] travel-to command demo -[x] Dijkstra metrics

Travel-to is implemented using the same strategies that already control NPCs. When starting a multi-turn action like travel-to, I give a strategy to the player character. The engine is perfectly happy to control any actors who are equipped with valid strategies. It’s like magic! But I probably need to add a pauses because things happen a bit too fast when I let the engine take care of everything. Path finding is done with A*.

I had a problem with wandering NPCs causing permanent traffic jams if two of them were trying to reach their way points in opposite directions in a narrow corridor. I figured that the best way to solve that would be to discover a new waypoint that is guaranteed to be reachable. I’m doing that with the Dijkstra algorithm, which was fun to implement and will come handy for a for other things.

Extras

Here are few highly connected mazes followed by their Dijkstra metrics. The number is the least significant digit of the distance to the origin (bottom left). Note how diagonals correctly cost only one. The Revengate maze generator can be biased for more or less twistiness as well as for reconnecting corridors to decrease the maze difficulty.

.....................................▓...............................▓...................................▓.............▓
.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓▓▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓.▓
.................▓...▓...........▓.▓.▓.▓...............▓.▓.▓.........▓...▓.▓.....▓.............▓...▓.▓.▓.▓...........▓.▓
.▓▓▓▓▓▓▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓▓▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓▓▓.▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓▓▓.▓.▓.▓.▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓
.........▓.......▓.▓.▓.▓.....▓.▓.▓.▓.▓.............▓.▓.▓.▓.▓.......▓.....▓.▓.▓.....▓.▓...▓.▓...▓.▓.▓...▓.▓.▓...........▓
.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓.▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓▓▓.▓.▓▓▓▓▓.▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓▓▓.▓.▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓
.▓.................▓...▓.▓.▓.▓...................▓.▓.▓.......▓...▓.▓.....▓.▓.▓.......▓...▓.▓.▓...▓.....▓.▓.▓.▓.......▓.▓
.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓▓▓.▓.▓.▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓▓▓.▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓▓▓.▓.▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓.▓.▓
.▓.▓.....................▓.▓.▓.▓.▓.▓...........▓.▓.▓.........▓.........▓.▓.▓.▓.▓.........▓.▓.......▓...▓...........▓.▓.▓
.▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓.▓.▓.▓.▓.▓
.▓.▓.▓.....................▓.▓.▓.............▓.▓.▓.▓.......▓.......▓...▓.▓.▓.▓...▓...▓...............▓.........▓.▓.▓.▓.▓
.▓.▓.▓▓▓.▓▓▓▓▓.▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓▓▓▓▓.▓▓▓▓▓▓▓.▓▓▓.▓.▓.▓.▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓
.▓.▓.........▓.▓.....▓.......▓.▓...........▓.▓.▓.▓.▓.▓...▓.......▓...▓...▓.▓.......▓.▓.▓.......▓.....▓.▓.........▓.▓.▓.▓
.▓.▓▓▓.▓.▓▓▓.▓.▓.▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓.▓.▓.▓▓▓▓▓.▓▓▓.▓.▓▓▓.▓▓▓.▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓.▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓
.▓.▓.▓.▓...▓.▓.▓.▓.▓.▓.▓.....▓...............▓.▓.▓.▓.▓.▓.▓.▓.......▓.▓...▓...▓.▓.....▓.▓.......▓.▓.▓.▓.▓.........▓.▓.▓.▓
.▓.▓.▓.▓▓▓▓▓.▓.▓.▓.▓.▓.▓▓▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓.▓▓▓▓▓.▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓▓▓▓▓▓▓.▓▓▓.▓.▓
.▓.▓.▓.....▓.▓.▓.▓.▓.▓.....▓.▓...............▓.▓.▓...▓...▓...........▓.▓.▓.▓.▓.▓...............▓.▓.▓.▓.▓.......▓.....▓.▓
.▓.▓.▓▓▓▓▓.▓.▓▓▓.▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓.▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓
.▓.▓.....▓.▓.....▓.▓.▓.....▓.▓.▓...........▓.▓.▓.▓.▓...▓.....▓...▓.....▓.▓...▓...................▓.▓.▓.................▓
.▓.▓.▓.▓▓▓.▓.▓▓▓▓▓.▓.▓.▓▓▓.▓.▓.▓.▓▓▓.▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓.▓▓▓.▓.▓.▓▓▓.▓▓▓.▓.▓▓▓▓▓▓▓▓▓.▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓▓▓
.▓.▓.▓.▓...▓.▓.....▓.▓.▓.▓.▓.▓.▓...▓.........▓.▓.▓.▓.▓.▓.▓.....▓...▓...▓.▓.........................▓.▓.....▓.......▓...▓
.▓.▓.▓.▓.▓.▓.▓▓▓▓▓.▓.▓.▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓▓▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓.▓▓▓.▓▓▓.▓
.▓.▓.▓.▓.▓.........▓.▓.▓...▓.▓.................▓.▓.▓.▓.▓.........▓...▓.▓.............▓.......▓.......▓.▓.............▓.▓
.▓.▓.▓▓▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓▓▓▓▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓.▓▓▓▓▓▓▓▓▓.▓▓▓▓▓▓▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓
...▓.................▓...........................▓...▓.................▓.......................▓.......................▓

4456789012345678900999012345678901234▓2109876543210987778901234567890▓77890123456789012345678901234567890▓5567890123455▓
3▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓8▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓4▓2▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓6▓8▓0▓2▓▓▓▓▓▓▓▓▓6▓▓▓0▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓6▓▓▓▓▓▓▓▓▓6▓8▓0▓4▓▓▓▓▓▓▓▓▓▓▓4▓
22345678889012345▓778▓43210987655▓3▓5▓3▓334567890123456▓9▓1▓334567890▓655▓1▓09877▓4321098777890▓334▓7▓9▓1▓33456789012▓3▓
1▓▓▓▓▓▓▓7▓▓▓▓▓▓▓5▓6▓▓▓4▓▓▓▓▓▓▓▓▓4▓2▓6▓▓▓2▓▓▓▓▓▓▓▓▓▓▓4▓6▓0▓2▓▓▓▓▓▓▓▓▓0▓▓▓4▓2▓0▓▓▓6▓4▓2▓▓▓▓▓8▓▓▓0▓2▓4▓8▓0▓2▓2▓4▓▓▓▓▓▓▓▓▓2▓
001234567▓1098766▓5▓9▓5▓55678▓5▓3▓1▓7▓1123456789012▓5▓7▓1▓3▓5567890▓11234▓3▓1▓87655▓3▓112▓9▓211▓1▓3▓990▓3▓1▓33456789012▓
9▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓4▓8▓6▓4▓6▓8▓4▓2▓0▓8▓0▓▓▓▓▓▓▓▓▓▓▓2▓6▓8▓▓▓2▓4▓▓▓▓▓0▓▓▓▓▓▓▓4▓2▓▓▓▓▓▓▓4▓0▓▓▓0▓2▓▓▓0▓2▓▓▓▓▓4▓0▓2▓▓▓▓▓▓▓▓▓2▓
8▓99012345678901234▓877▓3▓7▓9▓4321099901234567890▓3▓7▓9901234▓778▓1▓87655▓5▓3▓0987655▓099▓1▓3▓099▓11234▓5▓9▓1▓3345678▓3▓
7▓8▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓8▓▓▓2▓8▓0▓4▓2▓0▓0▓▓▓▓▓▓▓▓▓▓▓0▓4▓8▓▓▓▓▓▓▓▓▓6▓▓▓2▓▓▓▓▓4▓6▓4▓0▓▓▓▓▓▓▓▓▓8▓2▓4▓▓▓8▓0▓▓▓▓▓6▓8▓0▓2▓▓▓▓▓8▓4▓
6▓7▓432109876543210999012▓9▓1▓5▓3▓1▓11234567890▓1▓5▓990123456▓654333456▓3▓7▓5▓1▓432109877▓3▓5567890▓556▓77890123456▓9▓5▓
5▓6▓4▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓0▓2▓6▓4▓▓▓▓▓▓▓▓▓▓▓▓▓0▓2▓6▓▓▓▓▓▓▓4▓6▓▓▓▓▓▓▓▓▓6▓2▓8▓6▓2▓4▓▓▓▓▓▓▓6▓4▓▓▓▓▓▓▓▓▓4▓6▓▓▓▓▓▓▓2▓4▓6▓0▓6▓
4▓5▓5▓211123432109876543211▓3▓7▓5567890123456▓1▓3▓7▓9987655▓7789012▓877▓1▓9▓7▓334▓334▓876555678901234▓778901233▓5▓7▓1▓7▓
3▓4▓6▓▓▓0▓▓▓▓▓2▓▓▓▓▓▓▓▓▓▓▓▓▓4▓8▓▓▓▓▓▓▓▓▓▓▓▓▓6▓2▓4▓8▓8▓▓▓▓▓6▓▓▓▓▓▓▓2▓▓▓8▓0▓0▓8▓▓▓▓▓2▓4▓8▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓8▓▓▓▓▓▓▓▓▓6▓8▓2▓8▓
2▓3▓778901234▓3▓77890▓0987655▓9▓09876543211▓7▓3▓5▓9▓7▓990▓7789012▓334▓990▓1▓9999012▓3▓9▓7789012▓55655▓9▓432109877▓9▓3▓9▓
1▓2▓▓▓8▓0▓▓▓4▓4▓6▓▓▓0▓0▓▓▓▓▓6▓0▓▓▓▓▓▓▓▓▓▓▓0▓8▓4▓6▓0▓6▓8▓0▓8▓▓▓▓▓2▓▓▓4▓0▓▓▓2▓▓▓8▓▓▓▓▓2▓0▓6▓▓▓▓▓▓▓4▓▓▓4▓0▓4▓▓▓▓▓▓▓▓▓0▓4▓0▓
0▓1▓3▓9▓112▓5▓5▓5▓3▓1▓1▓09877▓112345678901099▓5▓7▓1▓5▓7▓1▓9▓6543334▓5▓112▓334▓7▓99012▓1▓6543211▓3▓7▓3▓1▓556789011▓1▓5▓1▓
9▓0▓2▓0▓▓▓▓▓6▓6▓4▓2▓2▓2▓▓▓8▓8▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓0▓6▓8▓2▓4▓6▓▓▓0▓▓▓▓▓▓▓▓▓6▓2▓2▓4▓4▓6▓8▓▓▓▓▓2▓▓▓▓▓▓▓0▓2▓6▓2▓2▓6▓▓▓▓▓▓▓0▓▓▓6▓2▓
8▓9▓1▓11234▓7▓7▓3▓1▓3▓21099▓9▓432109876543211▓7▓9▓334▓655▓11234567877▓3▓3▓5▓5▓5▓876543334567890▓1▓5▓1▓3▓7789012▓09877▓1▓
7▓8▓0▓▓▓▓▓4▓8▓▓▓2▓0▓4▓▓▓▓▓▓▓0▓4▓▓▓▓▓▓▓▓▓▓▓▓▓2▓8▓0▓4▓▓▓▓▓4▓▓▓▓▓▓▓▓▓▓▓▓▓4▓4▓6▓6▓4▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓0▓4▓0▓4▓▓▓▓▓▓▓▓▓▓▓▓▓8▓0▓
6▓7▓99012▓5▓99012▓9▓5▓77890▓1▓5▓65433345678▓3▓9▓1▓5▓778▓33211▓877▓87655▓5▓777▓4321099901234567890▓3▓9▓55678901234567890▓
5▓6▓8▓0▓▓▓6▓0▓▓▓▓▓8▓6▓6▓▓▓0▓2▓6▓6▓▓▓2▓▓▓▓▓▓▓4▓0▓2▓6▓6▓8▓2▓▓▓0▓8▓6▓▓▓6▓▓▓6▓8▓▓▓▓▓▓▓▓▓8▓▓▓▓▓▓▓▓▓▓▓▓▓2▓8▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓8▓▓▓
4▓5▓7▓1▓877▓1▓09877▓5▓5▓5▓1▓3▓7▓778▓210987655▓1▓3▓7▓5▓9▓1▓21099▓655▓778▓7▓9901234567890123456789012▓7▓11234▓7789012▓990▓
3▓4▓6▓2▓8▓8▓0▓▓▓▓▓6▓4▓4▓4▓2▓4▓8▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓2▓4▓8▓4▓0▓0▓▓▓▓▓▓▓▓▓4▓▓▓8▓8▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓6▓▓▓▓▓▓▓6▓0▓▓▓4▓6▓8▓▓▓2▓▓▓0▓
2▓3▓5▓3▓9▓990123456▓3▓3▓433▓5▓87654321098765433▓5▓9▓3▓1▓098765433▓433▓9▓9901234567890▓2109877▓1123456▓9▓6555678901234▓1▓
1▓2▓4▓▓▓0▓▓▓▓▓▓▓▓▓▓▓2▓2▓▓▓▓▓6▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓6▓0▓2▓2▓▓▓▓▓▓▓▓▓2▓4▓2▓0▓▓▓▓▓▓▓▓▓▓▓▓▓0▓▓▓▓▓▓▓▓▓0▓▓▓▓▓▓▓8▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓2▓
012▓43211123456789012▓210987654321098765432109877▓112▓33456789012343211▓21098765432111234567890▓43210987654321098765433▓
.....................▓.....▓.....▓...▓...▓...............▓...▓...▓...▓.......▓...▓...............▓.......▓.............▓
.▓▓▓▓▓.▓▓▓▓▓.▓.▓▓▓.▓.▓.▓▓▓.▓.▓.▓.▓.▓.▓.▓▓▓.▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓.▓.▓▓▓.▓.▓.▓.▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓.▓
.▓...▓...▓.........▓.▓...▓.▓.▓.▓.▓.▓.▓.......▓.....▓.....▓.▓.▓.▓...▓...▓...▓...▓.......▓...▓.▓.....▓...▓.▓.▓.....▓.▓...▓
.▓.▓.▓▓▓▓▓.▓▓▓.▓▓▓▓▓.▓▓▓.▓.▓.▓.▓.▓.▓.▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓.▓.▓▓▓.▓▓▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓▓▓.▓.▓▓▓▓▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓
.▓.▓...▓...▓...▓...▓.....▓.▓.▓.▓...▓...▓.▓.........▓...▓.▓.▓...........▓.▓...▓.▓...▓.▓.▓.......▓.▓.▓.....▓.......▓.....▓
.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓▓▓.▓▓▓.▓▓▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓.▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓.▓
.▓...▓...▓.▓.....▓...▓...▓...........▓.▓.▓.......▓...▓.▓.▓.......▓.▓.▓...▓.▓.▓.▓...▓.▓.▓.▓.....▓...▓.......▓...▓.....▓.▓
.▓▓▓.▓▓▓▓▓▓▓.▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓.▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓.▓▓▓.▓▓▓.▓.▓.▓▓▓.▓▓▓.▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓▓▓▓▓.▓.▓▓▓.▓.▓
.▓.▓.........▓...▓.▓.▓.................▓.........▓.....▓.▓.▓.....▓.▓...▓...▓.....▓...▓.....▓...▓...▓...▓.....▓.▓.▓.....▓
.▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓.▓.▓▓▓.▓▓▓.▓▓▓.▓.▓▓▓.▓▓▓▓▓.▓.▓▓▓.▓▓▓.▓▓▓▓▓.▓.▓▓▓▓▓▓▓.▓▓▓▓▓.▓.▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓
.▓.....▓.......▓.....▓.....▓.▓.▓.....▓.........▓...▓.▓.▓...▓...▓.▓...▓.....▓.▓.....▓...▓.....▓...▓...▓.▓.▓.▓.▓.▓.......▓
.▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓▓▓.▓.▓.▓.▓.▓▓▓.▓▓▓.▓.▓▓▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓.▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓.▓.▓.▓▓▓▓▓▓▓.▓
...▓.▓.▓.▓.............▓...▓.▓.▓...▓.....▓...▓...▓.▓.....▓.....▓...▓...▓.▓.▓...▓.▓...▓.▓.......▓.▓.▓...▓.......▓.▓.....▓
.▓.▓.▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓▓▓▓▓.▓▓▓▓▓.▓▓▓.▓.▓.▓.▓.▓▓▓.▓▓▓▓▓.▓▓▓▓▓▓▓.▓.▓.▓▓▓.▓.▓.▓▓▓.▓.▓▓▓.▓.▓▓▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓.▓▓▓.▓.▓▓▓.▓
.▓.▓.▓.▓.▓...▓.▓.▓...▓.▓...▓...........▓.▓.▓.▓.▓.......▓.........▓.▓.....▓...▓...▓.....▓.▓...▓...▓.▓.......▓.....▓.▓...▓
.▓.▓.▓.▓.▓.▓.▓.▓.▓.▓▓▓.▓.▓.▓▓▓.▓▓▓.▓▓▓▓▓.▓▓▓.▓.▓.▓▓▓.▓.▓▓▓▓▓▓▓.▓▓▓▓▓▓▓.▓.▓▓▓▓▓▓▓.▓▓▓▓▓.▓▓▓.▓.▓.▓▓▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓▓▓.▓
...▓.▓.▓...▓.▓...▓...▓.▓.▓.....▓...▓.........▓.▓.▓...▓.▓...▓...▓.................▓.........▓...▓...▓.....▓.▓.....▓.....▓
.▓▓▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓▓▓▓▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓.▓.▓
.▓.....▓.....▓...▓.....▓...▓...▓.........▓.▓...▓.▓.▓.▓...▓.......▓.▓...▓.......▓.......▓...▓.....▓.......▓.▓.▓.....▓.▓.▓
.▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓.▓.▓.▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓▓▓.▓▓▓.▓.▓▓▓.▓▓▓.▓.▓.▓.▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓▓▓.▓▓▓.▓
.▓.........▓...▓.▓.▓.......▓...........▓.▓.▓.▓...▓...▓.......▓.....▓...▓.▓.▓.▓.▓.▓.▓...▓.▓...▓.▓...▓...▓.▓.........▓...▓
.▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓▓▓▓▓.▓▓▓.▓▓▓.▓.▓.▓.▓.▓.▓.▓.▓.▓.▓.▓.▓.▓▓▓.▓▓▓.▓.▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓▓▓.▓.▓
...........▓.▓.▓.▓...▓...▓.....▓.....▓...▓.▓.▓.▓...▓.....▓.▓.▓.....▓.▓.▓.▓...▓.▓.▓.▓.▓...▓...▓.▓...▓.▓.▓.......▓...▓.▓.▓
▓▓▓▓.▓▓▓▓▓▓▓.▓.▓.▓▓▓▓▓.▓.▓.▓▓▓.▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓▓▓▓▓▓▓.▓.▓.▓▓▓.▓.▓.▓.▓.▓▓▓.▓.▓.▓.▓.▓.▓▓▓▓▓.▓.▓▓▓.▓.▓.▓▓▓.▓▓▓▓▓.▓.▓.▓
.....▓.........▓.......▓.....▓...▓...........▓...▓.............▓.....▓...▓.....▓.....▓.▓.......▓.....▓.....▓.........▓.▓

990123456789012345678▓77890▓43334▓112▓334▓876555654321099▓778▓556▓990▓3345433▓099▓099901234567890▓0987655▓9901099901234▓
8▓▓▓▓▓4▓▓▓▓▓0▓2▓▓▓6▓8▓6▓▓▓0▓4▓2▓4▓0▓2▓2▓▓▓8▓▓▓4▓▓▓▓▓▓▓▓▓8▓6▓8▓4▓6▓8▓0▓2▓▓▓4▓2▓0▓8▓▓▓8▓▓▓2▓▓▓6▓▓▓0▓▓▓8▓▓▓4▓8▓▓▓▓▓8▓0▓▓▓4▓
7▓099▓556▓211123456▓9▓655▓1▓5▓1▓5▓9▓1▓2109990▓43211▓55678▓5▓9▓3▓777▓112▓655▓211▓8777890▓334▓7▓21112▓990▓3▓7▓09877▓1▓655▓
6▓0▓8▓▓▓▓▓2▓▓▓2▓▓▓▓▓0▓▓▓4▓2▓6▓0▓6▓8▓0▓▓▓0▓▓▓▓▓▓▓▓▓0▓4▓▓▓8▓4▓0▓2▓▓▓6▓▓▓▓▓6▓▓▓▓▓▓▓▓▓6▓8▓0▓▓▓4▓6▓▓▓▓▓2▓▓▓▓▓2▓6▓▓▓▓▓6▓2▓▓▓▓▓
5▓1▓877▓433▓433▓433▓11234▓3▓7▓9▓778▓099▓1▓334567890▓334▓9▓3▓11234567890▓7▓334▓1▓556▓9▓1▓6555678▓7▓3▓99012▓6555556▓33455▓
4▓2▓▓▓6▓4▓4▓▓▓▓▓4▓2▓▓▓▓▓▓▓4▓▓▓8▓▓▓▓▓▓▓8▓2▓2▓▓▓▓▓▓▓▓▓2▓4▓0▓2▓▓▓▓▓▓▓6▓8▓▓▓6▓2▓4▓0▓4▓▓▓0▓2▓6▓▓▓▓▓8▓6▓4▓8▓▓▓▓▓▓▓4▓4▓▓▓▓▓▓▓4▓
3▓334▓655▓5▓87655▓211▓556▓55678901234▓7▓3▓2109877▓112▓3▓1▓2109877▓7▓9▓556▓1▓5▓9▓433▓1▓3▓7▓99099▓655▓8765556▓433▓65433▓3▓
2▓▓▓4▓▓▓▓▓▓▓8▓▓▓▓▓2▓0▓4▓▓▓▓▓▓▓▓▓▓▓2▓▓▓6▓▓▓▓▓▓▓▓▓6▓0▓▓▓2▓2▓2▓▓▓▓▓6▓8▓▓▓4▓▓▓0▓6▓8▓▓▓2▓▓▓4▓6▓8▓▓▓0▓6▓6▓▓▓▓▓4▓▓▓▓▓2▓6▓▓▓2▓2▓
1▓1▓554321099▓334▓3▓9▓43210987654333456▓990123456▓99012▓3▓3▓33456▓9▓334▓990▓77890▓112▓55678▓211▓777▓112▓33211▓1▓5▓43211▓
0▓0▓▓▓▓▓▓▓▓▓▓▓2▓4▓▓▓8▓4▓▓▓▓▓8▓6▓▓▓▓▓4▓6▓8▓0▓▓▓4▓▓▓8▓▓▓2▓4▓▓▓2▓▓▓▓▓0▓2▓▓▓8▓▓▓8▓▓▓▓▓0▓2▓▓▓▓▓▓▓2▓▓▓▓▓8▓0▓2▓2▓▓▓0▓0▓4▓▓▓▓▓0▓
9▓09990▓7789012▓55678▓55678▓9▓7▓87655▓778901234▓778▓7▓3▓556▓211▓7▓112▓77890▓9▓77890▓333▓99012▓211▓990▓3▓1▓9▓9▓9▓4321099▓
8▓▓▓8▓0▓6▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓8▓0▓8▓8▓▓▓▓▓▓▓▓▓0▓▓▓4▓6▓8▓6▓4▓▓▓6▓▓▓0▓6▓▓▓▓▓6▓▓▓0▓▓▓6▓▓▓0▓2▓2▓8▓▓▓▓▓2▓0▓▓▓▓▓4▓0▓8▓8▓8▓▓▓▓▓▓▓8▓
777▓7▓1▓5▓8765432109877▓099▓1▓9▓990▓65556▓112▓556▓9▓65556▓77890▓556▓556▓5▓1▓556▓5▓112▓1▓8765433▓9▓7▓655▓0987778▓7▓99877▓
6▓6▓6▓2▓4▓▓▓▓▓4▓2▓▓▓▓▓6▓▓▓▓▓2▓▓▓▓▓0▓▓▓4▓6▓2▓2▓6▓▓▓0▓▓▓▓▓6▓▓▓▓▓▓▓4▓6▓4▓▓▓4▓2▓4▓▓▓4▓2▓▓▓0▓8▓▓▓▓▓▓▓8▓6▓6▓▓▓▓▓▓▓6▓▓▓6▓8▓▓▓6▓
5▓5▓5▓3▓3▓099▓5▓3▓556▓5▓099▓33432111234▓7▓3▓3▓7▓2111234▓778901234▓7▓43334▓334▓433▓21099▓9▓334▓778▓5▓7789012▓55655▓7▓655▓
4▓4▓4▓4▓2▓0▓8▓6▓4▓4▓▓▓4▓0▓8▓▓▓4▓▓▓2▓▓▓▓▓8▓▓▓4▓8▓2▓▓▓2▓4▓▓▓▓▓▓▓2▓▓▓▓▓▓▓2▓4▓▓▓▓▓▓▓2▓▓▓▓▓8▓▓▓2▓4▓6▓▓▓4▓▓▓▓▓▓▓2▓4▓▓▓4▓6▓▓▓4▓
334▓3▓5▓211▓7▓655▓333▓3▓1▓87655▓433▓210987655▓9▓3▓433▓5▓990▓433▓77890123456789012▓877789012▓556▓334▓43211▓3▓43334▓65433▓
2▓▓▓2▓▓▓▓▓▓▓6▓6▓▓▓2▓2▓2▓2▓▓▓▓▓6▓4▓▓▓▓▓▓▓▓▓▓▓▓▓0▓4▓4▓▓▓6▓8▓0▓▓▓▓▓6▓▓▓▓▓2▓▓▓▓▓▓▓0▓2▓▓▓6▓▓▓▓▓▓▓▓▓▓▓2▓4▓▓▓▓▓0▓4▓4▓2▓▓▓▓▓4▓2▓
1▓43211▓33456▓777▓21112▓334▓877▓556789012▓3▓211▓5▓5▓9▓778▓1123456▓1▓433▓5543211▓3345678▓877▓43211▓5567890▓5▓5▓11234▓5▓1▓
0▓▓▓▓▓0▓2▓▓▓▓▓8▓6▓2▓0▓▓▓▓▓4▓8▓▓▓▓▓▓▓▓▓0▓2▓2▓2▓▓▓6▓6▓8▓▓▓8▓▓▓▓▓▓▓▓▓0▓4▓▓▓4▓▓▓2▓2▓▓▓4▓▓▓8▓8▓6▓4▓2▓0▓▓▓▓▓▓▓0▓6▓▓▓0▓▓▓4▓▓▓0▓
9▓778901211▓099▓5▓3▓0987655▓99012343211▓3▓1▓3▓877▓778▓0999012▓99990▓556▓3▓7▓3▓3▓3▓5▓099▓9▓655▓3▓099▓099▓1▓778901234▓990▓
8▓6▓▓▓▓▓▓▓0▓0▓▓▓4▓2▓0▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓2▓2▓4▓0▓4▓8▓▓▓▓▓8▓▓▓0▓▓▓2▓8▓8▓0▓4▓6▓2▓6▓4▓4▓2▓6▓0▓▓▓0▓▓▓6▓4▓▓▓8▓0▓8▓▓▓▓▓▓▓▓▓2▓▓▓8▓0▓
87655567890▓1▓5▓3▓211▓655▓21099▓65433▓334▓9▓5▓9▓334▓99011▓7▓3▓77890▓3▓7▓1▓655▓5▓1▓7▓1▓211▓877▓5▓778▓1▓7▓4321112▓334▓7▓1▓
▓▓▓▓4▓▓▓▓▓▓▓2▓4▓2▓▓▓▓▓6▓4▓2▓▓▓8▓6▓▓▓▓▓▓▓▓▓8▓6▓0▓2▓4▓▓▓▓▓▓▓6▓4▓6▓▓▓0▓2▓8▓0▓6▓▓▓6▓0▓8▓0▓2▓2▓▓▓▓▓6▓6▓▓▓2▓6▓4▓▓▓0▓▓▓▓▓4▓6▓2▓
01234▓876543334▓2109877▓43334▓877▓65432109877▓112▓5567898765556▓21112▓990▓77877▓09990▓3▓2109877▓65433▓65556▓098765556▓3▓
...............▓.......▓.........▓.................▓.......▓.......▓.......▓.............▓.▓.........................▓.▓
.▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓.▓▓▓.▓.▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓▓▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓.▓▓▓.▓.▓.▓.▓
...▓...▓.....▓...▓...▓.....▓.▓.▓...▓...▓.....▓...▓...▓...▓...▓...▓...▓...▓...▓.▓.....▓.........▓...▓...▓...▓...▓...▓...▓
.▓.▓.▓.▓.▓▓▓.▓.▓▓▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓.▓.▓.▓▓▓.▓.▓▓▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓▓▓.▓▓▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓▓▓.▓▓▓.▓
.▓...▓...▓...▓...▓...▓.▓.......▓.▓...▓...▓...▓.▓...▓...▓.....▓.....▓...▓...▓.....▓...▓...▓...▓...▓...▓.......▓.....▓...▓
.▓▓▓▓▓▓▓▓▓.▓▓▓.▓.▓▓▓.▓.▓.▓▓▓.▓▓▓.▓▓▓▓▓▓▓▓▓▓▓.▓▓▓▓▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓.▓▓▓.▓.▓▓▓▓▓▓▓.▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓.▓▓▓▓▓.▓.▓.▓▓▓▓▓.▓.▓
.▓...▓...▓...▓...▓.......▓.....▓.........▓...▓.........▓...▓...▓.▓...▓...▓...▓...▓.....▓...▓...▓.......▓...▓.......▓...▓
.▓.▓.▓.▓.▓▓▓.▓.▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓.▓.▓▓▓▓▓.▓.▓▓▓.▓▓▓▓▓.▓.▓.▓▓▓.▓.▓▓▓▓▓.▓.▓.▓▓▓.▓.▓.▓.▓▓▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓
...▓...▓...▓.▓...▓...▓.▓...▓.....▓...........▓...▓...▓.......▓...▓...▓...▓.▓...▓.▓.▓.▓...........▓.▓...▓...▓.▓.▓.▓.....▓
.▓▓▓▓▓▓▓.▓.▓.▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓.▓▓▓.▓▓▓.▓.▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓.▓.▓▓▓.▓.▓▓▓.▓.▓.▓▓▓▓▓.▓.▓.▓▓▓.▓▓▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓.▓▓▓.▓▓▓▓▓
...▓.....▓...▓...▓...▓...▓...▓.▓...▓...▓...▓.▓...▓...▓.▓.......▓...▓.........▓...▓...▓.▓...▓...▓...▓...▓.▓...▓...▓...▓.▓
▓▓.▓.▓▓▓.▓▓▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓.▓▓▓.▓▓▓.▓.▓.▓.▓▓▓▓▓.▓.▓.▓▓▓▓▓.▓▓▓▓▓▓▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓.▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓.▓▓▓.▓▓▓.▓.▓
...▓...▓...▓...▓.▓...▓...▓...▓.....▓...▓...▓.......▓.▓...▓...▓.......▓.....▓.▓.▓.▓.....▓...▓.▓...▓.▓.....▓...▓...▓.▓...▓
.▓▓▓▓▓.▓▓▓.▓.▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓▓▓▓▓.▓▓▓.▓.▓▓▓▓▓.▓▓▓.▓.▓▓▓.▓▓▓.▓▓▓.▓.▓.▓.▓▓▓.▓.▓.▓.▓.▓▓▓▓▓.▓▓▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓▓▓.▓.▓.▓▓▓.▓
...▓...▓...▓...▓...▓.......▓...▓...▓...▓...▓...▓...▓...▓.▓.....▓...▓.▓.....▓.▓...▓...▓...▓.▓.....▓...▓.....▓.........▓.▓
▓▓.▓.▓▓▓.▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓▓▓.▓▓▓▓▓.▓▓▓▓▓.▓▓▓▓▓.▓.▓.▓▓▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓▓▓.▓▓▓.▓.▓▓▓.▓.▓.▓▓▓.▓▓▓.▓▓▓▓▓.▓▓▓▓▓▓▓▓▓.▓
...▓.▓.▓...▓.....▓.....▓...▓...▓...▓...▓.......▓.......▓.....▓.......▓...▓...▓...▓...▓...▓.▓.▓...▓.▓...........▓...▓...▓
.▓▓▓.▓.▓▓▓.▓.▓▓▓▓▓▓▓.▓▓▓.▓.▓.▓▓▓▓▓.▓▓▓.▓▓▓▓▓▓▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓.▓.▓.▓.▓▓▓.▓▓▓▓▓.▓.▓.▓▓▓.▓.▓.▓▓▓.▓.▓▓▓.▓.▓.▓.▓▓▓
.▓...▓...▓...▓...▓...▓...▓...▓...▓...▓...▓...▓...▓...▓.....▓...▓...▓.....▓.▓.▓.▓.▓...▓...▓.....▓...▓...▓.▓...▓...▓...▓.▓
.▓.▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓▓▓.▓▓▓▓▓▓▓.▓▓▓▓▓.▓▓▓.▓.▓.▓▓▓.▓▓▓.▓▓▓.▓.▓.▓▓▓.▓▓▓.▓▓▓▓▓.▓▓▓.▓.▓▓▓.▓.▓▓▓.▓▓▓▓▓.▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓.▓
.......▓...▓...▓.....▓...▓.....▓...▓...▓...▓...▓...▓...▓.▓.........▓...▓.▓.......▓...▓...▓.▓...▓...▓...▓.▓...▓...▓.....▓
.▓▓▓▓▓▓▓▓▓▓▓.▓▓▓▓▓▓▓.▓▓▓.▓.▓▓▓▓▓.▓.▓▓▓.▓▓▓▓▓▓▓.▓.▓.▓.▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓.▓.▓▓▓▓▓▓▓.▓▓▓▓▓.▓▓▓.▓.▓.▓▓▓.▓▓▓▓▓.▓.▓.▓.▓▓▓▓▓.▓
.▓.....▓.....▓...▓...▓...▓...▓...▓...▓...▓.......▓.▓...▓.....▓...▓.▓.▓.▓...▓...▓...▓...▓...▓.▓.......▓.....▓...▓...▓...▓
▓▓.▓▓▓.▓.▓▓▓▓▓.▓.▓.▓▓▓.▓▓▓.▓.▓.▓▓▓▓▓.▓.▓.▓.▓.▓▓▓.▓▓▓.▓▓▓.▓▓▓.▓.▓.▓.▓.▓.▓▓▓▓▓.▓.▓.▓▓▓.▓.▓▓▓.▓.▓▓▓.▓.▓▓▓.▓▓▓▓▓▓▓▓▓▓▓.▓.▓.▓
...▓.....▓.....▓.......▓...▓...............▓...▓.........▓.........▓.▓.......▓.......▓...▓.....▓.....................▓.▓

778901234567890▓4321099▓654333334▓43210987655567890▓0987778▓0987655▓8765556▓8765555567890▓3▓5567890123456789012345678▓1▓
6▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓4▓▓▓0▓8▓▓▓4▓2▓2▓4▓▓▓▓▓▓▓▓▓▓▓4▓6▓▓▓0▓▓▓▓▓6▓8▓▓▓▓▓6▓4▓▓▓▓▓4▓6▓▓▓6▓4▓4▓▓▓▓▓0▓2▓4▓▓▓8▓0▓2▓▓▓▓▓8▓0▓▓▓4▓6▓8▓0▓
556▓877▓43211▓655▓990▓87655▓1▓1▓334▓778▓11234▓778▓112▓556▓990▓556▓433▓334▓778▓7▓33456▓211123456▓990▓334▓778▓112▓556▓990▓
4▓6▓8▓6▓4▓▓▓0▓6▓▓▓8▓▓▓▓▓▓▓▓▓0▓0▓2▓4▓6▓8▓0▓2▓▓▓8▓8▓▓▓2▓4▓▓▓0▓0▓4▓▓▓▓▓2▓2▓▓▓▓▓8▓▓▓2▓▓▓6▓2▓▓▓▓▓▓▓6▓8▓▓▓▓▓4▓6▓▓▓▓▓2▓▓▓6▓▓▓0▓
3▓778▓655▓990▓778▓877▓5▓2109990▓1▓556▓990▓211▓9▓990▓334▓99990▓43211▓112▓778▓99012▓877▓334▓778▓778▓877▓5567890▓33456▓211▓
2▓▓▓▓▓▓▓▓▓8▓▓▓8▓8▓▓▓6▓4▓2▓▓▓8▓▓▓0▓▓▓▓▓▓▓▓▓▓▓0▓▓▓▓▓0▓▓▓▓▓8▓8▓▓▓▓▓2▓0▓0▓▓▓6▓8▓▓▓▓▓▓▓8▓▓▓▓▓4▓6▓8▓8▓▓▓▓▓6▓▓▓▓▓8▓0▓2▓▓▓▓▓2▓2▓
1▓877▓433▓877▓999▓8765433▓09877▓990123456▓990▓990111234▓778▓112▓3▓099▓555▓990▓334▓99012▓556▓999▓3345678▓099▓1123456▓333▓
0▓8▓6▓4▓2▓▓▓6▓0▓▓▓8▓▓▓4▓▓▓0▓▓▓6▓8▓0▓▓▓▓▓6▓8▓▓▓8▓▓▓▓▓2▓4▓6▓▓▓0▓2▓▓▓▓▓8▓4▓4▓▓▓0▓2▓4▓0▓▓▓2▓4▓▓▓▓▓▓▓2▓4▓▓▓8▓0▓▓▓▓▓2▓4▓▓▓▓▓4▓
099▓655▓112▓5▓112▓990▓5▓211▓55678▓11234567890▓777▓433▓5567890▓334▓778▓333▓5▓112▓5▓1▓5▓33456789012▓5▓099▓112▓5▓3▓5▓87655▓
0▓▓▓▓▓▓▓0▓2▓4▓▓▓2▓▓▓0▓▓▓2▓▓▓4▓6▓▓▓2▓▓▓4▓6▓▓▓0▓6▓6▓4▓▓▓▓▓▓▓8▓0▓▓▓4▓6▓▓▓2▓2▓4▓▓▓▓▓6▓2▓4▓▓▓4▓▓▓8▓▓▓▓▓4▓0▓▓▓▓▓2▓4▓4▓▓▓8▓▓▓▓▓
112▓21099▓334▓433▓211▓433▓334▓7▓112▓655▓778▓1▓556▓556▓3▓0999012▓556▓211123456▓877▓334▓7▓556▓990▓334▓112▓5▓334▓556▓990▓3▓
▓▓2▓2▓▓▓8▓▓▓▓▓4▓▓▓2▓▓▓4▓▓▓2▓▓▓8▓0▓▓▓6▓▓▓8▓8▓2▓4▓▓▓▓▓6▓2▓0▓▓▓▓▓2▓▓▓▓▓▓▓0▓▓▓▓▓6▓8▓▓▓▓▓4▓6▓▓▓6▓▓▓0▓2▓▓▓▓▓2▓4▓▓▓4▓▓▓6▓▓▓0▓2▓
433▓334▓877▓655▓3▓211▓556▓211▓99012▓778▓999▓3345678▓7▓211▓099▓3345678▓99011▓7▓9▓3▓65556▓877▓5▓112▓7▓43334▓655▓877▓1▓112▓
4▓▓▓▓▓4▓▓▓6▓6▓▓▓2▓▓▓0▓▓▓6▓▓▓0▓▓▓▓▓2▓▓▓8▓0▓▓▓▓▓4▓▓▓8▓6▓▓▓2▓▓▓8▓▓▓4▓6▓8▓8▓▓▓0▓8▓0▓2▓6▓▓▓▓▓8▓▓▓4▓▓▓▓▓6▓4▓▓▓▓▓6▓▓▓8▓8▓0▓▓▓2▓
556▓655▓556▓778▓112▓0987778▓099▓433▓099▓112▓655▓099▓655▓3▓77890▓556▓9▓77890▓9▓112▓778▓099▓1▓43334▓655▓09877▓099999012▓1▓
▓▓6▓6▓▓▓4▓▓▓▓▓8▓0▓2▓▓▓▓▓▓▓▓▓▓▓8▓4▓▓▓0▓▓▓▓▓2▓▓▓▓▓0▓▓▓▓▓4▓4▓6▓▓▓0▓▓▓▓▓0▓6▓▓▓▓▓0▓▓▓2▓▓▓8▓0▓▓▓0▓4▓2▓▓▓6▓▓▓0▓▓▓▓▓0▓▓▓▓▓▓▓▓▓0▓
556▓7▓7▓433▓09990▓33456▓334▓778▓556▓112▓4333456▓9901234▓55678▓1123211▓655▓211▓112▓099▓112▓9▓5▓211▓7▓21112321112▓556▓990▓
4▓▓▓8▓6▓▓▓2▓0▓▓▓▓▓▓▓4▓▓▓2▓4▓6▓▓▓▓▓6▓▓▓2▓▓▓▓▓▓▓6▓8▓0▓▓▓▓▓▓▓▓▓8▓0▓2▓2▓▓▓▓▓4▓2▓2▓0▓▓▓0▓▓▓▓▓2▓8▓6▓▓▓0▓8▓2▓▓▓2▓2▓▓▓2▓4▓6▓8▓▓▓
3▓099▓556▓211▓556▓655▓112▓556▓990▓778▓334▓778▓778▓112▓65433▓990▓333▓11234▓3▓3▓9▓1▓112▓433▓87778▓999▓333▓3▓334▓334▓778▓9▓
2▓0▓▓▓4▓6▓▓▓▓▓4▓6▓▓▓▓▓0▓▓▓▓▓▓▓8▓▓▓▓▓8▓▓▓4▓6▓8▓▓▓8▓▓▓2▓▓▓4▓2▓0▓▓▓2▓▓▓0▓▓▓▓▓4▓▓▓8▓0▓▓▓2▓4▓▓▓8▓▓▓▓▓8▓▓▓▓▓2▓4▓4▓4▓▓▓▓▓▓▓▓▓8▓
2111234▓778▓334▓77890▓099▓55678▓877▓990▓556▓999▓990▓334▓5▓211123211▓099▓9▓5567890▓433▓556▓9▓334▓778▓112▓5▓555▓990▓09877▓
2▓▓▓▓▓▓▓▓▓▓▓2▓▓▓▓▓▓▓0▓▓▓8▓4▓▓▓▓▓8▓6▓▓▓0▓▓▓▓▓▓▓8▓0▓0▓4▓4▓▓▓▓▓▓▓▓▓▓▓0▓0▓8▓8▓6▓▓▓▓▓▓▓4▓▓▓▓▓6▓▓▓2▓4▓6▓▓▓0▓▓▓▓▓6▓6▓8▓0▓▓▓▓▓6▓
3▓33456▓99012▓655▓211▓778▓433▓099▓655▓112▓5567890▓1▓555▓99012▓556▓9▓1▓7▓877▓099▓655▓112▓778▓1▓5567890▓33456▓778▓112▓556▓
▓▓2▓▓▓6▓8▓▓▓▓▓6▓4▓2▓▓▓6▓▓▓4▓2▓0▓▓▓▓▓4▓2▓2▓4▓6▓▓▓0▓▓▓4▓▓▓8▓▓▓2▓4▓6▓8▓2▓6▓▓▓▓▓0▓8▓6▓▓▓0▓2▓▓▓8▓0▓▓▓6▓8▓▓▓2▓▓▓▓▓▓▓▓▓▓▓2▓4▓6▓
012▓87778▓09877▓4333456▓655▓210987654333334▓778▓112345678▓433345678▓3▓6543211▓8777890▓334▓99012▓778901234567890123334▓7▓