diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2013, Omari Norman
+Copyright (c) 2013-2019 Omari Norman
 
 All rights reserved.
 
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,20 @@
+# rainbow
+
+rainbow helps you build colorful output for both 8- and 256-color
+terminals.  It works only on Unix-like operating systems.  For more
+information, please see the documentation in the main Rainbow
+module.
+
+rainbow is on Github:
+
+http://www.github.com/massysett/rainbow
+
+and Hackage:
+
+http://hackage.haskell.org/package/rainbow
+
+and Stackage:
+
+https://www.stackage.org/package/rainbow
+
+rainbow is licensed under the BSD license; see the LICENSE file.
diff --git a/System/Console/Rainbow.hs b/System/Console/Rainbow.hs
deleted file mode 100644
--- a/System/Console/Rainbow.hs
+++ /dev/null
@@ -1,3511 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
--- | Handles colors and special effects for text. Internally this
--- module uses the Haskell terminfo library, which links against the
--- UNIX library of the same name, so it should work with a wide
--- variety of UNIX terminals.
---
--- The building block of Rainbow is the 'Chunk'. Each 'Chunk' comes with
--- a 'TextSpec', which specifies how the text should look on 8-color
--- and on 256-color terminals. The 'Chunk' is a full specification; that
--- is, although 'Chunk's are typically printed one after the other, the
--- appearance of one 'Chunk' does not affect the appearance of the next
--- 'Chunk'.
---
--- You have full freedom to specify different attributes and colors
--- for 8 and 256 color terminals; for instance, you can have text
--- appear red on an 8-color terminal but blue on a 256-color terminal.
---
--- A 'Chunk' is a 'Monoid', so you can combine them using the usual
--- monoid functions, including '<>'. You can create a 'Chunk' with
--- text using 'fromString', but this library is much more usable if
--- you enable the OverloadedStrings GHC extension:
---
--- > {-# LANGUAGE OverloadedStrings #-}
---
--- and all future examples assume you have enabled OverloadedStrings.
---
--- Here are some basic examples:
---
--- > putChunkLn $ "Some blue text" <> f_blue
--- > putChunkLn $ "Blue on red background" <> f_blue <> b_red
--- > putChunkLn $ "Blue on red, foreground bold" <> f_blue <> b_red <> bold
---
--- But what makes Rainbow a little more interesting is that you can
--- also specify output for 256-color terminals. To use these examples,
--- be sure your TERM environment variable is set to something that
--- supports 256 colors (like @xterm-256color@) before you start GHCi:
---
--- > putChunkLn $ "Blue on 8-color terminal, red on 256-color terminal"
--- >            <> c8_f_blue <> c256_f_red
---
--- If 'mappend' multiple chunks that change the same property, the
--- rightmost one \"wins\":
---
--- > putChunkLn $ "This will be blue" <> f_red <> f_blue
---
--- This property comes in handy if you want to specify a default color
--- for 8- and 256-color terminals, then a more specific shade for a
--- 256-color terminal:
---
--- > putChunkLn $ "Pink" <> f_red <> c256_f_201
---
--- However, if you use 'mappend' to add additional 'Chunk's that have
--- text, the text will be appended:
---
--- > putChunkLn $ f_green <> "You will see this text "
--- >              <> "and this text too, but it will all be blue"
--- >              <> f_blue
---
--- Although one chunk can have different colors on 8- and 256-color
--- terminals, it cannot have different colors on the same
--- terminal. That is, if you want to print some text in one color and
--- some text in another color, make two chunks.
-
-module System.Console.Rainbow (
-
-  -- * Terminal definitions
-    Term(..)
-  , termFromEnv
-  , smartTermFromEnv
-
-  -- * Chunks
-  , Chunk(..)
-
-  -- * Printing chunks
-  , putChunks
-  , hPutChunks
-
-  -- ** Printing one chunk at a time
-
-  -- | These functions make it easy to print one chunk at a time. Each
-  -- function initializes the terminal once for each chunk, unlike the
-  -- list-oriented functions, which only initialize the terminal
-  -- once. (Initialization does not clear the screen; rather, it is a
-  -- process that the terminfo library requires.) Thus there might be
-  -- a performance penalty for using these functions to print large
-  -- numbers of chunks. Or, there might not be--I have not benchmarked
-  -- them.
-  --
-  -- These functions use the default terminal, obtained using
-  -- 'termFromEnv'.
-  , putChunk
-  , putChunkLn
-  , hPutChunk
-  , hPutChunkLn
-
-  -- * Effects for both 8 and 256 color terminals
-
-  -- | These 'Chunk's affect both 8 and 256 color terminals:
-  --
-  -- > putChunkLn $ "bold on 8 and 256 color terminals" <> bold
-  --
-  -- There are also 'Chunk's to turn an effect off, such as
-  -- 'boldOff'. Ordinarily you will not need these because each chunk
-  -- starts with no effects, so you only need to turn on the effects
-  -- you want. However the @off@ 'Chunk's are here if you need them.
-
-  , bold, boldOff
-  , underline, underlineOff
-  , flash, flashOff
-  , inverse, inverseOff
-
-  -- * Effects for 8-color terminals only
-
-  -- | These 'Chunk's affect 8-color terminals only.
-  --
-  -- > putChunkLn $ "Bold on 8 color terminal only" <> bold8
-
-  , bold8, bold8off
-  , underline8, underline8off
-  , flash8, flash8off
-  , inverse8, inverse8off
-
-  -- * Effects for 256-color terminals only
-
-  -- | These 'Chunk's affect 256-color terminals only.
-  --
-  -- > putChunkLn $ "Underlined on 256-color terminal, "
-  -- >              <> "bold on 8-color terminal"
-  -- >              <> underlined256 <> bold8
-
-  , bold256, bold256off
-  , underline256, underline256off
-  , flash256, flash256off
-  , inverse256, inverse256off
-
-  -- * Colors for both 8 and 256 color terminals
-
-  -- | These 'Chunk's affect both 8 and 256 color
-  -- terminals.
-  --
-  -- > putChunkLn $ "Red on blue" <> f_red <> b_blue
-
-  -- ** Foreground colors
-
-  , f_default
-  , f_black
-  , f_red
-  , f_green
-  , f_yellow
-  , f_blue
-  , f_magenta
-  , f_cyan
-  , f_white
-
-  -- ** Background colors
-
-  , b_default
-  , b_black
-  , b_red
-  , b_green
-  , b_yellow
-  , b_blue
-  , b_magenta
-  , b_cyan
-  , b_white
-
-   -- * Specific colors
-   -- ** 8 color foreground colors
-  , c8_f_default
-  , c8_f_black
-  , c8_f_red
-  , c8_f_green
-  , c8_f_yellow
-  , c8_f_blue
-  , c8_f_magenta
-  , c8_f_cyan
-  , c8_f_white
-
-   -- ** 8 color background colors
-  , c8_b_default
-  , c8_b_black
-  , c8_b_red
-  , c8_b_green
-  , c8_b_yellow
-  , c8_b_blue
-  , c8_b_magenta
-  , c8_b_cyan
-  , c8_b_white
-
-   -- ** 256 color foreground colors
-
-   -- | The color names assume a palette similar to the default one
-   -- that xterm uses.
-  , c256_f_default
-  , c256_f_0
-  , c256_f_black
-  , c256_f_1
-  , c256_f_red
-  , c256_f_2
-  , c256_f_green
-  , c256_f_3
-  , c256_f_yellow
-  , c256_f_4
-  , c256_f_blue
-  , c256_f_5
-  , c256_f_magenta
-  , c256_f_6
-  , c256_f_cyan
-  , c256_f_7
-  , c256_f_white
-  , c256_f_8
-  , c256_f_grey
-  , c256_f_9
-  , c256_f_red_bright
-  , c256_f_10
-  , c256_f_green_bright
-  , c256_f_11
-  , c256_f_yellow_bright
-  , c256_f_12
-  , c256_f_blue_bright
-  , c256_f_13
-  , c256_f_magenta_bright
-  , c256_f_14
-  , c256_f_cyan_bright
-  , c256_f_15
-  , c256_f_white_bright
-  , c256_f_16
-  , c256_f_17
-  , c256_f_18
-  , c256_f_19
-  , c256_f_20
-  , c256_f_21
-  , c256_f_22
-  , c256_f_23
-  , c256_f_24
-  , c256_f_25
-  , c256_f_26
-  , c256_f_27
-  , c256_f_28
-  , c256_f_29
-  , c256_f_30
-  , c256_f_31
-  , c256_f_32
-  , c256_f_33
-  , c256_f_34
-  , c256_f_35
-  , c256_f_36
-  , c256_f_37
-  , c256_f_38
-  , c256_f_39
-  , c256_f_40
-  , c256_f_41
-  , c256_f_42
-  , c256_f_43
-  , c256_f_44
-  , c256_f_45
-  , c256_f_46
-  , c256_f_47
-  , c256_f_48
-  , c256_f_49
-  , c256_f_50
-  , c256_f_51
-  , c256_f_52
-  , c256_f_53
-  , c256_f_54
-  , c256_f_55
-  , c256_f_56
-  , c256_f_57
-  , c256_f_58
-  , c256_f_59
-  , c256_f_60
-  , c256_f_61
-  , c256_f_62
-  , c256_f_63
-  , c256_f_64
-  , c256_f_65
-  , c256_f_66
-  , c256_f_67
-  , c256_f_68
-  , c256_f_69
-  , c256_f_70
-  , c256_f_71
-  , c256_f_72
-  , c256_f_73
-  , c256_f_74
-  , c256_f_75
-  , c256_f_76
-  , c256_f_77
-  , c256_f_78
-  , c256_f_79
-  , c256_f_80
-  , c256_f_81
-  , c256_f_82
-  , c256_f_83
-  , c256_f_84
-  , c256_f_85
-  , c256_f_86
-  , c256_f_87
-  , c256_f_88
-  , c256_f_89
-  , c256_f_90
-  , c256_f_91
-  , c256_f_92
-  , c256_f_93
-  , c256_f_94
-  , c256_f_95
-  , c256_f_96
-  , c256_f_97
-  , c256_f_98
-  , c256_f_99
-  , c256_f_100
-  , c256_f_101
-  , c256_f_102
-  , c256_f_103
-  , c256_f_104
-  , c256_f_105
-  , c256_f_106
-  , c256_f_107
-  , c256_f_108
-  , c256_f_109
-  , c256_f_110
-  , c256_f_111
-  , c256_f_112
-  , c256_f_113
-  , c256_f_114
-  , c256_f_115
-  , c256_f_116
-  , c256_f_117
-  , c256_f_118
-  , c256_f_119
-  , c256_f_120
-  , c256_f_121
-  , c256_f_122
-  , c256_f_123
-  , c256_f_124
-  , c256_f_125
-  , c256_f_126
-  , c256_f_127
-  , c256_f_128
-  , c256_f_129
-  , c256_f_130
-  , c256_f_131
-  , c256_f_132
-  , c256_f_133
-  , c256_f_134
-  , c256_f_135
-  , c256_f_136
-  , c256_f_137
-  , c256_f_138
-  , c256_f_139
-  , c256_f_140
-  , c256_f_141
-  , c256_f_142
-  , c256_f_143
-  , c256_f_144
-  , c256_f_145
-  , c256_f_146
-  , c256_f_147
-  , c256_f_148
-  , c256_f_149
-  , c256_f_150
-  , c256_f_151
-  , c256_f_152
-  , c256_f_153
-  , c256_f_154
-  , c256_f_155
-  , c256_f_156
-  , c256_f_157
-  , c256_f_158
-  , c256_f_159
-  , c256_f_160
-  , c256_f_161
-  , c256_f_162
-  , c256_f_163
-  , c256_f_164
-  , c256_f_165
-  , c256_f_166
-  , c256_f_167
-  , c256_f_168
-  , c256_f_169
-  , c256_f_170
-  , c256_f_171
-  , c256_f_172
-  , c256_f_173
-  , c256_f_174
-  , c256_f_175
-  , c256_f_176
-  , c256_f_177
-  , c256_f_178
-  , c256_f_179
-  , c256_f_180
-  , c256_f_181
-  , c256_f_182
-  , c256_f_183
-  , c256_f_184
-  , c256_f_185
-  , c256_f_186
-  , c256_f_187
-  , c256_f_188
-  , c256_f_189
-  , c256_f_190
-  , c256_f_191
-  , c256_f_192
-  , c256_f_193
-  , c256_f_194
-  , c256_f_195
-  , c256_f_196
-  , c256_f_197
-  , c256_f_198
-  , c256_f_199
-  , c256_f_200
-  , c256_f_201
-  , c256_f_202
-  , c256_f_203
-  , c256_f_204
-  , c256_f_205
-  , c256_f_206
-  , c256_f_207
-  , c256_f_208
-  , c256_f_209
-  , c256_f_210
-  , c256_f_211
-  , c256_f_212
-  , c256_f_213
-  , c256_f_214
-  , c256_f_215
-  , c256_f_216
-  , c256_f_217
-  , c256_f_218
-  , c256_f_219
-  , c256_f_220
-  , c256_f_221
-  , c256_f_222
-  , c256_f_223
-  , c256_f_224
-  , c256_f_225
-  , c256_f_226
-  , c256_f_227
-  , c256_f_228
-  , c256_f_229
-  , c256_f_230
-  , c256_f_231
-  , c256_f_232
-  , c256_f_233
-  , c256_f_234
-  , c256_f_235
-  , c256_f_236
-  , c256_f_237
-  , c256_f_238
-  , c256_f_239
-  , c256_f_240
-  , c256_f_241
-  , c256_f_242
-  , c256_f_243
-  , c256_f_244
-  , c256_f_245
-  , c256_f_246
-  , c256_f_247
-  , c256_f_248
-  , c256_f_249
-  , c256_f_250
-  , c256_f_251
-  , c256_f_252
-  , c256_f_253
-  , c256_f_254
-  , c256_f_255
-
-  -- ** 256 color background colors
-
-   -- | The color names assume a palette similar to the default one
-   -- that xterm uses.
-  , c256_b_default
-  , c256_b_0
-  , c256_b_black
-  , c256_b_1
-  , c256_b_red
-  , c256_b_2
-  , c256_b_green
-  , c256_b_3
-  , c256_b_yellow
-  , c256_b_4
-  , c256_b_blue
-  , c256_b_5
-  , c256_b_magenta
-  , c256_b_6
-  , c256_b_cyan
-  , c256_b_7
-  , c256_b_white
-  , c256_b_8
-  , c256_b_grey
-  , c256_b_9
-  , c256_b_red_bright
-  , c256_b_10
-  , c256_b_green_bright
-  , c256_b_11
-  , c256_b_yellow_bright
-  , c256_b_12
-  , c256_b_blue_bright
-  , c256_b_13
-  , c256_b_magenta_bright
-  , c256_b_14
-  , c256_b_cyan_bright
-  , c256_b_15
-  , c256_b_white_bright
-  , c256_b_16
-  , c256_b_17
-  , c256_b_18
-  , c256_b_19
-  , c256_b_20
-  , c256_b_21
-  , c256_b_22
-  , c256_b_23
-  , c256_b_24
-  , c256_b_25
-  , c256_b_26
-  , c256_b_27
-  , c256_b_28
-  , c256_b_29
-  , c256_b_30
-  , c256_b_31
-  , c256_b_32
-  , c256_b_33
-  , c256_b_34
-  , c256_b_35
-  , c256_b_36
-  , c256_b_37
-  , c256_b_38
-  , c256_b_39
-  , c256_b_40
-  , c256_b_41
-  , c256_b_42
-  , c256_b_43
-  , c256_b_44
-  , c256_b_45
-  , c256_b_46
-  , c256_b_47
-  , c256_b_48
-  , c256_b_49
-  , c256_b_50
-  , c256_b_51
-  , c256_b_52
-  , c256_b_53
-  , c256_b_54
-  , c256_b_55
-  , c256_b_56
-  , c256_b_57
-  , c256_b_58
-  , c256_b_59
-  , c256_b_60
-  , c256_b_61
-  , c256_b_62
-  , c256_b_63
-  , c256_b_64
-  , c256_b_65
-  , c256_b_66
-  , c256_b_67
-  , c256_b_68
-  , c256_b_69
-  , c256_b_70
-  , c256_b_71
-  , c256_b_72
-  , c256_b_73
-  , c256_b_74
-  , c256_b_75
-  , c256_b_76
-  , c256_b_77
-  , c256_b_78
-  , c256_b_79
-  , c256_b_80
-  , c256_b_81
-  , c256_b_82
-  , c256_b_83
-  , c256_b_84
-  , c256_b_85
-  , c256_b_86
-  , c256_b_87
-  , c256_b_88
-  , c256_b_89
-  , c256_b_90
-  , c256_b_91
-  , c256_b_92
-  , c256_b_93
-  , c256_b_94
-  , c256_b_95
-  , c256_b_96
-  , c256_b_97
-  , c256_b_98
-  , c256_b_99
-  , c256_b_100
-  , c256_b_101
-  , c256_b_102
-  , c256_b_103
-  , c256_b_104
-  , c256_b_105
-  , c256_b_106
-  , c256_b_107
-  , c256_b_108
-  , c256_b_109
-  , c256_b_110
-  , c256_b_111
-  , c256_b_112
-  , c256_b_113
-  , c256_b_114
-  , c256_b_115
-  , c256_b_116
-  , c256_b_117
-  , c256_b_118
-  , c256_b_119
-  , c256_b_120
-  , c256_b_121
-  , c256_b_122
-  , c256_b_123
-  , c256_b_124
-  , c256_b_125
-  , c256_b_126
-  , c256_b_127
-  , c256_b_128
-  , c256_b_129
-  , c256_b_130
-  , c256_b_131
-  , c256_b_132
-  , c256_b_133
-  , c256_b_134
-  , c256_b_135
-  , c256_b_136
-  , c256_b_137
-  , c256_b_138
-  , c256_b_139
-  , c256_b_140
-  , c256_b_141
-  , c256_b_142
-  , c256_b_143
-  , c256_b_144
-  , c256_b_145
-  , c256_b_146
-  , c256_b_147
-  , c256_b_148
-  , c256_b_149
-  , c256_b_150
-  , c256_b_151
-  , c256_b_152
-  , c256_b_153
-  , c256_b_154
-  , c256_b_155
-  , c256_b_156
-  , c256_b_157
-  , c256_b_158
-  , c256_b_159
-  , c256_b_160
-  , c256_b_161
-  , c256_b_162
-  , c256_b_163
-  , c256_b_164
-  , c256_b_165
-  , c256_b_166
-  , c256_b_167
-  , c256_b_168
-  , c256_b_169
-  , c256_b_170
-  , c256_b_171
-  , c256_b_172
-  , c256_b_173
-  , c256_b_174
-  , c256_b_175
-  , c256_b_176
-  , c256_b_177
-  , c256_b_178
-  , c256_b_179
-  , c256_b_180
-  , c256_b_181
-  , c256_b_182
-  , c256_b_183
-  , c256_b_184
-  , c256_b_185
-  , c256_b_186
-  , c256_b_187
-  , c256_b_188
-  , c256_b_189
-  , c256_b_190
-  , c256_b_191
-  , c256_b_192
-  , c256_b_193
-  , c256_b_194
-  , c256_b_195
-  , c256_b_196
-  , c256_b_197
-  , c256_b_198
-  , c256_b_199
-  , c256_b_200
-  , c256_b_201
-  , c256_b_202
-  , c256_b_203
-  , c256_b_204
-  , c256_b_205
-  , c256_b_206
-  , c256_b_207
-  , c256_b_208
-  , c256_b_209
-  , c256_b_210
-  , c256_b_211
-  , c256_b_212
-  , c256_b_213
-  , c256_b_214
-  , c256_b_215
-  , c256_b_216
-  , c256_b_217
-  , c256_b_218
-  , c256_b_219
-  , c256_b_220
-  , c256_b_221
-  , c256_b_222
-  , c256_b_223
-  , c256_b_224
-  , c256_b_225
-  , c256_b_226
-  , c256_b_227
-  , c256_b_228
-  , c256_b_229
-  , c256_b_230
-  , c256_b_231
-  , c256_b_232
-  , c256_b_233
-  , c256_b_234
-  , c256_b_235
-  , c256_b_236
-  , c256_b_237
-  , c256_b_238
-  , c256_b_239
-  , c256_b_240
-  , c256_b_241
-  , c256_b_242
-  , c256_b_243
-  , c256_b_244
-  , c256_b_245
-  , c256_b_246
-  , c256_b_247
-  , c256_b_248
-  , c256_b_249
-  , c256_b_250
-  , c256_b_251
-  , c256_b_252
-  , c256_b_253
-  , c256_b_254
-  , c256_b_255
-
-  -- * Re-exports
-  , M.Monoid(..)
-  , (<>)
-  , Str.IsString(..)
-
-
-  -- * Create your own colors
-
-  -- * Style, TextSpec, and Chunk innards
-
-  -- | A style is a bundle of attributes that describes text
-  -- attributes, such as its color and whether it is bold.
-  --
-  -- Ordinarily you shouldn't need to use these types but they are
-  -- here in case they are useful; in particular, you can use them to
-  -- examine a Chunk's TextSpec to see what its characteristics are.
-  , StyleCommon(..)
-  , Style8(..)
-  , Style256(..)
-
-  , TextSpec (..)
-
-  -- * Basement
-
-  -- | Ordinarily you will not need the things down here. Instead, the
-  -- definitions above will give you a 'Chunk' that will
-  -- create the effect or color you need.
-
-  -- ** Wrappers for colors
-
-  -- | Definitions are provided above that give you every possible
-  -- color; however, these constructors are exported in case you want
-  -- to make your own colors instead. Use at your own risk, as you can
-  -- create non-sensical colors with this (such as 256-color colors in
-  -- a 'Background8'.)
-  , Background8
-  , Background256
-  , Foreground8
-  , Foreground256
-
-  -- ** Lenses
-  , scBold
-  , scUnderline
-  , scFlash
-  , scInverse
-  , foreground8
-  , background8
-  , common8
-  , foreground256
-  , background256
-  , common256
-  , textSpec
-  , text
-
-  ) where
-
-
--- # Imports
-
-import Control.Lens
-import qualified Data.String as Str
-import Data.Monoid (Monoid, mempty, mconcat, (<>), Last(..))
-import qualified Data.Monoid as M
-import Data.Text (Text)
-import Data.Maybe (fromMaybe)
-import qualified Data.Text as X
-import qualified System.Console.Terminfo as T
-import System.IO as IO
-import System.Environment as Env
-
---
--- Terminal definitions
---
-
--- | Which terminal definition to use.
-data Term
-  = Dumb
-  -- ^ Using this terminal should always succeed. This suppresses all
-  -- colors. Uesful if output is not going to a TTY, or if you just do
-  -- not like colors.
-
-  | TermName String
-  -- ^ Use the terminal with this given name. You might get this from
-  -- the TERM environment variable, or set it explicitly. A runtime
-  -- error will result if the terminfo database does not have a
-  -- definition for this terminal. If this terminal supports 256
-  -- colors, then 256 colors are used. If this terminal supports less
-  -- than 256 colors, but at least 8 colors, then 8 colors are
-  -- used. Otherwise, no colors are used.
-  deriving (Eq, Show)
-
--- | Gets the terminal definition from the environment. If the
--- environment does not have a TERM veriable, use 'Dumb'.
-termFromEnv :: IO Term
-termFromEnv = do
-  t <- Env.lookupEnv "TERM"
-  return $ maybe Dumb TermName t
-
--- | Gets the terminal definition from the environment. If the first
--- argument is True, the terminal is always obtained from the
--- environment. If it is False, the terminal is only obtained from the
--- environment if the given handle is not a terminal; otherwise, Dumb
--- is returned.
-smartTermFromEnv
-  :: Bool
-  -- ^ Use True if the user always wants to see colors, even if
-  -- standard output is not a terminal. Otherwise, use False.
-
-  -> IO.Handle
-  -- ^ Check this handle to see if it is a terminal (typically you
-  -- will use stdout).
-
-  -> IO Term
-smartTermFromEnv alwaysColor h =
-  if alwaysColor
-  then termFromEnv
-  else do
-        isTerm <- IO.hIsTerminalDevice h
-        if isTerm
-          then termFromEnv
-          else return Dumb
-
--- For Background8, Background256, Foreground8, Foreground256: the
--- Last wraps a Maybe (Terminfo Color). If the inner Maybe is Nothing,
--- use the default color.
-
-type Background8 = Last (Maybe T.Color)
-type Background256 = Last (Maybe T.Color)
-type Foreground8 = Last (Maybe T.Color)
-type Foreground256 = Last (Maybe T.Color)
-
---
--- Styles
---
-
--- | Style elements that apply in both 8 and 256 color
--- terminals. However, the elements are described separately for 8 and
--- 256 color terminals, so that the text appearance can change
--- depending on how many colors a terminal has.
-data StyleCommon = StyleCommon
-  { _scBold :: M.Last Bool
-  , _scUnderline :: M.Last Bool
-  , _scFlash :: M.Last Bool
-  , _scInverse :: M.Last Bool
-  } deriving (Show, Eq, Ord)
-
-makeLenses ''StyleCommon
-
-instance Monoid StyleCommon where
-  mempty = StyleCommon (Last Nothing) (Last Nothing)
-                       (Last Nothing) (Last Nothing)
-  mappend (StyleCommon b1 u1 f1 i1) (StyleCommon b2 u2 f2 i2)
-    = StyleCommon (b1 <> b2) (u1 <> u2) (f1 <> f2) (i1 <> i2)
-
--- | Describes text appearance (foreground and background colors, as
--- well as other attributes such as bold) for an 8 color terminal.
-data Style8 = Style8
-  { _foreground8 :: Foreground8
-  , _background8 :: Background8
-  , _common8 :: StyleCommon
-  } deriving (Show, Eq, Ord)
-
-makeLenses ''Style8
-
-instance Monoid Style8 where
-  mappend (Style8 fx bx cx) (Style8 fy by cy)
-    = Style8 (fx <> fy) (bx <> by) (cx <> cy)
-  mempty = Style8 mempty mempty mempty
-
--- | Describes text appearance (foreground and background colors, as
--- well as other attributes such as bold) for a 256 color terminal.
-data Style256 = Style256
-  { _foreground256 :: Foreground256
-  , _background256 :: Background256
-  , _common256 :: StyleCommon
-  } deriving (Show, Eq, Ord)
-
-makeLenses ''Style256
-
-instance Monoid Style256 where
-  mappend (Style256 fx bx cx) (Style256 fy by cy)
-    = Style256 (fx <> fy) (bx <> by) (cx <> cy)
-  mempty = Style256 mempty mempty mempty
-
---
--- TextSpec
---
-
--- | The TextSpec bundles together the styles for the 8 and 256 color
--- terminals, so that the text can be portrayed on any terminal.
-data TextSpec = TextSpec
-  { _style8 :: Style8
-  , _style256 :: Style256
-  } deriving (Show, Eq, Ord)
-
-makeLenses ''TextSpec
-
-instance Monoid TextSpec where
-  mappend (TextSpec x1 x2) (TextSpec y1 y2)
-    = TextSpec (x1 <> y1) (x2 <> y2)
-  mempty = TextSpec mempty mempty
-
---
--- Chunks
---
-
--- | A chunk is some textual data coupled with a description of what
--- color the text is, attributes like whether it is bold or
--- underlined, etc. The chunk knows what foreground and background
--- colors and what attributes to use for both an 8 color terminal and
--- a 256 color terminal.
-
-data Chunk = Chunk
-  { _textSpec :: TextSpec
-  , _text :: Text
-  } deriving (Eq, Show, Ord)
-
-makeLenses ''Chunk
-
-instance Str.IsString Chunk where
-  fromString s = Chunk mempty (X.pack s)
-
-instance Monoid Chunk where
-  mempty = Chunk mempty mempty
-  mappend (Chunk s1 t1) (Chunk s2 t2) = Chunk (s1 <> s2) (t1 <> t2)
-
-
-defaultColors :: T.Terminal -> T.TermOutput
-defaultColors term =
-  fromMaybe mempty (T.getCapability term T.restoreDefaultColors)
-
-
-commonAttrs :: T.Terminal -> StyleCommon -> T.TermOutput
-commonAttrs t s =
-  let a = T.Attributes
-        { T.standoutAttr = False
-        , T.underlineAttr = fromMaybe False
-          $ s ^. scUnderline . unwrapped
-        , T.reverseAttr = fromMaybe False
-          $ s ^. scInverse . unwrapped
-        , T.blinkAttr = fromMaybe False
-          $ s ^. scFlash . unwrapped
-        , T.dimAttr = False
-        , T.boldAttr = fromMaybe False
-          $ s ^. scBold . unwrapped
-        , T.invisibleAttr = False
-        , T.protectedAttr = False
-        }
-  in case T.getCapability t (T.setAttributes) of
-      Nothing -> error $ "System.Console.Rainbow: commonAttrs: "
-                 ++ "capability failed; should never happen"
-      Just f -> f a
-
-
--- | Gets the right set of terminal codes to apply the desired
--- highlighting, bold, underlining, etc. Be sure to apply the
--- attributes first (bold, underlining, etc) and then the
--- colors. Setting the colors first and then the attributes seems to
--- reset the colors, giving blank output.
-getTermCodes
-  :: T.Terminal
-  -> TextSpec
-  -> T.TermOutput
-getTermCodes t ts = fromMaybe mempty $ do
-  cols <- T.getCapability t T.termColors
-  let TextSpec s8 s256 = ts
-      Style8 f8 b8 c8 = s8
-      Style256 f256 b256 c256 = s256
-  setFg <- T.getCapability t T.setForegroundColor
-  setBg <- T.getCapability t T.setBackgroundColor
-  (fg, bg, cm) <- case () of
-    _ | cols >= 256 -> Just $ ( f256 ^. unwrapped
-                              , b256 ^. unwrapped
-                              , c256)
-      | cols >= 8 -> Just ( f8 ^. unwrapped
-                         , b8 ^. unwrapped
-                         , c8)
-      | otherwise -> Nothing
-  let oFg = maybe mempty (maybe mempty setFg) fg
-      oBg = maybe mempty (maybe mempty setBg) bg
-      oCm = commonAttrs t cm
-  return $ mconcat [oCm, oFg, oBg]
-
-
-hPrintChunk :: IO.Handle -> T.Terminal -> Chunk -> IO ()
-hPrintChunk h t (Chunk ts x) =
-  T.hRunTermOutput h t
-  . mconcat
-  $ [defaultColors t, codes, txt]
-  where
-    codes = getTermCodes t ts
-    txt = T.termText . X.unpack $ x
-
--- | Sends a list of chunks to the given handle for printing. Sets up
--- the terminal (this only needs to be done once.) Lazily processes
--- the list of Chunk. See 'putChunks' for notes on how many colors
--- are used.
-hPutChunks :: IO.Handle -> Term -> [Chunk] -> IO ()
-hPutChunks h t cs = do
-  let setup = case t of
-        Dumb -> T.setupTerm "dumb"
-        TermName s -> T.setupTerm s
-  term <- setup
-  mapM_ (hPrintChunk h term) cs
-  T.hRunTermOutput h term (defaultColors term)
-  T.hRunTermOutput h term
-    $ case T.getCapability term T.allAttributesOff of
-        Nothing -> error $ "System.Console.Rainbow.putChunks: error: "
-                   ++ "allAttributesOff failed"
-        Just s -> s
-
--- | Sends a list of chunks to standard output for printing. Sets up
--- the terminal (this only needs to be done once.) Lazily processes
--- the list of Chunk.
---
--- Which colors are used depends upon the 'Term'. If it is 'Dumb',
--- then no colors are used on output. If the 'Term' is specified with
--- 'TermName', the UNIX terminfo library is used to determine how many
--- colors the terminal supports. If it supports at least 256 colors,
--- then 256 colors are used. If it supports at least 8 colors but less
--- than 256 colors, then 256 colors are used. Otherwise, no colors are
--- used. A runtime error will occur if the 'TermName' is not found in
--- the system terminal database.
-putChunks :: Term -> [Chunk] -> IO ()
-putChunks = hPutChunks IO.stdout
-
--- | Print one chunk at a time, to a handle
-hPutChunk :: IO.Handle -> Chunk -> IO ()
-hPutChunk h c = do
-  t <- termFromEnv
-  hPutChunks h t [c]
-
--- | Print one chunk at a time, to standard output
-putChunk :: Chunk -> IO ()
-putChunk = hPutChunk IO.stdout
-
--- | Print one chunk at a time, to a handle, append a newline
-hPutChunkLn :: IO.Handle -> Chunk -> IO ()
-hPutChunkLn h c = hPutChunk h c >> IO.hPutStr h "\n"
-
--- | Print one chunk at a time, to standard output, append a newline
-putChunkLn :: Chunk -> IO ()
-putChunkLn c = putChunk c >> putStr "\n"
-
-bold8 :: Chunk
-bold8 = mempty & textSpec . style8 . common8
-                 . scBold . unwrapped .~ Just True
-
-bold8off :: Chunk
-bold8off = mempty & textSpec . style8 . common8
-                    . scBold . unwrapped .~ Just False
-
-underline8 :: Chunk
-underline8 = mempty & textSpec . style8 . common8
-                 . scUnderline . unwrapped .~ Just True
-
-underline8off :: Chunk
-underline8off = mempty & textSpec . style8 . common8
-                    . scUnderline . unwrapped .~ Just False
-
-flash8 :: Chunk
-flash8 = mempty & textSpec . style8 . common8
-                 . scFlash . unwrapped .~ Just True
-
-flash8off :: Chunk
-flash8off = mempty & textSpec . style8 . common8
-                    . scFlash . unwrapped .~ Just False
-
-inverse8 :: Chunk
-inverse8 = mempty & textSpec . style8 . common8
-                 . scInverse . unwrapped .~ Just True
-
-inverse8off :: Chunk
-inverse8off = mempty & textSpec . style8 . common8
-                    . scInverse . unwrapped .~ Just False
-
-underline256 :: Chunk
-underline256 = mempty & textSpec . style256 . common256
-                 . scUnderline . unwrapped .~ Just True
-
-underline256off :: Chunk
-underline256off = mempty & textSpec . style256 . common256
-                    . scUnderline . unwrapped .~ Just False
-
-bold256 :: Chunk
-bold256 = mempty & textSpec . style256 . common256
-                 . scBold . unwrapped .~ Just True
-
-bold256off :: Chunk
-bold256off = mempty & textSpec . style256 . common256
-                    . scBold . unwrapped .~ Just False
-
-inverse256 :: Chunk
-inverse256 = mempty & textSpec . style256 . common256
-                 . scInverse . unwrapped .~ Just True
-
-inverse256off :: Chunk
-inverse256off = mempty & textSpec . style256 . common256
-                    . scInverse . unwrapped .~ Just False
-
-flash256 :: Chunk
-flash256 = mempty & textSpec . style256 . common256
-                 . scFlash . unwrapped .~ Just True
-
-flash256off :: Chunk
-flash256off = mempty & textSpec . style256 . common256
-                    . scFlash . unwrapped .~ Just False
-
---
--- All
---
-
-
--- | Bold. What actually happens when you use Bold is going to depend
--- on your terminal. For example, xterm allows you actually use a bold
--- font for bold, if you have one. Otherwise, it might simulate bold
--- by using overstriking. Another possibility is that your terminal
--- might use a different color to indicate bold. For more details (at
--- least for xterm), look at xterm (1) and search for @boldColors@.
---
--- If your terminal uses a different color for bold, this allows an
--- 8-color terminal to really have 16 colors.
-bold :: Chunk
-bold = bold8 <> bold256
-
-boldOff :: Chunk
-boldOff = bold8off <> bold256off
-
-inverse :: Chunk
-inverse = inverse8 <> inverse256
-
-inverseOff :: Chunk
-inverseOff = inverse8off <> inverse256off
-
-flash :: Chunk
-flash = flash8 <> flash256
-
-flashOff :: Chunk
-flashOff = flash8off <> flash256off
-
-underline :: Chunk
-underline = underline8 <> underline256
-
-underlineOff :: Chunk
-underlineOff = underline8off <> underline256off
-
-f_default :: Chunk
-f_default = c8_f_default <> c256_f_default
-
-f_black :: Chunk
-f_black = c8_f_black <> c256_f_black
-
-f_red :: Chunk
-f_red = c8_f_red <> c256_f_red
-
-f_green :: Chunk
-f_green = c8_f_green <> c256_f_green
-
-f_yellow :: Chunk
-f_yellow = c8_f_yellow <> c256_f_yellow
-
-f_blue :: Chunk
-f_blue = c8_f_blue <> c256_f_blue
-
-f_magenta :: Chunk
-f_magenta = c8_f_magenta <> c256_f_magenta
-
-f_cyan :: Chunk
-f_cyan = c8_f_cyan <> c256_f_cyan
-
-f_white :: Chunk
-f_white = c8_f_white <> c256_f_white
-
-b_default :: Chunk
-b_default = c8_b_default <> c256_b_default
-
-b_black :: Chunk
-b_black = c8_b_black <> c256_b_black
-
-b_red :: Chunk
-b_red = c8_b_red <> c256_b_red
-
-b_green :: Chunk
-b_green = c8_b_green <> c256_b_green
-
-b_yellow :: Chunk
-b_yellow = c8_b_yellow <> c256_b_yellow
-
-b_blue :: Chunk
-b_blue = c8_b_blue <> c256_b_blue
-
-b_magenta :: Chunk
-b_magenta = c8_b_magenta <> c256_b_magenta
-
-b_cyan :: Chunk
-b_cyan = c8_b_cyan <> c256_b_cyan
-
-b_white :: Chunk
-b_white = c8_b_white <> c256_b_white
-
-
---
--- Color basement
---
-
-c8_f_default :: Chunk
-c8_f_default = mempty & textSpec . style8 . foreground8
-                            . unwrapped .~ (Just Nothing)
-
-
-c8_f_black :: Chunk
-c8_f_black = mempty & textSpec . style8 . foreground8
-  . unwrapped .~ (Just (Just T.Black))
-
-c8_f_red :: Chunk
-c8_f_red = mempty & textSpec . style8 . foreground8
-  . unwrapped .~ (Just (Just T.Red))
-
-c8_f_green :: Chunk
-c8_f_green = mempty & textSpec . style8 . foreground8
-  . unwrapped .~ (Just (Just T.Green))
-
-c8_f_yellow :: Chunk
-c8_f_yellow = mempty & textSpec . style8 . foreground8
-  . unwrapped .~ (Just (Just T.Yellow))
-
-c8_f_blue :: Chunk
-c8_f_blue = mempty & textSpec . style8 . foreground8
-  . unwrapped .~ (Just (Just T.Blue))
-
-c8_f_magenta :: Chunk
-c8_f_magenta = mempty & textSpec . style8 . foreground8
-  . unwrapped .~ (Just (Just T.Magenta))
-
-c8_f_cyan :: Chunk
-c8_f_cyan = mempty & textSpec . style8 . foreground8
-  . unwrapped .~ (Just (Just T.Cyan))
-
-c8_f_white :: Chunk
-c8_f_white = mempty & textSpec . style8 . foreground8
-  . unwrapped .~ (Just (Just T.White))
-
-
-c8_b_default :: Chunk
-c8_b_default = mempty & textSpec . style8 . background8
-                            . unwrapped .~ (Just Nothing)
-
-c8_b_black :: Chunk
-c8_b_black = mempty & textSpec . style8 . background8
-  . unwrapped .~ (Just (Just T.Black))
-
-c8_b_red :: Chunk
-c8_b_red = mempty & textSpec . style8 . background8
-  . unwrapped .~ (Just (Just T.Red))
-
-c8_b_green :: Chunk
-c8_b_green = mempty & textSpec . style8 . background8
-  . unwrapped .~ (Just (Just T.Green))
-
-c8_b_yellow :: Chunk
-c8_b_yellow = mempty & textSpec . style8 . background8
-  . unwrapped .~ (Just (Just T.Yellow))
-
-c8_b_blue :: Chunk
-c8_b_blue = mempty & textSpec . style8 . background8
-  . unwrapped .~ (Just (Just T.Blue))
-
-c8_b_magenta :: Chunk
-c8_b_magenta = mempty & textSpec . style8 . background8
-  . unwrapped .~ (Just (Just T.Magenta))
-
-c8_b_cyan :: Chunk
-c8_b_cyan = mempty & textSpec . style8 . background8
-  . unwrapped .~ (Just (Just T.Cyan))
-
-c8_b_white :: Chunk
-c8_b_white = mempty & textSpec . style8 . background8
-  . unwrapped .~ (Just (Just T.White))
-
-
-c256_f_default :: Chunk
-c256_f_default = mempty & textSpec . style256 . foreground256
-                            . unwrapped .~ (Just Nothing)
-
-
-c256_f_0 :: Chunk
-c256_f_0 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 0)))
-
-c256_f_black :: Chunk
-c256_f_black = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 0)))
-
-c256_f_1 :: Chunk
-c256_f_1 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 1)))
-
-c256_f_red :: Chunk
-c256_f_red = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 1)))
-
-c256_f_2 :: Chunk
-c256_f_2 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 2)))
-
-c256_f_green :: Chunk
-c256_f_green = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 2)))
-
-c256_f_3 :: Chunk
-c256_f_3 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 3)))
-
-c256_f_yellow :: Chunk
-c256_f_yellow = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 3)))
-
-c256_f_4 :: Chunk
-c256_f_4 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 4)))
-
-c256_f_blue :: Chunk
-c256_f_blue = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 4)))
-
-c256_f_5 :: Chunk
-c256_f_5 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 5)))
-
-c256_f_magenta :: Chunk
-c256_f_magenta = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 5)))
-
-c256_f_6 :: Chunk
-c256_f_6 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 6)))
-
-c256_f_cyan :: Chunk
-c256_f_cyan = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 6)))
-
-c256_f_7 :: Chunk
-c256_f_7 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 7)))
-
-c256_f_white :: Chunk
-c256_f_white = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 7)))
-
-c256_f_8 :: Chunk
-c256_f_8 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 8)))
-
-c256_f_grey :: Chunk
-c256_f_grey = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 8)))
-
-c256_f_9 :: Chunk
-c256_f_9 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 9)))
-
-c256_f_red_bright :: Chunk
-c256_f_red_bright = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 9)))
-
-c256_f_10 :: Chunk
-c256_f_10 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 10)))
-
-c256_f_green_bright :: Chunk
-c256_f_green_bright = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 10)))
-
-c256_f_11 :: Chunk
-c256_f_11 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 11)))
-
-c256_f_yellow_bright :: Chunk
-c256_f_yellow_bright = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 11)))
-
-c256_f_12 :: Chunk
-c256_f_12 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 12)))
-
-c256_f_blue_bright :: Chunk
-c256_f_blue_bright = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 12)))
-
-c256_f_13 :: Chunk
-c256_f_13 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 13)))
-
-c256_f_magenta_bright :: Chunk
-c256_f_magenta_bright = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 13)))
-
-c256_f_14 :: Chunk
-c256_f_14 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 14)))
-
-c256_f_cyan_bright :: Chunk
-c256_f_cyan_bright = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 14)))
-
-c256_f_15 :: Chunk
-c256_f_15 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 15)))
-
-c256_f_white_bright :: Chunk
-c256_f_white_bright = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 15)))
-
-c256_f_16 :: Chunk
-c256_f_16 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 16)))
-
-c256_f_17 :: Chunk
-c256_f_17 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 17)))
-
-c256_f_18 :: Chunk
-c256_f_18 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 18)))
-
-c256_f_19 :: Chunk
-c256_f_19 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 19)))
-
-c256_f_20 :: Chunk
-c256_f_20 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 20)))
-
-c256_f_21 :: Chunk
-c256_f_21 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 21)))
-
-c256_f_22 :: Chunk
-c256_f_22 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 22)))
-
-c256_f_23 :: Chunk
-c256_f_23 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 23)))
-
-c256_f_24 :: Chunk
-c256_f_24 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 24)))
-
-c256_f_25 :: Chunk
-c256_f_25 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 25)))
-
-c256_f_26 :: Chunk
-c256_f_26 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 26)))
-
-c256_f_27 :: Chunk
-c256_f_27 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 27)))
-
-c256_f_28 :: Chunk
-c256_f_28 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 28)))
-
-c256_f_29 :: Chunk
-c256_f_29 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 29)))
-
-c256_f_30 :: Chunk
-c256_f_30 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 30)))
-
-c256_f_31 :: Chunk
-c256_f_31 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 31)))
-
-c256_f_32 :: Chunk
-c256_f_32 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 32)))
-
-c256_f_33 :: Chunk
-c256_f_33 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 33)))
-
-c256_f_34 :: Chunk
-c256_f_34 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 34)))
-
-c256_f_35 :: Chunk
-c256_f_35 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 35)))
-
-c256_f_36 :: Chunk
-c256_f_36 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 36)))
-
-c256_f_37 :: Chunk
-c256_f_37 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 37)))
-
-c256_f_38 :: Chunk
-c256_f_38 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 38)))
-
-c256_f_39 :: Chunk
-c256_f_39 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 39)))
-
-c256_f_40 :: Chunk
-c256_f_40 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 40)))
-
-c256_f_41 :: Chunk
-c256_f_41 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 41)))
-
-c256_f_42 :: Chunk
-c256_f_42 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 42)))
-
-c256_f_43 :: Chunk
-c256_f_43 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 43)))
-
-c256_f_44 :: Chunk
-c256_f_44 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 44)))
-
-c256_f_45 :: Chunk
-c256_f_45 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 45)))
-
-c256_f_46 :: Chunk
-c256_f_46 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 46)))
-
-c256_f_47 :: Chunk
-c256_f_47 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 47)))
-
-c256_f_48 :: Chunk
-c256_f_48 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 48)))
-
-c256_f_49 :: Chunk
-c256_f_49 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 49)))
-
-c256_f_50 :: Chunk
-c256_f_50 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 50)))
-
-c256_f_51 :: Chunk
-c256_f_51 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 51)))
-
-c256_f_52 :: Chunk
-c256_f_52 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 52)))
-
-c256_f_53 :: Chunk
-c256_f_53 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 53)))
-
-c256_f_54 :: Chunk
-c256_f_54 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 54)))
-
-c256_f_55 :: Chunk
-c256_f_55 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 55)))
-
-c256_f_56 :: Chunk
-c256_f_56 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 56)))
-
-c256_f_57 :: Chunk
-c256_f_57 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 57)))
-
-c256_f_58 :: Chunk
-c256_f_58 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 58)))
-
-c256_f_59 :: Chunk
-c256_f_59 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 59)))
-
-c256_f_60 :: Chunk
-c256_f_60 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 60)))
-
-c256_f_61 :: Chunk
-c256_f_61 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 61)))
-
-c256_f_62 :: Chunk
-c256_f_62 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 62)))
-
-c256_f_63 :: Chunk
-c256_f_63 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 63)))
-
-c256_f_64 :: Chunk
-c256_f_64 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 64)))
-
-c256_f_65 :: Chunk
-c256_f_65 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 65)))
-
-c256_f_66 :: Chunk
-c256_f_66 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 66)))
-
-c256_f_67 :: Chunk
-c256_f_67 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 67)))
-
-c256_f_68 :: Chunk
-c256_f_68 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 68)))
-
-c256_f_69 :: Chunk
-c256_f_69 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 69)))
-
-c256_f_70 :: Chunk
-c256_f_70 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 70)))
-
-c256_f_71 :: Chunk
-c256_f_71 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 71)))
-
-c256_f_72 :: Chunk
-c256_f_72 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 72)))
-
-c256_f_73 :: Chunk
-c256_f_73 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 73)))
-
-c256_f_74 :: Chunk
-c256_f_74 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 74)))
-
-c256_f_75 :: Chunk
-c256_f_75 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 75)))
-
-c256_f_76 :: Chunk
-c256_f_76 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 76)))
-
-c256_f_77 :: Chunk
-c256_f_77 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 77)))
-
-c256_f_78 :: Chunk
-c256_f_78 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 78)))
-
-c256_f_79 :: Chunk
-c256_f_79 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 79)))
-
-c256_f_80 :: Chunk
-c256_f_80 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 80)))
-
-c256_f_81 :: Chunk
-c256_f_81 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 81)))
-
-c256_f_82 :: Chunk
-c256_f_82 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 82)))
-
-c256_f_83 :: Chunk
-c256_f_83 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 83)))
-
-c256_f_84 :: Chunk
-c256_f_84 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 84)))
-
-c256_f_85 :: Chunk
-c256_f_85 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 85)))
-
-c256_f_86 :: Chunk
-c256_f_86 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 86)))
-
-c256_f_87 :: Chunk
-c256_f_87 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 87)))
-
-c256_f_88 :: Chunk
-c256_f_88 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 88)))
-
-c256_f_89 :: Chunk
-c256_f_89 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 89)))
-
-c256_f_90 :: Chunk
-c256_f_90 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 90)))
-
-c256_f_91 :: Chunk
-c256_f_91 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 91)))
-
-c256_f_92 :: Chunk
-c256_f_92 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 92)))
-
-c256_f_93 :: Chunk
-c256_f_93 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 93)))
-
-c256_f_94 :: Chunk
-c256_f_94 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 94)))
-
-c256_f_95 :: Chunk
-c256_f_95 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 95)))
-
-c256_f_96 :: Chunk
-c256_f_96 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 96)))
-
-c256_f_97 :: Chunk
-c256_f_97 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 97)))
-
-c256_f_98 :: Chunk
-c256_f_98 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 98)))
-
-c256_f_99 :: Chunk
-c256_f_99 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 99)))
-
-c256_f_100 :: Chunk
-c256_f_100 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 100)))
-
-c256_f_101 :: Chunk
-c256_f_101 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 101)))
-
-c256_f_102 :: Chunk
-c256_f_102 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 102)))
-
-c256_f_103 :: Chunk
-c256_f_103 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 103)))
-
-c256_f_104 :: Chunk
-c256_f_104 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 104)))
-
-c256_f_105 :: Chunk
-c256_f_105 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 105)))
-
-c256_f_106 :: Chunk
-c256_f_106 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 106)))
-
-c256_f_107 :: Chunk
-c256_f_107 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 107)))
-
-c256_f_108 :: Chunk
-c256_f_108 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 108)))
-
-c256_f_109 :: Chunk
-c256_f_109 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 109)))
-
-c256_f_110 :: Chunk
-c256_f_110 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 110)))
-
-c256_f_111 :: Chunk
-c256_f_111 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 111)))
-
-c256_f_112 :: Chunk
-c256_f_112 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 112)))
-
-c256_f_113 :: Chunk
-c256_f_113 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 113)))
-
-c256_f_114 :: Chunk
-c256_f_114 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 114)))
-
-c256_f_115 :: Chunk
-c256_f_115 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 115)))
-
-c256_f_116 :: Chunk
-c256_f_116 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 116)))
-
-c256_f_117 :: Chunk
-c256_f_117 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 117)))
-
-c256_f_118 :: Chunk
-c256_f_118 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 118)))
-
-c256_f_119 :: Chunk
-c256_f_119 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 119)))
-
-c256_f_120 :: Chunk
-c256_f_120 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 120)))
-
-c256_f_121 :: Chunk
-c256_f_121 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 121)))
-
-c256_f_122 :: Chunk
-c256_f_122 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 122)))
-
-c256_f_123 :: Chunk
-c256_f_123 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 123)))
-
-c256_f_124 :: Chunk
-c256_f_124 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 124)))
-
-c256_f_125 :: Chunk
-c256_f_125 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 125)))
-
-c256_f_126 :: Chunk
-c256_f_126 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 126)))
-
-c256_f_127 :: Chunk
-c256_f_127 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 127)))
-
-c256_f_128 :: Chunk
-c256_f_128 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 128)))
-
-c256_f_129 :: Chunk
-c256_f_129 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 129)))
-
-c256_f_130 :: Chunk
-c256_f_130 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 130)))
-
-c256_f_131 :: Chunk
-c256_f_131 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 131)))
-
-c256_f_132 :: Chunk
-c256_f_132 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 132)))
-
-c256_f_133 :: Chunk
-c256_f_133 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 133)))
-
-c256_f_134 :: Chunk
-c256_f_134 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 134)))
-
-c256_f_135 :: Chunk
-c256_f_135 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 135)))
-
-c256_f_136 :: Chunk
-c256_f_136 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 136)))
-
-c256_f_137 :: Chunk
-c256_f_137 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 137)))
-
-c256_f_138 :: Chunk
-c256_f_138 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 138)))
-
-c256_f_139 :: Chunk
-c256_f_139 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 139)))
-
-c256_f_140 :: Chunk
-c256_f_140 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 140)))
-
-c256_f_141 :: Chunk
-c256_f_141 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 141)))
-
-c256_f_142 :: Chunk
-c256_f_142 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 142)))
-
-c256_f_143 :: Chunk
-c256_f_143 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 143)))
-
-c256_f_144 :: Chunk
-c256_f_144 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 144)))
-
-c256_f_145 :: Chunk
-c256_f_145 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 145)))
-
-c256_f_146 :: Chunk
-c256_f_146 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 146)))
-
-c256_f_147 :: Chunk
-c256_f_147 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 147)))
-
-c256_f_148 :: Chunk
-c256_f_148 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 148)))
-
-c256_f_149 :: Chunk
-c256_f_149 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 149)))
-
-c256_f_150 :: Chunk
-c256_f_150 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 150)))
-
-c256_f_151 :: Chunk
-c256_f_151 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 151)))
-
-c256_f_152 :: Chunk
-c256_f_152 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 152)))
-
-c256_f_153 :: Chunk
-c256_f_153 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 153)))
-
-c256_f_154 :: Chunk
-c256_f_154 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 154)))
-
-c256_f_155 :: Chunk
-c256_f_155 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 155)))
-
-c256_f_156 :: Chunk
-c256_f_156 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 156)))
-
-c256_f_157 :: Chunk
-c256_f_157 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 157)))
-
-c256_f_158 :: Chunk
-c256_f_158 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 158)))
-
-c256_f_159 :: Chunk
-c256_f_159 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 159)))
-
-c256_f_160 :: Chunk
-c256_f_160 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 160)))
-
-c256_f_161 :: Chunk
-c256_f_161 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 161)))
-
-c256_f_162 :: Chunk
-c256_f_162 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 162)))
-
-c256_f_163 :: Chunk
-c256_f_163 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 163)))
-
-c256_f_164 :: Chunk
-c256_f_164 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 164)))
-
-c256_f_165 :: Chunk
-c256_f_165 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 165)))
-
-c256_f_166 :: Chunk
-c256_f_166 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 166)))
-
-c256_f_167 :: Chunk
-c256_f_167 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 167)))
-
-c256_f_168 :: Chunk
-c256_f_168 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 168)))
-
-c256_f_169 :: Chunk
-c256_f_169 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 169)))
-
-c256_f_170 :: Chunk
-c256_f_170 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 170)))
-
-c256_f_171 :: Chunk
-c256_f_171 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 171)))
-
-c256_f_172 :: Chunk
-c256_f_172 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 172)))
-
-c256_f_173 :: Chunk
-c256_f_173 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 173)))
-
-c256_f_174 :: Chunk
-c256_f_174 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 174)))
-
-c256_f_175 :: Chunk
-c256_f_175 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 175)))
-
-c256_f_176 :: Chunk
-c256_f_176 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 176)))
-
-c256_f_177 :: Chunk
-c256_f_177 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 177)))
-
-c256_f_178 :: Chunk
-c256_f_178 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 178)))
-
-c256_f_179 :: Chunk
-c256_f_179 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 179)))
-
-c256_f_180 :: Chunk
-c256_f_180 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 180)))
-
-c256_f_181 :: Chunk
-c256_f_181 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 181)))
-
-c256_f_182 :: Chunk
-c256_f_182 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 182)))
-
-c256_f_183 :: Chunk
-c256_f_183 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 183)))
-
-c256_f_184 :: Chunk
-c256_f_184 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 184)))
-
-c256_f_185 :: Chunk
-c256_f_185 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 185)))
-
-c256_f_186 :: Chunk
-c256_f_186 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 186)))
-
-c256_f_187 :: Chunk
-c256_f_187 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 187)))
-
-c256_f_188 :: Chunk
-c256_f_188 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 188)))
-
-c256_f_189 :: Chunk
-c256_f_189 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 189)))
-
-c256_f_190 :: Chunk
-c256_f_190 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 190)))
-
-c256_f_191 :: Chunk
-c256_f_191 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 191)))
-
-c256_f_192 :: Chunk
-c256_f_192 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 192)))
-
-c256_f_193 :: Chunk
-c256_f_193 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 193)))
-
-c256_f_194 :: Chunk
-c256_f_194 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 194)))
-
-c256_f_195 :: Chunk
-c256_f_195 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 195)))
-
-c256_f_196 :: Chunk
-c256_f_196 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 196)))
-
-c256_f_197 :: Chunk
-c256_f_197 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 197)))
-
-c256_f_198 :: Chunk
-c256_f_198 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 198)))
-
-c256_f_199 :: Chunk
-c256_f_199 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 199)))
-
-c256_f_200 :: Chunk
-c256_f_200 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 200)))
-
-c256_f_201 :: Chunk
-c256_f_201 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 201)))
-
-c256_f_202 :: Chunk
-c256_f_202 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 202)))
-
-c256_f_203 :: Chunk
-c256_f_203 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 203)))
-
-c256_f_204 :: Chunk
-c256_f_204 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 204)))
-
-c256_f_205 :: Chunk
-c256_f_205 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 205)))
-
-c256_f_206 :: Chunk
-c256_f_206 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 206)))
-
-c256_f_207 :: Chunk
-c256_f_207 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 207)))
-
-c256_f_208 :: Chunk
-c256_f_208 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 208)))
-
-c256_f_209 :: Chunk
-c256_f_209 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 209)))
-
-c256_f_210 :: Chunk
-c256_f_210 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 210)))
-
-c256_f_211 :: Chunk
-c256_f_211 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 211)))
-
-c256_f_212 :: Chunk
-c256_f_212 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 212)))
-
-c256_f_213 :: Chunk
-c256_f_213 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 213)))
-
-c256_f_214 :: Chunk
-c256_f_214 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 214)))
-
-c256_f_215 :: Chunk
-c256_f_215 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 215)))
-
-c256_f_216 :: Chunk
-c256_f_216 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 216)))
-
-c256_f_217 :: Chunk
-c256_f_217 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 217)))
-
-c256_f_218 :: Chunk
-c256_f_218 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 218)))
-
-c256_f_219 :: Chunk
-c256_f_219 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 219)))
-
-c256_f_220 :: Chunk
-c256_f_220 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 220)))
-
-c256_f_221 :: Chunk
-c256_f_221 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 221)))
-
-c256_f_222 :: Chunk
-c256_f_222 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 222)))
-
-c256_f_223 :: Chunk
-c256_f_223 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 223)))
-
-c256_f_224 :: Chunk
-c256_f_224 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 224)))
-
-c256_f_225 :: Chunk
-c256_f_225 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 225)))
-
-c256_f_226 :: Chunk
-c256_f_226 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 226)))
-
-c256_f_227 :: Chunk
-c256_f_227 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 227)))
-
-c256_f_228 :: Chunk
-c256_f_228 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 228)))
-
-c256_f_229 :: Chunk
-c256_f_229 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 229)))
-
-c256_f_230 :: Chunk
-c256_f_230 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 230)))
-
-c256_f_231 :: Chunk
-c256_f_231 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 231)))
-
-c256_f_232 :: Chunk
-c256_f_232 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 232)))
-
-c256_f_233 :: Chunk
-c256_f_233 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 233)))
-
-c256_f_234 :: Chunk
-c256_f_234 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 234)))
-
-c256_f_235 :: Chunk
-c256_f_235 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 235)))
-
-c256_f_236 :: Chunk
-c256_f_236 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 236)))
-
-c256_f_237 :: Chunk
-c256_f_237 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 237)))
-
-c256_f_238 :: Chunk
-c256_f_238 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 238)))
-
-c256_f_239 :: Chunk
-c256_f_239 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 239)))
-
-c256_f_240 :: Chunk
-c256_f_240 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 240)))
-
-c256_f_241 :: Chunk
-c256_f_241 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 241)))
-
-c256_f_242 :: Chunk
-c256_f_242 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 242)))
-
-c256_f_243 :: Chunk
-c256_f_243 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 243)))
-
-c256_f_244 :: Chunk
-c256_f_244 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 244)))
-
-c256_f_245 :: Chunk
-c256_f_245 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 245)))
-
-c256_f_246 :: Chunk
-c256_f_246 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 246)))
-
-c256_f_247 :: Chunk
-c256_f_247 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 247)))
-
-c256_f_248 :: Chunk
-c256_f_248 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 248)))
-
-c256_f_249 :: Chunk
-c256_f_249 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 249)))
-
-c256_f_250 :: Chunk
-c256_f_250 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 250)))
-
-c256_f_251 :: Chunk
-c256_f_251 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 251)))
-
-c256_f_252 :: Chunk
-c256_f_252 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 252)))
-
-c256_f_253 :: Chunk
-c256_f_253 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 253)))
-
-c256_f_254 :: Chunk
-c256_f_254 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 254)))
-
-c256_f_255 :: Chunk
-c256_f_255 = mempty & textSpec . style256 . foreground256
-  . unwrapped .~ (Just (Just (T.ColorNumber 255)))
-
-
-c256_b_default :: Chunk
-c256_b_default = mempty & textSpec . style256 . background256
-                            . unwrapped .~ (Just Nothing)
-
-c256_b_0 :: Chunk
-c256_b_0 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 0)))
-
-c256_b_black :: Chunk
-c256_b_black = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 0)))
-
-c256_b_1 :: Chunk
-c256_b_1 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 1)))
-
-c256_b_red :: Chunk
-c256_b_red = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 1)))
-
-c256_b_2 :: Chunk
-c256_b_2 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 2)))
-
-c256_b_green :: Chunk
-c256_b_green = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 2)))
-
-c256_b_3 :: Chunk
-c256_b_3 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 3)))
-
-c256_b_yellow :: Chunk
-c256_b_yellow = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 3)))
-
-c256_b_4 :: Chunk
-c256_b_4 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 4)))
-
-c256_b_blue :: Chunk
-c256_b_blue = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 4)))
-
-c256_b_5 :: Chunk
-c256_b_5 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 5)))
-
-c256_b_magenta :: Chunk
-c256_b_magenta = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 5)))
-
-c256_b_6 :: Chunk
-c256_b_6 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 6)))
-
-c256_b_cyan :: Chunk
-c256_b_cyan = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 6)))
-
-c256_b_7 :: Chunk
-c256_b_7 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 7)))
-
-c256_b_white :: Chunk
-c256_b_white = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 7)))
-
-c256_b_8 :: Chunk
-c256_b_8 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 8)))
-
-c256_b_grey :: Chunk
-c256_b_grey = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 8)))
-
-c256_b_9 :: Chunk
-c256_b_9 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 9)))
-
-c256_b_red_bright :: Chunk
-c256_b_red_bright = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 9)))
-
-c256_b_10 :: Chunk
-c256_b_10 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 10)))
-
-c256_b_green_bright :: Chunk
-c256_b_green_bright = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 10)))
-
-c256_b_11 :: Chunk
-c256_b_11 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 11)))
-
-c256_b_yellow_bright :: Chunk
-c256_b_yellow_bright = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 11)))
-
-c256_b_12 :: Chunk
-c256_b_12 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 12)))
-
-c256_b_blue_bright :: Chunk
-c256_b_blue_bright = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 12)))
-
-c256_b_13 :: Chunk
-c256_b_13 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 13)))
-
-c256_b_magenta_bright :: Chunk
-c256_b_magenta_bright = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 13)))
-
-c256_b_14 :: Chunk
-c256_b_14 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 14)))
-
-c256_b_cyan_bright :: Chunk
-c256_b_cyan_bright = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 14)))
-
-c256_b_15 :: Chunk
-c256_b_15 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 15)))
-
-c256_b_white_bright :: Chunk
-c256_b_white_bright = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 15)))
-
-c256_b_16 :: Chunk
-c256_b_16 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 16)))
-
-c256_b_17 :: Chunk
-c256_b_17 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 17)))
-
-c256_b_18 :: Chunk
-c256_b_18 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 18)))
-
-c256_b_19 :: Chunk
-c256_b_19 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 19)))
-
-c256_b_20 :: Chunk
-c256_b_20 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 20)))
-
-c256_b_21 :: Chunk
-c256_b_21 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 21)))
-
-c256_b_22 :: Chunk
-c256_b_22 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 22)))
-
-c256_b_23 :: Chunk
-c256_b_23 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 23)))
-
-c256_b_24 :: Chunk
-c256_b_24 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 24)))
-
-c256_b_25 :: Chunk
-c256_b_25 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 25)))
-
-c256_b_26 :: Chunk
-c256_b_26 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 26)))
-
-c256_b_27 :: Chunk
-c256_b_27 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 27)))
-
-c256_b_28 :: Chunk
-c256_b_28 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 28)))
-
-c256_b_29 :: Chunk
-c256_b_29 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 29)))
-
-c256_b_30 :: Chunk
-c256_b_30 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 30)))
-
-c256_b_31 :: Chunk
-c256_b_31 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 31)))
-
-c256_b_32 :: Chunk
-c256_b_32 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 32)))
-
-c256_b_33 :: Chunk
-c256_b_33 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 33)))
-
-c256_b_34 :: Chunk
-c256_b_34 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 34)))
-
-c256_b_35 :: Chunk
-c256_b_35 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 35)))
-
-c256_b_36 :: Chunk
-c256_b_36 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 36)))
-
-c256_b_37 :: Chunk
-c256_b_37 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 37)))
-
-c256_b_38 :: Chunk
-c256_b_38 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 38)))
-
-c256_b_39 :: Chunk
-c256_b_39 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 39)))
-
-c256_b_40 :: Chunk
-c256_b_40 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 40)))
-
-c256_b_41 :: Chunk
-c256_b_41 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 41)))
-
-c256_b_42 :: Chunk
-c256_b_42 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 42)))
-
-c256_b_43 :: Chunk
-c256_b_43 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 43)))
-
-c256_b_44 :: Chunk
-c256_b_44 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 44)))
-
-c256_b_45 :: Chunk
-c256_b_45 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 45)))
-
-c256_b_46 :: Chunk
-c256_b_46 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 46)))
-
-c256_b_47 :: Chunk
-c256_b_47 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 47)))
-
-c256_b_48 :: Chunk
-c256_b_48 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 48)))
-
-c256_b_49 :: Chunk
-c256_b_49 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 49)))
-
-c256_b_50 :: Chunk
-c256_b_50 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 50)))
-
-c256_b_51 :: Chunk
-c256_b_51 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 51)))
-
-c256_b_52 :: Chunk
-c256_b_52 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 52)))
-
-c256_b_53 :: Chunk
-c256_b_53 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 53)))
-
-c256_b_54 :: Chunk
-c256_b_54 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 54)))
-
-c256_b_55 :: Chunk
-c256_b_55 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 55)))
-
-c256_b_56 :: Chunk
-c256_b_56 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 56)))
-
-c256_b_57 :: Chunk
-c256_b_57 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 57)))
-
-c256_b_58 :: Chunk
-c256_b_58 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 58)))
-
-c256_b_59 :: Chunk
-c256_b_59 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 59)))
-
-c256_b_60 :: Chunk
-c256_b_60 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 60)))
-
-c256_b_61 :: Chunk
-c256_b_61 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 61)))
-
-c256_b_62 :: Chunk
-c256_b_62 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 62)))
-
-c256_b_63 :: Chunk
-c256_b_63 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 63)))
-
-c256_b_64 :: Chunk
-c256_b_64 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 64)))
-
-c256_b_65 :: Chunk
-c256_b_65 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 65)))
-
-c256_b_66 :: Chunk
-c256_b_66 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 66)))
-
-c256_b_67 :: Chunk
-c256_b_67 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 67)))
-
-c256_b_68 :: Chunk
-c256_b_68 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 68)))
-
-c256_b_69 :: Chunk
-c256_b_69 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 69)))
-
-c256_b_70 :: Chunk
-c256_b_70 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 70)))
-
-c256_b_71 :: Chunk
-c256_b_71 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 71)))
-
-c256_b_72 :: Chunk
-c256_b_72 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 72)))
-
-c256_b_73 :: Chunk
-c256_b_73 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 73)))
-
-c256_b_74 :: Chunk
-c256_b_74 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 74)))
-
-c256_b_75 :: Chunk
-c256_b_75 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 75)))
-
-c256_b_76 :: Chunk
-c256_b_76 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 76)))
-
-c256_b_77 :: Chunk
-c256_b_77 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 77)))
-
-c256_b_78 :: Chunk
-c256_b_78 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 78)))
-
-c256_b_79 :: Chunk
-c256_b_79 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 79)))
-
-c256_b_80 :: Chunk
-c256_b_80 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 80)))
-
-c256_b_81 :: Chunk
-c256_b_81 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 81)))
-
-c256_b_82 :: Chunk
-c256_b_82 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 82)))
-
-c256_b_83 :: Chunk
-c256_b_83 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 83)))
-
-c256_b_84 :: Chunk
-c256_b_84 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 84)))
-
-c256_b_85 :: Chunk
-c256_b_85 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 85)))
-
-c256_b_86 :: Chunk
-c256_b_86 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 86)))
-
-c256_b_87 :: Chunk
-c256_b_87 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 87)))
-
-c256_b_88 :: Chunk
-c256_b_88 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 88)))
-
-c256_b_89 :: Chunk
-c256_b_89 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 89)))
-
-c256_b_90 :: Chunk
-c256_b_90 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 90)))
-
-c256_b_91 :: Chunk
-c256_b_91 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 91)))
-
-c256_b_92 :: Chunk
-c256_b_92 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 92)))
-
-c256_b_93 :: Chunk
-c256_b_93 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 93)))
-
-c256_b_94 :: Chunk
-c256_b_94 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 94)))
-
-c256_b_95 :: Chunk
-c256_b_95 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 95)))
-
-c256_b_96 :: Chunk
-c256_b_96 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 96)))
-
-c256_b_97 :: Chunk
-c256_b_97 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 97)))
-
-c256_b_98 :: Chunk
-c256_b_98 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 98)))
-
-c256_b_99 :: Chunk
-c256_b_99 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 99)))
-
-c256_b_100 :: Chunk
-c256_b_100 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 100)))
-
-c256_b_101 :: Chunk
-c256_b_101 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 101)))
-
-c256_b_102 :: Chunk
-c256_b_102 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 102)))
-
-c256_b_103 :: Chunk
-c256_b_103 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 103)))
-
-c256_b_104 :: Chunk
-c256_b_104 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 104)))
-
-c256_b_105 :: Chunk
-c256_b_105 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 105)))
-
-c256_b_106 :: Chunk
-c256_b_106 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 106)))
-
-c256_b_107 :: Chunk
-c256_b_107 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 107)))
-
-c256_b_108 :: Chunk
-c256_b_108 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 108)))
-
-c256_b_109 :: Chunk
-c256_b_109 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 109)))
-
-c256_b_110 :: Chunk
-c256_b_110 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 110)))
-
-c256_b_111 :: Chunk
-c256_b_111 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 111)))
-
-c256_b_112 :: Chunk
-c256_b_112 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 112)))
-
-c256_b_113 :: Chunk
-c256_b_113 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 113)))
-
-c256_b_114 :: Chunk
-c256_b_114 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 114)))
-
-c256_b_115 :: Chunk
-c256_b_115 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 115)))
-
-c256_b_116 :: Chunk
-c256_b_116 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 116)))
-
-c256_b_117 :: Chunk
-c256_b_117 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 117)))
-
-c256_b_118 :: Chunk
-c256_b_118 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 118)))
-
-c256_b_119 :: Chunk
-c256_b_119 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 119)))
-
-c256_b_120 :: Chunk
-c256_b_120 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 120)))
-
-c256_b_121 :: Chunk
-c256_b_121 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 121)))
-
-c256_b_122 :: Chunk
-c256_b_122 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 122)))
-
-c256_b_123 :: Chunk
-c256_b_123 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 123)))
-
-c256_b_124 :: Chunk
-c256_b_124 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 124)))
-
-c256_b_125 :: Chunk
-c256_b_125 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 125)))
-
-c256_b_126 :: Chunk
-c256_b_126 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 126)))
-
-c256_b_127 :: Chunk
-c256_b_127 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 127)))
-
-c256_b_128 :: Chunk
-c256_b_128 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 128)))
-
-c256_b_129 :: Chunk
-c256_b_129 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 129)))
-
-c256_b_130 :: Chunk
-c256_b_130 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 130)))
-
-c256_b_131 :: Chunk
-c256_b_131 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 131)))
-
-c256_b_132 :: Chunk
-c256_b_132 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 132)))
-
-c256_b_133 :: Chunk
-c256_b_133 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 133)))
-
-c256_b_134 :: Chunk
-c256_b_134 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 134)))
-
-c256_b_135 :: Chunk
-c256_b_135 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 135)))
-
-c256_b_136 :: Chunk
-c256_b_136 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 136)))
-
-c256_b_137 :: Chunk
-c256_b_137 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 137)))
-
-c256_b_138 :: Chunk
-c256_b_138 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 138)))
-
-c256_b_139 :: Chunk
-c256_b_139 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 139)))
-
-c256_b_140 :: Chunk
-c256_b_140 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 140)))
-
-c256_b_141 :: Chunk
-c256_b_141 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 141)))
-
-c256_b_142 :: Chunk
-c256_b_142 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 142)))
-
-c256_b_143 :: Chunk
-c256_b_143 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 143)))
-
-c256_b_144 :: Chunk
-c256_b_144 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 144)))
-
-c256_b_145 :: Chunk
-c256_b_145 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 145)))
-
-c256_b_146 :: Chunk
-c256_b_146 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 146)))
-
-c256_b_147 :: Chunk
-c256_b_147 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 147)))
-
-c256_b_148 :: Chunk
-c256_b_148 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 148)))
-
-c256_b_149 :: Chunk
-c256_b_149 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 149)))
-
-c256_b_150 :: Chunk
-c256_b_150 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 150)))
-
-c256_b_151 :: Chunk
-c256_b_151 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 151)))
-
-c256_b_152 :: Chunk
-c256_b_152 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 152)))
-
-c256_b_153 :: Chunk
-c256_b_153 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 153)))
-
-c256_b_154 :: Chunk
-c256_b_154 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 154)))
-
-c256_b_155 :: Chunk
-c256_b_155 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 155)))
-
-c256_b_156 :: Chunk
-c256_b_156 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 156)))
-
-c256_b_157 :: Chunk
-c256_b_157 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 157)))
-
-c256_b_158 :: Chunk
-c256_b_158 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 158)))
-
-c256_b_159 :: Chunk
-c256_b_159 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 159)))
-
-c256_b_160 :: Chunk
-c256_b_160 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 160)))
-
-c256_b_161 :: Chunk
-c256_b_161 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 161)))
-
-c256_b_162 :: Chunk
-c256_b_162 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 162)))
-
-c256_b_163 :: Chunk
-c256_b_163 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 163)))
-
-c256_b_164 :: Chunk
-c256_b_164 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 164)))
-
-c256_b_165 :: Chunk
-c256_b_165 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 165)))
-
-c256_b_166 :: Chunk
-c256_b_166 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 166)))
-
-c256_b_167 :: Chunk
-c256_b_167 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 167)))
-
-c256_b_168 :: Chunk
-c256_b_168 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 168)))
-
-c256_b_169 :: Chunk
-c256_b_169 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 169)))
-
-c256_b_170 :: Chunk
-c256_b_170 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 170)))
-
-c256_b_171 :: Chunk
-c256_b_171 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 171)))
-
-c256_b_172 :: Chunk
-c256_b_172 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 172)))
-
-c256_b_173 :: Chunk
-c256_b_173 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 173)))
-
-c256_b_174 :: Chunk
-c256_b_174 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 174)))
-
-c256_b_175 :: Chunk
-c256_b_175 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 175)))
-
-c256_b_176 :: Chunk
-c256_b_176 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 176)))
-
-c256_b_177 :: Chunk
-c256_b_177 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 177)))
-
-c256_b_178 :: Chunk
-c256_b_178 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 178)))
-
-c256_b_179 :: Chunk
-c256_b_179 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 179)))
-
-c256_b_180 :: Chunk
-c256_b_180 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 180)))
-
-c256_b_181 :: Chunk
-c256_b_181 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 181)))
-
-c256_b_182 :: Chunk
-c256_b_182 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 182)))
-
-c256_b_183 :: Chunk
-c256_b_183 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 183)))
-
-c256_b_184 :: Chunk
-c256_b_184 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 184)))
-
-c256_b_185 :: Chunk
-c256_b_185 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 185)))
-
-c256_b_186 :: Chunk
-c256_b_186 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 186)))
-
-c256_b_187 :: Chunk
-c256_b_187 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 187)))
-
-c256_b_188 :: Chunk
-c256_b_188 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 188)))
-
-c256_b_189 :: Chunk
-c256_b_189 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 189)))
-
-c256_b_190 :: Chunk
-c256_b_190 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 190)))
-
-c256_b_191 :: Chunk
-c256_b_191 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 191)))
-
-c256_b_192 :: Chunk
-c256_b_192 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 192)))
-
-c256_b_193 :: Chunk
-c256_b_193 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 193)))
-
-c256_b_194 :: Chunk
-c256_b_194 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 194)))
-
-c256_b_195 :: Chunk
-c256_b_195 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 195)))
-
-c256_b_196 :: Chunk
-c256_b_196 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 196)))
-
-c256_b_197 :: Chunk
-c256_b_197 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 197)))
-
-c256_b_198 :: Chunk
-c256_b_198 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 198)))
-
-c256_b_199 :: Chunk
-c256_b_199 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 199)))
-
-c256_b_200 :: Chunk
-c256_b_200 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 200)))
-
-c256_b_201 :: Chunk
-c256_b_201 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 201)))
-
-c256_b_202 :: Chunk
-c256_b_202 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 202)))
-
-c256_b_203 :: Chunk
-c256_b_203 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 203)))
-
-c256_b_204 :: Chunk
-c256_b_204 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 204)))
-
-c256_b_205 :: Chunk
-c256_b_205 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 205)))
-
-c256_b_206 :: Chunk
-c256_b_206 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 206)))
-
-c256_b_207 :: Chunk
-c256_b_207 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 207)))
-
-c256_b_208 :: Chunk
-c256_b_208 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 208)))
-
-c256_b_209 :: Chunk
-c256_b_209 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 209)))
-
-c256_b_210 :: Chunk
-c256_b_210 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 210)))
-
-c256_b_211 :: Chunk
-c256_b_211 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 211)))
-
-c256_b_212 :: Chunk
-c256_b_212 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 212)))
-
-c256_b_213 :: Chunk
-c256_b_213 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 213)))
-
-c256_b_214 :: Chunk
-c256_b_214 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 214)))
-
-c256_b_215 :: Chunk
-c256_b_215 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 215)))
-
-c256_b_216 :: Chunk
-c256_b_216 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 216)))
-
-c256_b_217 :: Chunk
-c256_b_217 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 217)))
-
-c256_b_218 :: Chunk
-c256_b_218 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 218)))
-
-c256_b_219 :: Chunk
-c256_b_219 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 219)))
-
-c256_b_220 :: Chunk
-c256_b_220 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 220)))
-
-c256_b_221 :: Chunk
-c256_b_221 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 221)))
-
-c256_b_222 :: Chunk
-c256_b_222 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 222)))
-
-c256_b_223 :: Chunk
-c256_b_223 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 223)))
-
-c256_b_224 :: Chunk
-c256_b_224 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 224)))
-
-c256_b_225 :: Chunk
-c256_b_225 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 225)))
-
-c256_b_226 :: Chunk
-c256_b_226 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 226)))
-
-c256_b_227 :: Chunk
-c256_b_227 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 227)))
-
-c256_b_228 :: Chunk
-c256_b_228 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 228)))
-
-c256_b_229 :: Chunk
-c256_b_229 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 229)))
-
-c256_b_230 :: Chunk
-c256_b_230 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 230)))
-
-c256_b_231 :: Chunk
-c256_b_231 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 231)))
-
-c256_b_232 :: Chunk
-c256_b_232 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 232)))
-
-c256_b_233 :: Chunk
-c256_b_233 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 233)))
-
-c256_b_234 :: Chunk
-c256_b_234 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 234)))
-
-c256_b_235 :: Chunk
-c256_b_235 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 235)))
-
-c256_b_236 :: Chunk
-c256_b_236 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 236)))
-
-c256_b_237 :: Chunk
-c256_b_237 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 237)))
-
-c256_b_238 :: Chunk
-c256_b_238 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 238)))
-
-c256_b_239 :: Chunk
-c256_b_239 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 239)))
-
-c256_b_240 :: Chunk
-c256_b_240 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 240)))
-
-c256_b_241 :: Chunk
-c256_b_241 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 241)))
-
-c256_b_242 :: Chunk
-c256_b_242 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 242)))
-
-c256_b_243 :: Chunk
-c256_b_243 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 243)))
-
-c256_b_244 :: Chunk
-c256_b_244 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 244)))
-
-c256_b_245 :: Chunk
-c256_b_245 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 245)))
-
-c256_b_246 :: Chunk
-c256_b_246 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 246)))
-
-c256_b_247 :: Chunk
-c256_b_247 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 247)))
-
-c256_b_248 :: Chunk
-c256_b_248 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 248)))
-
-c256_b_249 :: Chunk
-c256_b_249 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 249)))
-
-c256_b_250 :: Chunk
-c256_b_250 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 250)))
-
-c256_b_251 :: Chunk
-c256_b_251 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 251)))
-
-c256_b_252 :: Chunk
-c256_b_252 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 252)))
-
-c256_b_253 :: Chunk
-c256_b_253 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 253)))
-
-c256_b_254 :: Chunk
-c256_b_254 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 254)))
-
-c256_b_255 :: Chunk
-c256_b_255 = mempty & textSpec . style256 . background256
-  . unwrapped .~ (Just (Just (T.ColorNumber 255)))
-
diff --git a/lib/Rainbow.hs b/lib/Rainbow.hs
new file mode 100644
--- /dev/null
+++ b/lib/Rainbow.hs
@@ -0,0 +1,354 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveFoldable #-}
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RankNTypes #-}
+
+-- | Rainbow handles colors and special effects for text.  The basic
+-- building block of Rainbow is the 'Y.Chunk'.  The 'Y.Chunk' contains
+-- both text and formatting information such as colors, bold,
+-- underlining, etc.  'Y.Chunk' is an instance of
+-- 'Data.String.IsString' so you can create a 'Y.Chunk' using the
+-- @OverloadedStrings@ extension.  Such a chunk has the given text
+-- and has no formatting.
+--
+-- When printed, each 'Y.Chunk' starts off with a clean slate, so if
+-- you want special formatting such as any color, bold, etc, then you
+-- must specify it for every 'Y.Chunk'.  The appearance of one
+-- 'Y.Chunk' does not affect the appearance of the next 'Y.Chunk'.
+-- This makes it easy to reason about how a particular 'Y.Chunk' will
+-- look.
+--
+-- Rainbow supports 256-color terminals.  You have full freedom to
+-- specify different attributes and colors for 8 and 256 color
+-- terminals; for instance, you can have text appear red on an 8-color
+-- terminal but blue on a 256-color terminal.
+--
+-- Here are some basic examples:
+--
+-- @
+-- ghci> import Rainbow
+-- ghci> import Data.Function ((&))
+-- ghci> :set -XOverloadedStrings
+-- ghci> 'T.putChunkLn' $ \"Some blue text\" '&' 'fore' 'blue'
+-- ghci> 'T.putChunkLn' $ \"Blue on red background\"
+--               '&' 'fore' 'blue' '&' 'back' 'red'
+-- ghci> 'T.putChunkLn' $ \"Blue on red, foreground bold\"
+--                '&' 'fore' 'blue' '&' 'back' 'red' '&' 'bold'
+-- @
+--
+-- You can also specify output for 256-color terminals. To use these
+-- examples, be sure your TERM environment variable is set to
+-- something that supports 256 colors (like @xterm-256color@) before
+-- you start GHCi.
+--
+-- @
+-- ghci> 'T.putChunkLn' $ \"Blue on 8, bright green on 256\" '&'
+--    'fore' ('blue' '<>' 'brightGreen')
+--
+-- ghci> 'T.putChunkLn' $ \"Blue on 8, red on 256" '&'
+--    'fore' ('blue' '<>' 'only256' 'red')
+-- @
+--
+-- Each 'Y.Chunk' affects the formatting only of that 'Y.Chunk'.  So
+-- to print things in different colors, make more than one 'Y.Chunk':
+--
+-- @
+-- ghci> 'T.putChunksLn'
+--    [ \"Roses\" '&' 'fore' 'red'
+--    , \"Violets\" '&' 'fore' 'blue' ]
+-- @
+--
+-- Most of the above examples use 'T.putChunkLn', but that function
+-- may be inefficient if you are printing many 'Y.Chunk's.  For
+-- greater efficiency use functions under the heading \"Converting
+-- multiple Chunk to ByteString\", including 'T.putChunksLn' and
+-- 'T.putChunks'.
+--
+-- The functions in this module, "Rainbow", will likely be enough for
+-- most uses, but for more flexibility you can use "Rainbow.Types".
+-- Use of "Rainbow.Types" will require some familiarity with the
+-- @lens@ library.
+
+
+module Rainbow
+  (
+  -- * Chunk
+    Y.Chunk
+  , Y.chunk
+
+  -- * Formatting, all terminals
+
+  -- | These combinators affect the way a 'Y.Chunk' is displayed on
+  -- both 8- and 256-color terminals.
+  , bold
+  , faint
+  , italic
+  , underline
+  , blink
+  , inverse
+  , invisible
+  , strikeout
+
+  -- * Colors
+  , Y.Radiant
+  , fore
+  , back
+
+  -- * Colors, all terminals
+
+  -- | These 'Y.Radiant' affect the way a 'Y.Chunk' is displayed on
+  -- both 8- and 256-color terminals.
+  , black
+  , red
+  , green
+  , yellow
+  , blue
+  , magenta
+  , cyan
+  , white
+
+  -- * Colors, 256-color terminals only
+
+  -- | These 'Y.Radiant' affect 256-color terminals only.
+  , grey
+  , brightRed
+  , brightGreen
+  , brightYellow
+  , brightBlue
+  , brightMagenta
+  , brightCyan
+  , brightWhite
+  , color256
+  , only256
+
+  -- * Converting multiple 'Y.Chunk' to 'Data.ByteString.ByteString'
+
+  -- | To print a 'Y.Chunk', you need to convert it to some
+  -- 'Data.ByteString.ByteString's.
+  --
+  -- All these functions convert the 'Data.Text' to UTF-8
+  -- 'Data.ByteString.ByteString's.  Many of these functions return a
+  -- difference list.  Learn You a Haskell for Great Good has a great
+  -- explanation of difference lists:
+  --
+  -- http://learnyouahaskell.com/for-a-few-monads-more
+  --
+  -- If you don't want to learn about difference lists, just stick
+  -- with using 'T.chunksToByteStrings' and use
+  -- 'T.byteStringMakerFromEnvironment' if you want to use the highest
+  -- number of colors possible, or, to manually specify the number of
+  -- colors, use 'T.chunksToByteStrings' with 'T.toByteStringsColors0',
+  -- 'T.toByteStringsColors8', or 'T.toByteStringsColors256' as the first
+  -- argument.  'T.chunksToByteStrings' has an example.
+  --
+  -- For output to handles or to standard output, just use
+  -- 'T.hPutChunks' or 'T.putChunks'.
+  , T.toByteStringsColors0
+  , T.toByteStringsColors8
+  , T.toByteStringsColors256
+  , T.byteStringMakerFromEnvironment
+  , T.byteStringMakerFromHandle
+  , T.chunksToByteStrings
+
+  -- * Writing multiple 'Y.Chunk' to a handle or to standard output
+  , T.putChunks
+  , T.hPutChunks
+  , T.putChunksLn
+  , T.hPutChunksLn
+
+  -- * Quick and dirty functions for IO
+
+  -- | For efficiency reasons you probably don't want to use these
+  -- when printing large numbers of 'Y.Chunk', but they are handy for
+  -- throwaway uses like experimenting in GHCi.
+  , T.putChunk
+  , T.putChunkLn
+
+  -- * Notes on terminals
+  -- $termNotes
+
+  ) where
+
+import qualified Rainbow.Translate as T
+import qualified Rainbow.Types as Y
+import Data.Word (Word8)
+import Data.Function ((&))
+import qualified Control.Lens as Lens
+import Control.Lens ((.~))
+import Data.Monoid (Monoid(mempty))
+
+formatBoth :: Lens.Setter' Y.Format Bool -> Y.Chunk -> Y.Chunk
+formatBoth get c = c & Y.scheme . Y.style8 . Y.format . get .~ True
+  & Y.scheme . Y.style256 . Y.format . get .~ True
+
+-- | Bold. What actually happens when you use Bold is going to depend
+-- on your terminal. For example, xterm allows you actually use a bold
+-- font for bold, if you have one. Otherwise, it might simulate bold
+-- by using overstriking. Another possibility is that your terminal
+-- might use a different color to indicate bold. For more details (at
+-- least for xterm), look at xterm (1) and search for @boldColors@.
+--
+-- If your terminal uses a different color for bold, this allows an
+-- 8-color terminal to really have 16 colors.
+bold :: Y.Chunk -> Y.Chunk
+bold = formatBoth Y.bold
+
+faint :: Y.Chunk -> Y.Chunk
+faint = formatBoth Y.faint
+
+italic :: Y.Chunk -> Y.Chunk
+italic = formatBoth Y.italic
+
+underline :: Y.Chunk -> Y.Chunk
+underline = formatBoth Y.underline
+
+blink :: Y.Chunk -> Y.Chunk
+blink = formatBoth Y.blink
+
+inverse :: Y.Chunk -> Y.Chunk
+inverse = formatBoth Y.inverse
+
+invisible :: Y.Chunk -> Y.Chunk
+invisible = formatBoth Y.invisible
+
+strikeout :: Y.Chunk -> Y.Chunk
+strikeout = formatBoth Y.strikeout
+
+-- | Change the foreground color.  Whether this affects 8-color
+-- terminals, 256-color terminals, or both depends on the 'Y.Radiant'.
+fore :: Y.Radiant -> Y.Chunk -> Y.Chunk
+fore (Y.Radiant c8 c256) c = c & Y.scheme . Y.style8 . Y.fore .~ c8
+  & Y.scheme . Y.style256 . Y.fore .~ c256
+
+-- | Change the background color.  Whether this affects 8-color
+-- terminals, 256-color terminals, or both depends on the 'Y.Radiant'.
+back :: Y.Radiant -> Y.Chunk -> Y.Chunk
+back (Y.Radiant c8 c256) c = c & Y.scheme . Y.style8 . Y.back .~ c8
+  & Y.scheme . Y.style256 . Y.back .~ c256
+
+-- | Ensures that a 'Y.Radiant' affects only a 256-color terminal.
+-- For instance, to make text that is blue on an 8-color terminal but
+-- red on a 256-color terminal:
+--
+-- @
+-- 'T.putChunkLn' $ \"Blue on 8, red on 256\" &
+--    'fore' ('blue' <> 'only256' 'red')
+-- @
+only256 :: Y.Radiant -> Y.Radiant
+only256 (Y.Radiant _ c256) = Y.Radiant mempty c256
+
+black :: Y.Radiant
+black = Y.Radiant (Y.Color (Just Y.E0)) (Y.Color (Just 0))
+
+red :: Y.Radiant
+red = Y.Radiant (Y.Color (Just Y.E1)) (Y.Color (Just 1))
+
+green :: Y.Radiant
+green = Y.Radiant (Y.Color (Just Y.E2)) (Y.Color (Just 2))
+
+yellow :: Y.Radiant
+yellow = Y.Radiant (Y.Color (Just Y.E3)) (Y.Color (Just 3))
+
+blue :: Y.Radiant
+blue = Y.Radiant (Y.Color (Just Y.E4)) (Y.Color (Just 4))
+
+magenta :: Y.Radiant
+magenta = Y.Radiant (Y.Color (Just Y.E5)) (Y.Color (Just 5))
+
+cyan :: Y.Radiant
+cyan = Y.Radiant (Y.Color (Just Y.E6)) (Y.Color (Just 6))
+
+white :: Y.Radiant
+white = Y.Radiant (Y.Color (Just Y.E7)) (Y.Color (Just 7))
+
+grey :: Y.Radiant
+grey = color256 8
+
+brightRed :: Y.Radiant
+brightRed = color256 9
+
+brightGreen :: Y.Radiant
+brightGreen = color256 10
+
+brightYellow :: Y.Radiant
+brightYellow = color256 11
+
+brightBlue :: Y.Radiant
+brightBlue = color256 12
+
+brightMagenta :: Y.Radiant
+brightMagenta = color256 13
+
+brightCyan :: Y.Radiant
+brightCyan = color256 14
+
+brightWhite :: Y.Radiant
+brightWhite = color256 15
+
+-- | A 'Y.Radiant' for any of the 256 colors available.  Supply the
+-- color number.  Exactly which color you'll get for a given number
+-- is dependent on the terminal; though there seem to be common
+-- defaults, often the user can configure this however she likes.
+-- The resulting 'Y.Radiant' will affect 256-color terminals only.
+color256 :: Word8 -> Y.Radiant
+color256 x = Y.Radiant (Y.Color Nothing) (Y.Color (Just x))
+
+
+{- $termNotes
+
+Earlier versions of Rainbow used the Haskell terminfo library for
+dealing with the terminal.  Terminfo is available at
+
+<https://hackage.haskell.org/package/terminfo>
+
+Terminfo, in turn, uses the UNIX terminfo library.  The biggest
+advantage of using Terminfo is that it is compatible with a huge
+variety of terminals.  Many of these terminals are hardware models
+that are gathering dust in an IBM warehouse somewhere, but even modern
+software terminals might have quirks.  Terminfo covers all those.
+
+The disadvantage is that using Terminfo requires you to perform IO
+whenever you need to format output for the terminal.  Your only choice
+when using Terminfo is to send output directly to the terminal, or to
+a handle.  This goes against typical Haskell practice, where we try to
+write pure code whenever possible.
+
+Perhaps surprisingly, there are times where you may want to format
+output, but not immediately send it to the terminal.  Maybe you want
+to send it to a file instead, or maybe you want to use a Haskell
+library like Pipes and stream it somewhere.  Terminfo is a binding to
+a Unix library that is not designed for this sort of thing.  The
+closest you could get using Terminfo would be to make a Handle that is
+backed by a in-memory buffer.  There is a package for that sort of
+thing:
+
+<http://hackage.haskell.org/package/knob>
+
+but it seems like a nasty workaround.  Or you can hijack stdout and
+send that somewhere--again, nasty workaround.
+
+So I decided to stop using Terminfo.  That means Rainbow no longer
+supports a menagerie of bizarre terminals.  It instead just uses the
+standard ISO 6429 / ECMA 48 terminal codes.  These are the same codes
+that are used by xterm, the OS X Terminal, the Linux console, or any
+other reasonably modern software terminal.  Realistically they are the
+only terminals Rainbow would be used for.
+
+The 256 color capability is not in ISO 6429, but it is widely supported.
+
+Probably the most common so-called terminals in use today that do NOT
+support the ISO 6429 codes are those that are not really terminals.
+For instance, you might use an Emacs shell buffer.  For those
+situations just use 'T.toByteStringsColors0'.
+
+I also decided to standardize on UTF-8 for the 'Data.Text.Text'
+output.  These days that seems reasonable.
+
+Apparently it's difficult to get ISO 6429 support on Microsoft
+Windows.  Oh well.
+
+-}
diff --git a/lib/Rainbow/Translate.hs b/lib/Rainbow/Translate.hs
new file mode 100644
--- /dev/null
+++ b/lib/Rainbow/Translate.hs
@@ -0,0 +1,355 @@
+{-# LANGUAGE FlexibleInstances #-}
+
+-- | This module contains functions that convert a 'T.Chunk' into
+-- 'ByteString's.  Ordinarily everything you need from this module is
+-- exported from "Rainbow".
+module Rainbow.Translate where
+
+import Control.Exception (try)
+import Data.ByteString (ByteString)
+import Data.List (intersperse)
+import Data.Text (Text)
+import Data.Word (Word8)
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Char8 as BS8
+import qualified Data.Text.Encoding as X
+import qualified Rainbow.Types as T
+import qualified System.Console.Terminfo as Terminfo
+import qualified System.IO as IO
+
+
+single :: Char -> [ByteString] -> [ByteString]
+single c = ((BS8.singleton c):)
+
+escape :: [ByteString] -> [ByteString]
+escape = single '\x1B'
+
+csi :: [ByteString] -> [ByteString]
+csi = escape . single '['
+
+sgr :: ([ByteString] -> [ByteString]) -> [ByteString] -> [ByteString]
+sgr sq = csi . sq . single 'm'
+
+params :: Show a => [a] -> [ByteString] -> [ByteString]
+params cs = ((intersperse semi . map (BS8.pack . show) $ cs) ++)
+  where
+    semi = BS8.singleton ';'
+
+sgrSingle :: Word -> [ByteString] -> [ByteString]
+sgrSingle w = sgr $ params [w]
+
+sgrDouble :: Word -> Word -> [ByteString] -> [ByteString]
+sgrDouble x y = sgr $ params [x, y]
+
+normalDefault :: [ByteString] -> [ByteString]
+normalDefault = sgrSingle 0
+
+bold :: [ByteString] -> [ByteString]
+bold = sgrSingle 1
+
+faint :: [ByteString] -> [ByteString]
+faint = sgrSingle 2
+
+italic :: [ByteString] -> [ByteString]
+italic = sgrSingle 3
+
+underline :: [ByteString] -> [ByteString]
+underline = sgrSingle 4
+
+blink :: [ByteString] -> [ByteString]
+blink = sgrSingle 5
+
+-- Yes, blink is 5, inverse is 7; 6 is skipped.  In ISO 6429 6 blinks
+-- at a different rate.
+
+inverse :: [ByteString] -> [ByteString]
+inverse = sgrSingle 7
+
+invisible :: [ByteString] -> [ByteString]
+invisible = sgrSingle 8
+
+strikeout :: [ByteString] -> [ByteString]
+strikeout = sgrSingle 9
+
+foreBlack :: [ByteString] -> [ByteString]
+foreBlack = sgrSingle 30
+
+foreRed :: [ByteString] -> [ByteString]
+foreRed = sgrSingle 31
+
+foreGreen :: [ByteString] -> [ByteString]
+foreGreen = sgrSingle 32
+
+foreYellow :: [ByteString] -> [ByteString]
+foreYellow = sgrSingle 33
+
+foreBlue :: [ByteString] -> [ByteString]
+foreBlue = sgrSingle 34
+
+foreMagenta :: [ByteString] -> [ByteString]
+foreMagenta = sgrSingle 35
+
+foreCyan :: [ByteString] -> [ByteString]
+foreCyan = sgrSingle 36
+
+foreWhite :: [ByteString] -> [ByteString]
+foreWhite = sgrSingle 37
+
+-- code 3 8 is skipped
+
+foreDefault :: [ByteString] -> [ByteString]
+foreDefault = sgrSingle 39
+
+backBlack :: [ByteString] -> [ByteString]
+backBlack = sgrSingle 40
+
+backRed :: [ByteString] -> [ByteString]
+backRed = sgrSingle 41
+
+backGreen :: [ByteString] -> [ByteString]
+backGreen = sgrSingle 42
+
+backYellow :: [ByteString] -> [ByteString]
+backYellow = sgrSingle 43
+
+backBlue :: [ByteString] -> [ByteString]
+backBlue = sgrSingle 44
+
+backMagenta :: [ByteString] -> [ByteString]
+backMagenta = sgrSingle 45
+
+backCyan :: [ByteString] -> [ByteString]
+backCyan = sgrSingle 46
+
+backWhite :: [ByteString] -> [ByteString]
+backWhite = sgrSingle 47
+
+-- code 4 8 is skipped
+
+backDefault :: [ByteString] -> [ByteString]
+backDefault = sgrSingle 49
+
+fore256 :: Word8 -> [ByteString] -> [ByteString]
+fore256 c = sgr $ params [38,5,c]
+
+back256 :: Word8 -> [ByteString] -> [ByteString]
+back256 c = sgr $ params [48,5,c]
+
+foreColor8 :: T.Enum8 -> [ByteString] -> [ByteString]
+foreColor8 e8 = case e8 of
+  T.E0 -> foreBlack
+  T.E1 -> foreRed
+  T.E2 -> foreGreen
+  T.E3 -> foreYellow
+  T.E4 -> foreBlue
+  T.E5 -> foreMagenta
+  T.E6 -> foreCyan
+  T.E7 -> foreWhite
+
+backColor8 :: T.Enum8 -> [ByteString] -> [ByteString]
+backColor8 e8 = case e8 of
+  T.E0 -> backBlack
+  T.E1 -> backRed
+  T.E2 -> backGreen
+  T.E3 -> backYellow
+  T.E4 -> backBlue
+  T.E5 -> backMagenta
+  T.E6 -> backCyan
+  T.E7 -> backWhite
+
+renderFormat :: T.Format -> [ByteString] -> [ByteString]
+renderFormat (T.Format bld fnt ita und bli ivr isb stk)
+  = effect bold bld
+  . effect faint fnt
+  . effect italic ita
+  . effect underline und
+  . effect blink bli
+  . effect inverse ivr
+  . effect invisible isb
+  . effect strikeout stk
+  where
+    effect on x = if x then on else id
+
+renderStyle8 :: T.Style T.Enum8 -> [ByteString] -> [ByteString]
+renderStyle8 (T.Style fore back format)
+  = effect foreColor8 fore
+  . effect backColor8 back
+  . renderFormat format
+  where
+      effect on (T.Color may) = maybe id on may
+
+renderStyle256 :: T.Style Word8 -> [ByteString] -> [ByteString]
+renderStyle256 (T.Style fore back format)
+  = effect fore256 fore
+  . effect back256 back
+  . renderFormat format
+  where
+    effect on (T.Color may) = maybe id on may
+
+render :: Text -> [ByteString] -> [ByteString]
+render x = (X.encodeUtf8 x :)
+
+toByteStringsColors0
+  :: T.Chunk
+  -> [ByteString]
+  -> [ByteString]
+toByteStringsColors0 (T.Chunk _ yn) = render yn
+
+toByteStringsColors8
+  :: T.Chunk
+  -> [ByteString]
+  -> [ByteString]
+toByteStringsColors8 (T.Chunk (T.Scheme s8 _) yn)
+  = normalDefault
+  . renderStyle8 s8
+  . render yn
+  . normalDefault
+
+toByteStringsColors256
+  :: T.Chunk
+  -> [ByteString]
+  -> [ByteString]
+toByteStringsColors256 (T.Chunk (T.Scheme _ s256) yn)
+  = normalDefault
+  . renderStyle256 s256
+  . render yn
+  . normalDefault
+
+
+-- | Uses 'Terminfo.setupTermFromEnv' to obtain the terminal's color
+-- capability.  If this says there are at least 256 colors are
+-- available, returns 'toByteStringsColors256'.  Otherwise, if there
+-- are at least 8 colors available, returns 'toByteStringsColors8'.
+-- Otherwise, returns 'toByteStringsColors0'.
+--
+-- If the terminfo database could not be read (that is, if
+-- 'System.Console.Terminfo.Base.SetupTermError' is returned), then return
+-- 'toByteStringsColors0'.
+byteStringMakerFromEnvironment
+  :: IO (T.Chunk -> [ByteString] -> [ByteString])
+byteStringMakerFromEnvironment = fmap g (try Terminfo.setupTermFromEnv)
+  where
+    g (Left e) = toByteStringsColors0
+      where
+        -- Previously this caught all IOException.  Now it catches only SetupTermError.
+        -- See
+        -- https://github.com/commercialhaskell/stackage/issues/4994
+        -- Hopefully this will fix this Stackage bug.
+        _types = e :: Terminfo.SetupTermError
+    g (Right terminal) =
+      case Terminfo.getCapability terminal (Terminfo.tiGetNum "colors") of
+        Nothing -> toByteStringsColors0
+        Just c
+          | c >= 256 -> toByteStringsColors256
+          | c >= 8 -> toByteStringsColors8
+          | otherwise -> toByteStringsColors0
+
+-- | Like 'byteStringMakerFromEnvironment' but also consults a
+-- provided 'IO.Handle'.  If the 'IO.Handle' is not a terminal,
+-- 'toByteStringsColors0' is returned.  Otherwise, the value of
+-- 'byteStringMakerFromEnvironment' is returned.
+byteStringMakerFromHandle
+  :: IO.Handle
+  -> IO (T.Chunk -> [ByteString] -> [ByteString])
+byteStringMakerFromHandle h = IO.hIsTerminalDevice h >>= f
+  where
+    f isTerm | isTerm = byteStringMakerFromEnvironment
+             | otherwise = return toByteStringsColors0
+          
+
+-- | Convert a list of 'T.Chunk' to a list of 'ByteString'.  The
+-- length of the returned list may be longer than the length of the
+-- input list.
+--
+-- So, for example, to print a bunch of chunks to standard output
+-- using 256 colors:
+--
+-- > module PrintMyChunks where
+-- >
+-- > import qualified Data.ByteString as BS
+-- > import Rainbow
+-- >
+-- > myChunks :: [Chunk String]
+-- > myChunks = [ chunk "Roses" & fore red, chunk "\n",
+-- >              chunk "Violets" & fore blue, chunk "\n" ]
+-- >
+-- > myPrintedChunks :: IO ()
+-- > myPrintedChunks = mapM_ BS.putStr
+-- >                 . chunksToByteStrings toByteStringsColors256
+-- >                 $ myChunks
+--
+-- To use the highest number of colors that this terminal supports:
+--
+-- > myPrintedChunks' :: IO ()
+-- > myPrintedChunks' = do
+-- >   printer <- byteStringMakerFromEnvironment
+-- >   mapM_ BS.putStr
+-- >     . chunksToByteStrings printer
+-- >     $ myChunks
+
+chunksToByteStrings
+  :: (T.Chunk -> [ByteString] -> [ByteString])
+  -- ^ Function that converts 'T.Chunk' to 'ByteString'.  This
+  -- function, when applied to a 'T.Chunk', returns a difference list.
+  -> [T.Chunk]
+  -> [ByteString]
+chunksToByteStrings mk = ($ []) . foldr (.) id . map mk
+
+-- | Writes a list of chunks to the given 'IO.Handle'.
+--
+-- First uses 'byteStringMakerFromEnvironment' to determine how many
+-- colors to use.  Then creates a list of 'ByteString' using
+-- 'chunksToByteStrings' and then writes them to the given 'IO.Handle'.
+hPutChunks :: IO.Handle -> [T.Chunk] -> IO ()
+hPutChunks h cks = do
+  maker <- byteStringMakerFromEnvironment
+  let bsList = chunksToByteStrings maker cks
+  mapM_ (BS.hPut h) bsList
+
+-- | Writes a list of chunks to the given 'IO.Handle', followed by a
+-- newline character.
+--
+-- First uses 'byteStringMakerFromEnvironment' to determine how many
+-- colors to use.  Then creates a list of 'ByteString' using
+-- 'chunksToByteStrings' and then writes them to the given 'IO.Handle'.
+hPutChunksLn :: IO.Handle -> [T.Chunk] -> IO ()
+hPutChunksLn h cks = do
+  hPutChunks h cks
+  IO.hPutStr h "\n"
+
+-- | Writes a list of chunks to standard output.
+--
+-- First uses 'byteStringMakerFromEnvironment' to determine how many
+-- colors to use.  Then creates a list of 'ByteString' using
+-- 'chunksToByteStrings' and then writes them to standard output.
+putChunks :: [T.Chunk] -> IO ()
+putChunks = hPutChunks IO.stdout
+
+-- | Writes a list of chunks to standard output, followed by a
+-- newline.
+--
+-- First uses 'byteStringMakerFromEnvironment' to determine how many
+-- colors to use.  Then creates a list of 'ByteString' using
+-- 'chunksToByteStrings' and then writes them to standard output.
+putChunksLn :: [T.Chunk] -> IO ()
+putChunksLn cks = do
+  putChunks cks
+  IO.putStr "\n"
+
+-- | Writes a 'T.Chunk' to standard output.  Uses
+-- 'byteStringMakerFromEnvironment' each time you apply it, so this
+-- might be inefficient.  You are better off using
+-- 'chunksToByteStrings' and the functions in "Data.ByteString" to
+-- print your 'T.Chunk's if you are printing a lot of them.
+putChunk :: T.Chunk -> IO ()
+putChunk ck = do
+  mkr <- byteStringMakerFromEnvironment
+  mapM_ BS.putStr . chunksToByteStrings mkr $ [ck]
+
+-- | Writes a 'T.Chunk' to standard output, and appends a newline.
+-- Uses 'byteStringMakerFromEnvironment' each time you apply it, so
+-- this might be inefficient.  You are better off using
+-- 'chunksToByteStrings' and the functions in "Data.ByteString" to
+-- print your 'T.Chunk's if you are printing a lot of them.
+putChunkLn :: T.Chunk -> IO ()
+putChunkLn ck = putChunk ck >> putStrLn ""
diff --git a/lib/Rainbow/Types.hs b/lib/Rainbow/Types.hs
new file mode 100644
--- /dev/null
+++ b/lib/Rainbow/Types.hs
@@ -0,0 +1,239 @@
+{-# LANGUAGE DeriveGeneric, DeriveDataTypeable, DeriveFunctor,
+             DeriveTraversable, DeriveFoldable, TemplateHaskell #-}
+
+-- | All the main types in Rainbow.  Using this module you can specify
+-- that you want different formatting for 8- and 256-color terminals.
+-- Many of the names in this module conflict with the names in
+-- "Rainbow", so it's probably best to @import@ this module
+-- @qualified@.
+module Rainbow.Types where
+
+-- # Imports
+
+import Control.Lens (makeLenses)
+import Data.String (IsString(..))
+import Data.Text (Text)
+import qualified Data.Text as X
+import Data.Traversable ()
+import Data.Typeable (Typeable)
+import Data.Word (Word8)
+import GHC.Generics (Generic)
+
+--
+-- Colors
+--
+
+-- | A color; a 'Nothing' value means that the terminal's default
+-- color is used.  The type of the 'Maybe' generally will be an
+-- 'Enum8' to represent one of 8 colors, or a 'Word8' to represent one
+-- of 256 colors.
+newtype Color a = Color (Maybe a)
+  deriving (Eq, Show, Ord, Generic, Typeable, Functor, Foldable,
+            Traversable)
+
+instance Semigroup (Color a) where
+  Color x <> Color y = case y of
+    Just a -> Color (Just a)
+    _ -> Color x
+
+-- | Takes the last non-Nothing Color.  'mempty' is no color.
+instance Monoid (Color a) where
+  mempty = Color Nothing
+
+-- | A simple enumeration for eight values.  Represents eight colors.
+data Enum8
+  = E0
+  | E1
+  | E2
+  | E3
+  | E4
+  | E5
+  | E6
+  | E7
+  deriving (Eq, Ord, Show, Bounded, Enum, Generic, Typeable)
+
+enum8toWord8 :: Enum8 -> Word8
+enum8toWord8 e = case e of
+  E0 -> 0
+  E1 -> 1
+  E2 -> 2
+  E3 -> 3
+  E4 -> 4
+  E5 -> 5
+  E6 -> 6
+  E7 -> 7
+
+black :: Enum8
+black = E0
+
+red :: Enum8
+red = E1
+
+green :: Enum8
+green = E2
+
+yellow :: Enum8
+yellow = E3
+
+blue :: Enum8
+blue = E4
+
+magenta :: Enum8
+magenta = E5
+
+cyan :: Enum8
+cyan = E6
+
+white :: Enum8
+white = E7
+
+grey :: Word8
+grey = 8
+
+brightRed :: Word8
+brightRed = 9
+
+brightGreen :: Word8
+brightGreen = 10
+
+brightYellow :: Word8
+brightYellow = 11
+
+brightBlue :: Word8
+brightBlue = 12
+
+brightMagenta :: Word8
+brightMagenta = 13
+
+brightCyan :: Word8
+brightCyan = 14
+
+brightWhite :: Word8
+brightWhite = 15
+
+--
+-- Styles
+--
+
+-- | Text formatting such as bold, italic, etc.
+data Format = Format
+  { _bold :: Bool
+  , _faint :: Bool
+  , _italic :: Bool
+  , _underline :: Bool
+  , _blink :: Bool
+  , _inverse :: Bool
+  , _invisible :: Bool
+  , _strikeout :: Bool
+  } deriving (Show, Eq, Ord, Generic, Typeable)
+
+makeLenses ''Format
+
+instance Semigroup Format where
+  (Format x0 x1 x2 x3 x4 x5 x6 x7) <> (Format y0 y1 y2 y3 y4 y5 y6 y7)
+    = Format (x0 || y0) (x1 || y1) (x2 || y2) (x3 || y3) (x4 || y4)
+             (x5 || y5) (x6 || y6) (x7 || y7)
+
+-- | For each field, the resulting field is True if either field is
+-- True.  For 'mempty', every field is False.
+instance Monoid Format where
+  mempty = Format False False False False False False False False
+
+-- | The foreground and background color, and the 'Format'.  This
+-- represents all colors and formatting attributes for either an 8- or
+-- 256-color terminal.
+data Style a = Style
+  { _fore :: Color a
+  , _back :: Color a
+  , _format :: Format
+  } deriving (Show, Eq, Ord, Generic, Typeable, Functor, Foldable,
+              Traversable)
+
+makeLenses ''Style
+
+instance Semigroup (Style a) where
+  (Style x0 x1 x2) <> (Style y0 y1 y2)
+    = Style (x0 <> y0) (x1 <> y1) (x2 <> y2)
+
+-- | Uses the underlying 'Monoid' instances for 'Color' and 'Format'.
+instance Monoid (Style a) where
+  mempty = Style mempty mempty mempty
+
+--
+-- Scheme
+--
+
+-- | Holds the 'Style' for both 8- and 256-color terminals.
+data Scheme = Scheme
+  { _style8 :: Style Enum8
+  , _style256 :: Style Word8
+  } deriving (Eq, Ord, Show, Generic, Typeable)
+
+makeLenses ''Scheme
+
+instance Semigroup Scheme where
+  (Scheme x0 x1) <> (Scheme y0 y1) = Scheme (x0 <> y0) (x1 <> y1)
+
+instance Monoid Scheme where
+  mempty = Scheme mempty mempty
+
+--
+-- Chunks
+--
+
+-- | A chunk is some textual data coupled with a description of what
+-- color the text is, attributes like whether it is bold or
+-- underlined, etc. The chunk knows what foreground and background
+-- colors and what attributes to use for both an 8 color terminal and
+-- a 256 color terminal.
+
+data Chunk = Chunk
+  { _scheme :: Scheme
+  , _yarn :: Text
+  } deriving (Eq, Show, Ord, Generic, Typeable)
+
+-- | Uses the underlying 'Semigroup' instances for both the
+-- underlying 'Scheme' and the underlying 'Text'.
+instance Semigroup Chunk where
+  (Chunk x0 x1) <> (Chunk y0 y1)
+    = Chunk (x0 <> y0) (x1 <> y1)
+
+-- | Creates a 'Chunk' with no formatting and with the given text.
+instance IsString Chunk where
+  fromString = chunk . X.pack
+
+-- | Uses the underlying 'Monoid' instances for the 'Scheme' and for
+-- the underlying 'Text'.  Therefore 'mempty' will have no
+-- formatting, no colors, and no text.
+instance Monoid Chunk where
+  mempty = Chunk mempty mempty
+
+-- | Creates a 'Chunk' with no formatting and with the given text.
+-- A 'Chunk' is also an instance of 'Data.String.IsString' so you
+-- can create them with the @OverloadedStrings@ extension.  Such a
+-- 'Chunk' has the text of the string and no formatting.
+chunk :: Text -> Chunk
+chunk = Chunk mempty
+
+makeLenses ''Chunk
+
+
+-- | Stores colors that may affect 8-color terminals, 256-color
+-- terminals, both, or neither.
+data Radiant = Radiant
+  { _color8 :: Color Enum8
+  , _color256 :: Color Word8
+  } deriving (Eq, Ord, Show, Typeable, Generic)
+
+instance Semigroup Radiant where
+  (Radiant x0 x1) <> (Radiant y0 y1) = Radiant (x0 <> y0) (x1 <> y1)
+
+-- | Uses the underlying 'Monoid' instance for the 'Color's.  Thus the
+-- last non-'Nothing' 'Color' is used.  This can be useful to specify
+-- one color for 8-color terminals and a different color for 256-color
+-- terminals.
+instance Monoid Radiant where
+  mempty = Radiant mempty mempty
+
+makeLenses ''Radiant
+
diff --git a/rainbow.cabal b/rainbow.cabal
--- a/rainbow.cabal
+++ b/rainbow.cabal
@@ -1,42 +1,95 @@
-name:                rainbow
-version:             0.4.0.0
-synopsis:            Print text to terminal with colors and effects
-description:
-  rainbow helps you print Text chunks to a terminal with colors and effects
-  such as bold, underlining, etc. You pair each Text with a description
-  of how it should appear. Rainbow works with both 8-color and 256-color
-  terminals.
-
-  .
+cabal-version: 1.12
 
-  rainbow uses the terminfo package which, in turn, needs the full C
-  library for ncurses installed, including the development
-  headers. Before installing terminfo, you may need to install the
-  ncurses headers (for instance, on Debian systems, install the
-  libncurses5-dev package.)
+-- This file has been generated from package.yaml by hpack version 0.31.2.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 837a60ee2540f28dc14f871885d041b7f60038586de137f1f3e495154992b4fe
 
-homepage:            http://github.com/massysett/rainbow
-license:             BSD3
-license-file:        LICENSE
-author:              Omari Norman
-maintainer:          omari@smileystation.com
-copyright:           2013 Omari Norman
-category:            System
-build-type:          Simple
-cabal-version:       >=1.8
+name:           rainbow
+version:        0.34.2.2
+synopsis:       Print text to terminal with colors and effects
+description:    Please see README.md
+category:       System
+stability:      Experimental
+homepage:       https://www.github.com/massysett/rainbow
+bug-reports:    https://www.github.com/massysett/rainbow/issues
+author:         Omari Norman
+maintainer:     omari@smileystation.com
+copyright:      Copyright 2013-2019 Omari Norman
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    README.md
+    stack.yaml
+x-curation:     uncurated
 
 source-repository head
-    type: git
-    location: git://github.com/massysett/rainbow.git
+  type: git
+  location: https://github.com/massysett/rainbow
 
 library
   exposed-modules:
-      System.Console.Rainbow
+      Rainbow
+      Rainbow.Translate
+      Rainbow.Types
+  other-modules:
+      Paths_rainbow
+  hs-source-dirs:
+      lib
+  other-extensions: TemplateHaskell
+  ghc-options: -Wall
+  build-depends:
+      base >=4.11 && <5
+    , bytestring
+    , lens
+    , terminfo
+    , text
+  default-language: Haskell2010
 
+test-suite rainbow-instances
+  type: exitcode-stdio-1.0
+  main-is: rainbow-instances.hs
+  other-modules:
+      Rainbow
+      Rainbow.Translate
+      Rainbow.Types
+      Rainbow.QuickCheck
+      Paths_rainbow
+  hs-source-dirs:
+      lib
+      tests
+  other-extensions: TemplateHaskell
+  ghc-options: -Wall
   build-depends:
-      base ==4.6.*
-    , lens ==3.9.*
-    , terminfo ==0.3.*
-    , text ==0.11.*
+      QuickCheck
+    , base >=4.11 && <5
+    , bytestring
+    , lens
+    , terminfo
+    , text
+  default-language: Haskell2010
 
+test-suite rainbow-visual
+  type: exitcode-stdio-1.0
+  main-is: rainbow-visual.hs
+  other-modules:
+      Rainbow
+      Rainbow.Translate
+      Rainbow.Types
+      Rainbow.QuickCheck
+      Paths_rainbow
+  hs-source-dirs:
+      lib
+      tests
+  other-extensions: TemplateHaskell
   ghc-options: -Wall
+  build-depends:
+      QuickCheck
+    , base >=4.11 && <5
+    , bytestring
+    , lens
+    , terminfo
+    , text
+  default-language: Haskell2010
diff --git a/stack.yaml b/stack.yaml
new file mode 100644
--- /dev/null
+++ b/stack.yaml
@@ -0,0 +1,32 @@
+# For more information, see: https://github.com/commercialhaskell/stack/blob/release/doc/yaml_configuration.md
+
+# Specifies the GHC version and set of packages available (e.g., lts-3.5, nightly-2015-09-21, ghc-7.10.2)
+resolver: lts-14.14
+
+# Local packages, usually specified by relative directory name
+packages:
+- '.'
+
+# Packages to be pulled from upstream that are not in the resolver (e.g., acme-missiles-0.3)
+extra-deps: []
+
+# Override default flag values for local packages and extra-deps
+flags: {}
+
+# Extra package databases containing global packages
+extra-package-dbs: []
+
+# Control whether we use the GHC we find on the path
+# system-ghc: true
+
+# Require a specific version of stack, using version ranges
+# require-stack-version: -any # Default
+# require-stack-version: >= 0.1.4.0
+
+# Override the architecture used by stack, especially useful on Windows
+# arch: i386
+# arch: x86_64
+
+# Extra directories used by stack for building
+# extra-include-dirs: [/path/to/dir]
+# extra-lib-dirs: [/path/to/dir]
diff --git a/tests/Rainbow/QuickCheck.hs b/tests/Rainbow/QuickCheck.hs
new file mode 100644
--- /dev/null
+++ b/tests/Rainbow/QuickCheck.hs
@@ -0,0 +1,106 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# LANGUAGE FlexibleInstances, DeriveGeneric, StandaloneDeriving #-}
+
+-- | QuickCheck instances for all of Rainbow.  Currently Rainbow does
+-- not use these instances itself; they are only here for
+-- cut-and-paste for other libraries that may need them.  There is an
+-- executable in Rainbow that is built solely to make sure this module
+-- compiles without any errors.
+--
+-- To use these instances, just drop them into your own project
+-- somewhere.  They are not packaged as a library because there are
+-- orphan instances.
+
+module Rainbow.QuickCheck where
+
+import qualified Data.Text as X
+import Data.Typeable
+import Rainbow.Types
+import Test.QuickCheck
+
+instance Arbitrary X.Text where
+  arbitrary = fmap X.pack $ listOf genChar
+    where
+      genChar = elements ['a'..'z']
+  shrink = fmap X.pack . shrink . X.unpack
+
+instance CoArbitrary X.Text where
+  coarbitrary = coarbitrary . X.unpack
+
+instance (Typeable a, Arbitrary a) => Arbitrary (Color a) where
+  arbitrary = Color <$> arbitrary
+  shrink = genericShrink
+
+instance CoArbitrary a => CoArbitrary (Color a) where
+  coarbitrary (Color a) = coarbitrary a
+
+varInt :: Int -> Gen b -> Gen b
+varInt = variant
+
+instance Arbitrary Enum8 where
+  arbitrary = elements [E0, E1, E2, E3, E4, E5, E6, E7]
+  shrink = genericShrink
+
+instance CoArbitrary Enum8 where
+  coarbitrary x = case x of
+    E0 -> varInt 0
+    E1 -> varInt 1
+    E2 -> varInt 2
+    E3 -> varInt 3
+    E4 -> varInt 4
+    E5 -> varInt 5
+    E6 -> varInt 6
+    E7 -> varInt 7
+
+instance Arbitrary Format where
+  arbitrary
+    = Format <$> g <*> g <*> g <*> g <*> g <*> g <*> g <*> g
+    where
+      g = arbitrary
+  shrink = genericShrink
+
+instance CoArbitrary Format where
+  coarbitrary (Format x0 x1 x2 x3 x4 x5 x6 x7)
+    = coarbitrary x0
+    . coarbitrary x1
+    . coarbitrary x2
+    . coarbitrary x3
+    . coarbitrary x4
+    . coarbitrary x5
+    . coarbitrary x6
+    . coarbitrary x7
+
+instance (Arbitrary a, Typeable a) => Arbitrary (Style a) where
+  arbitrary = Style <$> arbitrary <*> arbitrary <*> arbitrary
+  shrink = genericShrink
+
+instance CoArbitrary a => CoArbitrary (Style a) where
+  coarbitrary (Style a b c)
+    = coarbitrary a
+    . coarbitrary b
+    . coarbitrary c
+
+instance Arbitrary Scheme where
+  arbitrary = Scheme <$> arbitrary <*> arbitrary
+  shrink = genericShrink
+
+instance CoArbitrary Scheme where
+  coarbitrary (Scheme a b) = coarbitrary a . coarbitrary b
+
+
+instance Arbitrary Chunk where
+  arbitrary = Chunk <$> arbitrary <*> arbitrary
+  shrink = genericShrink
+
+instance CoArbitrary Chunk where
+  coarbitrary (Chunk a b)
+    = coarbitrary a
+    . coarbitrary b
+
+instance Arbitrary Radiant where
+  arbitrary = Radiant <$> arbitrary <*> arbitrary
+  shrink = genericShrink
+
+instance CoArbitrary Radiant where
+  coarbitrary (Radiant a b) = coarbitrary a . coarbitrary b
+
diff --git a/tests/rainbow-instances.hs b/tests/rainbow-instances.hs
new file mode 100644
--- /dev/null
+++ b/tests/rainbow-instances.hs
@@ -0,0 +1,10 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- | This program exists solely to import Rainbow.QuickCheck to make
+-- sure it compiles.
+module Main where
+
+import Rainbow.QuickCheck
+
+main :: IO ()
+main = return ()
diff --git a/tests/rainbow-visual.hs b/tests/rainbow-visual.hs
new file mode 100644
--- /dev/null
+++ b/tests/rainbow-visual.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Main where
+
+import Rainbow
+import Data.Function ((&))
+
+main :: IO ()
+main = do
+  putChunksLn
+    [ "Red fore, green back " & fore red & back green
+    , "Blue fore, magenta back" & fore blue & back magenta ]
+  putChunksLn
+    [ "Red, bold fore " & fore red & bold
+    , "Red, underlined fore " & fore red & underline
+    , "Cyan, italic fore" & fore cyan & italic
+    ]
+  putChunksLn
+    [ "Light grey background on 256-color" & back (color256 254) ]
