J. Duke | 319a3b9 | 2007-12-01 00:00:00 +0000 | [diff] [blame^] | 1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
| 2 | <html> |
| 3 | <head> |
| 4 | <!-- |
| 5 | Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. |
| 6 | DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| 7 | |
| 8 | This code is free software; you can redistribute it and/or modify it |
| 9 | under the terms of the GNU General Public License version 2 only, as |
| 10 | published by the Free Software Foundation. Sun designates this |
| 11 | particular file as subject to the "Classpath" exception as provided |
| 12 | by Sun in the LICENSE file that accompanied this code. |
| 13 | |
| 14 | This code is distributed in the hope that it will be useful, but WITHOUT |
| 15 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 16 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 17 | version 2 for more details (a copy is included in the LICENSE file that |
| 18 | accompanied this code). |
| 19 | |
| 20 | You should have received a copy of the GNU General Public License version |
| 21 | 2 along with this work; if not, write to the Free Software Foundation, |
| 22 | Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| 23 | |
| 24 | Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
| 25 | CA 95054 USA or visit www.sun.com if you need additional information or |
| 26 | have any questions. |
| 27 | --> |
| 28 | |
| 29 | <title>GIF Metadata Format Specification</title> |
| 30 | </head> |
| 31 | |
| 32 | <body bgcolor="white"> |
| 33 | |
| 34 | <center><h1> |
| 35 | GIF Metadata Format Specification |
| 36 | </h1></center> |
| 37 | |
| 38 | <a name="gif_stream_metadata_format"> |
| 39 | <center><h2> |
| 40 | GIF Stream Metadata Format Specification |
| 41 | </h2></center> |
| 42 | </a> |
| 43 | <p> |
| 44 | |
| 45 | The GIF stream metadata format encodes the information stored in the |
| 46 | per-file header, namely the file version, logical screen descriptor, |
| 47 | and the global color table. |
| 48 | |
| 49 | <p> |
| 50 | |
| 51 | The logical screen descriptor describes the overall width and height |
| 52 | of an animated file, as well as information about the color resolution |
| 53 | (number of bits per pixel) and pixel aspect ratio. |
| 54 | |
| 55 | <p> |
| 56 | |
| 57 | The global color table contains a color lookup table that is used for |
| 58 | images that do not have their own local color table. |
| 59 | |
| 60 | <pre> |
| 61 | <!DOCTYPE "javax_imageio_gif_stream_1.0" [ |
| 62 | |
| 63 | <!ELEMENT "javax_imageio_gif_stream_1.0" (Version?, |
| 64 | LogicalScreenDescriptor?, GlobalColorTable?)> |
| 65 | |
| 66 | <!ELEMENT "Version" EMPTY> |
| 67 | <!-- The file version, either 87a or 89a --> |
| 68 | <!ATTLIST "Version" "value" ("87a" | "89a") #REQUIRED> |
| 69 | <!-- The version string --> |
| 70 | |
| 71 | <!ELEMENT "LogicalScreenDescriptor" EMPTY> |
| 72 | <!-- The logical screen descriptor, except for the global color table --> |
| 73 | <!ATTLIST "LogicalScreenDescriptor" "logicalScreenWidth" #CDATA |
| 74 | #REQUIRED> |
| 75 | <!-- The width in pixels of the whole picture --> |
| 76 | <!-- Data type: Integer --> |
| 77 | <!-- Min value: 1 (inclusive) --> |
| 78 | <!-- Max value: 65535 (inclusive) --> |
| 79 | <!ATTLIST "LogicalScreenDescriptor" "logicalScreenHeight" #CDATA |
| 80 | #REQUIRED> |
| 81 | <!-- The height in pixels of the whole picture --> |
| 82 | <!-- Data type: Integer --> |
| 83 | <!-- Min value: 1 (inclusive) --> |
| 84 | <!-- Max value: 65535 (inclusive) --> |
| 85 | <!ATTLIST "LogicalScreenDescriptor" "colorResolution" #CDATA |
| 86 | #REQUIRED> |
| 87 | <!-- The number of bits of color resolution, beteen 1 and 8 --> |
| 88 | <!-- Data type: Integer --> |
| 89 | <!-- Min value: 1 (inclusive) --> |
| 90 | <!-- Max value: 8 (inclusive) --> |
| 91 | <!ATTLIST "LogicalScreenDescriptor" "pixelAspectRatio" #CDATA |
| 92 | #REQUIRED> |
| 93 | <!-- If 0, indicates square pixels, else W/H = (value + 16)/64 --> |
| 94 | <!-- Data type: Integer --> |
| 95 | <!-- Min value: 0 (inclusive) --> |
| 96 | <!-- Max value: 255 (inclusive) --> |
| 97 | |
| 98 | <!ELEMENT "GlobalColorTable" (ColorTableEntry)*> |
| 99 | <!-- The global color table --> |
| 100 | <!-- Min children: 2 --> |
| 101 | <!-- Max children: 256 --> |
| 102 | <!ATTLIST "GlobalColorTable" "sizeOfGlobalColorTable" ("2" | |
| 103 | "4" | "8" | "16" | "32" | "64" | "128" | "256") #REQUIRED> |
| 104 | <!-- The number of entries in the global color table --> |
| 105 | <!ATTLIST "GlobalColorTable" "backgroundColorIndex" #CDATA |
| 106 | #REQUIRED> |
| 107 | <!-- The index of the color table entry to be used as a background --> |
| 108 | <!-- Data type: Integer --> |
| 109 | <!-- Min value: 0 (inclusive) --> |
| 110 | <!-- Max value: 255 (inclusive) --> |
| 111 | <!ATTLIST "GlobalColorTable" "sortFlag" ("TRUE" | "FALSE") |
| 112 | #REQUIRED> |
| 113 | <!-- True if the global color table is sorted by frequency --> |
| 114 | |
| 115 | <!ELEMENT "ColorTableEntry" EMPTY> |
| 116 | <!-- A global color table entry --> |
| 117 | <!ATTLIST "ColorTableEntry" "index" #CDATA #REQUIRED> |
| 118 | <!-- The index of the color table entry --> |
| 119 | <!-- Data type: Integer --> |
| 120 | <!-- Min value: 0 (inclusive) --> |
| 121 | <!-- Max value: 255 (inclusive) --> |
| 122 | <!ATTLIST "ColorTableEntry" "red" #CDATA #REQUIRED> |
| 123 | <!-- The red value for the color table entry --> |
| 124 | <!-- Data type: Integer --> |
| 125 | <!-- Min value: 0 (inclusive) --> |
| 126 | <!-- Max value: 255 (inclusive) --> |
| 127 | <!ATTLIST "ColorTableEntry" "green" #CDATA #REQUIRED> |
| 128 | <!-- The green value for the color table entry --> |
| 129 | <!-- Data type: Integer --> |
| 130 | <!-- Min value: 0 (inclusive) --> |
| 131 | <!-- Max value: 255 (inclusive) --> |
| 132 | <!ATTLIST "ColorTableEntry" "blue" #CDATA #REQUIRED> |
| 133 | <!-- The blue value for the color table entry --> |
| 134 | <!-- Data type: Integer --> |
| 135 | <!-- Min value: 0 (inclusive) --> |
| 136 | <!-- Max value: 255 (inclusive) --> |
| 137 | ]> |
| 138 | </pre> |
| 139 | <a name="gif_image_metadata_format"> |
| 140 | <center><h2> |
| 141 | GIF Image Metadata Format Specification |
| 142 | </h2></center> |
| 143 | </a> |
| 144 | <p> |
| 145 | |
| 146 | The GIF image metadata format encodes the image descriptor, local |
| 147 | color table, and extension information assciated with a single image |
| 148 | within a GIF file, typically a frame of an animation. |
| 149 | |
| 150 | <p> |
| 151 | |
| 152 | The image description contains the offset of the frame within the |
| 153 | logical screen described in the stream metadata, as well as the width |
| 154 | and height of the frame and whether it is used interlaced encoding. |
| 155 | |
| 156 | <p> |
| 157 | |
| 158 | The local color table, if present, supersedes the global color table |
| 159 | for the frame at hand. |
| 160 | |
| 161 | <p> |
| 162 | |
| 163 | The graphic control extension contains information on how the frame is |
| 164 | to be incorporated into the animation. The disposal method indicates |
| 165 | whether the current frame should remain in place |
| 166 | (<code>doNotDispose</code>), be restored to the backgound color as |
| 167 | specified in the stream metadata |
| 168 | (<code>restoreToBackgroundColor</code>), or be restored to the |
| 169 | previous frame contents (<code>restoreToPrevious</code>) prior to |
| 170 | displaying the subsequent frame. |
| 171 | |
| 172 | <p> |
| 173 | |
| 174 | The user input flag indicates whether the animation should pause for |
| 175 | user input before advancing to the next frame. The transparent color |
| 176 | flag and index indicate a color index for which pixels of the frame |
| 177 | should not be drawn. The delay time indicates how long the frame |
| 178 | should be displayed, in hundredths of a second. If the user input |
| 179 | flag is set and the delay time is 0, the frame is intended to be |
| 180 | advanced only on user input. |
| 181 | |
| 182 | <pre> |
| 183 | <!DOCTYPE "javax_imageio_gif_image_1.0" [ |
| 184 | |
| 185 | <!ELEMENT "javax_imageio_gif_image_1.0" (ImageDescriptor?, |
| 186 | LocalColorTable?, GraphicControlExtension?, PlainTextExtension?, |
| 187 | ApplicationExtensions?, CommentExtensions?)> |
| 188 | |
| 189 | <!ELEMENT "ImageDescriptor" EMPTY> |
| 190 | <!-- The image descriptor --> |
| 191 | <!ATTLIST "ImageDescriptor" "imageLeftPosition" #CDATA #REQUIRED> |
| 192 | <!-- The X offset of the image relative to the screen origin --> |
| 193 | <!-- Data type: Integer --> |
| 194 | <!-- Min value: 0 (inclusive) --> |
| 195 | <!-- Max value: 65535 (inclusive) --> |
| 196 | <!ATTLIST "ImageDescriptor" "imageTopPosition" #CDATA #REQUIRED> |
| 197 | <!-- The Y offset of the image relative to the screen origin --> |
| 198 | <!-- Data type: Integer --> |
| 199 | <!-- Min value: 0 (inclusive) --> |
| 200 | <!-- Max value: 65535 (inclusive) --> |
| 201 | <!ATTLIST "ImageDescriptor" "imageWidth" #CDATA #REQUIRED> |
| 202 | <!-- The width of the image --> |
| 203 | <!-- Data type: Integer --> |
| 204 | <!-- Min value: 1 (inclusive) --> |
| 205 | <!-- Max value: 65535 (inclusive) --> |
| 206 | <!ATTLIST "ImageDescriptor" "imageHeight" #CDATA #REQUIRED> |
| 207 | <!-- The height of the image --> |
| 208 | <!-- Data type: Integer --> |
| 209 | <!-- Min value: 1 (inclusive) --> |
| 210 | <!-- Max value: 65535 (inclusive) --> |
| 211 | <!ATTLIST "ImageDescriptor" "interlaceFlag" ("TRUE" | "FALSE") |
| 212 | #REQUIRED> |
| 213 | <!-- True if the image is stored using interlacing --> |
| 214 | |
| 215 | <!ELEMENT "LocalColorTable" (ColorTableEntry)*> |
| 216 | <!-- The local color table --> |
| 217 | <!-- Min children: 2 --> |
| 218 | <!-- Max children: 256 --> |
| 219 | <!ATTLIST "LocalColorTable" "sizeOfLocalColorTable" ("2" | |
| 220 | "4" | "8" | "16" | "32" | "64" | "128" | "256") #REQUIRED> |
| 221 | <!-- The number of entries in the local color table --> |
| 222 | <!ATTLIST "LocalColorTable" "sortFlag" ("TRUE" | "FALSE") |
| 223 | #REQUIRED> |
| 224 | <!-- True if the local color table is sorted by frequency --> |
| 225 | |
| 226 | <!ELEMENT "ColorTableEntry" EMPTY> |
| 227 | <!-- A local color table entry --> |
| 228 | <!ATTLIST "ColorTableEntry" "index" #CDATA #REQUIRED> |
| 229 | <!-- The index of the color table entry --> |
| 230 | <!-- Data type: Integer --> |
| 231 | <!-- Min value: 0 (inclusive) --> |
| 232 | <!-- Max value: 255 (inclusive) --> |
| 233 | <!ATTLIST "ColorTableEntry" "red" #CDATA #REQUIRED> |
| 234 | <!-- The red value for the color table entry --> |
| 235 | <!-- Data type: Integer --> |
| 236 | <!-- Min value: 0 (inclusive) --> |
| 237 | <!-- Max value: 255 (inclusive) --> |
| 238 | <!ATTLIST "ColorTableEntry" "green" #CDATA #REQUIRED> |
| 239 | <!-- The green value for the color table entry --> |
| 240 | <!-- Data type: Integer --> |
| 241 | <!-- Min value: 0 (inclusive) --> |
| 242 | <!-- Max value: 255 (inclusive) --> |
| 243 | <!ATTLIST "ColorTableEntry" "blue" #CDATA #REQUIRED> |
| 244 | <!-- The blue value for the color table entry --> |
| 245 | <!-- Data type: Integer --> |
| 246 | <!-- Min value: 0 (inclusive) --> |
| 247 | <!-- Max value: 255 (inclusive) --> |
| 248 | |
| 249 | <!ELEMENT "GraphicControlExtension" EMPTY> |
| 250 | <!-- A graphic control extension --> |
| 251 | <!ATTLIST "GraphicControlExtension" "disposalMethod" ("none" | |
| 252 | "doNotDispose" | "restoreToBackgroundColor" | |
| 253 | "restoreToPrevious" | "undefinedDisposalMethod4" | |
| 254 | "undefinedDisposalMethod5" | "undefinedDisposalMethod6" | |
| 255 | "undefinedDisposalMethod7") #REQUIRED> |
| 256 | <!-- The disposal method for this frame --> |
| 257 | <!ATTLIST "GraphicControlExtension" "userInputFlag" ("TRUE" | |
| 258 | "FALSE") #REQUIRED> |
| 259 | <!-- True if the frame should be advanced based on user input --> |
| 260 | <!ATTLIST "GraphicControlExtension" "transparentColorFlag" ( |
| 261 | "TRUE" | "FALSE") #REQUIRED> |
| 262 | <!-- True if a transparent color exists --> |
| 263 | <!ATTLIST "GraphicControlExtension" "delayTime" #CDATA #REQUIRED> |
| 264 | <!-- The time to delay between frames, in hundredths of a second --> |
| 265 | <!-- Data type: Integer --> |
| 266 | <!-- Min value: 0 (inclusive) --> |
| 267 | <!-- Max value: 65535 (inclusive) --> |
| 268 | <!ATTLIST "GraphicControlExtension" "transparentColorIndex" |
| 269 | #CDATA #REQUIRED> |
| 270 | <!-- The transparent color, if transparentColorFlag is true --> |
| 271 | <!-- Data type: Integer --> |
| 272 | <!-- Min value: 0 (inclusive) --> |
| 273 | <!-- Max value: 255 (inclusive) --> |
| 274 | |
| 275 | <!ELEMENT "PlainTextExtension" EMPTY> |
| 276 | <!-- A plain text (text grid) extension --> |
| 277 | <!ATTLIST "PlainTextExtension" "textGridLeft" #CDATA #REQUIRED> |
| 278 | <!-- The X offset of the text grid --> |
| 279 | <!-- Data type: Integer --> |
| 280 | <!-- Min value: 0 (inclusive) --> |
| 281 | <!-- Max value: 65535 (inclusive) --> |
| 282 | <!ATTLIST "PlainTextExtension" "textGridTop" #CDATA #REQUIRED> |
| 283 | <!-- The Y offset of the text grid --> |
| 284 | <!-- Data type: Integer --> |
| 285 | <!-- Min value: 0 (inclusive) --> |
| 286 | <!-- Max value: 65535 (inclusive) --> |
| 287 | <!ATTLIST "PlainTextExtension" "textGridWidth" #CDATA #REQUIRED> |
| 288 | <!-- The number of columns in the text grid --> |
| 289 | <!-- Data type: Integer --> |
| 290 | <!-- Min value: 1 (inclusive) --> |
| 291 | <!-- Max value: 65535 (inclusive) --> |
| 292 | <!ATTLIST "PlainTextExtension" "textGridHeight" #CDATA #REQUIRED> |
| 293 | <!-- The number of rows in the text grid --> |
| 294 | <!-- Data type: Integer --> |
| 295 | <!-- Min value: 1 (inclusive) --> |
| 296 | <!-- Max value: 65535 (inclusive) --> |
| 297 | <!ATTLIST "PlainTextExtension" "characterCellWidth" #CDATA |
| 298 | #REQUIRED> |
| 299 | <!-- The width of a character cell --> |
| 300 | <!-- Data type: Integer --> |
| 301 | <!-- Min value: 1 (inclusive) --> |
| 302 | <!-- Max value: 65535 (inclusive) --> |
| 303 | <!ATTLIST "PlainTextExtension" "characterCellHeight" #CDATA |
| 304 | #REQUIRED> |
| 305 | <!-- The height of a character cell --> |
| 306 | <!-- Data type: Integer --> |
| 307 | <!-- Min value: 1 (inclusive) --> |
| 308 | <!-- Max value: 65535 (inclusive) --> |
| 309 | <!ATTLIST "PlainTextExtension" "textForegroundColor" #CDATA |
| 310 | #REQUIRED> |
| 311 | <!-- The text foreground color index --> |
| 312 | <!-- Data type: Integer --> |
| 313 | <!-- Min value: 0 (inclusive) --> |
| 314 | <!-- Max value: 255 (inclusive) --> |
| 315 | <!ATTLIST "PlainTextExtension" "textBackgroundColor" #CDATA |
| 316 | #REQUIRED> |
| 317 | <!-- The text background color index --> |
| 318 | <!-- Data type: Integer --> |
| 319 | <!-- Min value: 0 (inclusive) --> |
| 320 | <!-- Max value: 255 (inclusive) --> |
| 321 | |
| 322 | <!ELEMENT "ApplicationExtensions" (ApplicationExtension)*> |
| 323 | <!-- A set of application extensions --> |
| 324 | <!-- Min children: 1 --> |
| 325 | <!-- Max children: 2147483647 --> |
| 326 | |
| 327 | <!ELEMENT "ApplicationExtension" EMPTY> |
| 328 | <!-- An application extension --> |
| 329 | <!-- User object: array of byte --> |
| 330 | <!-- Min length: 0 --> |
| 331 | <!-- Max length: 2147483647 --> |
| 332 | <!ATTLIST "ApplicationExtension" "applicationID" #CDATA |
| 333 | #REQUIRED> |
| 334 | <!-- The application ID --> |
| 335 | <!-- Data type: String --> |
| 336 | <!ATTLIST "ApplicationExtension" "authenticationCode" #CDATA |
| 337 | #REQUIRED> |
| 338 | <!-- The authentication code --> |
| 339 | <!-- Data type: String --> |
| 340 | |
| 341 | <!ELEMENT "CommentExtensions" (CommentExtension)*> |
| 342 | <!-- A set of comments --> |
| 343 | <!-- Min children: 1 --> |
| 344 | <!-- Max children: 2147483647 --> |
| 345 | |
| 346 | <!ELEMENT "CommentExtension" EMPTY> |
| 347 | <!-- A comment --> |
| 348 | <!ATTLIST "CommentExtension" "value" #CDATA #REQUIRED> |
| 349 | <!-- The comment --> |
| 350 | <!-- Data type: String --> |
| 351 | ]> |
| 352 | </pre> |
| 353 | |
| 354 | <p> |
| 355 | <a name="mapping"> |
| 356 | <center> |
| 357 | <table border=1> |
| 358 | <caption><b>Mapping of Standard to GIF Native Stream Metadata</b></caption> |
| 359 | <tr> |
| 360 | <th>Standard Metadata Component</th> |
| 361 | <th>GIF Native Stream Metadata Component</th> |
| 362 | </tr> |
| 363 | <tr> |
| 364 | <td>/Chroma/Palette/PaletteEntry@index</td> |
| 365 | <td>/GlobalColorTable/ColorTableEntry@index</td> |
| 366 | </tr> |
| 367 | <tr> |
| 368 | <td>/Chroma/Palette/PaletteEntry@red</td> |
| 369 | <td>/GlobalColorTable/ColorTableEntry@red</td> |
| 370 | </tr> |
| 371 | <tr> |
| 372 | <td>/Chroma/Palette/PaletteEntry@green</td> |
| 373 | <td>/GlobalColorTable/ColorTableEntry@green</td> |
| 374 | </tr> |
| 375 | <tr> |
| 376 | <td>/Chroma/Palette/PaletteEntry@blue</td> |
| 377 | <td>/GlobalColorTable/ColorTableEntry@blue</td> |
| 378 | </tr> |
| 379 | <tr> |
| 380 | <td>/Chroma/BackgroundIndex@value</td> |
| 381 | <td>/GlobalColorTable@backgroundColorIndex</td> |
| 382 | </tr> |
| 383 | <tr> |
| 384 | <td>/Data/BitsPerSample@value</td> |
| 385 | <td>/LogicalScreenDescriptor@colorResolution</td> |
| 386 | </tr> |
| 387 | <tr> |
| 388 | <td>/Dimension/PixelAspectRatio@value</td> |
| 389 | <td>/LogicalScreenDescriptor@pixelAspectRatio</td> |
| 390 | </tr> |
| 391 | <tr> |
| 392 | <td>/Dimension/HorizontalScreenSize@value</td> |
| 393 | <td>/LogicalScreenDescriptor@logicalScreenWidth</td> |
| 394 | </tr> |
| 395 | <tr> |
| 396 | <td>/Dimension/VerticalScreenSize@value</td> |
| 397 | <td>/LogicalScreenDescriptor@logicalScreenHeight</td> |
| 398 | </tr> |
| 399 | <tr> |
| 400 | <td>/Document/FormatVersion@value</td> |
| 401 | <td>/Version@value</td> |
| 402 | </tr> |
| 403 | </table> |
| 404 | </center> |
| 405 | </p> |
| 406 | |
| 407 | <p> |
| 408 | <center> |
| 409 | <table border=1> |
| 410 | <caption><b>Mapping of Standard to GIF Native Image Metadata</b></caption> |
| 411 | <tr> |
| 412 | <th>Standard Metadata Component</th> |
| 413 | <th>GIF Native Image Metadata Component</th> |
| 414 | </tr> |
| 415 | <tr> |
| 416 | <td>/Chroma/Palette/PaletteEntry@index</td> |
| 417 | <td>/LocalColorTable/ColorTableEntry@index</td> |
| 418 | </tr> |
| 419 | <tr> |
| 420 | <td>/Chroma/Palette/PaletteEntry@red</td> |
| 421 | <td>/LocalColorTable/ColorTableEntry@red</td> |
| 422 | </tr> |
| 423 | <tr> |
| 424 | <td>/Chroma/Palette/PaletteEntry@green</td> |
| 425 | <td>/LocalColorTable/ColorTableEntry@green</td> |
| 426 | </tr> |
| 427 | <tr> |
| 428 | <td>/Chroma/Palette/PaletteEntry@blue</td> |
| 429 | <td>/LocalColorTable/ColorTableEntry@blue</td> |
| 430 | </tr> |
| 431 | <tr> |
| 432 | <td>/Dimension/HorizontalPixelOffset@value</td> |
| 433 | <td>/ImageDescriptor@imageLeftPosition</td> |
| 434 | </tr> |
| 435 | <tr> |
| 436 | <td>/Dimension/VerticalPixelOffset@value</td> |
| 437 | <td>/ImageDescriptor@imageTopPosition</td> |
| 438 | </tr> |
| 439 | <tr> |
| 440 | <td>/Text/TextEntry@value</td> |
| 441 | <td>/CommentExtensions/CommentExtension@value</td> |
| 442 | </tr> |
| 443 | <tr> |
| 444 | <td>/Transparency/TransparentIndex@value</td> |
| 445 | <td>/GraphicControlExtension@transparentColorIndex |
| 446 | (/GraphicControlExtension@transparentColorFlag is also set to |
| 447 | "TRUE")</td> |
| 448 | </tr> |
| 449 | </table> |
| 450 | </center> |
| 451 | |
| 452 | </body> |
| 453 | </html> |