Skip to content

Instantly share code, notes, and snippets.

@FiXato
Last active December 11, 2015 20:49
Show Gist options
  • Save FiXato/4658366 to your computer and use it in GitHub Desktop.
Save FiXato/4658366 to your computer and use it in GitHub Desktop.
A bit of an updated version of my ansinator script. Should toss it in a proper repo.
#!/usr/bin/env ruby
# encoding: utf-8
# Based on the 'colors' zsh script I found online somewhere years ago.
# It looks like it is based on works posted at http://crunchbanglinux.org/forums/topic/13645/ansi-colorschemes-scripts/page/2/
# I've basically just edited it a bit to work with IRC control codes as well.
# ~~Filip H.F. "FiXato" Slagter, 2012
abort("You need at least Ruby 1.9 to run this script due to encoding issues") if RUBY_VERSION < '1.9'
class String
def center(str_length)
delta = str_length - self.length
return self unless delta > 0
half=(delta/2)
remainder = (delta-half)
'%s%s%s' % [' ' * half, self, ' ' * remainder]
end
end
class IrcFormatter
COLOR_TABLE = {
:mirc => {
:white => 0,
:black => 1,
:blue => 2, :navy => 2,
:green => 3,
:red => 4,
:brown => 5, :maroon => 5,
:purple => 6,
:orange => 7, :olive => 7,
:yellow => 8,
:lightgreen => 9, :lime => 9,
:teal => 10, :darkcyan => 10,
:cyan => 11, :aqua => 11,
:lightblue => 12, :royal => 12,
:pink => 13, :lightpurple => 13,
:grey => 14, :gray => 14,
:lightgrey => 15, :silver => 15,
:transparent => 99,
},
}
COLOR_ESCAPE_CODE = "\003"
BOLD_ESCAPE_CODE = "\002"
ITALIC_ESCAPE_CODE = "\035"
UNDERLINE_ESCAPE_CODE = "\037"
REVERSE_ESCAPE_CODE = "\0026"
RESET_ESCAPE_CODE = "\017"
attr_accessor :type
def initialize(type=:mirc)
@type = type
end
#Convert colour name to appropriate colour code
def c(name)
return name unless name.kind_of?(Symbol)
COLOR_TABLE[type][name]
end
def color(fg,bg=nil)
arr = [COLOR_ESCAPE_CODE]
arr << c(fg) if fg
arr << ',' if bg
arr << c(bg) if bg
arr.join('')
end
def default
color(:white,:black)
end
def fg(colour_name)
colour = color(colour_name)
end
def bg(colour_name)
color(nil,colour_name)
end
def b(text=nil)
format(BOLD_ESCAPE_CODE, text)
end
def i(text=nil)
format(ITALIC_ESCAPE_CODE, text)
end
def u(text=nil)
format(UNDERLINE_ESCAPE_CODE, text)
end
def r(text=nil)
format(REVERSE_ESCAPE_CODE, text)
end
def reset
RESET_ESCAPE_CODE
end
def strip_formatting(str)
str = str.clone
str.gsub!(/#{COLOR_ESCAPE_CODE}\d{0,2}(,\d{1,2})?/,'')
str.gsub!(BOLD_ESCAPE_CODE,'')
str.gsub!(ITALIC_ESCAPE_CODE,'')
str.gsub!(UNDERLINE_ESCAPE_CODE,'')
str.gsub!(REVERSE_ESCAPE_CODE,'')
str.gsub!(RESET_ESCAPE_CODE,'')
str
end
private
def format(format_code, text=nil)
str = format_code
str += [text, format_code] unless text.nil?
str
end
end
if ARGV == ['mirctable']
f = IrcFormatter.new(:mirc)
str = ""
(0..15).map do |i|
str += [IrcFormatter::COLOR_ESCAPE_CODE,i,'....'].join("")
end
str += "#{f.reset}\n"
(0..15).map do |i|
str += [IrcFormatter::COLOR_ESCAPE_CODE,i,',',i,'....'].join("")
end
str += "#{f.reset}\n"
(0..15).map do |i|
str += [IrcFormatter::COLOR_ESCAPE_CODE,1,',',i,'....'].join("")
end
str += "#{f.reset}\n"
(0..15).map do |i|
str += [IrcFormatter::COLOR_ESCAPE_CODE,0,',',i,'....'].join("")
end
str += "#{f.reset}\n"
(0..15).map do |i|
str += [f.reset,IrcFormatter::COLOR_ESCAPE_CODE,nil,',',i,'....'].join("")
end
str += "#{f.reset}\n"
(0..15).map do |i|
str += ' %02i ' % i
end
puts str + f.reset
exit
end
class AnsiSprite
attr_accessor :primary_colour, :secondary_colour, :formatter, :replacement_char, :subtitle, :name,
:raw, :sprite, :transformations
def initialize(name)
#Defaults
@formatter = IrcFormatter.new(:mirc)
@primary_colour = :black
@secondary_colour = :white
@sprites_dir = File.join(File.dirname(File.expand_path(__FILE__)), 'ansi-shapes')
@subtitle = ''
@transformations = []
@name = name
end
def load_sprite(name=nil)
@name = name unless name.nil?
filename = File.join(@sprites_dir, File.basename(@name) + '.shape')
raise 'Unknown Shape' unless File.exist?(filename)
@raw = File.readlines(filename).map{|l|l.gsub("\n",'')}
@sprite = @raw
end
def append_subtitle
delta = width - subtitle.length
if delta > 0
@sprite << @subtitle.center(width)
else
@sprite.map! do |line|
line += (' '*delta.abs)
end
@sprite << @subtitle
end
end
def unformatted_sprite
@sprite.map do |line|
line.gsub(/\$\{(.+?)\}/, '')
end
end
def optimise_sprite
unformatted_sprite.each_with_index do |line,index|
# Make sure each line starts with the primary colour
formatted_line = '${1}%s' % @sprite[index]
# Pad each line so each line is of equal length
difference = width-line.length
formatted_line += (' '*difference) if difference > 0
# And end each line with the reset colour
formatted_line += '${r}'
@sprite[index] = formatted_line
end
end
def transform
@transformations.each do |transformation|
case transformation
when :mirror
@sprite.map! do |line|
sections = line.split(/(\$\{\S+?\})/)
next line.reverse if sections.size == 1
pairs = sections.each_slice(2).to_a
#puts "===="
#p pairs
#puts "-----"
i = -1
pairs.reverse!
pairs.map do |a|
a[0].reverse!
a.reverse!
#p a
#p ['swapping',a[0],'for', pairs[i][0]]
a[0] = pairs[i][0]
i -= 1
a
end#.rotate(1)
#pairs[-1].reverse!
#p pairs
#puts "===="
pairs.join('')
end
end
end
end
def formatted_sprite
@sprite.map do |line|
str = line.gsub(/\$\{(.+?)\}/) do |match|
style($1)
end
str.gsub!(' ',@replacement_char) if replace_spaces?
#[formatter.fg(@primary_colour), str, formatter.reset].join('')
#[str, formatter.reset].join('')
[formatter.default, str, formatter.reset,formatter.default].join('')
end
end
def width
unformatted_sprite.max_by{|line|line.length}.length
end
def style(format_string)
case format_string.to_s
when /#(\d+)(,(\d+))?/
return formatter.color($1,$3)
when /([01]),([01])/
fg = ($1.to_i == 0 ? @secondary_colour : @primary_colour)
bg = ($2.to_i == 0 ? @secondary_colour : @primary_colour)
return formatter.color(fg,bg)
when '0'
return formatter.fg(@secondary_colour)
when '1'
return formatter.fg(@primary_colour)
when 'r'
return formatter.reset
end
end
def replace_spaces?
!(replacement_char == '' || replacement_char.nil?)
end
def number_of_lines
@sprite.size
end
end
class AnsiScene
require 'yaml'
attr_accessor :scenes_dir
attr_reader :shapes
def initialize(*shapes)
@shapes = []
shapes.each{|shape|add_shape(shape)}
@scenes_dir = File.join(File.dirname(File.expand_path(__FILE__)), 'ansi-shapes')
end
def add_shape(shape)
raise 'Not an AnsiSprite' unless shape.kind_of?(AnsiSprite)
@shapes << shape
end
def height
@shapes.max_by{|g|g.number_of_lines}.number_of_lines
end
def irc_lines
lines = Array.new(height)
(0...height).each do |i|
shapes.map{|s|[s.formatted_sprite,s]}.each do |fsprite,shape|
lines[i] ||= IrcFormatter.new.default
if fsprite[i]
lines[i] += fsprite[i]
else
lines[i] += ' ' * shape.width
end
lines[i] += ' '
end
end
lines
end
def store(name)
filename = File.basename(name.to_s)
abort("Invalid ansinator scene name: #{name}") if filename.length < 1
filename += ".scene.ansinator"
File.open(File.join(@scenes_dir, filename), "w") do |f|
f.puts @shapes.to_yaml
end
end
def load(name)
filename = File.basename(name.to_s)
abort("Invalid ansinator scene name: #{name}") if filename.length < 1
filename += ".scene.ansinator"
@shapes = YAML.load_file(File.join(@scenes_dir, filename))
end
end
scene = AnsiScene.new
if ARGV.include?('pacman')
s = AnsiSprite.new('pacman')
s.subtitle = 'Pac-Man'
s.replacement_char = ' ' #'.'
s.primary_colour = :yellow
s.secondary_colour = :white
s.load_sprite
s.optimise_sprite
s.append_subtitle
scene.add_shape(s)
[[:red, 'Blinky'], [:pink, 'Pinky'], [:cyan, 'Inky'], [:orange, 'Clyde']].each do |color, name|
s = AnsiSprite.new('ghost')
s.subtitle = name
s.replacement_char = ' ' #'.'
s.primary_colour = color
s.secondary_colour = :white
# s.transformations << :mirror
s.load_sprite
s.optimise_sprite
# s.transform
s.append_subtitle
scene.add_shape(s)
end
end
if ARGV.include?('space')
i = 0
[[ :green, 'greeny'], [ :blue, 'bluey'], [ :red, 'Blinky'], [ :pink, 'Pinky'], [ :cyan, 'Inky'], [ :orange, 'Clyde'], [ :lightgreen, 'limey'], [ :lightblue, 'cloudy']].each do |color, name|
s = AnsiSprite.new('spaceinvader%i' % (i%2 + 1))
i+=1
s.subtitle = name
s.replacement_char = ' ' #'.'
s.primary_colour = color
s.secondary_colour = :white
# s.transformations << :mirror
s.load_sprite
s.optimise_sprite
# s.transform
# s.append_subtitle
scene.add_shape(s)
end
end
if ARGV.include?('kirby')
[[ :green, 'greeny']].each do |color, name|
s = AnsiSprite.new('kirby')
s.subtitle = name
s.replacement_char = ' ' #'.'
s.primary_colour = color
s.secondary_colour = :white
# s.transformations << :mirror
s.load_sprite
s.optimise_sprite
# s.transform
# s.append_subtitle
scene.add_shape(s)
end
end
if ARGV.include?('owl')
[[ :green, 'greeny']].each do |color, name|
s = AnsiSprite.new('owl')
s.subtitle = name
s.replacement_char = ' ' #'.'
s.primary_colour = color
s.secondary_colour = :white
# s.transformations << :mirror
s.load_sprite
s.optimise_sprite
# s.transform
# s.append_subtitle
scene.add_shape(s)
end
end
if ARGV.include?('russia')
[[ :green, 'greeny']].each do |color, name|
s = AnsiSprite.new('russia')
s.subtitle = name
s.replacement_char = ' ' #'.'
s.primary_colour = color
s.secondary_colour = :white
# s.transformations << :mirror
s.load_sprite
s.optimise_sprite
# s.transform
# s.append_subtitle
scene.add_shape(s)
end
end
if ARGV.include?('dkjr')
[[ :brown, 'greeny']].each do |color, name|
s = AnsiSprite.new('dkjr')
s.subtitle = name
s.replacement_char = ' ' #'.'
s.primary_colour = color
s.secondary_colour = :white
# s.transformations << :mirror
s.load_sprite
s.optimise_sprite
# s.transform
# s.append_subtitle
scene.add_shape(s)
end
end
if ARGV.include?('smiley')
[[ :brown, 'greeny']].each do |color, name|
s = AnsiSprite.new('smiley')
s.subtitle = name
s.replacement_char = ' ' #'.'
s.primary_colour = color
s.secondary_colour = :white
# s.transformations << :mirror
s.load_sprite
s.optimise_sprite
# s.transform
# s.append_subtitle
scene.add_shape(s)
end
end
if ARGV.include?('mario')
[[ :brown, 'Mario']].each do |color, name|
s = AnsiSprite.new('mario')
s.subtitle = name
s.replacement_char = ' ' #'.'
s.primary_colour = color
s.secondary_colour = :white
# s.transformations << :mirror
s.load_sprite
s.optimise_sprite
# s.transform
s.append_subtitle
scene.add_shape(s)
end
end
#s = AnsiSprite.new('pacman')
#s.subtitle = 'Pac-Man'
#s.replacement_char = ' ' #'.'
#s.primary_colour = :yellow
#s.secondary_colour = :white
#s.transformations << :mirror
#s.load_sprite
#s.optimise_sprite
#s.transform
#s.append_subtitle
#scene.add_shape(s)
#s = AnsiSprite.new('ghost')
#s.subtitle = 'Ghost'
#s.replacement_char = ' ' #'.'
#s.primary_colour = :cyan
#s.secondary_colour = :white
#s.load_sprite
#s.optimise_sprite
#s.transform
#s.append_subtitle
#scene.add_shape(s)
#s = AnsiSprite.new('ghost')
#s.subtitle = 'Reversie'
#s.replacement_char = ' ' #'.'
#s.primary_colour = :blue
#s.secondary_colour = :white
#s.transformations << :mirror
#s.load_sprite
#s.optimise_sprite
#s.transform
#s.append_subtitle
#scene.add_shape(s)
#scene.store("pacman_chasing_and_ghosts")
#scene.load("pacman_chasing_and_ghosts")
puts scene.irc_lines
${#1,1}██${#12,12}█${#1,1}███████████████████████${#12,12}█${#1,1}███
${#1,1}█${#12,12}█${#1,1}█${#12,12}█${#1,1}█████████████████████${#12,12}█${#1,1}█${#12,12}█${#1,1}██
${#7,7}███${#12,12}█${#7,7}█${#1,1}██████████${#0,0}█${#7,7}█${#5,5}███${#1,1}█████${#12,12}█${#1,1}█${#12,12}█${#1,1}██
${#7,7}██${#12,12}█${#1,1}█${#7,7}█${#5,5}█${#1,1}████████${#0,0}█${#1,1}█${#7,7}███${#5,5}██${#1,1}█████${#12,12}█${#1,1}███
${#7,7}███${#1,1}█${#5,5}███${#1,1}████${#7,7}██${#5,5}██${#0,0}█${#1,1}█${#0,0}█${#7,7}██${#5,5}█${#1,1}█████${#12,12}█${#1,1}███
${#1,1}█${#7,7}█${#1,1}█${#12,12}█${#5,5}█████${#1,1}█${#7,7}██████${#0,0}██${#7,7}█${#5,5}█${#7,7}█${#1,1}████${#12,12}█${#1,1}█${#7,7}███
${#1,1}█${#12,12}█${#1,1}█${#12,12}█${#5,5}██████${#7,7}█${#5,5}█${#7,7}█████████${#0,0}█${#1,1}███${#7,7}█${#1,1}█${#12,12}█${#7,7}██
${#1,1}██${#12,12}█${#1,1}██${#5,5}█████${#0,0}█${#7,7}█${#5,5}████${#7,7}████${#0,0}█${#5,5}██${#1,1}█${#5,5}█${#7,7}█${#12,12}█${#7,7}███
${#1,1}██${#12,12}█${#1,1}███${#5,5}███${#0,0}██${#7,7}██${#5,5}████${#7,7}███${#0,0}█${#5,5}█████${#12,12}█${#1,1}█${#7,7}█${#1,1}█
${#1,1}█${#12,12}█${#1,1}█${#12,12}█${#1,1}███${#5,5}██${#0,0}██${#5,5}█${#7,7}██${#5,5}██${#7,7}███${#0,0}█${#5,5}██████${#1,1}█${#12,12}█${#1,1}██
${#1,1}█${#12,12}█${#1,1}█${#12,12}█${#1,1}████${#5,5}█${#0,0}███${#5,5}█${#7,7}█████${#0,0}█${#5,5}███████${#1,1}█${#12,12}█${#1,1}██
${#1,1}██${#12,12}█${#1,1}██████${#0,0}████${#5,5}███${#0,0}██${#5,5}███████${#1,1}█${#12,12}█${#1,1}███
${#1,1}██${#12,12}█${#1,1}█████${#5,5}██${#0,0}██${#5,5}█${#0,0}██████${#5,5}█${#0,0}█${#1,1}█████${#12,12}█${#1,1}███
${#1,1}█${#12,12}█${#1,1}█${#12,12}█${#1,1}██${#7,7}█${#5,5}███${#0,0}███${#5,5}██${#0,0}█████${#5,5}███${#1,1}██${#5,5}██${#12,12}█${#1,1}██
${#1,1}█${#12,12}█${#1,1}█${#12,12}█${#1,1}█${#7,7}█${#5,5}█████${#0,0}██${#5,5}█${#0,0}████${#5,5}███████${#7,7}██${#12,12}█${#1,1}██
${#1,1}██${#12,12}█${#1,1}██${#7,7}█${#5,5}██████${#0,0}█████${#5,5}██████${#7,7}████${#1,1}███
${#1,1}██${#12,12}█${#1,1}██${#7,7}██${#5,5}███${#1,1}███████████${#5,5}█${#7,7}██${#1,1}██${#12,12}█${#1,1}███
${#1,1}█${#12,12}█${#1,1}█${#12,12}█${#1,1}██${#7,7}███${#1,1}████████████████${#12,12}█${#1,1}█${#12,12}█${#1,1}██
${#1,1}█${#12,12}█${#1,1}█${#12,12}█${#1,1}█████████████████████${#12,12}█${#1,1}█${#12,12}█${#1,1}██
▄██████▄
▄${0}█▀█${1}██${0}█▀█${1}██▄
█${0}▄▄█${1}██${0}▄▄█${1}███
████████████
██▀██▀▀██▀██
▀ ▀ ▀ ▀
${#0,0}████${#1,1}██████${#0,0}██${#1,1}████████████
${#0,0}██${#1,1}██${#13,13}██████${#1,1}██${#13,13}████████████${#1,1}████
${#1,1}██${#13,13}██████${#1,1}██${#13,13}██████████████████${#1,1}██
${#1,1}██${#13,13}████████████${#1,1}██${#13,13}██${#1,1}██${#13,13}██████████${#1,1}██
${#1,1}██${#13,13}████████████${#1,1}██${#13,13}██${#1,1}██${#13,13}████████████${#1,1}██
${#1,1}██${#13,13}████████████${#1,1}██${#13,13}██${#1,1}██${#13,13}████████████${#1,1}██
${#0,0}██${#1,1}██${#13,13}████${#4,4}████${#13,13}██${#1,1}██${#13,13}██${#1,1}██${#13,13}██${#4,4}████${#13,13}████████${#1,1}██
${#1,1}██${#13,13}██████${#4,4}████${#13,13}██████████${#4,4}████${#13,13}██████████${#1,1}██
${#1,1}██${#13,13}██████████${#13,13}████${#1,1}██${#13,13}████████████████████${#1,1}██
${#1,1}██${#13,13}██████████${#13,13}████${#1,1}██${#13,13}████████████████████${#1,1}██
${#1,1}██${#13,13}██████████${#13,13}████${#1,1}██${#13,13}████████████████████${#1,1}██
${#0,0}██${#1,1}██${#13,13}██████████████████████${#1,1}████${#13,13}██████${#1,1}██
${#0,0}██${#1,1}██${#13,13}████████████████████${#1,1}██${#4,4}████${#1,1}██████
${#0,0}████${#1,1}██${#13,13}████████████████${#1,1}██${#4,4}████████${#1,1}██
${#0,0}██${#1,1}██${#4,4}████████${#13,13}████████${#1,1}██${#4,4}██████████${#1,1}██
${#1,1}██${#4,4}████████████${#1,1}██████${#4,4}██████████${#1,1}██
${#1,1}██${#4,4}████████████${#1,1}██${#0,0}████${#1,1}██${#4,4}██████${#1,1}██
${#1,1}██████████████${#0,0}████████${#1,1}██████
${#1,1}██████${#05}█████${#1,1}██${#07}███${#1,1}██${r}
${#1,1}█████${#05}█████████${#07}██${#1,1}██${r}
${#1,1}█████${#03}███${#07}██${#01}█${#07}█${#01}█${#05}███${#1,1}██${r}
${#1,1}████${#03}█${#07}█${#03}█${#07}███${#01}█${#07}███${#05}██${#1,1}██${r}
${#1,1}████${#03}█${#07}█${#03}██${#07}███${#01}█${#07}███${#05}█${#1,1}██${r}
${#1,1}████${#03}██${#07}████${#01}████${#05}█${#1,1}███${r}
${#1,1}██████${#07}███████${#05}██${#1,1}███${r}
${#1,1}███${#05}████${#12}█${#05}███${#12}█${#05}██${#1,1}██${#05}█${#1,1}█${r}
${#1,1}█${#07}██${#05}█████${#12}█${#05}███${#12}█${#1,1}██${#05}██${#1,1}█${r}
${#1,1}█${#07}███${#05}████${#12}████${#08}█${#12}██${#05}██${#1,1}█${r}
${#1,1}██${#07}█${#1,1}██${#12}█${#05}█${#12}██${#08}█${#12}█████${#05}██${#1,1}█${r}
${#1,1}██${#05}███${#12}█████████${#05}██${#1,1}██${r}
${#1,1}██${#05}███${#12}██████${#1,1}███████${r}
${#1,1}██${#05}██${#1,1}██████████████${r}
${#1,1}██████████████████${r}
${#1,1}████████████████${#14,14}██${#15,15}██████${#14,14}██${#1,1}██████████████████${r}
${#1,1}██████████${#14,14}██${#15,15}██████${#0,0}████████${#15,15}██${#14,14}██${#1,1}██████████████${r}
${#1,1}████████${#14,14}██${#15,15}████${#0,0}████████████████${#15,15}████${#1,1}██████████${r}
${#1,1}██████${#14,14}██${#15,15}██${#0,0}██████████████████${#15,15}██${#8,8}██${#15,15}████${#1,1}████████${r}
${#1,1}████${#15,15}██${#0,0}██████${#8,8}████${#15,15}██${#0,0}██████████${#14,14}██${#1,1}██${#8,8}██${#0,0}██${#14,14}██${#1,1}██████${r}
${#1,1}██${#14,14}██${#15,15}██${#0,0}████${#8,8}██${#1,1}████${#8,8}██${#15,15}██${#0,0}████████${#15,15}██${#14,14}██${#8,8}██${#0,0}██${#15,15}██${#1,1}██████${r}
${#1,1}██${#15,15}██${#0,0}██████${#8,8}██${#1,1}████${#8,8}██${#0,0}████████${#15,15}██${#0,0}██${#15,15}████${#0,0}████${#14,14}██${#1,1}████${r}
${#1,1}██${#15,15}██${#0,0}████████${#8,8}████${#0,0}██████████${#14,14}██${#15,15}██${#0,0}████████${#15,15}██${#1,1}████${r}
${#14,14}██${#15,15}██${#0,0}██████████████████████${#5,5}██${#14,14}██${#0,0}████████${#15,15}██${#1,1}████${r}
${#14,14}██${#15,15}██${#0,0}████████████████████${#14,14}██${#5,5}██${#14,14}██${#15,15}██${#0,0}████████${#14,14}██${#1,1}██${r}
${#15,15}████${#0,0}████████████${#15,15}██${#14,14}██████${#5,5}████${#7,7}██${#0,0}██████████${#14,14}██${#1,1}██${r}
${#15,15}██${#0,0}████████████████${#15,15}██${#7,7}██${#5,5}██${#4,4}██${#5,5}██${#14,14}██${#0,0}██████████${#15,15}██${#1,1}██${r}
${#15,15}██${#0,0}████████████████████${#14,14}██${#1,1}██${#7,7}██${#15,15}██${#0,0}██████████${#15,15}██${#1,1}██${r}
${#14,14}██${#15,15}██${#0,0}████████████████████${#15,15}██${#14,14}██${#15,15}██${#0,0}██████████${#15,15}██${#1,1}██${r}
${#14,14}██${#15,15}██${#0,0}██████████████████████████████████████${#14,14}██${r}
${#14,14}██${#15,15}██${#0,0}██████████████████████████████████████${#15,15}█${r}
▄███████▄
▄█████████▀▀
███████▀
███████▄
▀█████████▄▄
▀███████▀
${#5}LOУAL TO MOTHEЯ ЯUSSIA
${#4,4}☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭
${#4,4}☭☭☭☭☭☭${#8,8}☭☭☭☭${#4,4}☭☭☭☭${#8,8}☭☭${#4,4}☭☭☭☭☭☭☭☭
${#4,4}☭☭☭☭${#8,8}☭☭☭☭${#4,4}☭☭☭☭☭☭☭☭${#8,8}☭☭${#4,4}☭☭☭☭☭☭
${#4,4}☭☭☭☭${#8,8}☭☭${#4,4}☭☭${#8,8}☭☭${#4,4}☭☭☭☭☭☭☭☭${#8,8}☭☭${#4,4}☭☭☭☭
${#4,4}☭☭☭☭☭☭☭☭☭☭${#8,8}☭☭${#4,4}☭☭☭☭☭☭${#8,8}☭☭${#4,4}☭☭☭☭
${#4,4}☭☭☭☭☭☭☭☭☭☭☭☭${#8,8}☭☭${#4,4}☭☭☭☭${#8,8}☭☭${#4,4}☭☭☭☭
${#4,4}☭☭☭☭☭☭${#8,8}☭☭${#4,4}☭☭☭☭☭☭${#8,8}☭☭${#4,4}☭☭${#8,8}☭☭${#4,4}☭☭☭☭
${#4,4}☭☭☭☭${#8,8}☭☭${#4,4}☭☭${#8,8}☭☭${#4,4}☭☭☭☭☭☭${#8,8}☭☭${#4,4}☭☭☭☭☭☭
${#4,4}☭☭${#8,8}☭☭${#4,4}☭☭☭☭☭☭${#8,8}☭☭☭☭☭☭${#4,4}☭☭${#8,8}☭☭${#4,4}☭☭☭☭
${#4,4}☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭${#8,8}☭☭${#4,4}☭☭
${#4,4}☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭
${#11,11}█████████████${#1,1}████████████████████${#11,11}██████████████
${#12,12}██████████${#1,1}███${#8,8}████████████████████${#1,1}████${#12,12}██████████
${#11,11}████████${#1,1}██${#8,8}███████████████████████████${#1,1}██${#11,11}████████
${#12,12}███████${#1,1}█${#8,8}███████████████████████████████${#1,1}█${#12,12}███████
${#11,11}██████${#1,1}█${#8,8}██${#1,1}████████${#8,8}█████████${#1,1}████████${#8,8}██████${#1,1}█${#11,11}██████
${#12,12}██████${#1,1}█${#8,8}█${#1,1}█${#0,0}█████${#1,1}████${#8,8}███████${#1,1}█${#0,0}█████${#1,1}████${#8,8}█████${#1,1}█${#12,12}██████
${#11,11}█████${#1,1}█${#8,8}██${#1,1}█${#0,0}█████${#1,1}█████${#8,8}█████${#1,1}█${#0,0}██████${#1,1}█████${#8,8}█████${#1,1}█${#11,11}█████
${#12,12}█████${#1,1}█${#8,8}██${#1,1}█${#0,0}█████████${#1,1}█${#8,8}█████${#1,1}█${#0,0}██████████${#1,1}█${#8,8}█████${#1,1}█${#12,12}█████
${#11,11}████${#1,1}█${#8,8}████${#1,1}█████████${#8,8}███████${#1,1}██████████${#8,8}███████${#1,1}█${#11,11}████
${#12,12}████${#1,1}█${#8,8}█████████████████████████████████████${#1,1}█${#12,12}████
${#11,11}████${#1,1}█${#8,8}██${#1,1}█████████████████████████████${#8,8}██████${#1,1}█${#11,11}████
${#12,12}████${#1,1}█${#8,8}████${#1,1}██${#6,6}████████:D█=)█face██████${#1,1}██${#8,8}█████${#1,1}█${#12,12}████
${#11,11}█████${#1,1}█${#8,8}███${#1,1}██${#6,6}████████████████████████${#1,1}██${#8,8}████${#1,1}█${#11,11}█████
${#12,12}█████${#1,1}█${#8,8}███${#1,1}██${#6,6}████████████${#13,13}██████${#6,6}██████${#1,1}██${#8,8}████${#1,1}█${#12,12}█████
${#11,11}██████${#1,1}█${#8,8}███${#1,1}██${#6,6}█████████${#13,13}██████████${#6,6}███${#1,1}██${#8,8}████${#1,1}█${#11,11}██████
${#12,12}██████${#1,1}█${#8,8}████${#1,1}██${#6,6}██████${#13,13}█████████████${#6,6}██${#1,1}██${#8,8}████${#1,1}█${#12,12}██████
${#11,11}███████${#1,1}█${#8,8}████${#1,1}███${#6,6}███${#13,13}█████████████${#1,1}████${#8,8}████${#1,1}█${#11,11}███████
${#12,12}████████${#1,1}██${#8,8}████${#1,1}██████████████████${#8,8}█████${#1,1}██${#12,12}████████
${#11,11}██████████${#1,1}███${#8,8}████████████████████${#1,1}████${#11,11}██████████
${#12,12}█████████████${#1,1}████████████████████${#12,12}██████████████
▀▄ ▄▀
▄█▀███▀█▄
█▀███████▀█
▀ ▀▄▄ ▄▄▀ ▀
▄▄▄
▄█▀███▀█▄
▀█████████▀
▄▄▀▄▀▄▀▄▄
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment