summaryrefslogtreecommitdiffstats
path: root/urpm/parallel_ssh.pm
blob: 89f44d6794e82730ab002f4cdbe0c12fe9b7e485 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
package urpm::parallel_ssh;
use Time::HiRes qw(gettimeofday);

#- parallel copy
sub parallel_register_rpms {
    my ($parallel, $urpm, @files) = @_;

    foreach (keys %{$parallel->{nodes}}) {
	my $sources = join ' ', map { "'$_'" } @files;
	$urpm->{log}("parallel_ssh: scp $sources $_:$urpm->{cachedir}/rpms");
	system "scp $sources $_:$urpm->{cachedir}/rpms";
	$? == 0 or $urpm->{fatal}(1, urpm::N("scp failed on host %s (%d)", $_, $? >> 8));
    }

    #- keep trace of direct files.
    foreach (@files) {
	my $basename = (/^.*\/([^\/]*)$/ && $1) || $_;
	$parallel->{line} .= "'$urpm->{cachedir}/rpms/$basename' ";
    }
}

#- parallel find_packages_to_remove
sub parallel_find_remove {
    my ($parallel, $urpm, $state, $l, %options) = @_;
    my ($test, $node, %bad_nodes, %base_to_remove, %notfound);
    local (*F, $_);

    #- keep in mind if the previous selection is still active, it avoid
    #- to re-start urpme --test on each node.
    if ($options{find_packages_to_remove}) {
	delete $state->{rejected};
	delete $urpm->{error_remove};
	$test = '--test ';
    } else {
	@{$urpm->{error_remove} || []} and return @{$urpm->{error_remove}};
	#- no need to restart what has been started before.
	$options{test} and return keys %{$state->{rejected}};
	$test = '--force ';
    }

    #- now try an iteration of urpme.
    foreach my $node (keys %{$parallel->{nodes}}) {
        $urpm->{log}("parallel_ssh: ssh $node urpme --no-locales --auto $test".(join ' ', map { "'$_'" } @$l));
	open F, "ssh 2>&1 $node urpme --no-locales --auto $test".(join ' ', map { "'$_'" } @$l)." |"
	    or $urpm->{fatal}(1, "Can't fork ssh: $!\n");
	while (defined ($_ = <F>)) {
	    chomp;
	    /^\s*$/ and next;
	    /Checking to remove the following packages/ and next;
	    /To satisfy dependencies, the following packages are going to be removed/
	      and $urpm->{fatal}(1, ("node %s has bad version of urpme, please upgrade", $node));
	    if (/unknown packages?:? (.*)/) {
		#- keep in mind unknown package from the node, because it should not be a fatal error
		#- if other node have it.
		@notfound{split ", ", $1} = ();
	    } elsif (/The following packages contain ([^:]*): (.*)/) {
		$options{callback_fuzzy} and $options{callback_fuzzy}->($urpm, $1, split " ", $2)
		  or delete $state->{rejected}, last;
	    } elsif (/removing package (.*) will break your system/) {
		$base_to_remove{$1} = undef;
	    } elsif (/removing \S/) {
		#- this is log for newer urpme, so do not try to remove removing...
	    } elsif (/Removing failed/) {
		$bad_nodes{$node} = [];
	    } else {
		if (exists $bad_nodes{$node}) {
		    /^\s+(.*)/ and push @{$bad_nodes{$node}}, $1;
		} else {
		    s/\s*\(.*//; #- remove reason (too complex to handle and needed to be removed).
		    $state->{rejected}{$_}{removed} = 1;
		    $state->{rejected}{$_}{nodes}{$node} = undef;
		}
	    }
	}
	close F;
    }

    #- check base, which has been delayed until there.
    $options{callback_base} and %base_to_remove and $options{callback_base}->($urpm, keys %base_to_remove)
      || return ();

    #- build error list contains all the error returned by each node.
    $urpm->{error_remove} = [];
    foreach (keys %bad_nodes) {
	my $msg = urpm::N("on node %s", $_);
	foreach (@{$bad_nodes{$_}}) {
	    push @{$urpm->{error_remove}}, "$msg, $_";
	}
    }

    #- if at least one node has the package, it should be seen as unknown...
    delete @notfound{map { /^(.*)-[^-]*-[^-]*$/ } keys %{$state->{rejected}}};
    if (%notfound) {
	$options{callback_notfound} and $options{callback_notfound}->($urpm, keys %notfound)
	  or delete $state->{rejected};
    }

    keys %{$state->{rejected}};
}

#- parallel resolve_dependencies
sub parallel_resolve_dependencies {
    my ($parallel, $synthesis, $urpm, $state, $requested, %options) = @_;

    #- first propagate the synthesis file to all machine.
    foreach (keys %{$parallel->{nodes}}) {
        $urpm->{ui_msg}("parallel_ssh: scp -q '$synthesis' '$_:$synthesis'", urpm::N("Propagating synthesis to %s...", $_));
	system "scp -q '$synthesis' '$_:$synthesis'";
	$? == 0 or $urpm->{fatal}(1, urpm::N("scp failed on host %s (%d)", $_, $? >> 8));
    }
    $parallel->{synthesis} = $synthesis;

    #- compute command line of urpm? tools.
    my $line = $parallel->{line} . ($options{auto_select} ? ' --auto-select' : '') . ($options{keep} ? ' --keep' : '');
    foreach (keys %$requested) {
	if (/\|/) {
	    #- taken from URPM::Resolve to filter out choices, not complete though.
	    my $packages = $urpm->find_candidate_packages($_);
	    foreach (values %$packages) {
		my ($best_requested, $best);
		foreach (@$_) {
		    exists $state->{selected}{$_->id} and $best_requested = $_, last;
		    if ($best_requested) {
			if ($best_requested && $best_requested != $_) {
			    $_->compare_pkg($best_requested) > 0 and $best_requested = $_;
			} else {
			    $best_requested = $_;
			}
		    } elsif ($best && $best != $_) {
			$_->compare_pkg($best) > 0 and $best = $_;
		    } else {
			$best = $_;
		    }
		}
		$_ = $best_requested || $best;
	    }
	    #- simplified choices resolution.
	    my $choice = $options{callback_choices}->($urpm, undef, $state, [ values %$packages ]);
	    if ($choice) {
		$urpm->{source}{$choice->id} and next; #- local packages have already been added.
		$line .= ' '.$choice->fullname;
	    }
	} else {
	    my $pkg = $urpm->{depslist}[$_] or next;
	    $urpm->{source}{$pkg->id} and next; #- local packages have already been added.
	    $line .= ' '.$pkg->fullname;
	}
    }

    #- execute urpmq to determine packages to install.
    my ($node, $cont, %chosen);
    local (*F, $_);
    do {
	$cont = 0; #- prepare to stop iteration.
	#- the following state should be cleaned for each iteration.
	delete $state->{selected};
	#- now try an iteration of urpmq.
	foreach my $node (keys %{$parallel->{nodes}}) {
            $urpm->{ui_msg}("parallel_ssh: ssh $node urpmq --synthesis $synthesis -fduc $line ".join(' ', keys %chosen), urpm::N("Resolving dependencies on %s...", $node));
	    open F, "ssh $node urpmq --synthesis $synthesis -fduc $line ".join(' ', keys %chosen)." |"
		or $urpm->{fatal}(1, "Can't fork ssh: $!\n");
	    while (defined ($_ = <F>)) {
		chomp;
		if (my ($action, $what) = /^\@([^\@]*)\@(.*)/) {
		    if ($action eq 'removing') {
			$state->{rejected}{$what}{removed} = 1;
			$state->{rejected}{$what}{nodes}{$node} = undef;
		    }
		} elsif (/\|/) {
		    #- distant urpmq returned a choices, check if it has already been chosen
		    #- or continue iteration to make sure no more choices are left.
		    $cont ||= 1; #- invalid transitory state (still choices is strange here if next sentence is not executed).
		    unless (grep { exists $chosen{$_} } split '\|', $_) {
			my $choice = $options{callback_choices}->($urpm, undef, $state, [ map { $urpm->search($_) } split '\|', $_ ]);
			if ($choice) {
			    $chosen{scalar $choice->fullname} = $choice;
			    #- it has not yet been chosen so need to ask user.
			    $cont = 2;
			} else {
			    #- no choices resolved, so forget it (no choices means no choices at all).
			    $cont = 0;
			}
		    }
		} else {
		    my $pkg = $urpm->search($_) or next; #TODO
		    $state->{selected}{$pkg->id}{$node} = $_;
		}
	    }
	    close F or $urpm->{fatal}(1, urpm::N("host %s does not have a good version of urpmi (%d)", $node, $? >> 8));
	}
	#- check for internal error of resolution.
	$cont == 1 and die "internal distant urpmq error on choice not taken";
    } while ($cont);

    #- keep trace of what has been chosen finally (if any).
    $parallel->{line} = "$line ".join(' ', keys %chosen);
}

#- parallel install.
sub parallel_install {
    my ($parallel, $urpm, $remove, $install, $upgrade, %options) = @_;

    foreach (keys %{$parallel->{nodes}}) {
	my $sources = join ' ', map { "'$_'" } values %$install, values %$upgrade;
        $urpm->{ui_msg}("parallel_ssh: scp $sources $_:$urpm->{cachedir}/rpms", urpm::N("Distributing files to %s...", $_));
	system "scp $sources $_:$urpm->{cachedir}/rpms";
	$? == 0 or $urpm->{fatal}(1, urpm::N("scp failed on host %s (%d)", $_, $? >> 8));
    }

    my %bad_nodes;
    foreach my $node (keys %{$parallel->{nodes}}) {
	local (*F, $_);
        $urpm->{ui_msg}("parallel_ssh: ssh $node urpmi --pre-clean --no-locales --test --no-verify-rpm --auto --synthesis $parallel->{synthesis} $parallel->{line}", urpm::N("Verifying if install is possible on %s...", $node));
	open F, "ssh $node urpmi --pre-clean --no-locales --test --no-verify-rpm --auto --synthesis $parallel->{synthesis} $parallel->{line} |"
	    or $urpm->{fatal}(1, "Can't fork ssh: $!\n");
	while ($_ = <F>) {
	    $bad_nodes{$node} .= $_;
	    /Installation failed/ and $bad_nodes{$node} = '';
	    /Installation is possible/ and delete $bad_nodes{$node}, last;
	}
	close F;
    }
    foreach (keys %{$parallel->{nodes}}) {
	exists $bad_nodes{$_} or next;
	$urpm->{error}(urpm::N("Installation failed on node %s", $_) . ":\n" . $bad_nodes{$_});
    }
    %bad_nodes and return;

    if ($options{test}) {
	$urpm->{error}(urpm::N("Installation is possible"));
	1;
    } else {
	my $line = $parallel->{line} . ($options{excludepath} ? " --excludepath $options{excludepath}" : "");
	#- continue installation on each nodes.
	foreach my $node (keys %{$parallel->{nodes}}) {
            $urpm->{ui_msg}("parallel_ssh: ssh $node urpmi --no-locales --no-verify-rpm --auto --synthesis $parallel->{synthesis} $line", urpm::N("Performing install on %s...", $node));
            $urpm->{ui}{progress}->(0) if ref $urpm->{ui}{progress};
	    open F, "ssh $node urpmi --no-locales --no-verify-rpm --auto --synthesis $parallel->{synthesis} $line |"
		or $urpm->{fatal}(1, "Can't fork ssh: $!\n");
            local $/ = \1;
            my $log;
            my $last_time;
            while ($_ = <F>) {
                print;
                $log .= $_;
                /\n/ and $log = '';
                if (my ($msg, $progress) = $log =~ /^\s*(\S+)\s+(#+)/) {
                    if ($urpm->{ui} && (gettimeofday() - $last_time > 0.15 || length($progress) == 50)) {
                        $urpm->{ui}{msg}->($msg =~ /\d+:(\S+)/ ? urpm::N("Installing %s on %s...", $1, $node)
                                                               : urpm::N("Preparing install on %s...", $node));
                        $urpm->{ui}{progress}->(length($progress)/50) if ref $urpm->{ui}{progress};
                        $last_time = gettimeofday();
                    }
                }
            }
            close F;
	}
    }
}


#- allow bootstrap from urpmi code directly (namespace is urpm).
package urpm;
sub handle_parallel_options {
    my ($urpm, $options) = @_;
    my ($id, @nodes) = split ':', $options;

    if ($id =~ /^ssh(?:\(([^\)]*)\))?$/) {
	my %nodes; @nodes{@nodes} = undef;

	return bless {
		      media   => $1,
		      nodes   => \%nodes,
		     }, "urpm::parallel_ssh";
    }

    return undef;
}

1;
0 1841 1842 1843 1844 1845 1846 1847
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/

namespace phpbb\captcha;

class gd
{
	var $width = 360;
	var $height = 96;

	/**
	* Create the image containing $code with a seed of $seed
	*/
	function execute($code, $seed)
	{
		global $config;

		mt_srand($seed);

		// Create image
		$img = imagecreatetruecolor($this->width, $this->height);

		// Generate colours
		$colour = new colour_manager($img, array(
			'random'	=> true,
			'min_value'	=> 60,
		), 'hsv');

		$scheme = $colour->colour_scheme('background', false);
		$scheme = $colour->mono_range($scheme, 10, false);
		shuffle($scheme);

		$bg_colours = array_splice($scheme, mt_rand(6, 12));

		// Generate code characters
		$characters = $sizes = $bounding_boxes = $noise = array();
		$width_avail = $this->width - 15;
		$code_len = strlen($code);
		$captcha_bitmaps = $this->captcha_bitmaps();

		for ($i = 0; $i < $code_len; ++$i)
		{
			$characters[$i] = new char_cube3d($captcha_bitmaps, $code[$i]);

			list($min, $max) = $characters[$i]->range();
			$sizes[$i] = mt_rand($min, $max);

			$box = $characters[$i]->dimensions($sizes[$i]);
			$width_avail -= ($box[2] - $box[0]);
			$bounding_boxes[$i] = $box;
		}

		// Redistribute leftover x-space
		$offset = array();
		for ($i = 0; $i < $code_len; ++$i)
		{
			$denom = ($code_len - $i);
			$denom = max(1.3, $denom);
			$offset[$i] = phpbb_mt_rand(0, (int) round((1.5 * $width_avail) / $denom));
			$width_avail -= $offset[$i];
		}

		if ($config['captcha_gd_x_grid'])
		{
			$grid = (int) $config['captcha_gd_x_grid'];
			for ($y = 0; $y < $this->height; $y += mt_rand($grid - 2, $grid + 2))
			{
				$current_colour = $scheme[array_rand($scheme)];
				imageline($img, mt_rand(0,4), mt_rand($y - 3, $y), mt_rand($this->width - 5, $this->width), mt_rand($y - 3, $y), $current_colour);
			}
		}

		if ($config['captcha_gd_y_grid'])
		{
			$grid = (int) $config['captcha_gd_y_grid'];
			for ($x = 0; $x < $this->width; $x += mt_rand($grid - 2, $grid + 2))
			{
				$current_colour = $scheme[array_rand($scheme)];
				imagedashedline($img, mt_rand($x -3, $x + 3), mt_rand(0, 4), mt_rand($x -3, $x + 3), mt_rand($this->height - 5, $this->height), $current_colour);
			}
		}

		if ($config['captcha_gd_wave'] && ($config['captcha_gd_y_grid'] || $config['captcha_gd_y_grid']))
		{
			$this->wave($img);
		}

		if ($config['captcha_gd_3d_noise'])
		{
			$xoffset = mt_rand(0,9);
			$noise_bitmaps = $this->captcha_noise_bg_bitmaps();
			for ($i = 0; $i < $code_len; ++$i)
			{
				$noise[$i] = new char_cube3d($noise_bitmaps, mt_rand(1, sizeof($noise_bitmaps['data'])));

				list($min, $max) = $noise[$i]->range();
				//$box = $noise[$i]->dimensions($sizes[$i]);
			}
			$xoffset = 0;
			for ($i = 0; $i < $code_len; ++$i)
			{
				$dimm = $bounding_boxes[$i];
				$xoffset += ($offset[$i] - $dimm[0]);
				$yoffset = mt_rand(-$dimm[1], $this->height - $dimm[3]);

				$noise[$i]->drawchar($sizes[$i], $xoffset, $yoffset, $img, $colour->get_resource('background'), $scheme);
				$xoffset += $dimm[2];
			}
		}

		$xoffset = 5;
		for ($i = 0; $i < $code_len; ++$i)
		{
			$dimm = $bounding_boxes[$i];
			$xoffset += ($offset[$i] - $dimm[0]);
			$yoffset = mt_rand(-$dimm[1], $this->height - $dimm[3]);

			$characters[$i]->drawchar($sizes[$i], $xoffset, $yoffset, $img, $colour->get_resource('background'), $scheme);
			$xoffset += $dimm[2];
		}

		if ($config['captcha_gd_wave'])
		{
			$this->wave($img);
		}

		if ($config['captcha_gd_foreground_noise'])
		{
			$this->noise_line($img, 0, 0, $this->width, $this->height, $colour->get_resource('background'), $scheme, $bg_colours);
		}

		// Send image
		header('Content-Type: image/png');
		header('Cache-control: no-cache, no-store');
		imagepng($img);
		imagedestroy($img);
	}

	/**
	* Sinus
	*/
	function wave($img)
	{
		global $config;

		$period_x = mt_rand(12,18);
		$period_y = mt_rand(7,14);
		$amp_x = mt_rand(5,10);
		$amp_y = mt_rand(2,4);
		$socket = mt_rand(0,100);

		$dampen_x = mt_rand($this->width/5, $this->width/2);
		$dampen_y = mt_rand($this->height/5, $this->height/2);
		$direction_x = (mt_rand (0, 1));
		$direction_y = (mt_rand (0, 1));

		for ($i = 0; $i < $this->width; $i++)
		{
			$dir = ($direction_x) ? $i : ($this->width - $i);
			imagecopy($img, $img, $i-1, sin($socket+ $i/($period_x + $dir/$dampen_x)) * $amp_x, $i, 0, 1, $this->height);
		}
		$socket = mt_rand(0,100);
		for ($i = 0; $i < $this->height; $i++)
		{
			$dir = ($direction_y) ? $i : ($this->height - $i);
			imagecopy($img, $img ,sin($socket + $i/($period_y + ($dir)/$dampen_y)) * $amp_y, $i-1, 0, $i, $this->width, 1);
		}
		return $img;
	}

	/**
	* Noise line
	*/
	function noise_line($img, $min_x, $min_y, $max_x, $max_y, $bg, $font, $non_font)
	{
		imagesetthickness($img, 2);

		$x1 = $min_x;
		$x2 = $max_x;
		$y1 = $min_y;
		$y2 = $min_y;

		do
		{
			$line = array_merge(
				array_fill(0, mt_rand(30, 60), $non_font[array_rand($non_font)]),
				array_fill(0, mt_rand(30, 60), $bg)
			);

			imagesetstyle($img, $line);
			imageline($img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED);

			$y1 += mt_rand(12, 35);
			$y2 += mt_rand(12, 35);
		}
		while ($y1 < $max_y && $y2 < $max_y);

		$x1 = $min_x;
		$x2 = $min_x;
		$y1 = $min_y;
		$y2 = $max_y;

		do
		{
			$line = array_merge(
				array_fill(0, mt_rand(30, 60), $non_font[array_rand($non_font)]),
				array_fill(0, mt_rand(30, 60), $bg)
			);

			imagesetstyle($img, $line);
			imageline($img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED);

			$x1 += mt_rand(20, 35);
			$x2 += mt_rand(20, 35);
		}
		while ($x1 < $max_x && $x2 < $max_x);
		imagesetthickness($img, 1);
	}

	function captcha_noise_bg_bitmaps()
	{
		return array(
			'width'		=> 15,
			'height'	=> 5,
			'data'		=> array(

			1 => array(
				array(1,0,0,0,1,0,0,0,0,0,0,0,0,0,0),
				array(1,0,0,0,0,1,0,0,0,0,0,0,0,0,0),
				array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(1,0,0,0,0,1,0,0,0,0,0,0,1,0,0),
				array(1,0,0,0,0,0,1,0,0,0,0,1,0,0,0),
			),
			2 => array(
				array(1,1,mt_rand(0,1),1,0,1,1,1,1,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,0,0,1,1,0,1,1,1),
			),
			3 => array(
				array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
				array(1,0,0,0,0,0,0,0,0,0,0,0,0,1,0),
				array(0,0,0,0,1,0,0,0,0,0,0,0,0,0,1),
				array(1,0,0,0,0,0,0,0,0,0,0,0,0,1,0),
				array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
			),
			4 => array(
				array(1,0,1,0,1,0,0,1,1,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(1,0,1,0,0,0,0,0,0,0,0,0,0,0,0),
			),
			5 => array(
				array(1,1,1,1,0,0,0,1,1,1,0,0,1,0,1),
				array(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(1,0,1,0,0,0,0,0,0,0,0,0,0,0,0),
			),
			6 => array(
				array(mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),0,mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),mt_rand(0,1),0,mt_rand(0,1),mt_rand(0,1),mt_rand(0,1)),
				array(0,0,0,0,0,0,0,mt_rand(0,1),0,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(mt_rand(0,1),0,mt_rand(0,1),0,0,0,0,0,0,0,0,0,0,0,0),
			),
			7 => array(
				array(0,0,0,0,0,0,0,0,0,0,1,1,0,1,1),
				array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
				array(0,0,1,1,0,0,0,1,0,0,0,0,0,0,0),
				array(0,1,0,0,0,1,0,0,0,0,0,0,0,0,0),
				array(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
			),
		));
	}

	/**
	* Return bitmaps
	*/
	function captcha_bitmaps()
	{
		global $config;

		$chars = array(
			'A'	=>	array(
						array(
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,1,0,1,0,0,0),
							array(0,0,0,1,0,1,0,0,0),
							array(0,0,0,1,0,1,0,0,0),
							array(0,0,1,0,0,0,1,0,0),
							array(0,0,1,0,0,0,1,0,0),
							array(0,0,1,0,0,0,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,1,1,1,1,1,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,1,0,1,0,0,0),
							array(0,0,1,1,0,1,1,0,0),
							array(0,0,1,0,0,0,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,1,1,1,1,1,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,1,0,0,0,1,1,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,1,1,1,1,1,0,0),
							array(0,1,1,0,0,0,1,1,0),
							array(1,1,0,0,0,0,0,1,1),
							array(1,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,1,1),
							array(0,0,0,0,0,1,1,1,1),
							array(0,0,0,1,1,1,0,0,1),
							array(0,1,1,1,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,1,0,0,0,0,1,1,1),
							array(0,1,1,1,1,1,1,0,1),
						),
					),
		'B'	=>		array(
						array(
							array(1,1,1,1,1,1,1,0,0),
							array(1,0,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,1,0),
							array(1,1,1,1,1,1,1,0,0),
							array(1,0,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,1,0),
							array(1,1,1,1,1,1,1,0,0),
						),
						array(
							array(1,1,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,1,1,1,1,1,0,0),
						),
						array(
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,1,1,1,1,1,0,0),
						),
					),
		'C'	=>		array(
						array(
							array(0,0,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,0,1,1,1,1,1,0,0),
						),
						array(
							array(0,0,1,1,1,1,1,0,1),
							array(0,1,0,0,0,0,0,1,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,1),
							array(0,0,1,1,1,1,1,0,1),
						),
					),
		'D'	=>		array(
						array(
							array(1,1,1,1,1,1,1,0,0),
							array(1,0,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,1,0),
							array(1,1,1,1,1,1,1,0,0),
						),
						array(
							array(1,1,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,1,1,1,1,1,0,0),
						),
						array(
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,1,1,1,1,1,0,1),
							array(0,1,1,0,0,0,1,1,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,1,0,0,0,1,1,1),
							array(0,0,1,1,1,1,1,0,1),
						),
					),
		'E'	=>		array(
						array(
							array(1,1,1,1,1,1,1,1,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,1,1,1,1,1,1,1,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,1,1,1,1,1,1,1,1),
						),
						array(
							array(1,1,1,1,1,1,1,1,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,1,1,1,1,1,1,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,1,1,1,1,1,1,1,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,1,1,1,1,1,0,0),
							array(0,1,1,0,0,0,1,1,0),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,1,1,1,1,1,1,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,1,0,0,0,0,0,1,1),
							array(0,1,1,1,1,1,1,1,0),
						),
					),
		'F'	=>		array(
						array(
							array(1,1,1,1,1,1,1,1,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,1,1,1,1,1,1,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
						),
						array(
							array(0,1,1,1,1,1,1,1,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(1,1,1,0,0,0,0,0,0),
						),
						array(
							array(0,0,0,1,1,0,0,0,0),
							array(0,0,1,1,0,0,0,0,0),
							array(0,1,1,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(1,1,1,1,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
						),
					),
		'G'	=>		array(
						array(
							array(0,0,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,1,1,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,0,1,1,1,1,1,0,0),
						),
						array(
							array(0,0,1,1,1,1,1,0,1),
							array(0,1,0,0,0,0,0,1,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,1,1,1,1,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,1),
							array(0,0,1,1,1,1,1,0,1),
						),
						array(
							array(0,0,1,1,1,1,1,0,1),
							array(0,1,1,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,1,1,0,0,0,0,0,1),
							array(0,0,1,1,1,1,1,1,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,1,1),
							array(1,1,1,1,1,1,1,1,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
						),
					),
		'H'	=>		array(
						array(
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,1,1,1,1,1,1,1,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
						),
						array(
							array(1,1,1,0,0,0,1,1,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,1,1,1,1,1,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,1,0,0,0,1,1,1),
						),
						array(
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,1,1,1,0,0,0),
							array(1,1,1,1,0,1,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
						),
					),
		'I'	=>		array(
						array(
							array(1,1,1,1,1,1,1,1,1),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(1,1,1,1,1,1,1,1,1),
						),
						array(
							array(0,0,0,1,1,1,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,1,1,1,0,0,0),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,1,1,1,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,1,1,1,0,0,0),
						),
					),
		'J'	=>		array(
						array(
							array(1,1,1,1,1,1,1,1,1),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(0,1,0,0,1,0,0,0,0),
							array(0,0,1,1,0,0,0,0,0),
						),
						array(
							array(1,1,1,1,1,1,1,1,1),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(1,1,0,0,1,0,0,0,0),
							array(1,0,1,1,0,0,0,0,0),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(0,1,0,0,1,0,0,0,0),
							array(0,0,1,1,0,0,0,0,0),
						),
					),
		'K'	=>		array(
						array(    // New 'K', supplied by NeoThermic
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(1,0,0,0,1,0,0,0,0),
							array(1,0,0,1,0,0,0,0,0),
							array(1,0,1,0,0,0,0,0,0),
							array(1,1,0,0,0,0,0,0,0),
							array(1,0,1,0,0,0,0,0,0),
							array(1,0,0,1,0,0,0,0,0),
							array(1,0,0,0,1,0,0,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
						),
						array(
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,1,0,0),
							array(0,1,0,0,0,1,0,0,0),
							array(0,1,0,0,1,0,0,0,0),
							array(0,1,0,1,0,0,0,0,0),
							array(0,1,1,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,1,0,0,0,0,0,0),
							array(0,1,0,1,0,0,0,0,0),
							array(0,1,0,0,1,0,0,0,0),
							array(0,1,0,0,0,1,0,0,0),
							array(0,1,0,0,0,0,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,1,0,0,0,1,1,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,1,0,0,0),
							array(0,1,0,0,1,0,0,0,0),
							array(0,1,0,1,0,0,0,0,0),
							array(0,1,1,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,1,0,0,0,0,0,0),
							array(0,1,0,1,0,0,0,0,0),
							array(0,1,0,0,1,0,0,0,0),
							array(0,1,0,0,0,1,0,0,0),
							array(0,1,0,0,0,0,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
						),
					),
		'L'	=>		array(
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,1,1,1,1,1,1,1,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,1),
							array(1,1,1,1,1,1,1,1,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,1,0,0,0,0,0,0),
							array(0,0,1,1,1,0,0,0,0),
						),
					),
		'M'	=>		array(
						array(
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,0,1,0,0,0,1,0,1),
							array(1,0,1,0,0,0,1,0,1),
							array(1,0,1,0,0,0,1,0,1),
							array(1,0,0,1,0,1,0,0,1),
							array(1,0,0,1,0,1,0,0,1),
							array(1,0,0,1,0,1,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,1,0,0,0,1,1,0),
							array(0,1,1,0,0,0,1,1,0),
							array(0,1,1,0,0,0,1,1,0),
							array(0,1,0,1,0,1,0,1,0),
							array(0,1,0,1,0,1,0,1,0),
							array(0,1,0,1,0,1,0,1,0),
							array(0,1,0,0,1,0,0,1,0),
							array(0,1,0,0,1,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,1,0,0,0,1,1,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,1,1,1,0,1,1,1,0),
							array(1,1,0,1,1,1,0,1,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
						),
					),
		'N'	=>		array(
						array(
							array(1,1,0,0,0,0,0,0,1),
							array(1,1,0,0,0,0,0,0,1),
							array(1,0,1,0,0,0,0,0,1),
							array(1,0,1,0,0,0,0,0,1),
							array(1,0,0,1,0,0,0,0,1),
							array(1,0,0,1,0,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,0,0,0,0,1,0,0,1),
							array(1,0,0,0,0,1,0,0,1),
							array(1,0,0,0,0,0,1,0,1),
							array(1,0,0,0,0,0,1,0,1),
							array(1,0,0,0,0,0,0,1,1),
							array(1,0,0,0,0,0,0,1,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,1,0,0,0,0,1,0),
							array(0,1,1,0,0,0,0,1,0),
							array(0,1,1,0,0,0,0,1,0),
							array(0,1,0,1,0,0,0,1,0),
							array(0,1,0,1,0,0,0,1,0),
							array(0,1,0,1,0,0,0,1,0),
							array(0,1,0,0,1,0,0,1,0),
							array(0,1,0,0,1,1,0,1,0),
							array(0,1,0,0,0,1,0,1,0),
							array(0,1,0,0,0,1,1,1,0),
							array(0,1,0,0,0,0,1,1,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,1,0,0,0,1,1,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(1,0,1,1,1,1,0,0,0),
							array(1,1,1,0,0,1,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
						),
					),
		'O'	=>		array(
						array(
							array(0,0,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,0,1,1,1,1,1,0,0),
						),
						array(
							array(0,0,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(1,1,0,0,0,0,0,1,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,0,1,1,1,1,1,0,0),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,1,1,1,1,1,0,0,0),
							array(1,1,1,0,0,1,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,1,0,0,0,1,1,0,0),
							array(0,1,1,1,1,1,0,0,0),
						),
					),
		'P'	=>		array(
						array(
							array(1,1,1,1,1,1,1,0,0),
							array(1,0,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,1,0),
							array(1,1,1,1,1,1,1,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
						),
						array(
							array(1,1,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(1,1,1,0,0,0,0,0,0),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,1,1,0,0,0,0,0),
							array(1,1,0,1,1,0,0,0,0),
							array(1,0,0,0,1,0,0,0,0),
							array(1,0,0,0,1,0,0,0,0),
							array(1,0,0,1,1,0,0,0,0),
							array(1,1,1,1,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
						),
					),
		'Q'	=>		array(
						array(
							array(0,0,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,1,0,0,1),
							array(1,0,0,0,0,0,1,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,0,1,1,1,1,1,0,1),
						),
						array(
							array(0,0,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,1,0,0,0,1),
							array(1,1,0,0,1,1,0,1,1),
							array(0,1,1,1,1,1,1,1,0),
							array(0,0,0,0,0,0,1,1,0),
							array(0,0,0,0,0,0,0,1,1),
							array(0,0,0,0,0,0,0,0,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,1,1,1,1),
							array(0,0,0,0,1,1,0,0,1),
							array(0,0,0,0,1,0,0,0,1),
							array(0,0,0,0,1,0,0,0,1),
							array(0,0,0,0,1,1,0,1,1),
							array(0,0,0,0,0,1,1,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
						),
					),
		'R'	=>		array(
						array(
							array(1,1,1,1,1,1,1,0,0),
							array(1,0,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,1,0),
							array(1,1,1,1,1,1,1,0,0),
							array(1,1,1,0,0,0,0,0,0),
							array(1,0,0,1,0,0,0,0,0),
							array(1,0,0,0,1,0,0,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(1,0,0,0,0,0,1,0,0),
							array(1,0,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
						),
						array(
							array(1,1,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(1,1,1,1,1,1,1,0,0),
							array(0,1,1,0,0,0,0,0,0),
							array(0,1,1,1,0,0,0,0,0),
							array(0,1,0,1,1,0,0,0,0),
							array(0,1,0,0,1,1,0,0,0),
							array(0,1,0,0,0,1,1,0,0),
							array(0,1,0,0,0,0,1,1,0),
							array(1,1,1,0,0,0,1,1,1),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,1,1,1,1,0,0,0,0),
							array(1,1,0,0,1,1,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
						),
					),
		'S'	=>		array(
						array(
							array(0,0,1,1,1,1,1,0,0),
							array(0,1,0,0,0,0,0,1,0),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,0,1,1,1,1,1,0,0),
							array(0,0,0,0,0,0,0,1,0),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(0,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(0,1,0,0,0,0,0,1,0),
							array(0,0,1,1,1,1,1,0,0),
						),
						array(
							array(0,0,1,1,1,1,1,0,1),
							array(0,1,0,0,0,0,0,1,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(0,1,0,0,0,0,0,0,0),
							array(0,0,1,1,1,1,1,0,0),
							array(0,0,0,0,0,0,0,1,0),
							array(0,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,0,0,0,0,0,0,0,1),
							array(1,1,0,0,0,0,0,1,0),
							array(1,0,1,1,1,1,1,0,0),
						),
						array(
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,0,0,0,0,0,0,0,0),
							array(0,1,1,1,1,0,0,0,0),
							array(1,0,0,0,0,1,0,0,0),
							array(1,0,0,0,0,0,0,0,0),
							array(1,1,0,0,0,0,0,0,0),
							array(0,1,1,1,1,0,0,0,0),
							array(0,0,0,0,0,1,0,0,0),
							array(1,0,0,0,1,1,0,0,0),
							array(0,1,1,1,1,0,0,0,0),
						),
					),
		'T'	=>		array(
						array(
							array(1,1,1,1,1,1,1,1,1),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),
							array(0,0,0,0,1,0,0,0,0),