b9fc657c88abe9c1f999ac63ab0656e83e812d35
[gnus] / lisp / compface.el
1 ;;; compface.el --- functions for converting X-Face headers
2 ;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
3
4 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
5 ;;      TAKAI Kousuke <tak@kmc.gr.jp>
6 ;; Keywords: news
7
8 ;; This file is part of GNU Emacs.
9
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; any later version.
14
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;; GNU General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;;; Commentary:
26
27 ;;; Code:
28
29 (defgroup compface nil
30   "X-Face image conversion."
31   :group 'extensions)
32
33 (defcustom uncompface-use-external (and (not noninteractive)
34                                         (executable-find "uncompface")
35                                         (executable-find "icontopbm")
36                                         t)
37   "*Non-nil means use the external `uncompface' and `icontopbm' programs.
38 If this variable is set to nil, use the internal Lisp-based function."
39   :type 'boolean
40   :group 'compface)
41
42 (defun uncompface (face)
43   "Convert FACE to pbm.
44 If `uncompface-use-external' is non-nil, it requires the external
45 programs `uncompface', and `icontopbm'.  On a GNU/Linux system these
46 might be in packages with names like `compface' or `faces-xface' and
47 `netpbm' or `libgr-progs', for instance."
48   (if uncompface-use-external
49       (with-temp-buffer
50         (insert face)
51         (and (eq 0 (apply 'call-process-region (point-min) (point-max)
52                           "uncompface"
53                           'delete '(t nil) nil))
54              (progn
55                (goto-char (point-min))
56                (insert "/* Width=48, Height=48 */\n")
57                ;; I just can't get "icontopbm" to work correctly on its
58                ;; own in XEmacs.  And Emacs doesn't understand un-raw pbm
59                ;; files.
60                (if (not (featurep 'xemacs))
61                    (eq 0 (call-process-region (point-min) (point-max)
62                                               "icontopbm"
63                                               'delete '(t nil)))
64                  (shell-command-on-region (point-min) (point-max)
65                                           "icontopbm | pnmnoraw"
66                                           (current-buffer) t)
67                  t))
68              (buffer-string)))
69     (uncompface-internal face)))
70
71 ;; The following section is a bug-for-bug compatible version of
72 ;; `uncompface' program entirely implemented in Emacs-Lisp.
73
74 (eval-when-compile
75   ;; The size of 48x48 is actually hard-coded into the code itself,
76   ;; so you cannot simply change those values.  So we hard-code
77   ;; them into the compiled code.
78   (defconst uncompface-width 48
79     "Width of X-Face bitmap image.")
80   (defconst uncompface-height 48
81     "Height of X-Face bitmap image.")
82
83   ;; Again, this is also hard-coded into the compiled code.
84   (defconst uncompface-guesses
85     (mapcar (lambda (x)
86               (mapcar (lambda (x)
87                         (let ((vector (make-vector (length x) nil))
88                               (i 0))
89                           (while x
90                             (or (zerop (car x))
91                                 (aset vector i t))
92                             (setq x (cdr x)
93                                   i (1+ i)))
94                           vector))
95                       x))
96             '((;; g_00
97                (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98                 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
99                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100                 1 1 1 0 0 0 1 1 1 1 0 1 1 1 1 1
101                 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 1
102                 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
103                 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1
104                 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1
105                 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
106                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107                 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
108                 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1
109                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
111                 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1
112                 0 1 0 0 0 1 0 1 0 0 1 0 1 1 1 1
113                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114                 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1
115                 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
116                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
117                 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
118                 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
119                 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1
120                 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
121                 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
122                 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1
123                 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
124                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
125                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
126                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
127                 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1
128                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
129                 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0
130                 0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1
131                 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1
132                 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0 1
133                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
134                 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1
135                 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
136                 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
137                 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
138                 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1
139                 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1
140                 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1
141                 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
142                 0 1 0 1 1 1 1 1 0 0 0 1 1 1 0 1
143                 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
144                 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1
145                 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1
146                 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1
147                 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1
148                 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1
149                 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
150                 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
151                 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
152                 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1
153                 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1
154                 1 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1
155                 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
156                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
157                 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1
158                 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 1
159                 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1
160                 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
161                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
162                 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
163                 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1
164                 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1
165                 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
166                 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
167                 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0
168                 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 1
169                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
170                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
171                 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1
172                 0 0 0 1 1 0 0 0 1 1 0 1 0 1 1 1
173                 1 0 0 1 0 1 0 0 0 1 1 1 0 0 0 1
174                 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
175                 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1
176                 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
177                 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
178                 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
179                 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1
180                 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1
181                 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1
182                 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
183                 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
184                 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1
185                 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1
186                 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
187                 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
188                 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
189                 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0
190                 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
191                 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
192                 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1
193                 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
194                 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1
195                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
196                 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
197                 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
198                 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
199                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
200                 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
201                 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1
202                 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1 1
203                 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
204                 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
205                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
206                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
207                 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1
208                 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1
209                 0 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1
210                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
211                 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
212                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
213                 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
214                 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1
215                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
216                 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1
217                 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1
218                 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
219                 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
220                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
221                 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
222                 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1
223                 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
224                 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
225                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
226                 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1
227                 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0
228                 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1
229                 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
230                 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
231                 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
232                 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
233                 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1
234                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
235                 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
236                 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
237                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
238                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
239                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
240                 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1
241                 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
242                 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
243                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
244                 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
245                 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
246                 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
247                 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
248                 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1
249                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
250                 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
251                 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
252                 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0
253                 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
254                 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
255                 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1
256                 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
257                 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
258                 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
259                 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1
260                 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1
261                 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 0
262                 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
263                 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
264                 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1
265                 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
266                 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1
267                 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1
268                 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1
269                 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 0
270                 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1
271                 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
272                 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
273                 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0
274                 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1
275                 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
276                 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1
277                 0 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1
278                 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1
279                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
280                 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
281                 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1
282                 1 1 0 1 1 0 0 0 0 1 0 1 1 1 1 1
283                 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1
284                 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1
285                 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1
286                 1 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1
287                 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
288                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
289                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
290                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
291                 0 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1
292                 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1
293                 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
294                 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1
295                 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 0
296                 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
297                 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
298                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
299                 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1
300                 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
301                 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
302                 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1
303                 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1
304                 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1
305                 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0
306                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
307                 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1
308                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
309                 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0
310                 0 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1
311                 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1
312                 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1
313                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
314                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
315                 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
316                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
317                 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0
318                 1 1 0 0 1 1 1 1 0 0 0 0 0 1 0 1
319                 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
320                 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1
321                 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
322                 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1
323                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
324                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
325                 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 1
326                 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1
327                 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
328                 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
329                 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
330                 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1
331                 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
332                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
333                 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0
334                 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1
335                 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1
336                 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
337                 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0
338                 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
339                 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
340                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
341                 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 0
342                 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1
343                 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
344                 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
345                 0 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1
346                 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
347                 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1
348                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
349                 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0
350                 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1
351                 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
352                 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
353                ;; g_10