diff --git a/.venv/lib/python3.11/site-packages/PIL/BdfFontFile.py b/.venv/lib/python3.11/site-packages/PIL/BdfFontFile.py new file mode 100644 index 0000000000000000000000000000000000000000..bc1416c74c6d4fc314aec854ccacfee0fe782f5d --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/BdfFontFile.py @@ -0,0 +1,133 @@ +# +# The Python Imaging Library +# $Id$ +# +# bitmap distribution font (bdf) file parser +# +# history: +# 1996-05-16 fl created (as bdf2pil) +# 1997-08-25 fl converted to FontFile driver +# 2001-05-25 fl removed bogus __init__ call +# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) +# 2003-04-22 fl more robustification (from Graham Dumpleton) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +""" +Parse X Bitmap Distribution Format (BDF) +""" +from __future__ import annotations + +from typing import BinaryIO + +from . import FontFile, Image + +bdf_slant = { + "R": "Roman", + "I": "Italic", + "O": "Oblique", + "RI": "Reverse Italic", + "RO": "Reverse Oblique", + "OT": "Other", +} + +bdf_spacing = {"P": "Proportional", "M": "Monospaced", "C": "Cell"} + + +def bdf_char( + f: BinaryIO, +) -> ( + tuple[ + str, + int, + tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]], + Image.Image, + ] + | None +): + # skip to STARTCHAR + while True: + s = f.readline() + if not s: + return None + if s[:9] == b"STARTCHAR": + break + id = s[9:].strip().decode("ascii") + + # load symbol properties + props = {} + while True: + s = f.readline() + if not s or s[:6] == b"BITMAP": + break + i = s.find(b" ") + props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") + + # load bitmap + bitmap = bytearray() + while True: + s = f.readline() + if not s or s[:7] == b"ENDCHAR": + break + bitmap += s[:-1] + + # The word BBX + # followed by the width in x (BBw), height in y (BBh), + # and x and y displacement (BBxoff0, BByoff0) + # of the lower left corner from the origin of the character. + width, height, x_disp, y_disp = (int(p) for p in props["BBX"].split()) + + # The word DWIDTH + # followed by the width in x and y of the character in device pixels. + dwx, dwy = (int(p) for p in props["DWIDTH"].split()) + + bbox = ( + (dwx, dwy), + (x_disp, -y_disp - height, width + x_disp, -y_disp), + (0, 0, width, height), + ) + + try: + im = Image.frombytes("1", (width, height), bitmap, "hex", "1") + except ValueError: + # deal with zero-width characters + im = Image.new("1", (width, height)) + + return id, int(props["ENCODING"]), bbox, im + + +class BdfFontFile(FontFile.FontFile): + """Font file plugin for the X11 BDF format.""" + + def __init__(self, fp: BinaryIO) -> None: + super().__init__() + + s = fp.readline() + if s[:13] != b"STARTFONT 2.1": + msg = "not a valid BDF file" + raise SyntaxError(msg) + + props = {} + comments = [] + + while True: + s = fp.readline() + if not s or s[:13] == b"ENDPROPERTIES": + break + i = s.find(b" ") + props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") + if s[:i] in [b"COMMENT", b"COPYRIGHT"]: + if s.find(b"LogicalFontDescription") < 0: + comments.append(s[i + 1 : -1].decode("ascii")) + + while True: + c = bdf_char(fp) + if not c: + break + id, ch, (xy, dst, src), im = c + if 0 <= ch < len(self.glyph): + self.glyph[ch] = xy, dst, src, im diff --git a/.venv/lib/python3.11/site-packages/PIL/BmpImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/BmpImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..ef204533712c771972751c46e47f82fa1b9d5892 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/BmpImagePlugin.py @@ -0,0 +1,489 @@ +# +# The Python Imaging Library. +# $Id$ +# +# BMP file handler +# +# Windows (and OS/2) native bitmap storage format. +# +# history: +# 1995-09-01 fl Created +# 1996-04-30 fl Added save +# 1997-08-27 fl Fixed save of 1-bit images +# 1998-03-06 fl Load P images as L where possible +# 1998-07-03 fl Load P images as 1 where possible +# 1998-12-29 fl Handle small palettes +# 2002-12-30 fl Fixed load of 1-bit palette images +# 2003-04-21 fl Fixed load of 1-bit monochrome images +# 2003-04-23 fl Added limited support for BI_BITFIELDS compression +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1995-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import i32le as i32 +from ._binary import o8 +from ._binary import o16le as o16 +from ._binary import o32le as o32 + +# +# -------------------------------------------------------------------- +# Read BMP file + +BIT2MODE = { + # bits => mode, rawmode + 1: ("P", "P;1"), + 4: ("P", "P;4"), + 8: ("P", "P"), + 16: ("RGB", "BGR;15"), + 24: ("RGB", "BGR"), + 32: ("RGB", "BGRX"), +} + + +def _accept(prefix: bytes) -> bool: + return prefix[:2] == b"BM" + + +def _dib_accept(prefix: bytes) -> bool: + return i32(prefix) in [12, 40, 52, 56, 64, 108, 124] + + +# ============================================================================= +# Image plugin for the Windows BMP format. +# ============================================================================= +class BmpImageFile(ImageFile.ImageFile): + """Image plugin for the Windows Bitmap format (BMP)""" + + # ------------------------------------------------------------- Description + format_description = "Windows Bitmap" + format = "BMP" + + # -------------------------------------------------- BMP Compression values + COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5} + for k, v in COMPRESSIONS.items(): + vars()[k] = v + + def _bitmap(self, header=0, offset=0): + """Read relevant info about the BMP""" + read, seek = self.fp.read, self.fp.seek + if header: + seek(header) + # read bmp header size @offset 14 (this is part of the header size) + file_info = {"header_size": i32(read(4)), "direction": -1} + + # -------------------- If requested, read header at a specific position + # read the rest of the bmp header, without its size + header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) + + # ------------------------------- Windows Bitmap v2, IBM OS/2 Bitmap v1 + # ----- This format has different offsets because of width/height types + # 12: BITMAPCOREHEADER/OS21XBITMAPHEADER + if file_info["header_size"] == 12: + file_info["width"] = i16(header_data, 0) + file_info["height"] = i16(header_data, 2) + file_info["planes"] = i16(header_data, 4) + file_info["bits"] = i16(header_data, 6) + file_info["compression"] = self.RAW + file_info["palette_padding"] = 3 + + # --------------------------------------------- Windows Bitmap v3 to v5 + # 40: BITMAPINFOHEADER + # 52: BITMAPV2HEADER + # 56: BITMAPV3HEADER + # 64: BITMAPCOREHEADER2/OS22XBITMAPHEADER + # 108: BITMAPV4HEADER + # 124: BITMAPV5HEADER + elif file_info["header_size"] in (40, 52, 56, 64, 108, 124): + file_info["y_flip"] = header_data[7] == 0xFF + file_info["direction"] = 1 if file_info["y_flip"] else -1 + file_info["width"] = i32(header_data, 0) + file_info["height"] = ( + i32(header_data, 4) + if not file_info["y_flip"] + else 2**32 - i32(header_data, 4) + ) + file_info["planes"] = i16(header_data, 8) + file_info["bits"] = i16(header_data, 10) + file_info["compression"] = i32(header_data, 12) + # byte size of pixel data + file_info["data_size"] = i32(header_data, 16) + file_info["pixels_per_meter"] = ( + i32(header_data, 20), + i32(header_data, 24), + ) + file_info["colors"] = i32(header_data, 28) + file_info["palette_padding"] = 4 + self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) + if file_info["compression"] == self.BITFIELDS: + masks = ["r_mask", "g_mask", "b_mask"] + if len(header_data) >= 48: + if len(header_data) >= 52: + masks.append("a_mask") + else: + file_info["a_mask"] = 0x0 + for idx, mask in enumerate(masks): + file_info[mask] = i32(header_data, 36 + idx * 4) + else: + # 40 byte headers only have the three components in the + # bitfields masks, ref: + # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx + # See also + # https://github.com/python-pillow/Pillow/issues/1293 + # There is a 4th component in the RGBQuad, in the alpha + # location, but it is listed as a reserved component, + # and it is not generally an alpha channel + file_info["a_mask"] = 0x0 + for mask in masks: + file_info[mask] = i32(read(4)) + file_info["rgb_mask"] = ( + file_info["r_mask"], + file_info["g_mask"], + file_info["b_mask"], + ) + file_info["rgba_mask"] = ( + file_info["r_mask"], + file_info["g_mask"], + file_info["b_mask"], + file_info["a_mask"], + ) + else: + msg = f"Unsupported BMP header type ({file_info['header_size']})" + raise OSError(msg) + + # ------------------ Special case : header is reported 40, which + # ---------------------- is shorter than real size for bpp >= 16 + self._size = file_info["width"], file_info["height"] + + # ------- If color count was not found in the header, compute from bits + file_info["colors"] = ( + file_info["colors"] + if file_info.get("colors", 0) + else (1 << file_info["bits"]) + ) + if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8: + offset += 4 * file_info["colors"] + + # ---------------------- Check bit depth for unusual unsupported values + self._mode, raw_mode = BIT2MODE.get(file_info["bits"], (None, None)) + if self.mode is None: + msg = f"Unsupported BMP pixel depth ({file_info['bits']})" + raise OSError(msg) + + # ---------------- Process BMP with Bitfields compression (not palette) + decoder_name = "raw" + if file_info["compression"] == self.BITFIELDS: + SUPPORTED = { + 32: [ + (0xFF0000, 0xFF00, 0xFF, 0x0), + (0xFF000000, 0xFF0000, 0xFF00, 0x0), + (0xFF000000, 0xFF00, 0xFF, 0x0), + (0xFF000000, 0xFF0000, 0xFF00, 0xFF), + (0xFF, 0xFF00, 0xFF0000, 0xFF000000), + (0xFF0000, 0xFF00, 0xFF, 0xFF000000), + (0xFF000000, 0xFF00, 0xFF, 0xFF0000), + (0x0, 0x0, 0x0, 0x0), + ], + 24: [(0xFF0000, 0xFF00, 0xFF)], + 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], + } + MASK_MODES = { + (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", + (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", + (32, (0xFF000000, 0xFF00, 0xFF, 0x0)): "BGXR", + (32, (0xFF000000, 0xFF0000, 0xFF00, 0xFF)): "ABGR", + (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", + (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", + (32, (0xFF000000, 0xFF00, 0xFF, 0xFF0000)): "BGAR", + (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", + (24, (0xFF0000, 0xFF00, 0xFF)): "BGR", + (16, (0xF800, 0x7E0, 0x1F)): "BGR;16", + (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15", + } + if file_info["bits"] in SUPPORTED: + if ( + file_info["bits"] == 32 + and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]] + ): + raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])] + self._mode = "RGBA" if "A" in raw_mode else self.mode + elif ( + file_info["bits"] in (24, 16) + and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]] + ): + raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])] + else: + msg = "Unsupported BMP bitfields layout" + raise OSError(msg) + else: + msg = "Unsupported BMP bitfields layout" + raise OSError(msg) + elif file_info["compression"] == self.RAW: + if file_info["bits"] == 32 and header == 22: # 32-bit .cur offset + raw_mode, self._mode = "BGRA", "RGBA" + elif file_info["compression"] in (self.RLE8, self.RLE4): + decoder_name = "bmp_rle" + else: + msg = f"Unsupported BMP compression ({file_info['compression']})" + raise OSError(msg) + + # --------------- Once the header is processed, process the palette/LUT + if self.mode == "P": # Paletted for 1, 4 and 8 bit images + # ---------------------------------------------------- 1-bit images + if not (0 < file_info["colors"] <= 65536): + msg = f"Unsupported BMP Palette size ({file_info['colors']})" + raise OSError(msg) + else: + padding = file_info["palette_padding"] + palette = read(padding * file_info["colors"]) + grayscale = True + indices = ( + (0, 255) + if file_info["colors"] == 2 + else list(range(file_info["colors"])) + ) + + # ----------------- Check if grayscale and ignore palette if so + for ind, val in enumerate(indices): + rgb = palette[ind * padding : ind * padding + 3] + if rgb != o8(val) * 3: + grayscale = False + + # ------- If all colors are gray, white or black, ditch palette + if grayscale: + self._mode = "1" if file_info["colors"] == 2 else "L" + raw_mode = self.mode + else: + self._mode = "P" + self.palette = ImagePalette.raw( + "BGRX" if padding == 4 else "BGR", palette + ) + + # ---------------------------- Finally set the tile data for the plugin + self.info["compression"] = file_info["compression"] + args = [raw_mode] + if decoder_name == "bmp_rle": + args.append(file_info["compression"] == self.RLE4) + else: + args.append(((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3)) + args.append(file_info["direction"]) + self.tile = [ + ( + decoder_name, + (0, 0, file_info["width"], file_info["height"]), + offset or self.fp.tell(), + tuple(args), + ) + ] + + def _open(self) -> None: + """Open file, check magic number and read header""" + # read 14 bytes: magic number, filesize, reserved, header final offset + head_data = self.fp.read(14) + # choke if the file does not have the required magic bytes + if not _accept(head_data): + msg = "Not a BMP file" + raise SyntaxError(msg) + # read the start position of the BMP image data (u32) + offset = i32(head_data, 10) + # load bitmap information (offset=raster info) + self._bitmap(offset=offset) + + +class BmpRleDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes) -> tuple[int, int]: + assert self.fd is not None + rle4 = self.args[1] + data = bytearray() + x = 0 + dest_length = self.state.xsize * self.state.ysize + while len(data) < dest_length: + pixels = self.fd.read(1) + byte = self.fd.read(1) + if not pixels or not byte: + break + num_pixels = pixels[0] + if num_pixels: + # encoded mode + if x + num_pixels > self.state.xsize: + # Too much data for row + num_pixels = max(0, self.state.xsize - x) + if rle4: + first_pixel = o8(byte[0] >> 4) + second_pixel = o8(byte[0] & 0x0F) + for index in range(num_pixels): + if index % 2 == 0: + data += first_pixel + else: + data += second_pixel + else: + data += byte * num_pixels + x += num_pixels + else: + if byte[0] == 0: + # end of line + while len(data) % self.state.xsize != 0: + data += b"\x00" + x = 0 + elif byte[0] == 1: + # end of bitmap + break + elif byte[0] == 2: + # delta + bytes_read = self.fd.read(2) + if len(bytes_read) < 2: + break + right, up = self.fd.read(2) + data += b"\x00" * (right + up * self.state.xsize) + x = len(data) % self.state.xsize + else: + # absolute mode + if rle4: + # 2 pixels per byte + byte_count = byte[0] // 2 + bytes_read = self.fd.read(byte_count) + for byte_read in bytes_read: + data += o8(byte_read >> 4) + data += o8(byte_read & 0x0F) + else: + byte_count = byte[0] + bytes_read = self.fd.read(byte_count) + data += bytes_read + if len(bytes_read) < byte_count: + break + x += byte[0] + + # align to 16-bit word boundary + if self.fd.tell() % 2 != 0: + self.fd.seek(1, os.SEEK_CUR) + rawmode = "L" if self.mode == "L" else "P" + self.set_as_raw(bytes(data), (rawmode, 0, self.args[-1])) + return -1, 0 + + +# ============================================================================= +# Image plugin for the DIB format (BMP alias) +# ============================================================================= +class DibImageFile(BmpImageFile): + format = "DIB" + format_description = "Windows Bitmap" + + def _open(self) -> None: + self._bitmap() + + +# +# -------------------------------------------------------------------- +# Write BMP file + + +SAVE = { + "1": ("1", 1, 2), + "L": ("L", 8, 256), + "P": ("P", 8, 256), + "RGB": ("BGR", 24, 0), + "RGBA": ("BGRA", 32, 0), +} + + +def _dib_save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, False) + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, bitmap_header: bool = True +) -> None: + try: + rawmode, bits, colors = SAVE[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as BMP" + raise OSError(msg) from e + + info = im.encoderinfo + + dpi = info.get("dpi", (96, 96)) + + # 1 meter == 39.3701 inches + ppm = tuple(int(x * 39.3701 + 0.5) for x in dpi) + + stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) + header = 40 # or 64 for OS/2 version 2 + image = stride * im.size[1] + + if im.mode == "1": + palette = b"".join(o8(i) * 4 for i in (0, 255)) + elif im.mode == "L": + palette = b"".join(o8(i) * 4 for i in range(256)) + elif im.mode == "P": + palette = im.im.getpalette("RGB", "BGRX") + colors = len(palette) // 4 + else: + palette = None + + # bitmap header + if bitmap_header: + offset = 14 + header + colors * 4 + file_size = offset + image + if file_size > 2**32 - 1: + msg = "File size is too large for the BMP format" + raise ValueError(msg) + fp.write( + b"BM" # file type (magic) + + o32(file_size) # file size + + o32(0) # reserved + + o32(offset) # image data offset + ) + + # bitmap info header + fp.write( + o32(header) # info header size + + o32(im.size[0]) # width + + o32(im.size[1]) # height + + o16(1) # planes + + o16(bits) # depth + + o32(0) # compression (0=uncompressed) + + o32(image) # size of bitmap + + o32(ppm[0]) # resolution + + o32(ppm[1]) # resolution + + o32(colors) # colors used + + o32(colors) # colors important + ) + + fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) + + if palette: + fp.write(palette) + + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))]) + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(BmpImageFile.format, BmpImageFile, _accept) +Image.register_save(BmpImageFile.format, _save) + +Image.register_extension(BmpImageFile.format, ".bmp") + +Image.register_mime(BmpImageFile.format, "image/bmp") + +Image.register_decoder("bmp_rle", BmpRleDecoder) + +Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) +Image.register_save(DibImageFile.format, _dib_save) + +Image.register_extension(DibImageFile.format, ".dib") + +Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/.venv/lib/python3.11/site-packages/PIL/BufrStubImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/BufrStubImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..0ee2f653b2c3d3c2515c2cd99dccc78d2ad80ec6 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/BufrStubImagePlugin.py @@ -0,0 +1,76 @@ +# +# The Python Imaging Library +# $Id$ +# +# BUFR stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific BUFR image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" + + +class BufrStubImageFile(ImageFile.StubImageFile): + format = "BUFR" + format_description = "BUFR" + + def _open(self) -> None: + offset = self.fp.tell() + + if not _accept(self.fp.read(4)): + msg = "Not a BUFR file" + raise SyntaxError(msg) + + self.fp.seek(offset) + + # make something up + self._mode = "F" + self._size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "BUFR save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) +Image.register_save(BufrStubImageFile.format, _save) + +Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/.venv/lib/python3.11/site-packages/PIL/ContainerIO.py b/.venv/lib/python3.11/site-packages/PIL/ContainerIO.py new file mode 100644 index 0000000000000000000000000000000000000000..0035296a45c14576988720407e11c6a06f857ce9 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ContainerIO.py @@ -0,0 +1,121 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a class to read from a container file +# +# History: +# 1995-06-18 fl Created +# 1995-09-07 fl Added readline(), readlines() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +from typing import IO, AnyStr, Generic, Literal + + +class ContainerIO(Generic[AnyStr]): + """ + A file object that provides read access to a part of an existing + file (for example a TAR file). + """ + + def __init__(self, file: IO[AnyStr], offset: int, length: int) -> None: + """ + Create file object. + + :param file: Existing file. + :param offset: Start of region, in bytes. + :param length: Size of region, in bytes. + """ + self.fh: IO[AnyStr] = file + self.pos = 0 + self.offset = offset + self.length = length + self.fh.seek(offset) + + ## + # Always false. + + def isatty(self) -> bool: + return False + + def seek(self, offset: int, mode: Literal[0, 1, 2] = io.SEEK_SET) -> None: + """ + Move file pointer. + + :param offset: Offset in bytes. + :param mode: Starting position. Use 0 for beginning of region, 1 + for current offset, and 2 for end of region. You cannot move + the pointer outside the defined region. + """ + if mode == 1: + self.pos = self.pos + offset + elif mode == 2: + self.pos = self.length + offset + else: + self.pos = offset + # clamp + self.pos = max(0, min(self.pos, self.length)) + self.fh.seek(self.offset + self.pos) + + def tell(self) -> int: + """ + Get current file pointer. + + :returns: Offset from start of region, in bytes. + """ + return self.pos + + def read(self, n: int = 0) -> AnyStr: + """ + Read data. + + :param n: Number of bytes to read. If omitted or zero, + read until end of region. + :returns: An 8-bit string. + """ + if n: + n = min(n, self.length - self.pos) + else: + n = self.length - self.pos + if not n: # EOF + return b"" if "b" in self.fh.mode else "" # type: ignore[return-value] + self.pos = self.pos + n + return self.fh.read(n) + + def readline(self) -> AnyStr: + """ + Read a line of text. + + :returns: An 8-bit string. + """ + s: AnyStr = b"" if "b" in self.fh.mode else "" # type: ignore[assignment] + newline_character = b"\n" if "b" in self.fh.mode else "\n" + while True: + c = self.read(1) + if not c: + break + s = s + c + if c == newline_character: + break + return s + + def readlines(self) -> list[AnyStr]: + """ + Read multiple lines of text. + + :returns: A list of 8-bit strings. + """ + lines = [] + while True: + s = self.readline() + if not s: + break + lines.append(s) + return lines diff --git a/.venv/lib/python3.11/site-packages/PIL/CurImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/CurImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..85e2145e766042cc159ff4d5f011053061d30aba --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/CurImagePlugin.py @@ -0,0 +1,75 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Cursor support for PIL +# +# notes: +# uses BmpImagePlugin.py to read the bitmap data. +# +# history: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import BmpImagePlugin, Image +from ._binary import i16le as i16 +from ._binary import i32le as i32 + +# +# -------------------------------------------------------------------- + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"\0\0\2\0" + + +## +# Image plugin for Windows Cursor files. + + +class CurImageFile(BmpImagePlugin.BmpImageFile): + format = "CUR" + format_description = "Windows Cursor" + + def _open(self) -> None: + offset = self.fp.tell() + + # check magic + s = self.fp.read(6) + if not _accept(s): + msg = "not a CUR file" + raise SyntaxError(msg) + + # pick the largest cursor in the file + m = b"" + for i in range(i16(s, 4)): + s = self.fp.read(16) + if not m: + m = s + elif s[0] > m[0] and s[1] > m[1]: + m = s + if not m: + msg = "No cursors were found" + raise TypeError(msg) + + # load as bitmap + self._bitmap(i32(m, 12) + offset) + + # patch up the bitmap height + self._size = self.size[0], self.size[1] // 2 + d, e, o, a = self.tile[0] + self.tile[0] = d, (0, 0) + self.size, o, a + + +# +# -------------------------------------------------------------------- + +Image.register_open(CurImageFile.format, CurImageFile, _accept) + +Image.register_extension(CurImageFile.format, ".cur") diff --git a/.venv/lib/python3.11/site-packages/PIL/DcxImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/DcxImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..f67f27d73bbc74f9e6ee75f2a68c4dbc090ad3da --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/DcxImagePlugin.py @@ -0,0 +1,80 @@ +# +# The Python Imaging Library. +# $Id$ +# +# DCX file handling +# +# DCX is a container file format defined by Intel, commonly used +# for fax applications. Each DCX file consists of a directory +# (a list of file offsets) followed by a set of (usually 1-bit) +# PCX files. +# +# History: +# 1995-09-09 fl Created +# 1996-03-20 fl Properly derived from PcxImageFile. +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2002-07-30 fl Fixed file handling +# +# Copyright (c) 1997-98 by Secret Labs AB. +# Copyright (c) 1995-96 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image +from ._binary import i32le as i32 +from .PcxImagePlugin import PcxImageFile + +MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 4 and i32(prefix) == MAGIC + + +## +# Image plugin for the Intel DCX format. + + +class DcxImageFile(PcxImageFile): + format = "DCX" + format_description = "Intel DCX" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # Header + s = self.fp.read(4) + if not _accept(s): + msg = "not a DCX file" + raise SyntaxError(msg) + + # Component directory + self._offset = [] + for i in range(1024): + offset = i32(self.fp.read(4)) + if not offset: + break + self._offset.append(offset) + + self._fp = self.fp + self.frame = -1 + self.n_frames = len(self._offset) + self.is_animated = self.n_frames > 1 + self.seek(0) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + self.frame = frame + self.fp = self._fp + self.fp.seek(self._offset[frame]) + PcxImageFile._open(self) + + def tell(self) -> int: + return self.frame + + +Image.register_open(DcxImageFile.format, DcxImageFile, _accept) + +Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/.venv/lib/python3.11/site-packages/PIL/DdsImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/DdsImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..a57e4aea2d5184f9b595f9079383e4484e9dc07d --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/DdsImagePlugin.py @@ -0,0 +1,575 @@ +""" +A Pillow loader for .dds files (S3TC-compressed aka DXTC) +Jerome Leclanche + +Documentation: +https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: +https://creativecommons.org/publicdomain/zero/1.0/ +""" + +from __future__ import annotations + +import io +import struct +import sys +from enum import IntEnum, IntFlag +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i32le as i32 +from ._binary import o8 +from ._binary import o32le as o32 + +# Magic ("DDS ") +DDS_MAGIC = 0x20534444 + + +# DDS flags +class DDSD(IntFlag): + CAPS = 0x1 + HEIGHT = 0x2 + WIDTH = 0x4 + PITCH = 0x8 + PIXELFORMAT = 0x1000 + MIPMAPCOUNT = 0x20000 + LINEARSIZE = 0x80000 + DEPTH = 0x800000 + + +# DDS caps +class DDSCAPS(IntFlag): + COMPLEX = 0x8 + TEXTURE = 0x1000 + MIPMAP = 0x400000 + + +class DDSCAPS2(IntFlag): + CUBEMAP = 0x200 + CUBEMAP_POSITIVEX = 0x400 + CUBEMAP_NEGATIVEX = 0x800 + CUBEMAP_POSITIVEY = 0x1000 + CUBEMAP_NEGATIVEY = 0x2000 + CUBEMAP_POSITIVEZ = 0x4000 + CUBEMAP_NEGATIVEZ = 0x8000 + VOLUME = 0x200000 + + +# Pixel Format +class DDPF(IntFlag): + ALPHAPIXELS = 0x1 + ALPHA = 0x2 + FOURCC = 0x4 + PALETTEINDEXED8 = 0x20 + RGB = 0x40 + LUMINANCE = 0x20000 + + +# dxgiformat.h +class DXGI_FORMAT(IntEnum): + UNKNOWN = 0 + R32G32B32A32_TYPELESS = 1 + R32G32B32A32_FLOAT = 2 + R32G32B32A32_UINT = 3 + R32G32B32A32_SINT = 4 + R32G32B32_TYPELESS = 5 + R32G32B32_FLOAT = 6 + R32G32B32_UINT = 7 + R32G32B32_SINT = 8 + R16G16B16A16_TYPELESS = 9 + R16G16B16A16_FLOAT = 10 + R16G16B16A16_UNORM = 11 + R16G16B16A16_UINT = 12 + R16G16B16A16_SNORM = 13 + R16G16B16A16_SINT = 14 + R32G32_TYPELESS = 15 + R32G32_FLOAT = 16 + R32G32_UINT = 17 + R32G32_SINT = 18 + R32G8X24_TYPELESS = 19 + D32_FLOAT_S8X24_UINT = 20 + R32_FLOAT_X8X24_TYPELESS = 21 + X32_TYPELESS_G8X24_UINT = 22 + R10G10B10A2_TYPELESS = 23 + R10G10B10A2_UNORM = 24 + R10G10B10A2_UINT = 25 + R11G11B10_FLOAT = 26 + R8G8B8A8_TYPELESS = 27 + R8G8B8A8_UNORM = 28 + R8G8B8A8_UNORM_SRGB = 29 + R8G8B8A8_UINT = 30 + R8G8B8A8_SNORM = 31 + R8G8B8A8_SINT = 32 + R16G16_TYPELESS = 33 + R16G16_FLOAT = 34 + R16G16_UNORM = 35 + R16G16_UINT = 36 + R16G16_SNORM = 37 + R16G16_SINT = 38 + R32_TYPELESS = 39 + D32_FLOAT = 40 + R32_FLOAT = 41 + R32_UINT = 42 + R32_SINT = 43 + R24G8_TYPELESS = 44 + D24_UNORM_S8_UINT = 45 + R24_UNORM_X8_TYPELESS = 46 + X24_TYPELESS_G8_UINT = 47 + R8G8_TYPELESS = 48 + R8G8_UNORM = 49 + R8G8_UINT = 50 + R8G8_SNORM = 51 + R8G8_SINT = 52 + R16_TYPELESS = 53 + R16_FLOAT = 54 + D16_UNORM = 55 + R16_UNORM = 56 + R16_UINT = 57 + R16_SNORM = 58 + R16_SINT = 59 + R8_TYPELESS = 60 + R8_UNORM = 61 + R8_UINT = 62 + R8_SNORM = 63 + R8_SINT = 64 + A8_UNORM = 65 + R1_UNORM = 66 + R9G9B9E5_SHAREDEXP = 67 + R8G8_B8G8_UNORM = 68 + G8R8_G8B8_UNORM = 69 + BC1_TYPELESS = 70 + BC1_UNORM = 71 + BC1_UNORM_SRGB = 72 + BC2_TYPELESS = 73 + BC2_UNORM = 74 + BC2_UNORM_SRGB = 75 + BC3_TYPELESS = 76 + BC3_UNORM = 77 + BC3_UNORM_SRGB = 78 + BC4_TYPELESS = 79 + BC4_UNORM = 80 + BC4_SNORM = 81 + BC5_TYPELESS = 82 + BC5_UNORM = 83 + BC5_SNORM = 84 + B5G6R5_UNORM = 85 + B5G5R5A1_UNORM = 86 + B8G8R8A8_UNORM = 87 + B8G8R8X8_UNORM = 88 + R10G10B10_XR_BIAS_A2_UNORM = 89 + B8G8R8A8_TYPELESS = 90 + B8G8R8A8_UNORM_SRGB = 91 + B8G8R8X8_TYPELESS = 92 + B8G8R8X8_UNORM_SRGB = 93 + BC6H_TYPELESS = 94 + BC6H_UF16 = 95 + BC6H_SF16 = 96 + BC7_TYPELESS = 97 + BC7_UNORM = 98 + BC7_UNORM_SRGB = 99 + AYUV = 100 + Y410 = 101 + Y416 = 102 + NV12 = 103 + P010 = 104 + P016 = 105 + OPAQUE_420 = 106 + YUY2 = 107 + Y210 = 108 + Y216 = 109 + NV11 = 110 + AI44 = 111 + IA44 = 112 + P8 = 113 + A8P8 = 114 + B4G4R4A4_UNORM = 115 + P208 = 130 + V208 = 131 + V408 = 132 + SAMPLER_FEEDBACK_MIN_MIP_OPAQUE = 189 + SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE = 190 + + +class D3DFMT(IntEnum): + UNKNOWN = 0 + R8G8B8 = 20 + A8R8G8B8 = 21 + X8R8G8B8 = 22 + R5G6B5 = 23 + X1R5G5B5 = 24 + A1R5G5B5 = 25 + A4R4G4B4 = 26 + R3G3B2 = 27 + A8 = 28 + A8R3G3B2 = 29 + X4R4G4B4 = 30 + A2B10G10R10 = 31 + A8B8G8R8 = 32 + X8B8G8R8 = 33 + G16R16 = 34 + A2R10G10B10 = 35 + A16B16G16R16 = 36 + A8P8 = 40 + P8 = 41 + L8 = 50 + A8L8 = 51 + A4L4 = 52 + V8U8 = 60 + L6V5U5 = 61 + X8L8V8U8 = 62 + Q8W8V8U8 = 63 + V16U16 = 64 + A2W10V10U10 = 67 + D16_LOCKABLE = 70 + D32 = 71 + D15S1 = 73 + D24S8 = 75 + D24X8 = 77 + D24X4S4 = 79 + D16 = 80 + D32F_LOCKABLE = 82 + D24FS8 = 83 + D32_LOCKABLE = 84 + S8_LOCKABLE = 85 + L16 = 81 + VERTEXDATA = 100 + INDEX16 = 101 + INDEX32 = 102 + Q16W16V16U16 = 110 + R16F = 111 + G16R16F = 112 + A16B16G16R16F = 113 + R32F = 114 + G32R32F = 115 + A32B32G32R32F = 116 + CxV8U8 = 117 + A1 = 118 + A2B10G10R10_XR_BIAS = 119 + BINARYBUFFER = 199 + + UYVY = i32(b"UYVY") + R8G8_B8G8 = i32(b"RGBG") + YUY2 = i32(b"YUY2") + G8R8_G8B8 = i32(b"GRGB") + DXT1 = i32(b"DXT1") + DXT2 = i32(b"DXT2") + DXT3 = i32(b"DXT3") + DXT4 = i32(b"DXT4") + DXT5 = i32(b"DXT5") + DX10 = i32(b"DX10") + BC4S = i32(b"BC4S") + BC4U = i32(b"BC4U") + BC5S = i32(b"BC5S") + BC5U = i32(b"BC5U") + ATI1 = i32(b"ATI1") + ATI2 = i32(b"ATI2") + MULTI2_ARGB8 = i32(b"MET1") + + +# Backward compatibility layer +module = sys.modules[__name__] +for item in DDSD: + assert item.name is not None + setattr(module, f"DDSD_{item.name}", item.value) +for item1 in DDSCAPS: + assert item1.name is not None + setattr(module, f"DDSCAPS_{item1.name}", item1.value) +for item2 in DDSCAPS2: + assert item2.name is not None + setattr(module, f"DDSCAPS2_{item2.name}", item2.value) +for item3 in DDPF: + assert item3.name is not None + setattr(module, f"DDPF_{item3.name}", item3.value) + +DDS_FOURCC = DDPF.FOURCC +DDS_RGB = DDPF.RGB +DDS_RGBA = DDPF.RGB | DDPF.ALPHAPIXELS +DDS_LUMINANCE = DDPF.LUMINANCE +DDS_LUMINANCEA = DDPF.LUMINANCE | DDPF.ALPHAPIXELS +DDS_ALPHA = DDPF.ALPHA +DDS_PAL8 = DDPF.PALETTEINDEXED8 + +DDS_HEADER_FLAGS_TEXTURE = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PIXELFORMAT +DDS_HEADER_FLAGS_MIPMAP = DDSD.MIPMAPCOUNT +DDS_HEADER_FLAGS_VOLUME = DDSD.DEPTH +DDS_HEADER_FLAGS_PITCH = DDSD.PITCH +DDS_HEADER_FLAGS_LINEARSIZE = DDSD.LINEARSIZE + +DDS_HEIGHT = DDSD.HEIGHT +DDS_WIDTH = DDSD.WIDTH + +DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS.TEXTURE +DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS.COMPLEX | DDSCAPS.MIPMAP +DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS.COMPLEX + +DDS_CUBEMAP_POSITIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEX +DDS_CUBEMAP_NEGATIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEX +DDS_CUBEMAP_POSITIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEY +DDS_CUBEMAP_NEGATIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEY +DDS_CUBEMAP_POSITIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEZ +DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEZ + +DXT1_FOURCC = D3DFMT.DXT1 +DXT3_FOURCC = D3DFMT.DXT3 +DXT5_FOURCC = D3DFMT.DXT5 + +DXGI_FORMAT_R8G8B8A8_TYPELESS = DXGI_FORMAT.R8G8B8A8_TYPELESS +DXGI_FORMAT_R8G8B8A8_UNORM = DXGI_FORMAT.R8G8B8A8_UNORM +DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = DXGI_FORMAT.R8G8B8A8_UNORM_SRGB +DXGI_FORMAT_BC5_TYPELESS = DXGI_FORMAT.BC5_TYPELESS +DXGI_FORMAT_BC5_UNORM = DXGI_FORMAT.BC5_UNORM +DXGI_FORMAT_BC5_SNORM = DXGI_FORMAT.BC5_SNORM +DXGI_FORMAT_BC6H_UF16 = DXGI_FORMAT.BC6H_UF16 +DXGI_FORMAT_BC6H_SF16 = DXGI_FORMAT.BC6H_SF16 +DXGI_FORMAT_BC7_TYPELESS = DXGI_FORMAT.BC7_TYPELESS +DXGI_FORMAT_BC7_UNORM = DXGI_FORMAT.BC7_UNORM +DXGI_FORMAT_BC7_UNORM_SRGB = DXGI_FORMAT.BC7_UNORM_SRGB + + +class DdsImageFile(ImageFile.ImageFile): + format = "DDS" + format_description = "DirectDraw Surface" + + def _open(self) -> None: + if not _accept(self.fp.read(4)): + msg = "not a DDS file" + raise SyntaxError(msg) + (header_size,) = struct.unpack(" None: + pass + + +class DdsRgbDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes) -> tuple[int, int]: + assert self.fd is not None + bitcount, masks = self.args + + # Some masks will be padded with zeros, e.g. R 0b11 G 0b1100 + # Calculate how many zeros each mask is padded with + mask_offsets = [] + # And the maximum value of each channel without the padding + mask_totals = [] + for mask in masks: + offset = 0 + if mask != 0: + while mask >> (offset + 1) << (offset + 1) == mask: + offset += 1 + mask_offsets.append(offset) + mask_totals.append(mask >> offset) + + data = bytearray() + bytecount = bitcount // 8 + dest_length = self.state.xsize * self.state.ysize * len(masks) + while len(data) < dest_length: + value = int.from_bytes(self.fd.read(bytecount), "little") + for i, mask in enumerate(masks): + masked_value = value & mask + # Remove the zero padding, and scale it to 8 bits + data += o8( + int(((masked_value >> mask_offsets[i]) / mask_totals[i]) * 255) + ) + self.set_as_raw(data) + return -1, 0 + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode not in ("RGB", "RGBA", "L", "LA"): + msg = f"cannot write mode {im.mode} as DDS" + raise OSError(msg) + + alpha = im.mode[-1] == "A" + if im.mode[0] == "L": + pixel_flags = DDPF.LUMINANCE + rawmode = im.mode + if alpha: + rgba_mask = [0x000000FF, 0x000000FF, 0x000000FF] + else: + rgba_mask = [0xFF000000, 0xFF000000, 0xFF000000] + else: + pixel_flags = DDPF.RGB + rawmode = im.mode[::-1] + rgba_mask = [0x00FF0000, 0x0000FF00, 0x000000FF] + + if alpha: + r, g, b, a = im.split() + im = Image.merge("RGBA", (a, r, g, b)) + if alpha: + pixel_flags |= DDPF.ALPHAPIXELS + rgba_mask.append(0xFF000000 if alpha else 0) + + flags = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PITCH | DDSD.PIXELFORMAT + bitcount = len(im.getbands()) * 8 + pitch = (im.width * bitcount + 7) // 8 + + fp.write( + o32(DDS_MAGIC) + + struct.pack( + "<7I", + 124, # header size + flags, # flags + im.height, + im.width, + pitch, + 0, # depth + 0, # mipmaps + ) + + struct.pack("11I", *((0,) * 11)) # reserved + # pfsize, pfflags, fourcc, bitcount + + struct.pack("<4I", 32, pixel_flags, 0, bitcount) + + struct.pack("<4I", *rgba_mask) # dwRGBABitMask + + struct.pack("<5I", DDSCAPS.TEXTURE, 0, 0, 0, 0) + ) + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))] + ) + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"DDS " + + +Image.register_open(DdsImageFile.format, DdsImageFile, _accept) +Image.register_decoder("dds_rgb", DdsRgbDecoder) +Image.register_save(DdsImageFile.format, _save) +Image.register_extension(DdsImageFile.format, ".dds") diff --git a/.venv/lib/python3.11/site-packages/PIL/ExifTags.py b/.venv/lib/python3.11/site-packages/PIL/ExifTags.py new file mode 100644 index 0000000000000000000000000000000000000000..39b4aa552622b39860adb19e909534f3251141bd --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ExifTags.py @@ -0,0 +1,381 @@ +# +# The Python Imaging Library. +# $Id$ +# +# EXIF tags +# +# Copyright (c) 2003 by Secret Labs AB +# +# See the README file for information on usage and redistribution. +# + +""" +This module provides constants and clear-text names for various +well-known EXIF tags. +""" +from __future__ import annotations + +from enum import IntEnum + + +class Base(IntEnum): + # possibly incomplete + InteropIndex = 0x0001 + ProcessingSoftware = 0x000B + NewSubfileType = 0x00FE + SubfileType = 0x00FF + ImageWidth = 0x0100 + ImageLength = 0x0101 + BitsPerSample = 0x0102 + Compression = 0x0103 + PhotometricInterpretation = 0x0106 + Thresholding = 0x0107 + CellWidth = 0x0108 + CellLength = 0x0109 + FillOrder = 0x010A + DocumentName = 0x010D + ImageDescription = 0x010E + Make = 0x010F + Model = 0x0110 + StripOffsets = 0x0111 + Orientation = 0x0112 + SamplesPerPixel = 0x0115 + RowsPerStrip = 0x0116 + StripByteCounts = 0x0117 + MinSampleValue = 0x0118 + MaxSampleValue = 0x0119 + XResolution = 0x011A + YResolution = 0x011B + PlanarConfiguration = 0x011C + PageName = 0x011D + FreeOffsets = 0x0120 + FreeByteCounts = 0x0121 + GrayResponseUnit = 0x0122 + GrayResponseCurve = 0x0123 + T4Options = 0x0124 + T6Options = 0x0125 + ResolutionUnit = 0x0128 + PageNumber = 0x0129 + TransferFunction = 0x012D + Software = 0x0131 + DateTime = 0x0132 + Artist = 0x013B + HostComputer = 0x013C + Predictor = 0x013D + WhitePoint = 0x013E + PrimaryChromaticities = 0x013F + ColorMap = 0x0140 + HalftoneHints = 0x0141 + TileWidth = 0x0142 + TileLength = 0x0143 + TileOffsets = 0x0144 + TileByteCounts = 0x0145 + SubIFDs = 0x014A + InkSet = 0x014C + InkNames = 0x014D + NumberOfInks = 0x014E + DotRange = 0x0150 + TargetPrinter = 0x0151 + ExtraSamples = 0x0152 + SampleFormat = 0x0153 + SMinSampleValue = 0x0154 + SMaxSampleValue = 0x0155 + TransferRange = 0x0156 + ClipPath = 0x0157 + XClipPathUnits = 0x0158 + YClipPathUnits = 0x0159 + Indexed = 0x015A + JPEGTables = 0x015B + OPIProxy = 0x015F + JPEGProc = 0x0200 + JpegIFOffset = 0x0201 + JpegIFByteCount = 0x0202 + JpegRestartInterval = 0x0203 + JpegLosslessPredictors = 0x0205 + JpegPointTransforms = 0x0206 + JpegQTables = 0x0207 + JpegDCTables = 0x0208 + JpegACTables = 0x0209 + YCbCrCoefficients = 0x0211 + YCbCrSubSampling = 0x0212 + YCbCrPositioning = 0x0213 + ReferenceBlackWhite = 0x0214 + XMLPacket = 0x02BC + RelatedImageFileFormat = 0x1000 + RelatedImageWidth = 0x1001 + RelatedImageLength = 0x1002 + Rating = 0x4746 + RatingPercent = 0x4749 + ImageID = 0x800D + CFARepeatPatternDim = 0x828D + BatteryLevel = 0x828F + Copyright = 0x8298 + ExposureTime = 0x829A + FNumber = 0x829D + IPTCNAA = 0x83BB + ImageResources = 0x8649 + ExifOffset = 0x8769 + InterColorProfile = 0x8773 + ExposureProgram = 0x8822 + SpectralSensitivity = 0x8824 + GPSInfo = 0x8825 + ISOSpeedRatings = 0x8827 + OECF = 0x8828 + Interlace = 0x8829 + TimeZoneOffset = 0x882A + SelfTimerMode = 0x882B + SensitivityType = 0x8830 + StandardOutputSensitivity = 0x8831 + RecommendedExposureIndex = 0x8832 + ISOSpeed = 0x8833 + ISOSpeedLatitudeyyy = 0x8834 + ISOSpeedLatitudezzz = 0x8835 + ExifVersion = 0x9000 + DateTimeOriginal = 0x9003 + DateTimeDigitized = 0x9004 + OffsetTime = 0x9010 + OffsetTimeOriginal = 0x9011 + OffsetTimeDigitized = 0x9012 + ComponentsConfiguration = 0x9101 + CompressedBitsPerPixel = 0x9102 + ShutterSpeedValue = 0x9201 + ApertureValue = 0x9202 + BrightnessValue = 0x9203 + ExposureBiasValue = 0x9204 + MaxApertureValue = 0x9205 + SubjectDistance = 0x9206 + MeteringMode = 0x9207 + LightSource = 0x9208 + Flash = 0x9209 + FocalLength = 0x920A + Noise = 0x920D + ImageNumber = 0x9211 + SecurityClassification = 0x9212 + ImageHistory = 0x9213 + TIFFEPStandardID = 0x9216 + MakerNote = 0x927C + UserComment = 0x9286 + SubsecTime = 0x9290 + SubsecTimeOriginal = 0x9291 + SubsecTimeDigitized = 0x9292 + AmbientTemperature = 0x9400 + Humidity = 0x9401 + Pressure = 0x9402 + WaterDepth = 0x9403 + Acceleration = 0x9404 + CameraElevationAngle = 0x9405 + XPTitle = 0x9C9B + XPComment = 0x9C9C + XPAuthor = 0x9C9D + XPKeywords = 0x9C9E + XPSubject = 0x9C9F + FlashPixVersion = 0xA000 + ColorSpace = 0xA001 + ExifImageWidth = 0xA002 + ExifImageHeight = 0xA003 + RelatedSoundFile = 0xA004 + ExifInteroperabilityOffset = 0xA005 + FlashEnergy = 0xA20B + SpatialFrequencyResponse = 0xA20C + FocalPlaneXResolution = 0xA20E + FocalPlaneYResolution = 0xA20F + FocalPlaneResolutionUnit = 0xA210 + SubjectLocation = 0xA214 + ExposureIndex = 0xA215 + SensingMethod = 0xA217 + FileSource = 0xA300 + SceneType = 0xA301 + CFAPattern = 0xA302 + CustomRendered = 0xA401 + ExposureMode = 0xA402 + WhiteBalance = 0xA403 + DigitalZoomRatio = 0xA404 + FocalLengthIn35mmFilm = 0xA405 + SceneCaptureType = 0xA406 + GainControl = 0xA407 + Contrast = 0xA408 + Saturation = 0xA409 + Sharpness = 0xA40A + DeviceSettingDescription = 0xA40B + SubjectDistanceRange = 0xA40C + ImageUniqueID = 0xA420 + CameraOwnerName = 0xA430 + BodySerialNumber = 0xA431 + LensSpecification = 0xA432 + LensMake = 0xA433 + LensModel = 0xA434 + LensSerialNumber = 0xA435 + CompositeImage = 0xA460 + CompositeImageCount = 0xA461 + CompositeImageExposureTimes = 0xA462 + Gamma = 0xA500 + PrintImageMatching = 0xC4A5 + DNGVersion = 0xC612 + DNGBackwardVersion = 0xC613 + UniqueCameraModel = 0xC614 + LocalizedCameraModel = 0xC615 + CFAPlaneColor = 0xC616 + CFALayout = 0xC617 + LinearizationTable = 0xC618 + BlackLevelRepeatDim = 0xC619 + BlackLevel = 0xC61A + BlackLevelDeltaH = 0xC61B + BlackLevelDeltaV = 0xC61C + WhiteLevel = 0xC61D + DefaultScale = 0xC61E + DefaultCropOrigin = 0xC61F + DefaultCropSize = 0xC620 + ColorMatrix1 = 0xC621 + ColorMatrix2 = 0xC622 + CameraCalibration1 = 0xC623 + CameraCalibration2 = 0xC624 + ReductionMatrix1 = 0xC625 + ReductionMatrix2 = 0xC626 + AnalogBalance = 0xC627 + AsShotNeutral = 0xC628 + AsShotWhiteXY = 0xC629 + BaselineExposure = 0xC62A + BaselineNoise = 0xC62B + BaselineSharpness = 0xC62C + BayerGreenSplit = 0xC62D + LinearResponseLimit = 0xC62E + CameraSerialNumber = 0xC62F + LensInfo = 0xC630 + ChromaBlurRadius = 0xC631 + AntiAliasStrength = 0xC632 + ShadowScale = 0xC633 + DNGPrivateData = 0xC634 + MakerNoteSafety = 0xC635 + CalibrationIlluminant1 = 0xC65A + CalibrationIlluminant2 = 0xC65B + BestQualityScale = 0xC65C + RawDataUniqueID = 0xC65D + OriginalRawFileName = 0xC68B + OriginalRawFileData = 0xC68C + ActiveArea = 0xC68D + MaskedAreas = 0xC68E + AsShotICCProfile = 0xC68F + AsShotPreProfileMatrix = 0xC690 + CurrentICCProfile = 0xC691 + CurrentPreProfileMatrix = 0xC692 + ColorimetricReference = 0xC6BF + CameraCalibrationSignature = 0xC6F3 + ProfileCalibrationSignature = 0xC6F4 + AsShotProfileName = 0xC6F6 + NoiseReductionApplied = 0xC6F7 + ProfileName = 0xC6F8 + ProfileHueSatMapDims = 0xC6F9 + ProfileHueSatMapData1 = 0xC6FA + ProfileHueSatMapData2 = 0xC6FB + ProfileToneCurve = 0xC6FC + ProfileEmbedPolicy = 0xC6FD + ProfileCopyright = 0xC6FE + ForwardMatrix1 = 0xC714 + ForwardMatrix2 = 0xC715 + PreviewApplicationName = 0xC716 + PreviewApplicationVersion = 0xC717 + PreviewSettingsName = 0xC718 + PreviewSettingsDigest = 0xC719 + PreviewColorSpace = 0xC71A + PreviewDateTime = 0xC71B + RawImageDigest = 0xC71C + OriginalRawFileDigest = 0xC71D + SubTileBlockSize = 0xC71E + RowInterleaveFactor = 0xC71F + ProfileLookTableDims = 0xC725 + ProfileLookTableData = 0xC726 + OpcodeList1 = 0xC740 + OpcodeList2 = 0xC741 + OpcodeList3 = 0xC74E + NoiseProfile = 0xC761 + + +"""Maps EXIF tags to tag names.""" +TAGS = { + **{i.value: i.name for i in Base}, + 0x920C: "SpatialFrequencyResponse", + 0x9214: "SubjectLocation", + 0x9215: "ExposureIndex", + 0x828E: "CFAPattern", + 0x920B: "FlashEnergy", + 0x9216: "TIFF/EPStandardID", +} + + +class GPS(IntEnum): + GPSVersionID = 0 + GPSLatitudeRef = 1 + GPSLatitude = 2 + GPSLongitudeRef = 3 + GPSLongitude = 4 + GPSAltitudeRef = 5 + GPSAltitude = 6 + GPSTimeStamp = 7 + GPSSatellites = 8 + GPSStatus = 9 + GPSMeasureMode = 10 + GPSDOP = 11 + GPSSpeedRef = 12 + GPSSpeed = 13 + GPSTrackRef = 14 + GPSTrack = 15 + GPSImgDirectionRef = 16 + GPSImgDirection = 17 + GPSMapDatum = 18 + GPSDestLatitudeRef = 19 + GPSDestLatitude = 20 + GPSDestLongitudeRef = 21 + GPSDestLongitude = 22 + GPSDestBearingRef = 23 + GPSDestBearing = 24 + GPSDestDistanceRef = 25 + GPSDestDistance = 26 + GPSProcessingMethod = 27 + GPSAreaInformation = 28 + GPSDateStamp = 29 + GPSDifferential = 30 + GPSHPositioningError = 31 + + +"""Maps EXIF GPS tags to tag names.""" +GPSTAGS = {i.value: i.name for i in GPS} + + +class Interop(IntEnum): + InteropIndex = 1 + InteropVersion = 2 + RelatedImageFileFormat = 4096 + RelatedImageWidth = 4097 + RelatedImageHeight = 4098 + + +class IFD(IntEnum): + Exif = 34665 + GPSInfo = 34853 + Makernote = 37500 + Interop = 40965 + IFD1 = -1 + + +class LightSource(IntEnum): + Unknown = 0 + Daylight = 1 + Fluorescent = 2 + Tungsten = 3 + Flash = 4 + Fine = 9 + Cloudy = 10 + Shade = 11 + DaylightFluorescent = 12 + DayWhiteFluorescent = 13 + CoolWhiteFluorescent = 14 + WhiteFluorescent = 15 + StandardLightA = 17 + StandardLightB = 18 + StandardLightC = 19 + D55 = 20 + D65 = 21 + D75 = 22 + D50 = 23 + ISO = 24 + Other = 255 diff --git a/.venv/lib/python3.11/site-packages/PIL/FontFile.py b/.venv/lib/python3.11/site-packages/PIL/FontFile.py new file mode 100644 index 0000000000000000000000000000000000000000..1e0c1c166b5932a7621e510eba047586465e03d8 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/FontFile.py @@ -0,0 +1,134 @@ +# +# The Python Imaging Library +# $Id$ +# +# base class for raster font file parsers +# +# history: +# 1997-06-05 fl created +# 1997-08-19 fl restrict image width +# +# Copyright (c) 1997-1998 by Secret Labs AB +# Copyright (c) 1997-1998 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +from typing import BinaryIO + +from . import Image, _binary + +WIDTH = 800 + + +def puti16( + fp: BinaryIO, values: tuple[int, int, int, int, int, int, int, int, int, int] +) -> None: + """Write network order (big-endian) 16-bit sequence""" + for v in values: + if v < 0: + v += 65536 + fp.write(_binary.o16be(v)) + + +class FontFile: + """Base class for raster font file handlers.""" + + bitmap: Image.Image | None = None + + def __init__(self) -> None: + self.info: dict[bytes, bytes | int] = {} + self.glyph: list[ + tuple[ + tuple[int, int], + tuple[int, int, int, int], + tuple[int, int, int, int], + Image.Image, + ] + | None + ] = [None] * 256 + + def __getitem__(self, ix: int) -> ( + tuple[ + tuple[int, int], + tuple[int, int, int, int], + tuple[int, int, int, int], + Image.Image, + ] + | None + ): + return self.glyph[ix] + + def compile(self) -> None: + """Create metrics and bitmap""" + + if self.bitmap: + return + + # create bitmap large enough to hold all data + h = w = maxwidth = 0 + lines = 1 + for glyph in self.glyph: + if glyph: + d, dst, src, im = glyph + h = max(h, src[3] - src[1]) + w = w + (src[2] - src[0]) + if w > WIDTH: + lines += 1 + w = src[2] - src[0] + maxwidth = max(maxwidth, w) + + xsize = maxwidth + ysize = lines * h + + if xsize == 0 and ysize == 0: + return + + self.ysize = h + + # paste glyphs into bitmap + self.bitmap = Image.new("1", (xsize, ysize)) + self.metrics: list[ + tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]] + | None + ] = [None] * 256 + x = y = 0 + for i in range(256): + glyph = self[i] + if glyph: + d, dst, src, im = glyph + xx = src[2] - src[0] + x0, y0 = x, y + x = x + xx + if x > WIDTH: + x, y = 0, y + h + x0, y0 = x, y + x = xx + s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 + self.bitmap.paste(im.crop(src), s) + self.metrics[i] = d, dst, s + + def save(self, filename: str) -> None: + """Save font""" + + self.compile() + + # font data + if not self.bitmap: + msg = "No bitmap created" + raise ValueError(msg) + self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") + + # font metrics + with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: + fp.write(b"PILfont\n") + fp.write(f";;;;;;{self.ysize};\n".encode("ascii")) # HACK!!! + fp.write(b"DATA\n") + for id in range(256): + m = self.metrics[id] + if not m: + puti16(fp, (0,) * 10) + else: + puti16(fp, m[0] + m[1] + m[2]) diff --git a/.venv/lib/python3.11/site-packages/PIL/FpxImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/FpxImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..c1927bd26aac38d17aea21088c1ef15b804d4b5b --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/FpxImagePlugin.py @@ -0,0 +1,255 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library. +# $Id$ +# +# FlashPix support for PIL +# +# History: +# 97-01-25 fl Created (reads uncompressed RGB images only) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import olefile + +from . import Image, ImageFile +from ._binary import i32le as i32 + +# we map from colour field tuples to (mode, rawmode) descriptors +MODES = { + # opacity + (0x00007FFE,): ("A", "L"), + # monochrome + (0x00010000,): ("L", "L"), + (0x00018000, 0x00017FFE): ("RGBA", "LA"), + # photo YCC + (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), + (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"), + # standard RGB (NIFRGB) + (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), + (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"), +} + + +# +# -------------------------------------------------------------------- + + +def _accept(prefix: bytes) -> bool: + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for the FlashPix images. + + +class FpxImageFile(ImageFile.ImageFile): + format = "FPX" + format_description = "FlashPix" + + def _open(self): + # + # read the OLE directory and see if this is a likely + # to be a FlashPix file + + try: + self.ole = olefile.OleFileIO(self.fp) + except OSError as e: + msg = "not an FPX file; invalid OLE file" + raise SyntaxError(msg) from e + + if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": + msg = "not an FPX file; bad root CLSID" + raise SyntaxError(msg) + + self._open_index(1) + + def _open_index(self, index: int = 1) -> None: + # + # get the Image Contents Property Set + + prop = self.ole.getproperties( + [f"Data Object Store {index:06d}", "\005Image Contents"] + ) + + # size (highest resolution) + + self._size = prop[0x1000002], prop[0x1000003] + + size = max(self.size) + i = 1 + while size > 64: + size = size // 2 + i += 1 + self.maxid = i - 1 + + # mode. instead of using a single field for this, flashpix + # requires you to specify the mode for each channel in each + # resolution subimage, and leaves it to the decoder to make + # sure that they all match. for now, we'll cheat and assume + # that this is always the case. + + id = self.maxid << 16 + + s = prop[0x2000002 | id] + + bands = i32(s, 4) + if bands > 4: + msg = "Invalid number of bands" + raise OSError(msg) + + # note: for now, we ignore the "uncalibrated" flag + colors = tuple(i32(s, 8 + i * 4) & 0x7FFFFFFF for i in range(bands)) + + self._mode, self.rawmode = MODES[colors] + + # load JPEG tables, if any + self.jpeg = {} + for i in range(256): + id = 0x3000001 | (i << 16) + if id in prop: + self.jpeg[i] = prop[id] + + self._open_subimage(1, self.maxid) + + def _open_subimage(self, index: int = 1, subimage: int = 0) -> None: + # + # setup tile descriptors for a given subimage + + stream = [ + f"Data Object Store {index:06d}", + f"Resolution {subimage:04d}", + "Subimage 0000 Header", + ] + + fp = self.ole.openstream(stream) + + # skip prefix + fp.read(28) + + # header stream + s = fp.read(36) + + size = i32(s, 4), i32(s, 8) + # tilecount = i32(s, 12) + tilesize = i32(s, 16), i32(s, 20) + # channels = i32(s, 24) + offset = i32(s, 28) + length = i32(s, 32) + + if size != self.size: + msg = "subimage mismatch" + raise OSError(msg) + + # get tile descriptors + fp.seek(28 + offset) + s = fp.read(i32(s, 12) * length) + + x = y = 0 + xsize, ysize = size + xtile, ytile = tilesize + self.tile = [] + + for i in range(0, len(s), length): + x1 = min(xsize, x + xtile) + y1 = min(ysize, y + ytile) + + compression = i32(s, i + 8) + + if compression == 0: + self.tile.append( + ( + "raw", + (x, y, x1, y1), + i32(s, i) + 28, + (self.rawmode,), + ) + ) + + elif compression == 1: + # FIXME: the fill decoder is not implemented + self.tile.append( + ( + "fill", + (x, y, x1, y1), + i32(s, i) + 28, + (self.rawmode, s[12:16]), + ) + ) + + elif compression == 2: + internal_color_conversion = s[14] + jpeg_tables = s[15] + rawmode = self.rawmode + + if internal_color_conversion: + # The image is stored as usual (usually YCbCr). + if rawmode == "RGBA": + # For "RGBA", data is stored as YCbCrA based on + # negative RGB. The following trick works around + # this problem : + jpegmode, rawmode = "YCbCrK", "CMYK" + else: + jpegmode = None # let the decoder decide + + else: + # The image is stored as defined by rawmode + jpegmode = rawmode + + self.tile.append( + ( + "jpeg", + (x, y, x1, y1), + i32(s, i) + 28, + (rawmode, jpegmode), + ) + ) + + # FIXME: jpeg tables are tile dependent; the prefix + # data must be placed in the tile descriptor itself! + + if jpeg_tables: + self.tile_prefix = self.jpeg[jpeg_tables] + + else: + msg = "unknown/invalid compression" + raise OSError(msg) + + x = x + xtile + if x >= xsize: + x, y = 0, y + ytile + if y >= ysize: + break # isn't really required + + self.stream = stream + self._fp = self.fp + self.fp = None + + def load(self): + if not self.fp: + self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) + + return ImageFile.ImageFile.load(self) + + def close(self) -> None: + self.ole.close() + super().close() + + def __exit__(self, *args: object) -> None: + self.ole.close() + super().__exit__() + + +# +# -------------------------------------------------------------------- + + +Image.register_open(FpxImageFile.format, FpxImageFile, _accept) + +Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/.venv/lib/python3.11/site-packages/PIL/GifImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/GifImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..284128c773fe848541d75b23691ad8565bad9ce2 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/GifImagePlugin.py @@ -0,0 +1,1159 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GIF file handling +# +# History: +# 1995-09-01 fl Created +# 1996-12-14 fl Added interlace support +# 1996-12-30 fl Added animation support +# 1997-01-05 fl Added write support, fixed local colour map bug +# 1997-02-23 fl Make sure to load raster data in getdata() +# 1997-07-05 fl Support external decoder (0.4) +# 1998-07-09 fl Handle all modes when saving (0.5) +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) +# 2001-04-17 fl Added palette optimization (0.7) +# 2002-06-06 fl Added transparency support for save (0.8) +# 2004-02-24 fl Disable interlacing for small images +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import itertools +import math +import os +import subprocess +import sys +from enum import IntEnum +from functools import cached_property +from typing import IO, TYPE_CHECKING, Any, List, Literal, NamedTuple, Union + +from . import ( + Image, + ImageChops, + ImageFile, + ImageMath, + ImageOps, + ImagePalette, + ImageSequence, +) +from ._binary import i16le as i16 +from ._binary import o8 +from ._binary import o16le as o16 + +if TYPE_CHECKING: + from . import _imaging + + +class LoadingStrategy(IntEnum): + """.. versionadded:: 9.1.0""" + + RGB_AFTER_FIRST = 0 + RGB_AFTER_DIFFERENT_PALETTE_ONLY = 1 + RGB_ALWAYS = 2 + + +#: .. versionadded:: 9.1.0 +LOADING_STRATEGY = LoadingStrategy.RGB_AFTER_FIRST + +# -------------------------------------------------------------------- +# Identify/read GIF files + + +def _accept(prefix: bytes) -> bool: + return prefix[:6] in [b"GIF87a", b"GIF89a"] + + +## +# Image plugin for GIF images. This plugin supports both GIF87 and +# GIF89 images. + + +class GifImageFile(ImageFile.ImageFile): + format = "GIF" + format_description = "Compuserve GIF" + _close_exclusive_fp_after_loading = False + + global_palette = None + + def data(self) -> bytes | None: + s = self.fp.read(1) + if s and s[0]: + return self.fp.read(s[0]) + return None + + def _is_palette_needed(self, p: bytes) -> bool: + for i in range(0, len(p), 3): + if not (i // 3 == p[i] == p[i + 1] == p[i + 2]): + return True + return False + + def _open(self) -> None: + # Screen + s = self.fp.read(13) + if not _accept(s): + msg = "not a GIF file" + raise SyntaxError(msg) + + self.info["version"] = s[:6] + self._size = i16(s, 6), i16(s, 8) + self.tile = [] + flags = s[10] + bits = (flags & 7) + 1 + + if flags & 128: + # get global palette + self.info["background"] = s[11] + # check if palette contains colour indices + p = self.fp.read(3 << bits) + if self._is_palette_needed(p): + p = ImagePalette.raw("RGB", p) + self.global_palette = self.palette = p + + self._fp = self.fp # FIXME: hack + self.__rewind = self.fp.tell() + self._n_frames: int | None = None + self._seek(0) # get ready to read first frame + + @property + def n_frames(self) -> int: + if self._n_frames is None: + current = self.tell() + try: + while True: + self._seek(self.tell() + 1, False) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + + @cached_property + def is_animated(self) -> bool: + if self._n_frames is not None: + return self._n_frames != 1 + + current = self.tell() + if current: + return True + + try: + self._seek(1, False) + is_animated = True + except EOFError: + is_animated = False + + self.seek(current) + return is_animated + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if frame < self.__frame: + self.im = None + self._seek(0) + + last_frame = self.__frame + for f in range(self.__frame + 1, frame + 1): + try: + self._seek(f) + except EOFError as e: + self.seek(last_frame) + msg = "no more images in GIF file" + raise EOFError(msg) from e + + def _seek(self, frame: int, update_image: bool = True) -> None: + if frame == 0: + # rewind + self.__offset = 0 + self.dispose: _imaging.ImagingCore | None = None + self.__frame = -1 + self._fp.seek(self.__rewind) + self.disposal_method = 0 + if "comment" in self.info: + del self.info["comment"] + else: + # ensure that the previous frame was loaded + if self.tile and update_image: + self.load() + + if frame != self.__frame + 1: + msg = f"cannot seek to frame {frame}" + raise ValueError(msg) + + self.fp = self._fp + if self.__offset: + # backup to last frame + self.fp.seek(self.__offset) + while self.data(): + pass + self.__offset = 0 + + s = self.fp.read(1) + if not s or s == b";": + msg = "no more images in GIF file" + raise EOFError(msg) + + palette: ImagePalette.ImagePalette | Literal[False] | None = None + + info: dict[str, Any] = {} + frame_transparency = None + interlace = None + frame_dispose_extent = None + while True: + if not s: + s = self.fp.read(1) + if not s or s == b";": + break + + elif s == b"!": + # + # extensions + # + s = self.fp.read(1) + block = self.data() + if s[0] == 249 and block is not None: + # + # graphic control extension + # + flags = block[0] + if flags & 1: + frame_transparency = block[3] + info["duration"] = i16(block, 1) * 10 + + # disposal method - find the value of bits 4 - 6 + dispose_bits = 0b00011100 & flags + dispose_bits = dispose_bits >> 2 + if dispose_bits: + # only set the dispose if it is not + # unspecified. I'm not sure if this is + # correct, but it seems to prevent the last + # frame from looking odd for some animations + self.disposal_method = dispose_bits + elif s[0] == 254: + # + # comment extension + # + comment = b"" + + # Read this comment block + while block: + comment += block + block = self.data() + + if "comment" in info: + # If multiple comment blocks in frame, separate with \n + info["comment"] += b"\n" + comment + else: + info["comment"] = comment + s = None + continue + elif s[0] == 255 and frame == 0 and block is not None: + # + # application extension + # + info["extension"] = block, self.fp.tell() + if block[:11] == b"NETSCAPE2.0": + block = self.data() + if block and len(block) >= 3 and block[0] == 1: + self.info["loop"] = i16(block, 1) + while self.data(): + pass + + elif s == b",": + # + # local image + # + s = self.fp.read(9) + + # extent + x0, y0 = i16(s, 0), i16(s, 2) + x1, y1 = x0 + i16(s, 4), y0 + i16(s, 6) + if (x1 > self.size[0] or y1 > self.size[1]) and update_image: + self._size = max(x1, self.size[0]), max(y1, self.size[1]) + Image._decompression_bomb_check(self._size) + frame_dispose_extent = x0, y0, x1, y1 + flags = s[8] + + interlace = (flags & 64) != 0 + + if flags & 128: + bits = (flags & 7) + 1 + p = self.fp.read(3 << bits) + if self._is_palette_needed(p): + palette = ImagePalette.raw("RGB", p) + else: + palette = False + + # image data + bits = self.fp.read(1)[0] + self.__offset = self.fp.tell() + break + s = None + + if interlace is None: + msg = "image not found in GIF frame" + raise EOFError(msg) + + self.__frame = frame + if not update_image: + return + + self.tile = [] + + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + + self._frame_palette = palette if palette is not None else self.global_palette + self._frame_transparency = frame_transparency + if frame == 0: + if self._frame_palette: + if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: + self._mode = "RGBA" if frame_transparency is not None else "RGB" + else: + self._mode = "P" + else: + self._mode = "L" + + if not palette and self.global_palette: + from copy import copy + + palette = copy(self.global_palette) + self.palette = palette + else: + if self.mode == "P": + if ( + LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY + or palette + ): + self.pyaccess = None + if "transparency" in self.info: + self.im.putpalettealpha(self.info["transparency"], 0) + self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) + self._mode = "RGBA" + del self.info["transparency"] + else: + self._mode = "RGB" + self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) + + def _rgb(color: int) -> tuple[int, int, int]: + if self._frame_palette: + if color * 3 + 3 > len(self._frame_palette.palette): + color = 0 + return tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]) + else: + return (color, color, color) + + self.dispose = None + self.dispose_extent = frame_dispose_extent + if self.dispose_extent and self.disposal_method >= 2: + try: + if self.disposal_method == 2: + # replace with background colour + + # only dispose the extent in this frame + x0, y0, x1, y1 = self.dispose_extent + dispose_size = (x1 - x0, y1 - y0) + + Image._decompression_bomb_check(dispose_size) + + # by convention, attempt to use transparency first + dispose_mode = "P" + color = self.info.get("transparency", frame_transparency) + if color is not None: + if self.mode in ("RGB", "RGBA"): + dispose_mode = "RGBA" + color = _rgb(color) + (0,) + else: + color = self.info.get("background", 0) + if self.mode in ("RGB", "RGBA"): + dispose_mode = "RGB" + color = _rgb(color) + self.dispose = Image.core.fill(dispose_mode, dispose_size, color) + else: + # replace with previous contents + if self.im is not None: + # only dispose the extent in this frame + self.dispose = self._crop(self.im, self.dispose_extent) + elif frame_transparency is not None: + x0, y0, x1, y1 = self.dispose_extent + dispose_size = (x1 - x0, y1 - y0) + + Image._decompression_bomb_check(dispose_size) + dispose_mode = "P" + color = frame_transparency + if self.mode in ("RGB", "RGBA"): + dispose_mode = "RGBA" + color = _rgb(frame_transparency) + (0,) + self.dispose = Image.core.fill( + dispose_mode, dispose_size, color + ) + except AttributeError: + pass + + if interlace is not None: + transparency = -1 + if frame_transparency is not None: + if frame == 0: + if LOADING_STRATEGY != LoadingStrategy.RGB_ALWAYS: + self.info["transparency"] = frame_transparency + elif self.mode not in ("RGB", "RGBA"): + transparency = frame_transparency + self.tile = [ + ( + "gif", + (x0, y0, x1, y1), + self.__offset, + (bits, interlace, transparency), + ) + ] + + if info.get("comment"): + self.info["comment"] = info["comment"] + for k in ["duration", "extension"]: + if k in info: + self.info[k] = info[k] + elif k in self.info: + del self.info[k] + + def load_prepare(self) -> None: + temp_mode = "P" if self._frame_palette else "L" + self._prev_im = None + if self.__frame == 0: + if self._frame_transparency is not None: + self.im = Image.core.fill( + temp_mode, self.size, self._frame_transparency + ) + elif self.mode in ("RGB", "RGBA"): + self._prev_im = self.im + if self._frame_palette: + self.im = Image.core.fill("P", self.size, self._frame_transparency or 0) + self.im.putpalette("RGB", *self._frame_palette.getdata()) + else: + self.im = None + self._mode = temp_mode + self._frame_palette = None + + super().load_prepare() + + def load_end(self) -> None: + if self.__frame == 0: + if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: + if self._frame_transparency is not None: + self.im.putpalettealpha(self._frame_transparency, 0) + self._mode = "RGBA" + else: + self._mode = "RGB" + self.im = self.im.convert(self.mode, Image.Dither.FLOYDSTEINBERG) + return + if not self._prev_im: + return + if self._frame_transparency is not None: + self.im.putpalettealpha(self._frame_transparency, 0) + frame_im = self.im.convert("RGBA") + else: + frame_im = self.im.convert("RGB") + + assert self.dispose_extent is not None + frame_im = self._crop(frame_im, self.dispose_extent) + + self.im = self._prev_im + self._mode = self.im.mode + if frame_im.mode == "RGBA": + self.im.paste(frame_im, self.dispose_extent, frame_im) + else: + self.im.paste(frame_im, self.dispose_extent) + + def tell(self) -> int: + return self.__frame + + +# -------------------------------------------------------------------- +# Write GIF files + + +RAWMODE = {"1": "L", "L": "L", "P": "P"} + + +def _normalize_mode(im: Image.Image) -> Image.Image: + """ + Takes an image (or frame), returns an image in a mode that is appropriate + for saving in a Gif. + + It may return the original image, or it may return an image converted to + palette or 'L' mode. + + :param im: Image object + :returns: Image object + """ + if im.mode in RAWMODE: + im.load() + return im + if Image.getmodebase(im.mode) == "RGB": + im = im.convert("P", palette=Image.Palette.ADAPTIVE) + if im.palette.mode == "RGBA": + for rgba in im.palette.colors: + if rgba[3] == 0: + im.info["transparency"] = im.palette.colors[rgba] + break + return im + return im.convert("L") + + +_Palette = Union[bytes, bytearray, List[int], ImagePalette.ImagePalette] + + +def _normalize_palette( + im: Image.Image, palette: _Palette | None, info: dict[str, Any] +) -> Image.Image: + """ + Normalizes the palette for image. + - Sets the palette to the incoming palette, if provided. + - Ensures that there's a palette for L mode images + - Optimizes the palette if necessary/desired. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: Image object + """ + source_palette = None + if palette: + # a bytes palette + if isinstance(palette, (bytes, bytearray, list)): + source_palette = bytearray(palette[:768]) + if isinstance(palette, ImagePalette.ImagePalette): + source_palette = bytearray(palette.palette) + + if im.mode == "P": + if not source_palette: + source_palette = im.im.getpalette("RGB")[:768] + else: # L-mode + if not source_palette: + source_palette = bytearray(i // 3 for i in range(768)) + im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette) + + used_palette_colors: list[int] | None + if palette: + used_palette_colors = [] + assert source_palette is not None + for i in range(0, len(source_palette), 3): + source_color = tuple(source_palette[i : i + 3]) + index = im.palette.colors.get(source_color) + if index in used_palette_colors: + index = None + used_palette_colors.append(index) + for i, index in enumerate(used_palette_colors): + if index is None: + for j in range(len(used_palette_colors)): + if j not in used_palette_colors: + used_palette_colors[i] = j + break + im = im.remap_palette(used_palette_colors) + else: + used_palette_colors = _get_optimize(im, info) + if used_palette_colors is not None: + im = im.remap_palette(used_palette_colors, source_palette) + if "transparency" in info: + try: + info["transparency"] = used_palette_colors.index( + info["transparency"] + ) + except ValueError: + del info["transparency"] + return im + + im.palette.palette = source_palette + return im + + +def _write_single_frame( + im: Image.Image, + fp: IO[bytes], + palette: _Palette | None, +) -> None: + im_out = _normalize_mode(im) + for k, v in im_out.info.items(): + im.encoderinfo.setdefault(k, v) + im_out = _normalize_palette(im_out, palette, im.encoderinfo) + + for s in _get_global_header(im_out, im.encoderinfo): + fp.write(s) + + # local image header + flags = 0 + if get_interlace(im): + flags = flags | 64 + _write_local_header(fp, im, (0, 0), flags) + + im_out.encoderconfig = (8, get_interlace(im)) + ImageFile._save(im_out, fp, [("gif", (0, 0) + im.size, 0, RAWMODE[im_out.mode])]) + + fp.write(b"\0") # end of image data + + +def _getbbox( + base_im: Image.Image, im_frame: Image.Image +) -> tuple[Image.Image, tuple[int, int, int, int] | None]: + if _get_palette_bytes(im_frame) != _get_palette_bytes(base_im): + im_frame = im_frame.convert("RGBA") + base_im = base_im.convert("RGBA") + delta = ImageChops.subtract_modulo(im_frame, base_im) + return delta, delta.getbbox(alpha_only=False) + + +class _Frame(NamedTuple): + im: Image.Image + bbox: tuple[int, int, int, int] | None + encoderinfo: dict[str, Any] + + +def _write_multiple_frames( + im: Image.Image, fp: IO[bytes], palette: _Palette | None +) -> bool: + duration = im.encoderinfo.get("duration") + disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) + + im_frames: list[_Frame] = [] + previous_im: Image.Image | None = None + frame_count = 0 + background_im = None + for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): + for im_frame in ImageSequence.Iterator(imSequence): + # a copy is required here since seek can still mutate the image + im_frame = _normalize_mode(im_frame.copy()) + if frame_count == 0: + for k, v in im_frame.info.items(): + if k == "transparency": + continue + im.encoderinfo.setdefault(k, v) + + encoderinfo = im.encoderinfo.copy() + if "transparency" in im_frame.info: + encoderinfo.setdefault("transparency", im_frame.info["transparency"]) + im_frame = _normalize_palette(im_frame, palette, encoderinfo) + if isinstance(duration, (list, tuple)): + encoderinfo["duration"] = duration[frame_count] + elif duration is None and "duration" in im_frame.info: + encoderinfo["duration"] = im_frame.info["duration"] + if isinstance(disposal, (list, tuple)): + encoderinfo["disposal"] = disposal[frame_count] + frame_count += 1 + + diff_frame = None + if im_frames and previous_im: + # delta frame + delta, bbox = _getbbox(previous_im, im_frame) + if not bbox: + # This frame is identical to the previous frame + if encoderinfo.get("duration"): + im_frames[-1].encoderinfo["duration"] += encoderinfo["duration"] + continue + if im_frames[-1].encoderinfo.get("disposal") == 2: + if background_im is None: + color = im.encoderinfo.get( + "transparency", im.info.get("transparency", (0, 0, 0)) + ) + background = _get_background(im_frame, color) + background_im = Image.new("P", im_frame.size, background) + background_im.putpalette(im_frames[0].im.palette) + bbox = _getbbox(background_im, im_frame)[1] + elif encoderinfo.get("optimize") and im_frame.mode != "1": + if "transparency" not in encoderinfo: + try: + encoderinfo["transparency"] = ( + im_frame.palette._new_color_index(im_frame) + ) + except ValueError: + pass + if "transparency" in encoderinfo: + # When the delta is zero, fill the image with transparency + diff_frame = im_frame.copy() + fill = Image.new("P", delta.size, encoderinfo["transparency"]) + if delta.mode == "RGBA": + r, g, b, a = delta.split() + mask = ImageMath.lambda_eval( + lambda args: args["convert"]( + args["max"]( + args["max"]( + args["max"](args["r"], args["g"]), args["b"] + ), + args["a"], + ) + * 255, + "1", + ), + r=r, + g=g, + b=b, + a=a, + ) + else: + if delta.mode == "P": + # Convert to L without considering palette + delta_l = Image.new("L", delta.size) + delta_l.putdata(delta.getdata()) + delta = delta_l + mask = ImageMath.lambda_eval( + lambda args: args["convert"](args["im"] * 255, "1"), + im=delta, + ) + diff_frame.paste(fill, mask=ImageOps.invert(mask)) + else: + bbox = None + previous_im = im_frame + im_frames.append(_Frame(diff_frame or im_frame, bbox, encoderinfo)) + + if len(im_frames) == 1: + if "duration" in im.encoderinfo: + # Since multiple frames will not be written, use the combined duration + im.encoderinfo["duration"] = im_frames[0].encoderinfo["duration"] + return False + + for frame_data in im_frames: + im_frame = frame_data.im + if not frame_data.bbox: + # global header + for s in _get_global_header(im_frame, frame_data.encoderinfo): + fp.write(s) + offset = (0, 0) + else: + # compress difference + if not palette: + frame_data.encoderinfo["include_color_table"] = True + + im_frame = im_frame.crop(frame_data.bbox) + offset = frame_data.bbox[:2] + _write_frame_data(fp, im_frame, offset, frame_data.encoderinfo) + return True + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False +) -> None: + # header + if "palette" in im.encoderinfo or "palette" in im.info: + palette = im.encoderinfo.get("palette", im.info.get("palette")) + else: + palette = None + im.encoderinfo.setdefault("optimize", True) + + if not save_all or not _write_multiple_frames(im, fp, palette): + _write_single_frame(im, fp, palette) + + fp.write(b";") # end of file + + if hasattr(fp, "flush"): + fp.flush() + + +def get_interlace(im: Image.Image) -> int: + interlace = im.encoderinfo.get("interlace", 1) + + # workaround for @PIL153 + if min(im.size) < 16: + interlace = 0 + + return interlace + + +def _write_local_header( + fp: IO[bytes], im: Image.Image, offset: tuple[int, int], flags: int +) -> None: + try: + transparency = im.encoderinfo["transparency"] + except KeyError: + transparency = None + + if "duration" in im.encoderinfo: + duration = int(im.encoderinfo["duration"] / 10) + else: + duration = 0 + + disposal = int(im.encoderinfo.get("disposal", 0)) + + if transparency is not None or duration != 0 or disposal: + packed_flag = 1 if transparency is not None else 0 + packed_flag |= disposal << 2 + + fp.write( + b"!" + + o8(249) # extension intro + + o8(4) # length + + o8(packed_flag) # packed fields + + o16(duration) # duration + + o8(transparency or 0) # transparency index + + o8(0) + ) + + include_color_table = im.encoderinfo.get("include_color_table") + if include_color_table: + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + if color_table_size: + flags = flags | 128 # local color table flag + flags = flags | color_table_size + + fp.write( + b"," + + o16(offset[0]) # offset + + o16(offset[1]) + + o16(im.size[0]) # size + + o16(im.size[1]) + + o8(flags) # flags + ) + if include_color_table and color_table_size: + fp.write(_get_header_palette(palette_bytes)) + fp.write(o8(8)) # bits + + +def _save_netpbm(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + # Unused by default. + # To use, uncomment the register_save call at the end of the file. + # + # If you need real GIF compression and/or RGB quantization, you + # can use the external NETPBM/PBMPLUS utilities. See comments + # below for information on how to enable this. + tempfile = im._dump() + + try: + with open(filename, "wb") as f: + if im.mode != "RGB": + subprocess.check_call( + ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL + ) + else: + # Pipe ppmquant output into ppmtogif + # "ppmquant 256 %s | ppmtogif > %s" % (tempfile, filename) + quant_cmd = ["ppmquant", "256", tempfile] + togif_cmd = ["ppmtogif"] + quant_proc = subprocess.Popen( + quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL + ) + togif_proc = subprocess.Popen( + togif_cmd, + stdin=quant_proc.stdout, + stdout=f, + stderr=subprocess.DEVNULL, + ) + + # Allow ppmquant to receive SIGPIPE if ppmtogif exits + assert quant_proc.stdout is not None + quant_proc.stdout.close() + + retcode = quant_proc.wait() + if retcode: + raise subprocess.CalledProcessError(retcode, quant_cmd) + + retcode = togif_proc.wait() + if retcode: + raise subprocess.CalledProcessError(retcode, togif_cmd) + finally: + try: + os.unlink(tempfile) + except OSError: + pass + + +# Force optimization so that we can test performance against +# cases where it took lots of memory and time previously. +_FORCE_OPTIMIZE = False + + +def _get_optimize(im: Image.Image, info: dict[str, Any]) -> list[int] | None: + """ + Palette optimization is a potentially expensive operation. + + This function determines if the palette should be optimized using + some heuristics, then returns the list of palette entries in use. + + :param im: Image object + :param info: encoderinfo + :returns: list of indexes of palette entries in use, or None + """ + if im.mode in ("P", "L") and info and info.get("optimize"): + # Potentially expensive operation. + + # The palette saves 3 bytes per color not used, but palette + # lengths are restricted to 3*(2**N) bytes. Max saving would + # be 768 -> 6 bytes if we went all the way down to 2 colors. + # * If we're over 128 colors, we can't save any space. + # * If there aren't any holes, it's not worth collapsing. + # * If we have a 'large' image, the palette is in the noise. + + # create the new palette if not every color is used + optimise = _FORCE_OPTIMIZE or im.mode == "L" + if optimise or im.width * im.height < 512 * 512: + # check which colors are used + used_palette_colors = [] + for i, count in enumerate(im.histogram()): + if count: + used_palette_colors.append(i) + + if optimise or max(used_palette_colors) >= len(used_palette_colors): + return used_palette_colors + + num_palette_colors = len(im.palette.palette) // Image.getmodebands( + im.palette.mode + ) + current_palette_size = 1 << (num_palette_colors - 1).bit_length() + if ( + # check that the palette would become smaller when saved + len(used_palette_colors) <= current_palette_size // 2 + # check that the palette is not already the smallest possible size + and current_palette_size > 2 + ): + return used_palette_colors + return None + + +def _get_color_table_size(palette_bytes: bytes) -> int: + # calculate the palette size for the header + if not palette_bytes: + return 0 + elif len(palette_bytes) < 9: + return 1 + else: + return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1 + + +def _get_header_palette(palette_bytes: bytes) -> bytes: + """ + Returns the palette, null padded to the next power of 2 (*3) bytes + suitable for direct inclusion in the GIF header + + :param palette_bytes: Unpadded palette bytes, in RGBRGB form + :returns: Null padded palette + """ + color_table_size = _get_color_table_size(palette_bytes) + + # add the missing amount of bytes + # the palette has to be 2< 0: + palette_bytes += o8(0) * 3 * actual_target_size_diff + return palette_bytes + + +def _get_palette_bytes(im: Image.Image) -> bytes: + """ + Gets the palette for inclusion in the gif header + + :param im: Image object + :returns: Bytes, len<=768 suitable for inclusion in gif header + """ + return im.palette.palette if im.palette else b"" + + +def _get_background( + im: Image.Image, + info_background: int | tuple[int, int, int] | tuple[int, int, int, int] | None, +) -> int: + background = 0 + if info_background: + if isinstance(info_background, tuple): + # WebPImagePlugin stores an RGBA value in info["background"] + # So it must be converted to the same format as GifImagePlugin's + # info["background"] - a global color table index + try: + background = im.palette.getcolor(info_background, im) + except ValueError as e: + if str(e) not in ( + # If all 256 colors are in use, + # then there is no need for the background color + "cannot allocate more than 256 colors", + # Ignore non-opaque WebP background + "cannot add non-opaque RGBA color to RGB palette", + ): + raise + else: + background = info_background + return background + + +def _get_global_header(im: Image.Image, info: dict[str, Any]) -> list[bytes]: + """Return a list of strings representing a GIF header""" + + # Header Block + # https://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp + + version = b"87a" + if im.info.get("version") == b"89a" or ( + info + and ( + "transparency" in info + or info.get("loop") is not None + or info.get("duration") + or info.get("comment") + ) + ): + version = b"89a" + + background = _get_background(im, info.get("background")) + + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + + header = [ + b"GIF" # signature + + version # version + + o16(im.size[0]) # canvas width + + o16(im.size[1]), # canvas height + # Logical Screen Descriptor + # size of global color table + global color table flag + o8(color_table_size + 128), # packed fields + # background + reserved/aspect + o8(background) + o8(0), + # Global Color Table + _get_header_palette(palette_bytes), + ] + if info.get("loop") is not None: + header.append( + b"!" + + o8(255) # extension intro + + o8(11) + + b"NETSCAPE2.0" + + o8(3) + + o8(1) + + o16(info["loop"]) # number of loops + + o8(0) + ) + if info.get("comment"): + comment_block = b"!" + o8(254) # extension intro + + comment = info["comment"] + if isinstance(comment, str): + comment = comment.encode() + for i in range(0, len(comment), 255): + subblock = comment[i : i + 255] + comment_block += o8(len(subblock)) + subblock + + comment_block += o8(0) + header.append(comment_block) + return header + + +def _write_frame_data( + fp: IO[bytes], + im_frame: Image.Image, + offset: tuple[int, int], + params: dict[str, Any], +) -> None: + try: + im_frame.encoderinfo = params + + # local image header + _write_local_header(fp, im_frame, offset, 0) + + ImageFile._save( + im_frame, fp, [("gif", (0, 0) + im_frame.size, 0, RAWMODE[im_frame.mode])] + ) + + fp.write(b"\0") # end of image data + finally: + del im_frame.encoderinfo + + +# -------------------------------------------------------------------- +# Legacy GIF utilities + + +def getheader( + im: Image.Image, palette: _Palette | None = None, info: dict[str, Any] | None = None +) -> tuple[list[bytes], list[int] | None]: + """ + Legacy Method to get Gif data from image. + + Warning:: May modify image data. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: tuple of(list of header items, optimized palette) + + """ + if info is None: + info = {} + + used_palette_colors = _get_optimize(im, info) + + if "background" not in info and "background" in im.info: + info["background"] = im.info["background"] + + im_mod = _normalize_palette(im, palette, info) + im.palette = im_mod.palette + im.im = im_mod.im + header = _get_global_header(im, info) + + return header, used_palette_colors + + +def getdata( + im: Image.Image, offset: tuple[int, int] = (0, 0), **params: Any +) -> list[bytes]: + """ + Legacy Method + + Return a list of strings representing this image. + The first string is a local image header, the rest contains + encoded image data. + + To specify duration, add the time in milliseconds, + e.g. ``getdata(im_frame, duration=1000)`` + + :param im: Image object + :param offset: Tuple of (x, y) pixels. Defaults to (0, 0) + :param \\**params: e.g. duration or other encoder info parameters + :returns: List of bytes containing GIF encoded frame data + + """ + from io import BytesIO + + class Collector(BytesIO): + data = [] + + if sys.version_info >= (3, 12): + from collections.abc import Buffer + + def write(self, data: Buffer) -> int: + self.data.append(data) + return len(data) + + else: + + def write(self, data: Any) -> int: + self.data.append(data) + return len(data) + + im.load() # make sure raster data is available + + fp = Collector() + + _write_frame_data(fp, im, offset, params) + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GifImageFile.format, GifImageFile, _accept) +Image.register_save(GifImageFile.format, _save) +Image.register_save_all(GifImageFile.format, _save_all) +Image.register_extension(GifImageFile.format, ".gif") +Image.register_mime(GifImageFile.format, "image/gif") + +# +# Uncomment the following line if you wish to use NETPBM/PBMPLUS +# instead of the built-in "uncompressed" GIF encoder + +# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/.venv/lib/python3.11/site-packages/PIL/IcnsImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/IcnsImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..2a89d498cbf8b5c98f3d002b0e6eeee98e55dacd --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/IcnsImagePlugin.py @@ -0,0 +1,399 @@ +# +# The Python Imaging Library. +# $Id$ +# +# macOS icns file decoder, based on icns.py by Bob Ippolito. +# +# history: +# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. +# 2020-04-04 Allow saving on all operating systems. +# +# Copyright (c) 2004 by Bob Ippolito. +# Copyright (c) 2004 by Secret Labs. +# Copyright (c) 2004 by Fredrik Lundh. +# Copyright (c) 2014 by Alastair Houghton. +# Copyright (c) 2020 by Pan Jing. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import struct +import sys +from typing import IO + +from . import Image, ImageFile, PngImagePlugin, features + +enable_jpeg2k = features.check_codec("jpg_2000") +if enable_jpeg2k: + from . import Jpeg2KImagePlugin + +MAGIC = b"icns" +HEADERSIZE = 8 + + +def nextheader(fobj): + return struct.unpack(">4sI", fobj.read(HEADERSIZE)) + + +def read_32t(fobj, start_length, size): + # The 128x128 icon seems to have an extra header for some reason. + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(4) + if sig != b"\x00\x00\x00\x00": + msg = "Unknown signature, expecting 0x00000000" + raise SyntaxError(msg) + return read_32(fobj, (start + 4, length - 4), size) + + +def read_32(fobj, start_length, size): + """ + Read a 32bit RGB icon resource. Seems to be either uncompressed or + an RLE packbits-like scheme. + """ + (start, length) = start_length + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + if length == sizesq * 3: + # uncompressed ("RGBRGBGB") + indata = fobj.read(length) + im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) + else: + # decode image + im = Image.new("RGB", pixel_size, None) + for band_ix in range(3): + data = [] + bytesleft = sizesq + while bytesleft > 0: + byte = fobj.read(1) + if not byte: + break + byte = byte[0] + if byte & 0x80: + blocksize = byte - 125 + byte = fobj.read(1) + for i in range(blocksize): + data.append(byte) + else: + blocksize = byte + 1 + data.append(fobj.read(blocksize)) + bytesleft -= blocksize + if bytesleft <= 0: + break + if bytesleft != 0: + msg = f"Error reading channel [{repr(bytesleft)} left]" + raise SyntaxError(msg) + band = Image.frombuffer("L", pixel_size, b"".join(data), "raw", "L", 0, 1) + im.im.putband(band.im, band_ix) + return {"RGB": im} + + +def read_mk(fobj, start_length, size): + # Alpha masks seem to be uncompressed + start = start_length[0] + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + band = Image.frombuffer("L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1) + return {"A": band} + + +def read_png_or_jpeg2000(fobj, start_length, size): + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(12) + if sig[:8] == b"\x89PNG\x0d\x0a\x1a\x0a": + fobj.seek(start) + im = PngImagePlugin.PngImageFile(fobj) + Image._decompression_bomb_check(im.size) + return {"RGBA": im} + elif ( + sig[:4] == b"\xff\x4f\xff\x51" + or sig[:4] == b"\x0d\x0a\x87\x0a" + or sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" + ): + if not enable_jpeg2k: + msg = ( + "Unsupported icon subimage format (rebuild PIL " + "with JPEG 2000 support to fix this)" + ) + raise ValueError(msg) + # j2k, jpc or j2c + fobj.seek(start) + jp2kstream = fobj.read(length) + f = io.BytesIO(jp2kstream) + im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) + Image._decompression_bomb_check(im.size) + if im.mode != "RGBA": + im = im.convert("RGBA") + return {"RGBA": im} + else: + msg = "Unsupported icon subimage format" + raise ValueError(msg) + + +class IcnsFile: + SIZES = { + (512, 512, 2): [(b"ic10", read_png_or_jpeg2000)], + (512, 512, 1): [(b"ic09", read_png_or_jpeg2000)], + (256, 256, 2): [(b"ic14", read_png_or_jpeg2000)], + (256, 256, 1): [(b"ic08", read_png_or_jpeg2000)], + (128, 128, 2): [(b"ic13", read_png_or_jpeg2000)], + (128, 128, 1): [ + (b"ic07", read_png_or_jpeg2000), + (b"it32", read_32t), + (b"t8mk", read_mk), + ], + (64, 64, 1): [(b"icp6", read_png_or_jpeg2000)], + (32, 32, 2): [(b"ic12", read_png_or_jpeg2000)], + (48, 48, 1): [(b"ih32", read_32), (b"h8mk", read_mk)], + (32, 32, 1): [ + (b"icp5", read_png_or_jpeg2000), + (b"il32", read_32), + (b"l8mk", read_mk), + ], + (16, 16, 2): [(b"ic11", read_png_or_jpeg2000)], + (16, 16, 1): [ + (b"icp4", read_png_or_jpeg2000), + (b"is32", read_32), + (b"s8mk", read_mk), + ], + } + + def __init__(self, fobj): + """ + fobj is a file-like object as an icns resource + """ + # signature : (start, length) + self.dct = dct = {} + self.fobj = fobj + sig, filesize = nextheader(fobj) + if not _accept(sig): + msg = "not an icns file" + raise SyntaxError(msg) + i = HEADERSIZE + while i < filesize: + sig, blocksize = nextheader(fobj) + if blocksize <= 0: + msg = "invalid block header" + raise SyntaxError(msg) + i += HEADERSIZE + blocksize -= HEADERSIZE + dct[sig] = (i, blocksize) + fobj.seek(blocksize, io.SEEK_CUR) + i += blocksize + + def itersizes(self): + sizes = [] + for size, fmts in self.SIZES.items(): + for fmt, reader in fmts: + if fmt in self.dct: + sizes.append(size) + break + return sizes + + def bestsize(self): + sizes = self.itersizes() + if not sizes: + msg = "No 32bit icon resources found" + raise SyntaxError(msg) + return max(sizes) + + def dataforsize(self, size): + """ + Get an icon resource as {channel: array}. Note that + the arrays are bottom-up like windows bitmaps and will likely + need to be flipped or transposed in some way. + """ + dct = {} + for code, reader in self.SIZES[size]: + desc = self.dct.get(code) + if desc is not None: + dct.update(reader(self.fobj, desc, size)) + return dct + + def getimage(self, size=None): + if size is None: + size = self.bestsize() + if len(size) == 2: + size = (size[0], size[1], 1) + channels = self.dataforsize(size) + + im = channels.get("RGBA", None) + if im: + return im + + im = channels.get("RGB").copy() + try: + im.putalpha(channels["A"]) + except KeyError: + pass + return im + + +## +# Image plugin for Mac OS icons. + + +class IcnsImageFile(ImageFile.ImageFile): + """ + PIL image support for Mac OS .icns files. + Chooses the best resolution, but will possibly load + a different size image if you mutate the size attribute + before calling 'load'. + + The info dictionary has a key 'sizes' that is a list + of sizes that the icns file has. + """ + + format = "ICNS" + format_description = "Mac OS icns resource" + + def _open(self) -> None: + self.icns = IcnsFile(self.fp) + self._mode = "RGBA" + self.info["sizes"] = self.icns.itersizes() + self.best_size = self.icns.bestsize() + self.size = ( + self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2], + ) + + @property + def size(self): + return self._size + + @size.setter + def size(self, value): + info_size = value + if info_size not in self.info["sizes"] and len(info_size) == 2: + info_size = (info_size[0], info_size[1], 1) + if ( + info_size not in self.info["sizes"] + and len(info_size) == 3 + and info_size[2] == 1 + ): + simple_sizes = [ + (size[0] * size[2], size[1] * size[2]) for size in self.info["sizes"] + ] + if value in simple_sizes: + info_size = self.info["sizes"][simple_sizes.index(value)] + if info_size not in self.info["sizes"]: + msg = "This is not one of the allowed sizes of this image" + raise ValueError(msg) + self._size = value + + def load(self): + if len(self.size) == 3: + self.best_size = self.size + self.size = ( + self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2], + ) + + px = Image.Image.load(self) + if self.im is not None and self.im.size == self.size: + # Already loaded + return px + self.load_prepare() + # This is likely NOT the best way to do it, but whatever. + im = self.icns.getimage(self.best_size) + + # If this is a PNG or JPEG 2000, it won't be loaded yet + px = im.load() + + self.im = im.im + self._mode = im.mode + self.size = im.size + + return px + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + """ + Saves the image as a series of PNG files, + that are then combined into a .icns file. + """ + if hasattr(fp, "flush"): + fp.flush() + + sizes = { + b"ic07": 128, + b"ic08": 256, + b"ic09": 512, + b"ic10": 1024, + b"ic11": 32, + b"ic12": 64, + b"ic13": 256, + b"ic14": 512, + } + provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} + size_streams = {} + for size in set(sizes.values()): + image = ( + provided_images[size] + if size in provided_images + else im.resize((size, size)) + ) + + temp = io.BytesIO() + image.save(temp, "png") + size_streams[size] = temp.getvalue() + + entries = [] + for type, size in sizes.items(): + stream = size_streams[size] + entries.append((type, HEADERSIZE + len(stream), stream)) + + # Header + fp.write(MAGIC) + file_length = HEADERSIZE # Header + file_length += HEADERSIZE + 8 * len(entries) # TOC + file_length += sum(entry[1] for entry in entries) + fp.write(struct.pack(">i", file_length)) + + # TOC + fp.write(b"TOC ") + fp.write(struct.pack(">i", HEADERSIZE + len(entries) * HEADERSIZE)) + for entry in entries: + fp.write(entry[0]) + fp.write(struct.pack(">i", entry[1])) + + # Data + for entry in entries: + fp.write(entry[0]) + fp.write(struct.pack(">i", entry[1])) + fp.write(entry[2]) + + if hasattr(fp, "flush"): + fp.flush() + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == MAGIC + + +Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) +Image.register_extension(IcnsImageFile.format, ".icns") + +Image.register_save(IcnsImageFile.format, _save) +Image.register_mime(IcnsImageFile.format, "image/icns") + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Syntax: python3 IcnsImagePlugin.py [file]") + sys.exit() + + with open(sys.argv[1], "rb") as fp: + imf = IcnsImageFile(fp) + for size in imf.info["sizes"]: + width, height, scale = imf.size = size + imf.save(f"out-{width}-{height}-{scale}.png") + with Image.open(sys.argv[1]) as im: + im.save("out.png") + if sys.platform == "windows": + os.startfile("out.png") diff --git a/.venv/lib/python3.11/site-packages/PIL/Image.py b/.venv/lib/python3.11/site-packages/PIL/Image.py new file mode 100644 index 0000000000000000000000000000000000000000..d41c06523f4dc8c515e298d43654a88707df756f --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/Image.py @@ -0,0 +1,4147 @@ +# +# The Python Imaging Library. +# $Id$ +# +# the Image class wrapper +# +# partial release history: +# 1995-09-09 fl Created +# 1996-03-11 fl PIL release 0.0 (proof of concept) +# 1996-04-30 fl PIL release 0.1b1 +# 1999-07-28 fl PIL release 1.0 final +# 2000-06-07 fl PIL release 1.1 +# 2000-10-20 fl PIL release 1.1.1 +# 2001-05-07 fl PIL release 1.1.2 +# 2002-03-15 fl PIL release 1.1.3 +# 2003-05-10 fl PIL release 1.1.4 +# 2005-03-28 fl PIL release 1.1.5 +# 2006-12-02 fl PIL release 1.1.6 +# 2009-11-15 fl PIL release 1.1.7 +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import annotations + +import abc +import atexit +import builtins +import io +import logging +import math +import os +import re +import struct +import sys +import tempfile +import warnings +from collections.abc import Callable, MutableMapping +from enum import IntEnum +from types import ModuleType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Literal, + Protocol, + Sequence, + Tuple, + cast, +) + +# VERSION was removed in Pillow 6.0.0. +# PILLOW_VERSION was removed in Pillow 9.0.0. +# Use __version__ instead. +from . import ( + ExifTags, + ImageMode, + TiffTags, + UnidentifiedImageError, + __version__, + _plugins, +) +from ._binary import i32le, o32be, o32le +from ._deprecate import deprecate +from ._typing import StrOrBytesPath, TypeGuard +from ._util import DeferredError, is_path + +ElementTree: ModuleType | None +try: + from defusedxml import ElementTree +except ImportError: + ElementTree = None + +logger = logging.getLogger(__name__) + + +class DecompressionBombWarning(RuntimeWarning): + pass + + +class DecompressionBombError(Exception): + pass + + +WARN_POSSIBLE_FORMATS: bool = False + +# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image +MAX_IMAGE_PIXELS: int | None = int(1024 * 1024 * 1024 // 4 // 3) + + +try: + # If the _imaging C module is not present, Pillow will not load. + # Note that other modules should not refer to _imaging directly; + # import Image and use the Image.core variable instead. + # Also note that Image.core is not a publicly documented interface, + # and should be considered private and subject to change. + from . import _imaging as core + + if __version__ != getattr(core, "PILLOW_VERSION", None): + msg = ( + "The _imaging extension was built for another version of Pillow or PIL:\n" + f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" + f"Pillow version: {__version__}" + ) + raise ImportError(msg) + +except ImportError as v: + core = DeferredError.new(ImportError("The _imaging C module is not installed.")) + # Explanations for ways that we know we might have an import error + if str(v).startswith("Module use of python"): + # The _imaging C module is present, but not compiled for + # the right version (windows only). Print a warning, if + # possible. + warnings.warn( + "The _imaging extension was built for another version of Python.", + RuntimeWarning, + ) + elif str(v).startswith("The _imaging extension"): + warnings.warn(str(v), RuntimeWarning) + # Fail here anyway. Don't let people run with a mostly broken Pillow. + # see docs/porting.rst + raise + + +USE_CFFI_ACCESS = False +cffi: ModuleType | None +try: + import cffi +except ImportError: + cffi = None + + +def isImageType(t: Any) -> TypeGuard[Image]: + """ + Checks if an object is an image object. + + .. warning:: + + This function is for internal use only. + + :param t: object to check if it's an image + :returns: True if the object is an image + """ + return hasattr(t, "im") + + +# +# Constants + + +# transpose +class Transpose(IntEnum): + FLIP_LEFT_RIGHT = 0 + FLIP_TOP_BOTTOM = 1 + ROTATE_90 = 2 + ROTATE_180 = 3 + ROTATE_270 = 4 + TRANSPOSE = 5 + TRANSVERSE = 6 + + +# transforms (also defined in Imaging.h) +class Transform(IntEnum): + AFFINE = 0 + EXTENT = 1 + PERSPECTIVE = 2 + QUAD = 3 + MESH = 4 + + +# resampling filters (also defined in Imaging.h) +class Resampling(IntEnum): + NEAREST = 0 + BOX = 4 + BILINEAR = 2 + HAMMING = 5 + BICUBIC = 3 + LANCZOS = 1 + + +_filters_support = { + Resampling.BOX: 0.5, + Resampling.BILINEAR: 1.0, + Resampling.HAMMING: 1.0, + Resampling.BICUBIC: 2.0, + Resampling.LANCZOS: 3.0, +} + + +# dithers +class Dither(IntEnum): + NONE = 0 + ORDERED = 1 # Not yet implemented + RASTERIZE = 2 # Not yet implemented + FLOYDSTEINBERG = 3 # default + + +# palettes/quantizers +class Palette(IntEnum): + WEB = 0 + ADAPTIVE = 1 + + +class Quantize(IntEnum): + MEDIANCUT = 0 + MAXCOVERAGE = 1 + FASTOCTREE = 2 + LIBIMAGEQUANT = 3 + + +module = sys.modules[__name__] +for enum in (Transpose, Transform, Resampling, Dither, Palette, Quantize): + for item in enum: + setattr(module, item.name, item.value) + + +if hasattr(core, "DEFAULT_STRATEGY"): + DEFAULT_STRATEGY = core.DEFAULT_STRATEGY + FILTERED = core.FILTERED + HUFFMAN_ONLY = core.HUFFMAN_ONLY + RLE = core.RLE + FIXED = core.FIXED + + +# -------------------------------------------------------------------- +# Registries + +if TYPE_CHECKING: + from . import ImageFile, PyAccess +ID: list[str] = [] +OPEN: dict[ + str, + tuple[ + Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], + Callable[[bytes], bool | str] | None, + ], +] = {} +MIME: dict[str, str] = {} +SAVE: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} +SAVE_ALL: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} +EXTENSION: dict[str, str] = {} +DECODERS: dict[str, type[ImageFile.PyDecoder]] = {} +ENCODERS: dict[str, type[ImageFile.PyEncoder]] = {} + +# -------------------------------------------------------------------- +# Modes + +_ENDIAN = "<" if sys.byteorder == "little" else ">" + + +def _conv_type_shape(im): + m = ImageMode.getmode(im.mode) + shape = (im.height, im.width) + extra = len(m.bands) + if extra != 1: + shape += (extra,) + return shape, m.typestr + + +MODES = [ + "1", + "CMYK", + "F", + "HSV", + "I", + "I;16", + "I;16B", + "I;16L", + "I;16N", + "L", + "LA", + "La", + "LAB", + "P", + "PA", + "RGB", + "RGBA", + "RGBa", + "RGBX", + "YCbCr", +] + +# raw modes that may be memory mapped. NOTE: if you change this, you +# may have to modify the stride calculation in map.c too! +_MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16L", "I;16B") + + +def getmodebase(mode: str) -> str: + """ + Gets the "base" mode for given mode. This function returns "L" for + images that contain grayscale data, and "RGB" for images that + contain color data. + + :param mode: Input mode. + :returns: "L" or "RGB". + :exception KeyError: If the input mode was not a standard mode. + """ + return ImageMode.getmode(mode).basemode + + +def getmodetype(mode: str) -> str: + """ + Gets the storage type mode. Given a mode, this function returns a + single-layer mode suitable for storing individual bands. + + :param mode: Input mode. + :returns: "L", "I", or "F". + :exception KeyError: If the input mode was not a standard mode. + """ + return ImageMode.getmode(mode).basetype + + +def getmodebandnames(mode: str) -> tuple[str, ...]: + """ + Gets a list of individual band names. Given a mode, this function returns + a tuple containing the names of individual bands (use + :py:method:`~PIL.Image.getmodetype` to get the mode used to store each + individual band. + + :param mode: Input mode. + :returns: A tuple containing band names. The length of the tuple + gives the number of bands in an image of the given mode. + :exception KeyError: If the input mode was not a standard mode. + """ + return ImageMode.getmode(mode).bands + + +def getmodebands(mode: str) -> int: + """ + Gets the number of individual bands for this mode. + + :param mode: Input mode. + :returns: The number of bands in this mode. + :exception KeyError: If the input mode was not a standard mode. + """ + return len(ImageMode.getmode(mode).bands) + + +# -------------------------------------------------------------------- +# Helpers + +_initialized = 0 + + +def preinit() -> None: + """ + Explicitly loads BMP, GIF, JPEG, PPM and PPM file format drivers. + + It is called when opening or saving images. + """ + + global _initialized + if _initialized >= 1: + return + + try: + from . import BmpImagePlugin + + assert BmpImagePlugin + except ImportError: + pass + try: + from . import GifImagePlugin + + assert GifImagePlugin + except ImportError: + pass + try: + from . import JpegImagePlugin + + assert JpegImagePlugin + except ImportError: + pass + try: + from . import PpmImagePlugin + + assert PpmImagePlugin + except ImportError: + pass + try: + from . import PngImagePlugin + + assert PngImagePlugin + except ImportError: + pass + + _initialized = 1 + + +def init() -> bool: + """ + Explicitly initializes the Python Imaging Library. This function + loads all available file format drivers. + + It is called when opening or saving images if :py:meth:`~preinit()` is + insufficient, and by :py:meth:`~PIL.features.pilinfo`. + """ + + global _initialized + if _initialized >= 2: + return False + + parent_name = __name__.rpartition(".")[0] + for plugin in _plugins: + try: + logger.debug("Importing %s", plugin) + __import__(f"{parent_name}.{plugin}", globals(), locals(), []) + except ImportError as e: + logger.debug("Image: failed to import %s: %s", plugin, e) + + if OPEN or SAVE: + _initialized = 2 + return True + return False + + +# -------------------------------------------------------------------- +# Codec factories (used by tobytes/frombytes and ImageFile.load) + + +def _getdecoder( + mode: str, decoder_name: str, args: Any, extra: tuple[Any, ...] = () +) -> core.ImagingDecoder | ImageFile.PyDecoder: + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + decoder = DECODERS[decoder_name] + except KeyError: + pass + else: + return decoder(mode, *args + extra) + + try: + # get decoder + decoder = getattr(core, f"{decoder_name}_decoder") + except AttributeError as e: + msg = f"decoder {decoder_name} not available" + raise OSError(msg) from e + return decoder(mode, *args + extra) + + +def _getencoder( + mode: str, encoder_name: str, args: Any, extra: tuple[Any, ...] = () +) -> core.ImagingEncoder | ImageFile.PyEncoder: + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + encoder = ENCODERS[encoder_name] + except KeyError: + pass + else: + return encoder(mode, *args + extra) + + try: + # get encoder + encoder = getattr(core, f"{encoder_name}_encoder") + except AttributeError as e: + msg = f"encoder {encoder_name} not available" + raise OSError(msg) from e + return encoder(mode, *args + extra) + + +# -------------------------------------------------------------------- +# Simple expression analyzer + + +class _E: + def __init__(self, scale, offset) -> None: + self.scale = scale + self.offset = offset + + def __neg__(self): + return _E(-self.scale, -self.offset) + + def __add__(self, other): + if isinstance(other, _E): + return _E(self.scale + other.scale, self.offset + other.offset) + return _E(self.scale, self.offset + other) + + __radd__ = __add__ + + def __sub__(self, other): + return self + -other + + def __rsub__(self, other): + return other + -self + + def __mul__(self, other): + if isinstance(other, _E): + return NotImplemented + return _E(self.scale * other, self.offset * other) + + __rmul__ = __mul__ + + def __truediv__(self, other): + if isinstance(other, _E): + return NotImplemented + return _E(self.scale / other, self.offset / other) + + +def _getscaleoffset(expr): + a = expr(_E(1, 0)) + return (a.scale, a.offset) if isinstance(a, _E) else (0, a) + + +# -------------------------------------------------------------------- +# Implementation wrapper + + +class SupportsGetData(Protocol): + def getdata( + self, + ) -> tuple[Transform, Sequence[int]]: ... + + +class Image: + """ + This class represents an image object. To create + :py:class:`~PIL.Image.Image` objects, use the appropriate factory + functions. There's hardly ever any reason to call the Image constructor + directly. + + * :py:func:`~PIL.Image.open` + * :py:func:`~PIL.Image.new` + * :py:func:`~PIL.Image.frombytes` + """ + + format: str | None = None + format_description: str | None = None + _close_exclusive_fp_after_loading = True + + def __init__(self): + # FIXME: take "new" parameters / other image? + # FIXME: turn mode and size into delegating properties? + self.im = None + self._mode = "" + self._size = (0, 0) + self.palette = None + self.info = {} + self.readonly = 0 + self.pyaccess = None + self._exif = None + + @property + def width(self) -> int: + return self.size[0] + + @property + def height(self) -> int: + return self.size[1] + + @property + def size(self) -> tuple[int, int]: + return self._size + + @property + def mode(self) -> str: + return self._mode + + def _new(self, im: core.ImagingCore) -> Image: + new = Image() + new.im = im + new._mode = im.mode + new._size = im.size + if im.mode in ("P", "PA"): + if self.palette: + new.palette = self.palette.copy() + else: + from . import ImagePalette + + new.palette = ImagePalette.ImagePalette() + new.info = self.info.copy() + return new + + # Context manager support + def __enter__(self): + return self + + def _close_fp(self): + if getattr(self, "_fp", False): + if self._fp != self.fp: + self._fp.close() + self._fp = DeferredError(ValueError("Operation on closed image")) + if self.fp: + self.fp.close() + + def __exit__(self, *args): + if hasattr(self, "fp"): + if getattr(self, "_exclusive_fp", False): + self._close_fp() + self.fp = None + + def close(self) -> None: + """ + Closes the file pointer, if possible. + + This operation will destroy the image core and release its memory. + The image data will be unusable afterward. + + This function is required to close images that have multiple frames or + have not had their file read and closed by the + :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for + more information. + """ + if hasattr(self, "fp"): + try: + self._close_fp() + self.fp = None + except Exception as msg: + logger.debug("Error closing: %s", msg) + + if getattr(self, "map", None): + self.map = None + + # Instead of simply setting to None, we're setting up a + # deferred error that will better explain that the core image + # object is gone. + self.im = DeferredError(ValueError("Operation on closed image")) + + def _copy(self) -> None: + self.load() + self.im = self.im.copy() + self.pyaccess = None + self.readonly = 0 + + def _ensure_mutable(self) -> None: + if self.readonly: + self._copy() + else: + self.load() + + def _dump( + self, file: str | None = None, format: str | None = None, **options: Any + ) -> str: + suffix = "" + if format: + suffix = f".{format}" + + if not file: + f, filename = tempfile.mkstemp(suffix) + os.close(f) + else: + filename = file + if not filename.endswith(suffix): + filename = filename + suffix + + self.load() + + if not format or format == "PPM": + self.im.save_ppm(filename) + else: + self.save(filename, format, **options) + + return filename + + def __eq__(self, other: object) -> bool: + if self.__class__ is not other.__class__: + return False + assert isinstance(other, Image) + return ( + self.mode == other.mode + and self.size == other.size + and self.info == other.info + and self.getpalette() == other.getpalette() + and self.tobytes() == other.tobytes() + ) + + def __repr__(self) -> str: + return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( + self.__class__.__module__, + self.__class__.__name__, + self.mode, + self.size[0], + self.size[1], + id(self), + ) + + def _repr_pretty_(self, p, cycle) -> None: + """IPython plain text display support""" + + # Same as __repr__ but without unpredictable id(self), + # to keep Jupyter notebook `text/plain` output stable. + p.text( + "<%s.%s image mode=%s size=%dx%d>" + % ( + self.__class__.__module__, + self.__class__.__name__, + self.mode, + self.size[0], + self.size[1], + ) + ) + + def _repr_image(self, image_format: str, **kwargs: Any) -> bytes | None: + """Helper function for iPython display hook. + + :param image_format: Image format. + :returns: image as bytes, saved into the given format. + """ + b = io.BytesIO() + try: + self.save(b, image_format, **kwargs) + except Exception: + return None + return b.getvalue() + + def _repr_png_(self) -> bytes | None: + """iPython display hook support for PNG format. + + :returns: PNG version of the image as bytes + """ + return self._repr_image("PNG", compress_level=1) + + def _repr_jpeg_(self) -> bytes | None: + """iPython display hook support for JPEG format. + + :returns: JPEG version of the image as bytes + """ + return self._repr_image("JPEG") + + @property + def __array_interface__(self): + # numpy array interface support + new = {"version": 3} + try: + if self.mode == "1": + # Binary images need to be extended from bits to bytes + # See: https://github.com/python-pillow/Pillow/issues/350 + new["data"] = self.tobytes("raw", "L") + else: + new["data"] = self.tobytes() + except Exception as e: + if not isinstance(e, (MemoryError, RecursionError)): + try: + import numpy + from packaging.version import parse as parse_version + except ImportError: + pass + else: + if parse_version(numpy.__version__) < parse_version("1.23"): + warnings.warn(str(e)) + raise + new["shape"], new["typestr"] = _conv_type_shape(self) + return new + + def __getstate__(self): + im_data = self.tobytes() # load image first + return [self.info, self.mode, self.size, self.getpalette(), im_data] + + def __setstate__(self, state) -> None: + Image.__init__(self) + info, mode, size, palette, data = state + self.info = info + self._mode = mode + self._size = size + self.im = core.new(mode, size) + if mode in ("L", "LA", "P", "PA") and palette: + self.putpalette(palette) + self.frombytes(data) + + def tobytes(self, encoder_name: str = "raw", *args: Any) -> bytes: + """ + Return image as a bytes object. + + .. warning:: + + This method returns the raw image data from the internal + storage. For compressed image data (e.g. PNG, JPEG) use + :meth:`~.save`, with a BytesIO parameter for in-memory + data. + + :param encoder_name: What encoder to use. The default is to + use the standard "raw" encoder. + + A list of C encoders can be seen under + codecs section of the function array in + :file:`_imaging.c`. Python encoders are + registered within the relevant plugins. + :param args: Extra arguments to the encoder. + :returns: A :py:class:`bytes` object. + """ + + encoder_args: Any = args + if len(encoder_args) == 1 and isinstance(encoder_args[0], tuple): + # may pass tuple instead of argument list + encoder_args = encoder_args[0] + + if encoder_name == "raw" and encoder_args == (): + encoder_args = self.mode + + self.load() + + if self.width == 0 or self.height == 0: + return b"" + + # unpack data + e = _getencoder(self.mode, encoder_name, encoder_args) + e.setimage(self.im) + + bufsize = max(65536, self.size[0] * 4) # see RawEncode.c + + output = [] + while True: + bytes_consumed, errcode, data = e.encode(bufsize) + output.append(data) + if errcode: + break + if errcode < 0: + msg = f"encoder error {errcode} in tobytes" + raise RuntimeError(msg) + + return b"".join(output) + + def tobitmap(self, name: str = "image") -> bytes: + """ + Returns the image converted to an X11 bitmap. + + .. note:: This method only works for mode "1" images. + + :param name: The name prefix to use for the bitmap variables. + :returns: A string containing an X11 bitmap. + :raises ValueError: If the mode is not "1" + """ + + self.load() + if self.mode != "1": + msg = "not a bitmap" + raise ValueError(msg) + data = self.tobytes("xbm") + return b"".join( + [ + f"#define {name}_width {self.size[0]}\n".encode("ascii"), + f"#define {name}_height {self.size[1]}\n".encode("ascii"), + f"static char {name}_bits[] = {{\n".encode("ascii"), + data, + b"};", + ] + ) + + def frombytes( + self, data: bytes | bytearray, decoder_name: str = "raw", *args: Any + ) -> None: + """ + Loads this image with pixel data from a bytes object. + + This method is similar to the :py:func:`~PIL.Image.frombytes` function, + but loads data into this image instead of creating a new image object. + """ + + if self.width == 0 or self.height == 0: + return + + decoder_args: Any = args + if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): + # may pass tuple instead of argument list + decoder_args = decoder_args[0] + + # default format + if decoder_name == "raw" and decoder_args == (): + decoder_args = self.mode + + # unpack data + d = _getdecoder(self.mode, decoder_name, decoder_args) + d.setimage(self.im) + s = d.decode(data) + + if s[0] >= 0: + msg = "not enough image data" + raise ValueError(msg) + if s[1] != 0: + msg = "cannot decode image data" + raise ValueError(msg) + + def load(self) -> core.PixelAccess | PyAccess.PyAccess | None: + """ + Allocates storage for the image and loads the pixel data. In + normal cases, you don't need to call this method, since the + Image class automatically loads an opened image when it is + accessed for the first time. + + If the file associated with the image was opened by Pillow, then this + method will close it. The exception to this is if the image has + multiple frames, in which case the file will be left open for seek + operations. See :ref:`file-handling` for more information. + + :returns: An image access object. + :rtype: :py:class:`.PixelAccess` or :py:class:`.PyAccess` + """ + if self.im is not None and self.palette and self.palette.dirty: + # realize palette + mode, arr = self.palette.getdata() + self.im.putpalette(self.palette.mode, mode, arr) + self.palette.dirty = 0 + self.palette.rawmode = None + if "transparency" in self.info and mode in ("LA", "PA"): + if isinstance(self.info["transparency"], int): + self.im.putpalettealpha(self.info["transparency"], 0) + else: + self.im.putpalettealphas(self.info["transparency"]) + self.palette.mode = "RGBA" + else: + self.palette.palette = self.im.getpalette( + self.palette.mode, self.palette.mode + ) + + if self.im is not None: + if cffi and USE_CFFI_ACCESS: + if self.pyaccess: + return self.pyaccess + from . import PyAccess + + self.pyaccess = PyAccess.new(self, self.readonly) + if self.pyaccess: + return self.pyaccess + return self.im.pixel_access(self.readonly) + return None + + def verify(self) -> None: + """ + Verifies the contents of a file. For data read from a file, this + method attempts to determine if the file is broken, without + actually decoding the image data. If this method finds any + problems, it raises suitable exceptions. If you need to load + the image after using this method, you must reopen the image + file. + """ + pass + + def convert( + self, + mode: str | None = None, + matrix: tuple[float, ...] | None = None, + dither: Dither | None = None, + palette: Palette = Palette.WEB, + colors: int = 256, + ) -> Image: + """ + Returns a converted copy of this image. For the "P" mode, this + method translates pixels through the palette. If mode is + omitted, a mode is chosen so that all information in the image + and the palette can be represented without a palette. + + This supports all possible conversions between "L", "RGB" and "CMYK". The + ``matrix`` argument only supports "L" and "RGB". + + When translating a color image to grayscale (mode "L"), + the library uses the ITU-R 601-2 luma transform:: + + L = R * 299/1000 + G * 587/1000 + B * 114/1000 + + The default method of converting a grayscale ("L") or "RGB" + image into a bilevel (mode "1") image uses Floyd-Steinberg + dither to approximate the original image luminosity levels. If + dither is ``None``, all values larger than 127 are set to 255 (white), + all other values to 0 (black). To use other thresholds, use the + :py:meth:`~PIL.Image.Image.point` method. + + When converting from "RGBA" to "P" without a ``matrix`` argument, + this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, + and ``dither`` and ``palette`` are ignored. + + When converting from "PA", if an "RGBA" palette is present, the alpha + channel from the image will be used instead of the values from the palette. + + :param mode: The requested mode. See: :ref:`concept-modes`. + :param matrix: An optional conversion matrix. If given, this + should be 4- or 12-tuple containing floating point values. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` + (default). Note that this is not used when ``matrix`` is supplied. + :param palette: Palette to use when converting from mode "RGB" + to "P". Available palettes are :data:`Palette.WEB` or + :data:`Palette.ADAPTIVE`. + :param colors: Number of colors to use for the :data:`Palette.ADAPTIVE` + palette. Defaults to 256. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if mode in ("BGR;15", "BGR;16", "BGR;24"): + deprecate(mode, 12) + + self.load() + + has_transparency = "transparency" in self.info + if not mode and self.mode == "P": + # determine default mode + if self.palette: + mode = self.palette.mode + else: + mode = "RGB" + if mode == "RGB" and has_transparency: + mode = "RGBA" + if not mode or (mode == self.mode and not matrix): + return self.copy() + + if matrix: + # matrix conversion + if mode not in ("L", "RGB"): + msg = "illegal conversion" + raise ValueError(msg) + im = self.im.convert_matrix(mode, matrix) + new_im = self._new(im) + if has_transparency and self.im.bands == 3: + transparency = new_im.info["transparency"] + + def convert_transparency( + m: tuple[float, ...], v: tuple[int, int, int] + ) -> int: + value = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 + return max(0, min(255, int(value))) + + if mode == "L": + transparency = convert_transparency(matrix, transparency) + elif len(mode) == 3: + transparency = tuple( + convert_transparency(matrix[i * 4 : i * 4 + 4], transparency) + for i in range(0, len(transparency)) + ) + new_im.info["transparency"] = transparency + return new_im + + if mode == "P" and self.mode == "RGBA": + return self.quantize(colors) + + trns = None + delete_trns = False + # transparency handling + if has_transparency: + if (self.mode in ("1", "L", "I", "I;16") and mode in ("LA", "RGBA")) or ( + self.mode == "RGB" and mode in ("La", "LA", "RGBa", "RGBA") + ): + # Use transparent conversion to promote from transparent + # color to an alpha channel. + new_im = self._new( + self.im.convert_transparent(mode, self.info["transparency"]) + ) + del new_im.info["transparency"] + return new_im + elif self.mode in ("L", "RGB", "P") and mode in ("L", "RGB", "P"): + t = self.info["transparency"] + if isinstance(t, bytes): + # Dragons. This can't be represented by a single color + warnings.warn( + "Palette images with Transparency expressed in bytes should be " + "converted to RGBA images" + ) + delete_trns = True + else: + # get the new transparency color. + # use existing conversions + trns_im = new(self.mode, (1, 1)) + if self.mode == "P": + trns_im.putpalette(self.palette) + if isinstance(t, tuple): + err = "Couldn't allocate a palette color for transparency" + try: + t = trns_im.palette.getcolor(t, self) + except ValueError as e: + if str(e) == "cannot allocate more than 256 colors": + # If all 256 colors are in use, + # then there is no need for transparency + t = None + else: + raise ValueError(err) from e + if t is None: + trns = None + else: + trns_im.putpixel((0, 0), t) + + if mode in ("L", "RGB"): + trns_im = trns_im.convert(mode) + else: + # can't just retrieve the palette number, got to do it + # after quantization. + trns_im = trns_im.convert("RGB") + trns = trns_im.getpixel((0, 0)) + + elif self.mode == "P" and mode in ("LA", "PA", "RGBA"): + t = self.info["transparency"] + delete_trns = True + + if isinstance(t, bytes): + self.im.putpalettealphas(t) + elif isinstance(t, int): + self.im.putpalettealpha(t, 0) + else: + msg = "Transparency for P mode should be bytes or int" + raise ValueError(msg) + + if mode == "P" and palette == Palette.ADAPTIVE: + im = self.im.quantize(colors) + new_im = self._new(im) + from . import ImagePalette + + new_im.palette = ImagePalette.ImagePalette( + "RGB", new_im.im.getpalette("RGB") + ) + if delete_trns: + # This could possibly happen if we requantize to fewer colors. + # The transparency would be totally off in that case. + del new_im.info["transparency"] + if trns is not None: + try: + new_im.info["transparency"] = new_im.palette.getcolor( + cast(Tuple[int, ...], trns), # trns was converted to RGB + new_im, + ) + except Exception: + # if we can't make a transparent color, don't leave the old + # transparency hanging around to mess us up. + del new_im.info["transparency"] + warnings.warn("Couldn't allocate palette entry for transparency") + return new_im + + if "LAB" in (self.mode, mode): + other_mode = mode if self.mode == "LAB" else self.mode + if other_mode in ("RGB", "RGBA", "RGBX"): + from . import ImageCms + + srgb = ImageCms.createProfile("sRGB") + lab = ImageCms.createProfile("LAB") + profiles = [lab, srgb] if self.mode == "LAB" else [srgb, lab] + transform = ImageCms.buildTransform( + profiles[0], profiles[1], self.mode, mode + ) + return transform.apply(self) + + # colorspace conversion + if dither is None: + dither = Dither.FLOYDSTEINBERG + + try: + im = self.im.convert(mode, dither) + except ValueError: + try: + # normalize source image and try again + modebase = getmodebase(self.mode) + if modebase == self.mode: + raise + im = self.im.convert(modebase) + im = im.convert(mode, dither) + except KeyError as e: + msg = "illegal conversion" + raise ValueError(msg) from e + + new_im = self._new(im) + if mode == "P" and palette != Palette.ADAPTIVE: + from . import ImagePalette + + new_im.palette = ImagePalette.ImagePalette("RGB", im.getpalette("RGB")) + if delete_trns: + # crash fail if we leave a bytes transparency in an rgb/l mode. + del new_im.info["transparency"] + if trns is not None: + if new_im.mode == "P" and new_im.palette: + try: + new_im.info["transparency"] = new_im.palette.getcolor(trns, new_im) + except ValueError as e: + del new_im.info["transparency"] + if str(e) != "cannot allocate more than 256 colors": + # If all 256 colors are in use, + # then there is no need for transparency + warnings.warn( + "Couldn't allocate palette entry for transparency" + ) + else: + new_im.info["transparency"] = trns + return new_im + + def quantize( + self, + colors: int = 256, + method: int | None = None, + kmeans: int = 0, + palette=None, + dither: Dither = Dither.FLOYDSTEINBERG, + ) -> Image: + """ + Convert the image to 'P' mode with the specified number + of colors. + + :param colors: The desired number of colors, <= 256 + :param method: :data:`Quantize.MEDIANCUT` (median cut), + :data:`Quantize.MAXCOVERAGE` (maximum coverage), + :data:`Quantize.FASTOCTREE` (fast octree), + :data:`Quantize.LIBIMAGEQUANT` (libimagequant; check support + using :py:func:`PIL.features.check_feature` with + ``feature="libimagequant"``). + + By default, :data:`Quantize.MEDIANCUT` will be used. + + The exception to this is RGBA images. :data:`Quantize.MEDIANCUT` + and :data:`Quantize.MAXCOVERAGE` do not support RGBA images, so + :data:`Quantize.FASTOCTREE` is used by default instead. + :param kmeans: Integer greater than or equal to zero. + :param palette: Quantize to the palette of given + :py:class:`PIL.Image.Image`. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` + (default). + :returns: A new image + """ + + self.load() + + if method is None: + # defaults: + method = Quantize.MEDIANCUT + if self.mode == "RGBA": + method = Quantize.FASTOCTREE + + if self.mode == "RGBA" and method not in ( + Quantize.FASTOCTREE, + Quantize.LIBIMAGEQUANT, + ): + # Caller specified an invalid mode. + msg = ( + "Fast Octree (method == 2) and libimagequant (method == 3) " + "are the only valid methods for quantizing RGBA images" + ) + raise ValueError(msg) + + if palette: + # use palette from reference image + palette.load() + if palette.mode != "P": + msg = "bad mode for palette image" + raise ValueError(msg) + if self.mode not in {"RGB", "L"}: + msg = "only RGB or L mode images can be quantized to a palette" + raise ValueError(msg) + im = self.im.convert("P", dither, palette.im) + new_im = self._new(im) + new_im.palette = palette.palette.copy() + return new_im + + if kmeans < 0: + msg = "kmeans must not be negative" + raise ValueError(msg) + + im = self._new(self.im.quantize(colors, method, kmeans)) + + from . import ImagePalette + + mode = im.im.getpalettemode() + palette = im.im.getpalette(mode, mode)[: colors * len(mode)] + im.palette = ImagePalette.ImagePalette(mode, palette) + + return im + + def copy(self) -> Image: + """ + Copies this image. Use this method if you wish to paste things + into an image, but still retain the original. + + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + self.load() + return self._new(self.im.copy()) + + __copy__ = copy + + def crop(self, box: tuple[float, float, float, float] | None = None) -> Image: + """ + Returns a rectangular region from this image. The box is a + 4-tuple defining the left, upper, right, and lower pixel + coordinate. See :ref:`coordinate-system`. + + Note: Prior to Pillow 3.4.0, this was a lazy operation. + + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if box is None: + return self.copy() + + if box[2] < box[0]: + msg = "Coordinate 'right' is less than 'left'" + raise ValueError(msg) + elif box[3] < box[1]: + msg = "Coordinate 'lower' is less than 'upper'" + raise ValueError(msg) + + self.load() + return self._new(self._crop(self.im, box)) + + def _crop( + self, im: core.ImagingCore, box: tuple[float, float, float, float] + ) -> core.ImagingCore: + """ + Returns a rectangular region from the core image object im. + + This is equivalent to calling im.crop((x0, y0, x1, y1)), but + includes additional sanity checks. + + :param im: a core image object + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :returns: A core image object. + """ + + x0, y0, x1, y1 = map(int, map(round, box)) + + absolute_values = (abs(x1 - x0), abs(y1 - y0)) + + _decompression_bomb_check(absolute_values) + + return im.crop((x0, y0, x1, y1)) + + def draft( + self, mode: str | None, size: tuple[int, int] | None + ) -> tuple[str, tuple[int, int, float, float]] | None: + """ + Configures the image file loader so it returns a version of the + image that as closely as possible matches the given mode and + size. For example, you can use this method to convert a color + JPEG to grayscale while loading it. + + If any changes are made, returns a tuple with the chosen ``mode`` and + ``box`` with coordinates of the original image within the altered one. + + Note that this method modifies the :py:class:`~PIL.Image.Image` object + in place. If the image has already been loaded, this method has no + effect. + + Note: This method is not implemented for most images. It is + currently implemented only for JPEG and MPO images. + + :param mode: The requested mode. + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + """ + pass + + def _expand(self, xmargin: int, ymargin: int | None = None) -> Image: + if ymargin is None: + ymargin = xmargin + self.load() + return self._new(self.im.expand(xmargin, ymargin)) + + if TYPE_CHECKING: + from . import ImageFilter + + def filter(self, filter: ImageFilter.Filter | type[ImageFilter.Filter]) -> Image: + """ + Filters this image using the given filter. For a list of + available filters, see the :py:mod:`~PIL.ImageFilter` module. + + :param filter: Filter kernel. + :returns: An :py:class:`~PIL.Image.Image` object.""" + + from . import ImageFilter + + self.load() + + if callable(filter): + filter = filter() + if not hasattr(filter, "filter"): + msg = "filter argument should be ImageFilter.Filter instance or class" + raise TypeError(msg) + + multiband = isinstance(filter, ImageFilter.MultibandFilter) + if self.im.bands == 1 or multiband: + return self._new(filter.filter(self.im)) + + ims = [ + self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands) + ] + return merge(self.mode, ims) + + def getbands(self) -> tuple[str, ...]: + """ + Returns a tuple containing the name of each band in this image. + For example, ``getbands`` on an RGB image returns ("R", "G", "B"). + + :returns: A tuple containing band names. + :rtype: tuple + """ + return ImageMode.getmode(self.mode).bands + + def getbbox(self, *, alpha_only: bool = True) -> tuple[int, int, int, int] | None: + """ + Calculates the bounding box of the non-zero regions in the + image. + + :param alpha_only: Optional flag, defaulting to ``True``. + If ``True`` and the image has an alpha channel, trim transparent pixels. + Otherwise, trim pixels when all channels are zero. + Keyword-only argument. + :returns: The bounding box is returned as a 4-tuple defining the + left, upper, right, and lower pixel coordinate. See + :ref:`coordinate-system`. If the image is completely empty, this + method returns None. + + """ + + self.load() + return self.im.getbbox(alpha_only) + + def getcolors(self, maxcolors: int = 256): + """ + Returns a list of colors used in this image. + + The colors will be in the image's mode. For example, an RGB image will + return a tuple of (red, green, blue) color values, and a P image will + return the index of the color in the palette. + + :param maxcolors: Maximum number of colors. If this number is + exceeded, this method returns None. The default limit is + 256 colors. + :returns: An unsorted list of (count, pixel) values. + """ + + self.load() + if self.mode in ("1", "L", "P"): + h = self.im.histogram() + out = [(h[i], i) for i in range(256) if h[i]] + if len(out) > maxcolors: + return None + return out + return self.im.getcolors(maxcolors) + + def getdata(self, band: int | None = None): + """ + Returns the contents of this image as a sequence object + containing pixel values. The sequence object is flattened, so + that values for line one follow directly after the values of + line zero, and so on. + + Note that the sequence object returned by this method is an + internal PIL data type, which only supports certain sequence + operations. To convert it to an ordinary sequence (e.g. for + printing), use ``list(im.getdata())``. + + :param band: What band to return. The default is to return + all bands. To return a single band, pass in the index + value (e.g. 0 to get the "R" band from an "RGB" image). + :returns: A sequence-like object. + """ + + self.load() + if band is not None: + return self.im.getband(band) + return self.im # could be abused + + def getextrema(self) -> tuple[float, float] | tuple[tuple[int, int], ...]: + """ + Gets the minimum and maximum pixel values for each band in + the image. + + :returns: For a single-band image, a 2-tuple containing the + minimum and maximum pixel value. For a multi-band image, + a tuple containing one 2-tuple for each band. + """ + + self.load() + if self.im.bands > 1: + return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands)) + return self.im.getextrema() + + def getxmp(self): + """ + Returns a dictionary containing the XMP tags. + Requires defusedxml to be installed. + + :returns: XMP tags in a dictionary. + """ + + def get_name(tag: str) -> str: + return re.sub("^{[^}]+}", "", tag) + + def get_value(element): + value = {get_name(k): v for k, v in element.attrib.items()} + children = list(element) + if children: + for child in children: + name = get_name(child.tag) + child_value = get_value(child) + if name in value: + if not isinstance(value[name], list): + value[name] = [value[name]] + value[name].append(child_value) + else: + value[name] = child_value + elif value: + if element.text: + value["text"] = element.text + else: + return element.text + return value + + if ElementTree is None: + warnings.warn("XMP data cannot be read without defusedxml dependency") + return {} + if "xmp" not in self.info: + return {} + root = ElementTree.fromstring(self.info["xmp"].rstrip(b"\x00")) + return {get_name(root.tag): get_value(root)} + + def getexif(self) -> Exif: + """ + Gets EXIF data from the image. + + :returns: an :py:class:`~PIL.Image.Exif` object. + """ + if self._exif is None: + self._exif = Exif() + elif self._exif._loaded: + return self._exif + self._exif._loaded = True + + exif_info = self.info.get("exif") + if exif_info is None: + if "Raw profile type exif" in self.info: + exif_info = bytes.fromhex( + "".join(self.info["Raw profile type exif"].split("\n")[3:]) + ) + elif hasattr(self, "tag_v2"): + self._exif.bigtiff = self.tag_v2._bigtiff + self._exif.endian = self.tag_v2._endian + self._exif.load_from_fp(self.fp, self.tag_v2._offset) + if exif_info is not None: + self._exif.load(exif_info) + + # XMP tags + if ExifTags.Base.Orientation not in self._exif: + xmp_tags = self.info.get("XML:com.adobe.xmp") + if xmp_tags: + match = re.search(r'tiff:Orientation(="|>)([0-9])', xmp_tags) + if match: + self._exif[ExifTags.Base.Orientation] = int(match[2]) + + return self._exif + + def _reload_exif(self) -> None: + if self._exif is None or not self._exif._loaded: + return + self._exif._loaded = False + self.getexif() + + def get_child_images(self) -> list[ImageFile.ImageFile]: + child_images = [] + exif = self.getexif() + ifds = [] + if ExifTags.Base.SubIFDs in exif: + subifd_offsets = exif[ExifTags.Base.SubIFDs] + if subifd_offsets: + if not isinstance(subifd_offsets, tuple): + subifd_offsets = (subifd_offsets,) + for subifd_offset in subifd_offsets: + ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset)) + ifd1 = exif.get_ifd(ExifTags.IFD.IFD1) + if ifd1 and ifd1.get(513): + ifds.append((ifd1, exif._info.next)) + + offset = None + for ifd, ifd_offset in ifds: + current_offset = self.fp.tell() + if offset is None: + offset = current_offset + + fp = self.fp + thumbnail_offset = ifd.get(513) + if thumbnail_offset is not None: + thumbnail_offset += getattr(self, "_exif_offset", 0) + self.fp.seek(thumbnail_offset) + data = self.fp.read(ifd.get(514)) + fp = io.BytesIO(data) + + with open(fp) as im: + from . import TiffImagePlugin + + if thumbnail_offset is None and isinstance( + im, TiffImagePlugin.TiffImageFile + ): + im._frame_pos = [ifd_offset] + im._seek(0) + im.load() + child_images.append(im) + + if offset is not None: + self.fp.seek(offset) + return child_images + + def getim(self): + """ + Returns a capsule that points to the internal image memory. + + :returns: A capsule object. + """ + + self.load() + return self.im.ptr + + def getpalette(self, rawmode: str | None = "RGB") -> list[int] | None: + """ + Returns the image palette as a list. + + :param rawmode: The mode in which to return the palette. ``None`` will + return the palette in its current mode. + + .. versionadded:: 9.1.0 + + :returns: A list of color values [r, g, b, ...], or None if the + image has no palette. + """ + + self.load() + try: + mode = self.im.getpalettemode() + except ValueError: + return None # no palette + if rawmode is None: + rawmode = mode + return list(self.im.getpalette(mode, rawmode)) + + @property + def has_transparency_data(self) -> bool: + """ + Determine if an image has transparency data, whether in the form of an + alpha channel, a palette with an alpha channel, or a "transparency" key + in the info dictionary. + + Note the image might still appear solid, if all of the values shown + within are opaque. + + :returns: A boolean. + """ + return ( + self.mode in ("LA", "La", "PA", "RGBA", "RGBa") + or (self.mode == "P" and self.palette.mode.endswith("A")) + or "transparency" in self.info + ) + + def apply_transparency(self) -> None: + """ + If a P mode image has a "transparency" key in the info dictionary, + remove the key and instead apply the transparency to the palette. + Otherwise, the image is unchanged. + """ + if self.mode != "P" or "transparency" not in self.info: + return + + from . import ImagePalette + + palette = self.getpalette("RGBA") + assert palette is not None + transparency = self.info["transparency"] + if isinstance(transparency, bytes): + for i, alpha in enumerate(transparency): + palette[i * 4 + 3] = alpha + else: + palette[transparency * 4 + 3] = 0 + self.palette = ImagePalette.ImagePalette("RGBA", bytes(palette)) + self.palette.dirty = 1 + + del self.info["transparency"] + + def getpixel( + self, xy: tuple[int, int] | list[int] + ) -> float | tuple[int, ...] | None: + """ + Returns the pixel value at a given position. + + :param xy: The coordinate, given as (x, y). See + :ref:`coordinate-system`. + :returns: The pixel value. If the image is a multi-layer image, + this method returns a tuple. + """ + + self.load() + if self.pyaccess: + return self.pyaccess.getpixel(xy) + return self.im.getpixel(tuple(xy)) + + def getprojection(self) -> tuple[list[int], list[int]]: + """ + Get projection to x and y axes + + :returns: Two sequences, indicating where there are non-zero + pixels along the X-axis and the Y-axis, respectively. + """ + + self.load() + x, y = self.im.getprojection() + return list(x), list(y) + + def histogram(self, mask: Image | None = None, extrema=None) -> list[int]: + """ + Returns a histogram for the image. The histogram is returned as a + list of pixel counts, one for each pixel value in the source + image. Counts are grouped into 256 bins for each band, even if + the image has more than 8 bits per band. If the image has more + than one band, the histograms for all bands are concatenated (for + example, the histogram for an "RGB" image contains 768 values). + + A bilevel image (mode "1") is treated as a grayscale ("L") image + by this method. + + If a mask is provided, the method returns a histogram for those + parts of the image where the mask image is non-zero. The mask + image must have the same size as the image, and be either a + bi-level image (mode "1") or a grayscale image ("L"). + + :param mask: An optional mask. + :param extrema: An optional tuple of manually-specified extrema. + :returns: A list containing pixel counts. + """ + self.load() + if mask: + mask.load() + return self.im.histogram((0, 0), mask.im) + if self.mode in ("I", "F"): + if extrema is None: + extrema = self.getextrema() + return self.im.histogram(extrema) + return self.im.histogram() + + def entropy(self, mask=None, extrema=None): + """ + Calculates and returns the entropy for the image. + + A bilevel image (mode "1") is treated as a grayscale ("L") + image by this method. + + If a mask is provided, the method employs the histogram for + those parts of the image where the mask image is non-zero. + The mask image must have the same size as the image, and be + either a bi-level image (mode "1") or a grayscale image ("L"). + + :param mask: An optional mask. + :param extrema: An optional tuple of manually-specified extrema. + :returns: A float value representing the image entropy + """ + self.load() + if mask: + mask.load() + return self.im.entropy((0, 0), mask.im) + if self.mode in ("I", "F"): + if extrema is None: + extrema = self.getextrema() + return self.im.entropy(extrema) + return self.im.entropy() + + def paste( + self, + im: Image | str | float | tuple[float, ...], + box: Image | tuple[int, int, int, int] | tuple[int, int] | None = None, + mask: Image | None = None, + ) -> None: + """ + Pastes another image into this image. The box argument is either + a 2-tuple giving the upper left corner, a 4-tuple defining the + left, upper, right, and lower pixel coordinate, or None (same as + (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size + of the pasted image must match the size of the region. + + If the modes don't match, the pasted image is converted to the mode of + this image (see the :py:meth:`~PIL.Image.Image.convert` method for + details). + + Instead of an image, the source can be a integer or tuple + containing pixel values. The method then fills the region + with the given color. When creating RGB images, you can + also use color strings as supported by the ImageColor module. + + If a mask is given, this method updates only the regions + indicated by the mask. You can use either "1", "L", "LA", "RGBA" + or "RGBa" images (if present, the alpha band is used as mask). + Where the mask is 255, the given image is copied as is. Where + the mask is 0, the current value is preserved. Intermediate + values will mix the two images together, including their alpha + channels if they have them. + + See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to + combine images with respect to their alpha channels. + + :param im: Source image or pixel value (integer, float or tuple). + :param box: An optional 4-tuple giving the region to paste into. + If a 2-tuple is used instead, it's treated as the upper left + corner. If omitted or None, the source is pasted into the + upper left corner. + + If an image is given as the second argument and there is no + third, the box defaults to (0, 0), and the second argument + is interpreted as a mask image. + :param mask: An optional mask image. + """ + + if isImageType(box): + if mask is not None: + msg = "If using second argument as mask, third argument must be None" + raise ValueError(msg) + # abbreviated paste(im, mask) syntax + mask = box + box = None + assert not isinstance(box, Image) + + if box is None: + box = (0, 0) + + if len(box) == 2: + # upper left corner given; get size from image or mask + if isImageType(im): + size = im.size + elif isImageType(mask): + size = mask.size + else: + # FIXME: use self.size here? + msg = "cannot determine region size; use 4-item box" + raise ValueError(msg) + box += (box[0] + size[0], box[1] + size[1]) + + if isinstance(im, str): + from . import ImageColor + + im = ImageColor.getcolor(im, self.mode) + + elif isImageType(im): + im.load() + if self.mode != im.mode: + if self.mode != "RGB" or im.mode not in ("LA", "RGBA", "RGBa"): + # should use an adapter for this! + im = im.convert(self.mode) + im = im.im + + self._ensure_mutable() + + if mask: + mask.load() + self.im.paste(im, box, mask.im) + else: + self.im.paste(im, box) + + def alpha_composite( + self, im: Image, dest: Sequence[int] = (0, 0), source: Sequence[int] = (0, 0) + ) -> None: + """'In-place' analog of Image.alpha_composite. Composites an image + onto this image. + + :param im: image to composite over this one + :param dest: Optional 2 tuple (left, top) specifying the upper + left corner in this (destination) image. + :param source: Optional 2 (left, top) tuple for the upper left + corner in the overlay source image, or 4 tuple (left, top, right, + bottom) for the bounds of the source rectangle + + Performance Note: Not currently implemented in-place in the core layer. + """ + + if not isinstance(source, (list, tuple)): + msg = "Source must be a list or tuple" + raise ValueError(msg) + if not isinstance(dest, (list, tuple)): + msg = "Destination must be a list or tuple" + raise ValueError(msg) + + if len(source) == 4: + overlay_crop_box = tuple(source) + elif len(source) == 2: + overlay_crop_box = tuple(source) + im.size + else: + msg = "Source must be a sequence of length 2 or 4" + raise ValueError(msg) + + if not len(dest) == 2: + msg = "Destination must be a sequence of length 2" + raise ValueError(msg) + if min(source) < 0: + msg = "Source must be non-negative" + raise ValueError(msg) + + # over image, crop if it's not the whole image. + if overlay_crop_box == (0, 0) + im.size: + overlay = im + else: + overlay = im.crop(overlay_crop_box) + + # target for the paste + box = tuple(dest) + (dest[0] + overlay.width, dest[1] + overlay.height) + + # destination image. don't copy if we're using the whole image. + if box == (0, 0) + self.size: + background = self + else: + background = self.crop(box) + + result = alpha_composite(background, overlay) + self.paste(result, box) + + def point( + self, + lut: Sequence[float] | Callable[[int], float] | ImagePointHandler, + mode: str | None = None, + ) -> Image: + """ + Maps this image through a lookup table or function. + + :param lut: A lookup table, containing 256 (or 65536 if + self.mode=="I" and mode == "L") values per band in the + image. A function can be used instead, it should take a + single argument. The function is called once for each + possible pixel value, and the resulting table is applied to + all bands of the image. + + It may also be an :py:class:`~PIL.Image.ImagePointHandler` + object:: + + class Example(Image.ImagePointHandler): + def point(self, data): + # Return result + :param mode: Output mode (default is same as input). This can only be used if + the source image has mode "L" or "P", and the output has mode "1" or the + source image mode is "I" and the output mode is "L". + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + if isinstance(lut, ImagePointHandler): + return lut.point(self) + + if callable(lut): + # if it isn't a list, it should be a function + if self.mode in ("I", "I;16", "F"): + # check if the function can be used with point_transform + # UNDONE wiredfool -- I think this prevents us from ever doing + # a gamma function point transform on > 8bit images. + scale, offset = _getscaleoffset(lut) + return self._new(self.im.point_transform(scale, offset)) + # for other modes, convert the function to a table + flatLut = [lut(i) for i in range(256)] * self.im.bands + else: + flatLut = lut + + if self.mode == "F": + # FIXME: _imaging returns a confusing error message for this case + msg = "point operation not supported for this mode" + raise ValueError(msg) + + if mode != "F": + flatLut = [round(i) for i in flatLut] + return self._new(self.im.point(flatLut, mode)) + + def putalpha(self, alpha: Image | int) -> None: + """ + Adds or replaces the alpha layer in this image. If the image + does not have an alpha layer, it's converted to "LA" or "RGBA". + The new layer must be either "L" or "1". + + :param alpha: The new alpha layer. This can either be an "L" or "1" + image having the same size as this image, or an integer. + """ + + self._ensure_mutable() + + if self.mode not in ("LA", "PA", "RGBA"): + # attempt to promote self to a matching alpha mode + try: + mode = getmodebase(self.mode) + "A" + try: + self.im.setmode(mode) + except (AttributeError, ValueError) as e: + # do things the hard way + im = self.im.convert(mode) + if im.mode not in ("LA", "PA", "RGBA"): + msg = "alpha channel could not be added" + raise ValueError(msg) from e # sanity check + self.im = im + self.pyaccess = None + self._mode = self.im.mode + except KeyError as e: + msg = "illegal image mode" + raise ValueError(msg) from e + + if self.mode in ("LA", "PA"): + band = 1 + else: + band = 3 + + if isImageType(alpha): + # alpha layer + if alpha.mode not in ("1", "L"): + msg = "illegal image mode" + raise ValueError(msg) + alpha.load() + if alpha.mode == "1": + alpha = alpha.convert("L") + else: + # constant alpha + alpha = cast(int, alpha) # see python/typing#1013 + try: + self.im.fillband(band, alpha) + except (AttributeError, ValueError): + # do things the hard way + alpha = new("L", self.size, alpha) + else: + return + + self.im.putband(alpha.im, band) + + def putdata( + self, + data: Sequence[float] | Sequence[Sequence[int]], + scale: float = 1.0, + offset: float = 0.0, + ) -> None: + """ + Copies pixel data from a flattened sequence object into the image. The + values should start at the upper left corner (0, 0), continue to the + end of the line, followed directly by the first value of the second + line, and so on. Data will be read until either the image or the + sequence ends. The scale and offset values are used to adjust the + sequence values: **pixel = value*scale + offset**. + + :param data: A flattened sequence object. + :param scale: An optional scale value. The default is 1.0. + :param offset: An optional offset value. The default is 0.0. + """ + + self._ensure_mutable() + + self.im.putdata(data, scale, offset) + + def putpalette(self, data, rawmode="RGB") -> None: + """ + Attaches a palette to this image. The image must be a "P", "PA", "L" + or "LA" image. + + The palette sequence must contain at most 256 colors, made up of one + integer value for each channel in the raw mode. + For example, if the raw mode is "RGB", then it can contain at most 768 + values, made up of red, green and blue values for the corresponding pixel + index in the 256 colors. + If the raw mode is "RGBA", then it can contain at most 1024 values, + containing red, green, blue and alpha values. + + Alternatively, an 8-bit string may be used instead of an integer sequence. + + :param data: A palette sequence (either a list or a string). + :param rawmode: The raw mode of the palette. Either "RGB", "RGBA", or a mode + that can be transformed to "RGB" or "RGBA" (e.g. "R", "BGR;15", "RGBA;L"). + """ + from . import ImagePalette + + if self.mode not in ("L", "LA", "P", "PA"): + msg = "illegal image mode" + raise ValueError(msg) + if isinstance(data, ImagePalette.ImagePalette): + palette = ImagePalette.raw(data.rawmode, data.palette) + else: + if not isinstance(data, bytes): + data = bytes(data) + palette = ImagePalette.raw(rawmode, data) + self._mode = "PA" if "A" in self.mode else "P" + self.palette = palette + self.palette.mode = "RGBA" if "A" in rawmode else "RGB" + self.load() # install new palette + + def putpixel( + self, xy: tuple[int, int], value: float | tuple[int, ...] | list[int] + ) -> None: + """ + Modifies the pixel at the given position. The color is given as + a single numerical value for single-band images, and a tuple for + multi-band images. In addition to this, RGB and RGBA tuples are + accepted for P and PA images. + + Note that this method is relatively slow. For more extensive changes, + use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` + module instead. + + See: + + * :py:meth:`~PIL.Image.Image.paste` + * :py:meth:`~PIL.Image.Image.putdata` + * :py:mod:`~PIL.ImageDraw` + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :param value: The pixel value. + """ + + if self.readonly: + self._copy() + self.load() + + if self.pyaccess: + return self.pyaccess.putpixel(xy, value) + + if ( + self.mode in ("P", "PA") + and isinstance(value, (list, tuple)) + and len(value) in [3, 4] + ): + # RGB or RGBA value for a P or PA image + if self.mode == "PA": + alpha = value[3] if len(value) == 4 else 255 + value = value[:3] + palette_index = self.palette.getcolor(value, self) + value = (palette_index, alpha) if self.mode == "PA" else palette_index + return self.im.putpixel(xy, value) + + def remap_palette(self, dest_map, source_palette=None): + """ + Rewrites the image to reorder the palette. + + :param dest_map: A list of indexes into the original palette. + e.g. ``[1,0]`` would swap a two item palette, and ``list(range(256))`` + is the identity transform. + :param source_palette: Bytes or None. + :returns: An :py:class:`~PIL.Image.Image` object. + + """ + from . import ImagePalette + + if self.mode not in ("L", "P"): + msg = "illegal image mode" + raise ValueError(msg) + + bands = 3 + palette_mode = "RGB" + if source_palette is None: + if self.mode == "P": + self.load() + palette_mode = self.im.getpalettemode() + if palette_mode == "RGBA": + bands = 4 + source_palette = self.im.getpalette(palette_mode, palette_mode) + else: # L-mode + source_palette = bytearray(i // 3 for i in range(768)) + + palette_bytes = b"" + new_positions = [0] * 256 + + # pick only the used colors from the palette + for i, oldPosition in enumerate(dest_map): + palette_bytes += source_palette[ + oldPosition * bands : oldPosition * bands + bands + ] + new_positions[oldPosition] = i + + # replace the palette color id of all pixel with the new id + + # Palette images are [0..255], mapped through a 1 or 3 + # byte/color map. We need to remap the whole image + # from palette 1 to palette 2. New_positions is + # an array of indexes into palette 1. Palette 2 is + # palette 1 with any holes removed. + + # We're going to leverage the convert mechanism to use the + # C code to remap the image from palette 1 to palette 2, + # by forcing the source image into 'L' mode and adding a + # mapping 'L' mode palette, then converting back to 'L' + # sans palette thus converting the image bytes, then + # assigning the optimized RGB palette. + + # perf reference, 9500x4000 gif, w/~135 colors + # 14 sec prepatch, 1 sec postpatch with optimization forced. + + mapping_palette = bytearray(new_positions) + + m_im = self.copy() + m_im._mode = "P" + + m_im.palette = ImagePalette.ImagePalette( + palette_mode, palette=mapping_palette * bands + ) + # possibly set palette dirty, then + # m_im.putpalette(mapping_palette, 'L') # converts to 'P' + # or just force it. + # UNDONE -- this is part of the general issue with palettes + m_im.im.putpalette(palette_mode, palette_mode + ";L", m_im.palette.tobytes()) + + m_im = m_im.convert("L") + + m_im.putpalette(palette_bytes, palette_mode) + m_im.palette = ImagePalette.ImagePalette(palette_mode, palette=palette_bytes) + + if "transparency" in self.info: + try: + m_im.info["transparency"] = dest_map.index(self.info["transparency"]) + except ValueError: + if "transparency" in m_im.info: + del m_im.info["transparency"] + + return m_im + + def _get_safe_box(self, size, resample, box): + """Expands the box so it includes adjacent pixels + that may be used by resampling with the given resampling filter. + """ + filter_support = _filters_support[resample] - 0.5 + scale_x = (box[2] - box[0]) / size[0] + scale_y = (box[3] - box[1]) / size[1] + support_x = filter_support * scale_x + support_y = filter_support * scale_y + + return ( + max(0, int(box[0] - support_x)), + max(0, int(box[1] - support_y)), + min(self.size[0], math.ceil(box[2] + support_x)), + min(self.size[1], math.ceil(box[3] + support_y)), + ) + + def resize( + self, + size: tuple[int, int], + resample: int | None = None, + box: tuple[float, float, float, float] | None = None, + reducing_gap: float | None = None, + ) -> Image: + """ + Returns a resized copy of this image. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param resample: An optional resampling filter. This can be + one of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, + :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, + :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. + If the image has mode "1" or "P", it is always set to + :py:data:`Resampling.NEAREST`. If the image mode specifies a number + of bits, such as "I;16", then the default filter is + :py:data:`Resampling.NEAREST`. Otherwise, the default filter is + :py:data:`Resampling.BICUBIC`. See: :ref:`concept-filters`. + :param box: An optional 4-tuple of floats providing + the source image region to be scaled. + The values must be within (0, 0, width, height) rectangle. + If omitted or None, the entire source is used. + :param reducing_gap: Apply optimization by resizing the image + in two steps. First, reducing the image by integer times + using :py:meth:`~PIL.Image.Image.reduce`. + Second, resizing using regular resampling. The last step + changes size no less than by ``reducing_gap`` times. + ``reducing_gap`` may be None (no first step is performed) + or should be greater than 1.0. The bigger ``reducing_gap``, + the closer the result to the fair resampling. + The smaller ``reducing_gap``, the faster resizing. + With ``reducing_gap`` greater or equal to 3.0, the result is + indistinguishable from fair resampling in most cases. + The default value is None (no optimization). + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if resample is None: + type_special = ";" in self.mode + resample = Resampling.NEAREST if type_special else Resampling.BICUBIC + elif resample not in ( + Resampling.NEAREST, + Resampling.BILINEAR, + Resampling.BICUBIC, + Resampling.LANCZOS, + Resampling.BOX, + Resampling.HAMMING, + ): + msg = f"Unknown resampling filter ({resample})." + + filters = [ + f"{filter[1]} ({filter[0]})" + for filter in ( + (Resampling.NEAREST, "Image.Resampling.NEAREST"), + (Resampling.LANCZOS, "Image.Resampling.LANCZOS"), + (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), + (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), + (Resampling.BOX, "Image.Resampling.BOX"), + (Resampling.HAMMING, "Image.Resampling.HAMMING"), + ) + ] + msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" + raise ValueError(msg) + + if reducing_gap is not None and reducing_gap < 1.0: + msg = "reducing_gap must be 1.0 or greater" + raise ValueError(msg) + + self.load() + if box is None: + box = (0, 0) + self.size + + if self.size == size and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ("1", "P"): + resample = Resampling.NEAREST + + if self.mode in ["LA", "RGBA"] and resample != Resampling.NEAREST: + im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) + im = im.resize(size, resample, box) + return im.convert(self.mode) + + self.load() + + if reducing_gap is not None and resample != Resampling.NEAREST: + factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 + factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 + if factor_x > 1 or factor_y > 1: + reduce_box = self._get_safe_box(size, resample, box) + factor = (factor_x, factor_y) + self = ( + self.reduce(factor, box=reduce_box) + if callable(self.reduce) + else Image.reduce(self, factor, box=reduce_box) + ) + box = ( + (box[0] - reduce_box[0]) / factor_x, + (box[1] - reduce_box[1]) / factor_y, + (box[2] - reduce_box[0]) / factor_x, + (box[3] - reduce_box[1]) / factor_y, + ) + + return self._new(self.im.resize(size, resample, box)) + + def reduce( + self, + factor: int | tuple[int, int], + box: tuple[int, int, int, int] | None = None, + ) -> Image: + """ + Returns a copy of the image reduced ``factor`` times. + If the size of the image is not dividable by ``factor``, + the resulting size will be rounded up. + + :param factor: A greater than 0 integer or tuple of two integers + for width and height separately. + :param box: An optional 4-tuple of ints providing + the source image region to be reduced. + The values must be within ``(0, 0, width, height)`` rectangle. + If omitted or ``None``, the entire source is used. + """ + if not isinstance(factor, (list, tuple)): + factor = (factor, factor) + + if box is None: + box = (0, 0) + self.size + + if factor == (1, 1) and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ["LA", "RGBA"]: + im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) + im = im.reduce(factor, box) + return im.convert(self.mode) + + self.load() + + return self._new(self.im.reduce(factor, box)) + + def rotate( + self, + angle: float, + resample: Resampling = Resampling.NEAREST, + expand: int | bool = False, + center: tuple[float, float] | None = None, + translate: tuple[int, int] | None = None, + fillcolor: float | tuple[float, ...] | str | None = None, + ) -> Image: + """ + Returns a rotated copy of this image. This method returns a + copy of this image, rotated the given number of degrees counter + clockwise around its centre. + + :param angle: In degrees counter clockwise. + :param resample: An optional resampling filter. This can be + one of :py:data:`Resampling.NEAREST` (use nearest neighbour), + :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:data:`Resampling.BICUBIC` (cubic spline + interpolation in a 4x4 environment). If omitted, or if the image has + mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. + See :ref:`concept-filters`. + :param expand: Optional expansion flag. If true, expands the output + image to make it large enough to hold the entire rotated image. + If false or omitted, make the output image the same size as the + input image. Note that the expand flag assumes rotation around + the center and no translation. + :param center: Optional center of rotation (a 2-tuple). Origin is + the upper left corner. Default is the center of the image. + :param translate: An optional post-rotate translation (a 2-tuple). + :param fillcolor: An optional color for area outside the rotated image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + angle = angle % 360.0 + + # Fast paths regardless of filter, as long as we're not + # translating or changing the center. + if not (center or translate): + if angle == 0: + return self.copy() + if angle == 180: + return self.transpose(Transpose.ROTATE_180) + if angle in (90, 270) and (expand or self.width == self.height): + return self.transpose( + Transpose.ROTATE_90 if angle == 90 else Transpose.ROTATE_270 + ) + + # Calculate the affine matrix. Note that this is the reverse + # transformation (from destination image to source) because we + # want to interpolate the (discrete) destination pixel from + # the local area around the (floating) source pixel. + + # The matrix we actually want (note that it operates from the right): + # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) + # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) + # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) + + # The reverse matrix is thus: + # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) + # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) + # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) + + # In any case, the final translation may be updated at the end to + # compensate for the expand flag. + + w, h = self.size + + if translate is None: + post_trans = (0, 0) + else: + post_trans = translate + if center is None: + center = (w / 2, h / 2) + + angle = -math.radians(angle) + matrix = [ + round(math.cos(angle), 15), + round(math.sin(angle), 15), + 0.0, + round(-math.sin(angle), 15), + round(math.cos(angle), 15), + 0.0, + ] + + def transform(x, y, matrix): + (a, b, c, d, e, f) = matrix + return a * x + b * y + c, d * x + e * y + f + + matrix[2], matrix[5] = transform( + -center[0] - post_trans[0], -center[1] - post_trans[1], matrix + ) + matrix[2] += center[0] + matrix[5] += center[1] + + if expand: + # calculate output size + xx = [] + yy = [] + for x, y in ((0, 0), (w, 0), (w, h), (0, h)): + x, y = transform(x, y, matrix) + xx.append(x) + yy.append(y) + nw = math.ceil(max(xx)) - math.floor(min(xx)) + nh = math.ceil(max(yy)) - math.floor(min(yy)) + + # We multiply a translation matrix from the right. Because of its + # special form, this is the same as taking the image of the + # translation vector as new translation vector. + matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) + w, h = nw, nh + + return self.transform( + (w, h), Transform.AFFINE, matrix, resample, fillcolor=fillcolor + ) + + def save( + self, fp: StrOrBytesPath | IO[bytes], format: str | None = None, **params: Any + ) -> None: + """ + Saves this image under the given filename. If no format is + specified, the format to use is determined from the filename + extension, if possible. + + Keyword options can be used to provide additional instructions + to the writer. If a writer doesn't recognise an option, it is + silently ignored. The available options are described in the + :doc:`image format documentation + <../handbook/image-file-formats>` for each writer. + + You can use a file object instead of a filename. In this case, + you must always specify the format. The file object must + implement the ``seek``, ``tell``, and ``write`` + methods, and be opened in binary mode. + + :param fp: A filename (string), os.PathLike object or file object. + :param format: Optional format override. If omitted, the + format to use is determined from the filename extension. + If a file object was used instead of a filename, this + parameter should always be used. + :param params: Extra parameters to the image writer. + :returns: None + :exception ValueError: If the output format could not be determined + from the file name. Use the format option to solve this. + :exception OSError: If the file could not be written. The file + may have been created, and may contain partial data. + """ + + filename: str | bytes = "" + open_fp = False + if is_path(fp): + filename = os.path.realpath(os.fspath(fp)) + open_fp = True + elif fp == sys.stdout: + try: + fp = sys.stdout.buffer + except AttributeError: + pass + if not filename and hasattr(fp, "name") and is_path(fp.name): + # only set the name for metadata purposes + filename = os.path.realpath(os.fspath(fp.name)) + + # may mutate self! + self._ensure_mutable() + + save_all = params.pop("save_all", False) + self.encoderinfo = params + self.encoderconfig: tuple[Any, ...] = () + + preinit() + + filename_ext = os.path.splitext(filename)[1].lower() + ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext + + if not format: + if ext not in EXTENSION: + init() + try: + format = EXTENSION[ext] + except KeyError as e: + msg = f"unknown file extension: {ext}" + raise ValueError(msg) from e + + if format.upper() not in SAVE: + init() + if save_all: + save_handler = SAVE_ALL[format.upper()] + else: + save_handler = SAVE[format.upper()] + + created = False + if open_fp: + created = not os.path.exists(filename) + if params.get("append", False): + # Open also for reading ("+"), because TIFF save_all + # writer needs to go back and edit the written data. + fp = builtins.open(filename, "r+b") + else: + fp = builtins.open(filename, "w+b") + else: + fp = cast(IO[bytes], fp) + + try: + save_handler(self, fp, filename) + except Exception: + if open_fp: + fp.close() + if created: + try: + os.remove(filename) + except PermissionError: + pass + raise + if open_fp: + fp.close() + + def seek(self, frame: int) -> None: + """ + Seeks to the given frame in this sequence file. If you seek + beyond the end of the sequence, the method raises an + ``EOFError`` exception. When a sequence file is opened, the + library automatically seeks to frame 0. + + See :py:meth:`~PIL.Image.Image.tell`. + + If defined, :attr:`~PIL.Image.Image.n_frames` refers to the + number of available frames. + + :param frame: Frame number, starting at 0. + :exception EOFError: If the call attempts to seek beyond the end + of the sequence. + """ + + # overridden by file handlers + if frame != 0: + msg = "no more images in file" + raise EOFError(msg) + + def show(self, title: str | None = None) -> None: + """ + Displays this image. This method is mainly intended for debugging purposes. + + This method calls :py:func:`PIL.ImageShow.show` internally. You can use + :py:func:`PIL.ImageShow.register` to override its default behaviour. + + The image is first saved to a temporary file. By default, it will be in + PNG format. + + On Unix, the image is then opened using the **xdg-open**, **display**, + **gm**, **eog** or **xv** utility, depending on which one can be found. + + On macOS, the image is opened with the native Preview application. + + On Windows, the image is opened with the standard PNG display utility. + + :param title: Optional title to use for the image window, where possible. + """ + + _show(self, title=title) + + def split(self) -> tuple[Image, ...]: + """ + Split this image into individual bands. This method returns a + tuple of individual image bands from an image. For example, + splitting an "RGB" image creates three new images each + containing a copy of one of the original bands (red, green, + blue). + + If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` + method can be more convenient and faster. + + :returns: A tuple containing bands. + """ + + self.load() + if self.im.bands == 1: + return (self.copy(),) + return tuple(map(self._new, self.im.split())) + + def getchannel(self, channel: int | str) -> Image: + """ + Returns an image containing a single channel of the source image. + + :param channel: What channel to return. Could be index + (0 for "R" channel of "RGB") or channel name + ("A" for alpha channel of "RGBA"). + :returns: An image in "L" mode. + + .. versionadded:: 4.3.0 + """ + self.load() + + if isinstance(channel, str): + try: + channel = self.getbands().index(channel) + except ValueError as e: + msg = f'The image has no channel "{channel}"' + raise ValueError(msg) from e + + return self._new(self.im.getband(channel)) + + def tell(self) -> int: + """ + Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. + + If defined, :attr:`~PIL.Image.Image.n_frames` refers to the + number of available frames. + + :returns: Frame number, starting with 0. + """ + return 0 + + def thumbnail( + self, + size: tuple[float, float], + resample: Resampling = Resampling.BICUBIC, + reducing_gap: float | None = 2.0, + ) -> None: + """ + Make this image into a thumbnail. This method modifies the + image to contain a thumbnail version of itself, no larger than + the given size. This method calculates an appropriate thumbnail + size to preserve the aspect of the image, calls the + :py:meth:`~PIL.Image.Image.draft` method to configure the file reader + (where applicable), and finally resizes the image. + + Note that this function modifies the :py:class:`~PIL.Image.Image` + object in place. If you need to use the full resolution image as well, + apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original + image. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param resample: Optional resampling filter. This can be one + of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, + :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, + :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. + If omitted, it defaults to :py:data:`Resampling.BICUBIC`. + (was :py:data:`Resampling.NEAREST` prior to version 2.5.0). + See: :ref:`concept-filters`. + :param reducing_gap: Apply optimization by resizing the image + in two steps. First, reducing the image by integer times + using :py:meth:`~PIL.Image.Image.reduce` or + :py:meth:`~PIL.Image.Image.draft` for JPEG images. + Second, resizing using regular resampling. The last step + changes size no less than by ``reducing_gap`` times. + ``reducing_gap`` may be None (no first step is performed) + or should be greater than 1.0. The bigger ``reducing_gap``, + the closer the result to the fair resampling. + The smaller ``reducing_gap``, the faster resizing. + With ``reducing_gap`` greater or equal to 3.0, the result is + indistinguishable from fair resampling in most cases. + The default value is 2.0 (very close to fair resampling + while still being faster in many cases). + :returns: None + """ + + provided_size = tuple(map(math.floor, size)) + + def preserve_aspect_ratio() -> tuple[int, int] | None: + def round_aspect(number, key): + return max(min(math.floor(number), math.ceil(number), key=key), 1) + + x, y = provided_size + if x >= self.width and y >= self.height: + return None + + aspect = self.width / self.height + if x / y >= aspect: + x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) + else: + y = round_aspect( + x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) + ) + return x, y + + box = None + final_size: tuple[int, int] + if reducing_gap is not None: + preserved_size = preserve_aspect_ratio() + if preserved_size is None: + return + final_size = preserved_size + + res = self.draft( + None, (int(size[0] * reducing_gap), int(size[1] * reducing_gap)) + ) + if res is not None: + box = res[1] + if box is None: + self.load() + + # load() may have changed the size of the image + preserved_size = preserve_aspect_ratio() + if preserved_size is None: + return + final_size = preserved_size + + if self.size != final_size: + im = self.resize(final_size, resample, box=box, reducing_gap=reducing_gap) + + self.im = im.im + self._size = final_size + self._mode = self.im.mode + + self.readonly = 0 + self.pyaccess = None + + # FIXME: the different transform methods need further explanation + # instead of bloating the method docs, add a separate chapter. + def transform( + self, + size: tuple[int, int], + method: Transform | ImageTransformHandler | SupportsGetData, + data: Sequence[Any] | None = None, + resample: int = Resampling.NEAREST, + fill: int = 1, + fillcolor: float | tuple[float, ...] | str | None = None, + ) -> Image: + """ + Transforms this image. This method creates a new image with the + given size, and the same mode as the original, and copies data + to the new image using the given transform. + + :param size: The output size in pixels, as a 2-tuple: + (width, height). + :param method: The transformation method. This is one of + :py:data:`Transform.EXTENT` (cut out a rectangular subregion), + :py:data:`Transform.AFFINE` (affine transform), + :py:data:`Transform.PERSPECTIVE` (perspective transform), + :py:data:`Transform.QUAD` (map a quadrilateral to a rectangle), or + :py:data:`Transform.MESH` (map a number of source quadrilaterals + in one operation). + + It may also be an :py:class:`~PIL.Image.ImageTransformHandler` + object:: + + class Example(Image.ImageTransformHandler): + def transform(self, size, data, resample, fill=1): + # Return result + + Implementations of :py:class:`~PIL.Image.ImageTransformHandler` + for some of the :py:class:`Transform` methods are provided + in :py:mod:`~PIL.ImageTransform`. + + It may also be an object with a ``method.getdata`` method + that returns a tuple supplying new ``method`` and ``data`` values:: + + class Example: + def getdata(self): + method = Image.Transform.EXTENT + data = (0, 0, 100, 100) + return method, data + :param data: Extra data to the transformation method. + :param resample: Optional resampling filter. It can be one of + :py:data:`Resampling.NEAREST` (use nearest neighbour), + :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:data:`Resampling.BICUBIC` (cubic spline + interpolation in a 4x4 environment). If omitted, or if the image + has mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. + See: :ref:`concept-filters`. + :param fill: If ``method`` is an + :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of + the arguments passed to it. Otherwise, it is unused. + :param fillcolor: Optional fill color for the area outside the + transform in the output image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if self.mode in ("LA", "RGBA") and resample != Resampling.NEAREST: + return ( + self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) + .transform(size, method, data, resample, fill, fillcolor) + .convert(self.mode) + ) + + if isinstance(method, ImageTransformHandler): + return method.transform(size, self, resample=resample, fill=fill) + + if hasattr(method, "getdata"): + # compatibility w. old-style transform objects + method, data = method.getdata() + + if data is None: + msg = "missing method data" + raise ValueError(msg) + + im = new(self.mode, size, fillcolor) + if self.mode == "P" and self.palette: + im.palette = self.palette.copy() + im.info = self.info.copy() + if method == Transform.MESH: + # list of quads + for box, quad in data: + im.__transformer( + box, self, Transform.QUAD, quad, resample, fillcolor is None + ) + else: + im.__transformer( + (0, 0) + size, self, method, data, resample, fillcolor is None + ) + + return im + + def __transformer( + self, box, image, method, data, resample=Resampling.NEAREST, fill=1 + ): + w = box[2] - box[0] + h = box[3] - box[1] + + if method == Transform.AFFINE: + data = data[:6] + + elif method == Transform.EXTENT: + # convert extent to an affine transform + x0, y0, x1, y1 = data + xs = (x1 - x0) / w + ys = (y1 - y0) / h + method = Transform.AFFINE + data = (xs, 0, x0, 0, ys, y0) + + elif method == Transform.PERSPECTIVE: + data = data[:8] + + elif method == Transform.QUAD: + # quadrilateral warp. data specifies the four corners + # given as NW, SW, SE, and NE. + nw = data[:2] + sw = data[2:4] + se = data[4:6] + ne = data[6:8] + x0, y0 = nw + As = 1.0 / w + At = 1.0 / h + data = ( + x0, + (ne[0] - x0) * As, + (sw[0] - x0) * At, + (se[0] - sw[0] - ne[0] + x0) * As * At, + y0, + (ne[1] - y0) * As, + (sw[1] - y0) * At, + (se[1] - sw[1] - ne[1] + y0) * As * At, + ) + + else: + msg = "unknown transformation method" + raise ValueError(msg) + + if resample not in ( + Resampling.NEAREST, + Resampling.BILINEAR, + Resampling.BICUBIC, + ): + if resample in (Resampling.BOX, Resampling.HAMMING, Resampling.LANCZOS): + msg = { + Resampling.BOX: "Image.Resampling.BOX", + Resampling.HAMMING: "Image.Resampling.HAMMING", + Resampling.LANCZOS: "Image.Resampling.LANCZOS", + }[resample] + f" ({resample}) cannot be used." + else: + msg = f"Unknown resampling filter ({resample})." + + filters = [ + f"{filter[1]} ({filter[0]})" + for filter in ( + (Resampling.NEAREST, "Image.Resampling.NEAREST"), + (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), + (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), + ) + ] + msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" + raise ValueError(msg) + + image.load() + + self.load() + + if image.mode in ("1", "P"): + resample = Resampling.NEAREST + + self.im.transform(box, image.im, method, data, resample, fill) + + def transpose(self, method: Transpose) -> Image: + """ + Transpose image (flip or rotate in 90 degree steps) + + :param method: One of :py:data:`Transpose.FLIP_LEFT_RIGHT`, + :py:data:`Transpose.FLIP_TOP_BOTTOM`, :py:data:`Transpose.ROTATE_90`, + :py:data:`Transpose.ROTATE_180`, :py:data:`Transpose.ROTATE_270`, + :py:data:`Transpose.TRANSPOSE` or :py:data:`Transpose.TRANSVERSE`. + :returns: Returns a flipped or rotated copy of this image. + """ + + self.load() + return self._new(self.im.transpose(method)) + + def effect_spread(self, distance: int) -> Image: + """ + Randomly spread pixels in an image. + + :param distance: Distance to spread pixels. + """ + self.load() + return self._new(self.im.effect_spread(distance)) + + def toqimage(self): + """Returns a QImage copy of this image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.toqimage(self) + + def toqpixmap(self): + """Returns a QPixmap copy of this image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.toqpixmap(self) + + +# -------------------------------------------------------------------- +# Abstract handlers. + + +class ImagePointHandler: + """ + Used as a mixin by point transforms + (for use with :py:meth:`~PIL.Image.Image.point`) + """ + + @abc.abstractmethod + def point(self, im: Image) -> Image: + pass + + +class ImageTransformHandler: + """ + Used as a mixin by geometry transforms + (for use with :py:meth:`~PIL.Image.Image.transform`) + """ + + @abc.abstractmethod + def transform( + self, + size: tuple[int, int], + image: Image, + **options: Any, + ) -> Image: + pass + + +# -------------------------------------------------------------------- +# Factories + +# +# Debugging + + +def _wedge() -> Image: + """Create grayscale wedge (for debugging only)""" + + return Image()._new(core.wedge("L")) + + +def _check_size(size: Any) -> None: + """ + Common check to enforce type and sanity check on size tuples + + :param size: Should be a 2 tuple of (width, height) + :returns: None, or raises a ValueError + """ + + if not isinstance(size, (list, tuple)): + msg = "Size must be a list or tuple" + raise ValueError(msg) + if len(size) != 2: + msg = "Size must be a sequence of length 2" + raise ValueError(msg) + if size[0] < 0 or size[1] < 0: + msg = "Width and height must be >= 0" + raise ValueError(msg) + + +def new( + mode: str, + size: tuple[int, int] | list[int], + color: float | tuple[float, ...] | str | None = 0, +) -> Image: + """ + Creates a new image with the given mode and size. + + :param mode: The mode to use for the new image. See: + :ref:`concept-modes`. + :param size: A 2-tuple, containing (width, height) in pixels. + :param color: What color to use for the image. Default is black. + If given, this should be a single integer or floating point value + for single-band modes, and a tuple for multi-band modes (one value + per band). When creating RGB or HSV images, you can also use color + strings as supported by the ImageColor module. If the color is + None, the image is not initialised. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if mode in ("BGR;15", "BGR;16", "BGR;24"): + deprecate(mode, 12) + + _check_size(size) + + if color is None: + # don't initialize + return Image()._new(core.new(mode, size)) + + if isinstance(color, str): + # css3-style specifier + + from . import ImageColor + + color = ImageColor.getcolor(color, mode) + + im = Image() + if ( + mode == "P" + and isinstance(color, (list, tuple)) + and all(isinstance(i, int) for i in color) + ): + color_ints: tuple[int, ...] = cast(Tuple[int, ...], tuple(color)) + if len(color_ints) == 3 or len(color_ints) == 4: + # RGB or RGBA value for a P image + from . import ImagePalette + + im.palette = ImagePalette.ImagePalette() + color = im.palette.getcolor(color_ints) + return im._new(core.fill(mode, size, color)) + + +def frombytes( + mode: str, + size: tuple[int, int], + data: bytes | bytearray, + decoder_name: str = "raw", + *args: Any, +) -> Image: + """ + Creates a copy of an image memory from pixel data in a buffer. + + In its simplest form, this function takes three arguments + (mode, size, and unpacked pixel data). + + You can also use any pixel decoder supported by PIL. For more + information on available decoders, see the section + :ref:`Writing Your Own File Codec `. + + Note that this function decodes pixel data only, not entire images. + If you have an entire image in a string, wrap it in a + :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load + it. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A byte buffer containing raw data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + im = new(mode, size) + if im.width != 0 and im.height != 0: + decoder_args: Any = args + if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): + # may pass tuple instead of argument list + decoder_args = decoder_args[0] + + if decoder_name == "raw" and decoder_args == (): + decoder_args = mode + + im.frombytes(data, decoder_name, decoder_args) + return im + + +def frombuffer( + mode: str, size: tuple[int, int], data, decoder_name: str = "raw", *args: Any +) -> Image: + """ + Creates an image memory referencing pixel data in a byte buffer. + + This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data + in the byte buffer, where possible. This means that changes to the + original buffer object are reflected in this image). Not all modes can + share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". + + Note that this function decodes pixel data only, not entire images. + If you have an entire image file in a string, wrap it in a + :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. + + The default parameters used for the "raw" decoder differs from that used for + :py:func:`~PIL.Image.frombytes`. This is a bug, and will probably be fixed in a + future release. The current release issues a warning if you do this; to disable + the warning, you should provide the full set of parameters. See below for details. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A bytes or other buffer object containing raw + data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. For the + default encoder ("raw"), it's recommended that you provide the + full set of parameters:: + + frombuffer(mode, size, data, "raw", mode, 0, 1) + + :returns: An :py:class:`~PIL.Image.Image` object. + + .. versionadded:: 1.1.4 + """ + + _check_size(size) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw": + if args == (): + args = mode, 0, 1 + if args[0] in _MAPMODES: + im = new(mode, (0, 0)) + im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) + if mode == "P": + from . import ImagePalette + + im.palette = ImagePalette.ImagePalette("RGB", im.im.getpalette("RGB")) + im.readonly = 1 + return im + + return frombytes(mode, size, data, decoder_name, args) + + +class SupportsArrayInterface(Protocol): + """ + An object that has an ``__array_interface__`` dictionary. + """ + + @property + def __array_interface__(self) -> dict[str, Any]: + raise NotImplementedError() + + +def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: + """ + Creates an image memory from an object exporting the array interface + (using the buffer protocol):: + + from PIL import Image + import numpy as np + a = np.zeros((5, 5)) + im = Image.fromarray(a) + + If ``obj`` is not contiguous, then the ``tobytes`` method is called + and :py:func:`~PIL.Image.frombuffer` is used. + + In the case of NumPy, be aware that Pillow modes do not always correspond + to NumPy dtypes. Pillow modes only offer 1-bit pixels, 8-bit pixels, + 32-bit signed integer pixels, and 32-bit floating point pixels. + + Pillow images can also be converted to arrays:: + + from PIL import Image + import numpy as np + im = Image.open("hopper.jpg") + a = np.asarray(im) + + When converting Pillow images to arrays however, only pixel values are + transferred. This means that P and PA mode images will lose their palette. + + :param obj: Object with array interface + :param mode: Optional mode to use when reading ``obj``. Will be determined from + type if ``None``. + + This will not be used to convert the data after reading, but will be used to + change how the data is read:: + + from PIL import Image + import numpy as np + a = np.full((1, 1), 300) + im = Image.fromarray(a, mode="L") + im.getpixel((0, 0)) # 44 + im = Image.fromarray(a, mode="RGB") + im.getpixel((0, 0)) # (44, 1, 0) + + See: :ref:`concept-modes` for general information about modes. + :returns: An image object. + + .. versionadded:: 1.1.6 + """ + arr = obj.__array_interface__ + shape = arr["shape"] + ndim = len(shape) + strides = arr.get("strides", None) + if mode is None: + try: + typekey = (1, 1) + shape[2:], arr["typestr"] + except KeyError as e: + msg = "Cannot handle this data type" + raise TypeError(msg) from e + try: + mode, rawmode = _fromarray_typemap[typekey] + except KeyError as e: + typekey_shape, typestr = typekey + msg = f"Cannot handle this data type: {typekey_shape}, {typestr}" + raise TypeError(msg) from e + else: + rawmode = mode + if mode in ["1", "L", "I", "P", "F"]: + ndmax = 2 + elif mode == "RGB": + ndmax = 3 + else: + ndmax = 4 + if ndim > ndmax: + msg = f"Too many dimensions: {ndim} > {ndmax}." + raise ValueError(msg) + + size = 1 if ndim == 1 else shape[1], shape[0] + if strides is not None: + if hasattr(obj, "tobytes"): + obj = obj.tobytes() + elif hasattr(obj, "tostring"): + obj = obj.tostring() + else: + msg = "'strides' requires either tobytes() or tostring()" + raise ValueError(msg) + + return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) + + +def fromqimage(im): + """Creates an image instance from a QImage image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.fromqimage(im) + + +def fromqpixmap(im): + """Creates an image instance from a QPixmap image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.fromqpixmap(im) + + +_fromarray_typemap = { + # (shape, typestr) => mode, rawmode + # first two members of shape are set to one + ((1, 1), "|b1"): ("1", "1;8"), + ((1, 1), "|u1"): ("L", "L"), + ((1, 1), "|i1"): ("I", "I;8"), + ((1, 1), "u2"): ("I", "I;16B"), + ((1, 1), "i2"): ("I", "I;16BS"), + ((1, 1), "u4"): ("I", "I;32B"), + ((1, 1), "i4"): ("I", "I;32BS"), + ((1, 1), "f4"): ("F", "F;32BF"), + ((1, 1), "f8"): ("F", "F;64BF"), + ((1, 1, 2), "|u1"): ("LA", "LA"), + ((1, 1, 3), "|u1"): ("RGB", "RGB"), + ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), + # shortcuts: + ((1, 1), f"{_ENDIAN}i4"): ("I", "I"), + ((1, 1), f"{_ENDIAN}f4"): ("F", "F"), +} + + +def _decompression_bomb_check(size: tuple[int, int]) -> None: + if MAX_IMAGE_PIXELS is None: + return + + pixels = max(1, size[0]) * max(1, size[1]) + + if pixels > 2 * MAX_IMAGE_PIXELS: + msg = ( + f"Image size ({pixels} pixels) exceeds limit of {2 * MAX_IMAGE_PIXELS} " + "pixels, could be decompression bomb DOS attack." + ) + raise DecompressionBombError(msg) + + if pixels > MAX_IMAGE_PIXELS: + warnings.warn( + f"Image size ({pixels} pixels) exceeds limit of {MAX_IMAGE_PIXELS} pixels, " + "could be decompression bomb DOS attack.", + DecompressionBombWarning, + ) + + +def open( + fp: StrOrBytesPath | IO[bytes], + mode: Literal["r"] = "r", + formats: list[str] | tuple[str, ...] | None = None, +) -> ImageFile.ImageFile: + """ + Opens and identifies the given image file. + + This is a lazy operation; this function identifies the file, but + the file remains open and the actual image data is not read from + the file until you try to process the data (or call the + :py:meth:`~PIL.Image.Image.load` method). See + :py:func:`~PIL.Image.new`. See :ref:`file-handling`. + + :param fp: A filename (string), os.PathLike object or a file object. + The file object must implement ``file.read``, + ``file.seek``, and ``file.tell`` methods, + and be opened in binary mode. The file object will also seek to zero + before reading. + :param mode: The mode. If given, this argument must be "r". + :param formats: A list or tuple of formats to attempt to load the file in. + This can be used to restrict the set of formats checked. + Pass ``None`` to try all supported formats. You can print the set of + available formats by running ``python3 -m PIL`` or using + the :py:func:`PIL.features.pilinfo` function. + :returns: An :py:class:`~PIL.Image.Image` object. + :exception FileNotFoundError: If the file cannot be found. + :exception PIL.UnidentifiedImageError: If the image cannot be opened and + identified. + :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` + instance is used for ``fp``. + :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. + """ + + if mode != "r": + msg = f"bad mode {repr(mode)}" # type: ignore[unreachable] + raise ValueError(msg) + elif isinstance(fp, io.StringIO): + msg = ( # type: ignore[unreachable] + "StringIO cannot be used to open an image. " + "Binary data must be used instead." + ) + raise ValueError(msg) + + if formats is None: + formats = ID + elif not isinstance(formats, (list, tuple)): + msg = "formats must be a list or tuple" # type: ignore[unreachable] + raise TypeError(msg) + + exclusive_fp = False + filename: str | bytes = "" + if is_path(fp): + filename = os.path.realpath(os.fspath(fp)) + + if filename: + fp = builtins.open(filename, "rb") + exclusive_fp = True + else: + fp = cast(IO[bytes], fp) + + try: + fp.seek(0) + except (AttributeError, io.UnsupportedOperation): + fp = io.BytesIO(fp.read()) + exclusive_fp = True + + prefix = fp.read(16) + + preinit() + + warning_messages: list[str] = [] + + def _open_core( + fp: IO[bytes], + filename: str | bytes, + prefix: bytes, + formats: list[str] | tuple[str, ...], + ) -> ImageFile.ImageFile | None: + for i in formats: + i = i.upper() + if i not in OPEN: + init() + try: + factory, accept = OPEN[i] + result = not accept or accept(prefix) + if isinstance(result, str): + warning_messages.append(result) + elif result: + fp.seek(0) + im = factory(fp, filename) + _decompression_bomb_check(im.size) + return im + except (SyntaxError, IndexError, TypeError, struct.error) as e: + if WARN_POSSIBLE_FORMATS: + warning_messages.append(i + " opening failed. " + str(e)) + except BaseException: + if exclusive_fp: + fp.close() + raise + return None + + im = _open_core(fp, filename, prefix, formats) + + if im is None and formats is ID: + checked_formats = ID.copy() + if init(): + im = _open_core( + fp, + filename, + prefix, + tuple(format for format in formats if format not in checked_formats), + ) + + if im: + im._exclusive_fp = exclusive_fp + return im + + if exclusive_fp: + fp.close() + for message in warning_messages: + warnings.warn(message) + msg = "cannot identify image file %r" % (filename if filename else fp) + raise UnidentifiedImageError(msg) + + +# +# Image processing. + + +def alpha_composite(im1: Image, im2: Image) -> Image: + """ + Alpha composite im2 over im1. + + :param im1: The first image. Must have mode RGBA. + :param im2: The second image. Must have mode RGBA, and the same size as + the first image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.alpha_composite(im1.im, im2.im)) + + +def blend(im1: Image, im2: Image, alpha: float) -> Image: + """ + Creates a new image by interpolating between two input images, using + a constant alpha:: + + out = image1 * (1.0 - alpha) + image2 * alpha + + :param im1: The first image. + :param im2: The second image. Must have the same mode and size as + the first image. + :param alpha: The interpolation alpha factor. If alpha is 0.0, a + copy of the first image is returned. If alpha is 1.0, a copy of + the second image is returned. There are no restrictions on the + alpha value. If necessary, the result is clipped to fit into + the allowed output range. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.blend(im1.im, im2.im, alpha)) + + +def composite(image1: Image, image2: Image, mask: Image) -> Image: + """ + Create composite image by blending images using a transparency mask. + + :param image1: The first image. + :param image2: The second image. Must have the same mode and + size as the first image. + :param mask: A mask image. This image can have mode + "1", "L", or "RGBA", and must have the same size as the + other two images. + """ + + image = image2.copy() + image.paste(image1, None, mask) + return image + + +def eval(image, *args): + """ + Applies the function (which should take one argument) to each pixel + in the given image. If the image has more than one band, the same + function is applied to each band. Note that the function is + evaluated once for each possible pixel value, so you cannot use + random components or other generators. + + :param image: The input image. + :param function: A function object, taking one integer argument. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + return image.point(args[0]) + + +def merge(mode: str, bands: Sequence[Image]) -> Image: + """ + Merge a set of single band images into a new multiband image. + + :param mode: The mode to use for the output image. See: + :ref:`concept-modes`. + :param bands: A sequence containing one single-band image for + each band in the output image. All bands must have the + same size. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if getmodebands(mode) != len(bands) or "*" in mode: + msg = "wrong number of bands" + raise ValueError(msg) + for band in bands[1:]: + if band.mode != getmodetype(mode): + msg = "mode mismatch" + raise ValueError(msg) + if band.size != bands[0].size: + msg = "size mismatch" + raise ValueError(msg) + for band in bands: + band.load() + return bands[0]._new(core.merge(mode, *[b.im for b in bands])) + + +# -------------------------------------------------------------------- +# Plugin registry + + +def register_open( + id: str, + factory: Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], + accept: Callable[[bytes], bool | str] | None = None, +) -> None: + """ + Register an image file plugin. This function should not be used + in application code. + + :param id: An image format identifier. + :param factory: An image file factory method. + :param accept: An optional function that can be used to quickly + reject images having another format. + """ + id = id.upper() + if id not in ID: + ID.append(id) + OPEN[id] = factory, accept + + +def register_mime(id: str, mimetype: str) -> None: + """ + Registers an image MIME type by populating ``Image.MIME``. This function + should not be used in application code. + + ``Image.MIME`` provides a mapping from image format identifiers to mime + formats, but :py:meth:`~PIL.ImageFile.ImageFile.get_format_mimetype` can + provide a different result for specific images. + + :param id: An image format identifier. + :param mimetype: The image MIME type for this format. + """ + MIME[id.upper()] = mimetype + + +def register_save( + id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] +) -> None: + """ + Registers an image save function. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE[id.upper()] = driver + + +def register_save_all( + id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] +) -> None: + """ + Registers an image function to save all the frames + of a multiframe format. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE_ALL[id.upper()] = driver + + +def register_extension(id: str, extension: str) -> None: + """ + Registers an image extension. This function should not be + used in application code. + + :param id: An image format identifier. + :param extension: An extension used for this format. + """ + EXTENSION[extension.lower()] = id.upper() + + +def register_extensions(id: str, extensions: list[str]) -> None: + """ + Registers image extensions. This function should not be + used in application code. + + :param id: An image format identifier. + :param extensions: A list of extensions used for this format. + """ + for extension in extensions: + register_extension(id, extension) + + +def registered_extensions() -> dict[str, str]: + """ + Returns a dictionary containing all file extensions belonging + to registered plugins + """ + init() + return EXTENSION + + +def register_decoder(name: str, decoder: type[ImageFile.PyDecoder]) -> None: + """ + Registers an image decoder. This function should not be + used in application code. + + :param name: The name of the decoder + :param decoder: An ImageFile.PyDecoder object + + .. versionadded:: 4.1.0 + """ + DECODERS[name] = decoder + + +def register_encoder(name: str, encoder: type[ImageFile.PyEncoder]) -> None: + """ + Registers an image encoder. This function should not be + used in application code. + + :param name: The name of the encoder + :param encoder: An ImageFile.PyEncoder object + + .. versionadded:: 4.1.0 + """ + ENCODERS[name] = encoder + + +# -------------------------------------------------------------------- +# Simple display support. + + +def _show(image: Image, **options: Any) -> None: + from . import ImageShow + + ImageShow.show(image, **options) + + +# -------------------------------------------------------------------- +# Effects + + +def effect_mandelbrot( + size: tuple[int, int], extent: tuple[float, float, float, float], quality: int +) -> Image: + """ + Generate a Mandelbrot set covering the given extent. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param extent: The extent to cover, as a 4-tuple: + (x0, y0, x1, y1). + :param quality: Quality. + """ + return Image()._new(core.effect_mandelbrot(size, extent, quality)) + + +def effect_noise(size: tuple[int, int], sigma: float) -> Image: + """ + Generate Gaussian noise centered around 128. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param sigma: Standard deviation of noise. + """ + return Image()._new(core.effect_noise(size, sigma)) + + +def linear_gradient(mode: str) -> Image: + """ + Generate 256x256 linear gradient from black to white, top to bottom. + + :param mode: Input mode. + """ + return Image()._new(core.linear_gradient(mode)) + + +def radial_gradient(mode: str) -> Image: + """ + Generate 256x256 radial gradient from black to white, centre to edge. + + :param mode: Input mode. + """ + return Image()._new(core.radial_gradient(mode)) + + +# -------------------------------------------------------------------- +# Resources + + +def _apply_env_variables(env: dict[str, str] | None = None) -> None: + env_dict = env if env is not None else os.environ + + for var_name, setter in [ + ("PILLOW_ALIGNMENT", core.set_alignment), + ("PILLOW_BLOCK_SIZE", core.set_block_size), + ("PILLOW_BLOCKS_MAX", core.set_blocks_max), + ]: + if var_name not in env_dict: + continue + + var = env_dict[var_name].lower() + + units = 1 + for postfix, mul in [("k", 1024), ("m", 1024 * 1024)]: + if var.endswith(postfix): + units = mul + var = var[: -len(postfix)] + + try: + var_int = int(var) * units + except ValueError: + warnings.warn(f"{var_name} is not int") + continue + + try: + setter(var_int) + except ValueError as e: + warnings.warn(f"{var_name}: {e}") + + +_apply_env_variables() +atexit.register(core.clear_cache) + + +if TYPE_CHECKING: + _ExifBase = MutableMapping[int, Any] +else: + _ExifBase = MutableMapping + + +class Exif(_ExifBase): + """ + This class provides read and write access to EXIF image data:: + + from PIL import Image + im = Image.open("exif.png") + exif = im.getexif() # Returns an instance of this class + + Information can be read and written, iterated over or deleted:: + + print(exif[274]) # 1 + exif[274] = 2 + for k, v in exif.items(): + print("Tag", k, "Value", v) # Tag 274 Value 2 + del exif[274] + + To access information beyond IFD0, :py:meth:`~PIL.Image.Exif.get_ifd` + returns a dictionary:: + + from PIL import ExifTags + im = Image.open("exif_gps.jpg") + exif = im.getexif() + gps_ifd = exif.get_ifd(ExifTags.IFD.GPSInfo) + print(gps_ifd) + + Other IFDs include ``ExifTags.IFD.Exif``, ``ExifTags.IFD.Makernote``, + ``ExifTags.IFD.Interop`` and ``ExifTags.IFD.IFD1``. + + :py:mod:`~PIL.ExifTags` also has enum classes to provide names for data:: + + print(exif[ExifTags.Base.Software]) # PIL + print(gps_ifd[ExifTags.GPS.GPSDateStamp]) # 1999:99:99 99:99:99 + """ + + endian = None + bigtiff = False + _loaded = False + + def __init__(self): + self._data = {} + self._hidden_data = {} + self._ifds = {} + self._info = None + self._loaded_exif = None + + def _fixup(self, value): + try: + if len(value) == 1 and isinstance(value, tuple): + return value[0] + except Exception: + pass + return value + + def _fixup_dict(self, src_dict): + # Helper function + # returns a dict with any single item tuples/lists as individual values + return {k: self._fixup(v) for k, v in src_dict.items()} + + def _get_ifd_dict(self, offset, group=None): + try: + # an offset pointer to the location of the nested embedded IFD. + # It should be a long, but may be corrupted. + self.fp.seek(offset) + except (KeyError, TypeError): + pass + else: + from . import TiffImagePlugin + + info = TiffImagePlugin.ImageFileDirectory_v2(self.head, group=group) + info.load(self.fp) + return self._fixup_dict(info) + + def _get_head(self): + version = b"\x2B" if self.bigtiff else b"\x2A" + if self.endian == "<": + head = b"II" + version + b"\x00" + o32le(8) + else: + head = b"MM\x00" + version + o32be(8) + if self.bigtiff: + head += o32le(8) if self.endian == "<" else o32be(8) + head += b"\x00\x00\x00\x00" + return head + + def load(self, data): + # Extract EXIF information. This is highly experimental, + # and is likely to be replaced with something better in a future + # version. + + # The EXIF record consists of a TIFF file embedded in a JPEG + # application marker (!). + if data == self._loaded_exif: + return + self._loaded_exif = data + self._data.clear() + self._hidden_data.clear() + self._ifds.clear() + if data and data.startswith(b"Exif\x00\x00"): + data = data[6:] + if not data: + self._info = None + return + + self.fp = io.BytesIO(data) + self.head = self.fp.read(8) + # process dictionary + from . import TiffImagePlugin + + self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) + self.endian = self._info._endian + self.fp.seek(self._info.next) + self._info.load(self.fp) + + def load_from_fp(self, fp, offset=None): + self._loaded_exif = None + self._data.clear() + self._hidden_data.clear() + self._ifds.clear() + + # process dictionary + from . import TiffImagePlugin + + self.fp = fp + if offset is not None: + self.head = self._get_head() + else: + self.head = self.fp.read(8) + self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) + if self.endian is None: + self.endian = self._info._endian + if offset is None: + offset = self._info.next + self.fp.tell() + self.fp.seek(offset) + self._info.load(self.fp) + + def _get_merged_dict(self): + merged_dict = dict(self) + + # get EXIF extension + if ExifTags.IFD.Exif in self: + ifd = self._get_ifd_dict(self[ExifTags.IFD.Exif], ExifTags.IFD.Exif) + if ifd: + merged_dict.update(ifd) + + # GPS + if ExifTags.IFD.GPSInfo in self: + merged_dict[ExifTags.IFD.GPSInfo] = self._get_ifd_dict( + self[ExifTags.IFD.GPSInfo], ExifTags.IFD.GPSInfo + ) + + return merged_dict + + def tobytes(self, offset: int = 8) -> bytes: + from . import TiffImagePlugin + + head = self._get_head() + ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) + for tag, value in self.items(): + if tag in [ + ExifTags.IFD.Exif, + ExifTags.IFD.GPSInfo, + ] and not isinstance(value, dict): + value = self.get_ifd(tag) + if ( + tag == ExifTags.IFD.Exif + and ExifTags.IFD.Interop in value + and not isinstance(value[ExifTags.IFD.Interop], dict) + ): + value = value.copy() + value[ExifTags.IFD.Interop] = self.get_ifd(ExifTags.IFD.Interop) + ifd[tag] = value + return b"Exif\x00\x00" + head + ifd.tobytes(offset) + + def get_ifd(self, tag): + if tag not in self._ifds: + if tag == ExifTags.IFD.IFD1: + if self._info is not None and self._info.next != 0: + self._ifds[tag] = self._get_ifd_dict(self._info.next) + elif tag in [ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo]: + offset = self._hidden_data.get(tag, self.get(tag)) + if offset is not None: + self._ifds[tag] = self._get_ifd_dict(offset, tag) + elif tag in [ExifTags.IFD.Interop, ExifTags.IFD.Makernote]: + if ExifTags.IFD.Exif not in self._ifds: + self.get_ifd(ExifTags.IFD.Exif) + tag_data = self._ifds[ExifTags.IFD.Exif][tag] + if tag == ExifTags.IFD.Makernote: + from .TiffImagePlugin import ImageFileDirectory_v2 + + if tag_data[:8] == b"FUJIFILM": + ifd_offset = i32le(tag_data, 8) + ifd_data = tag_data[ifd_offset:] + + makernote = {} + for i in range(0, struct.unpack(" 4: + (offset,) = struct.unpack("H", tag_data[:2])[0]): + ifd_tag, typ, count, data = struct.unpack( + ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] + ) + if ifd_tag == 0x1101: + # CameraInfo + (offset,) = struct.unpack(">L", data) + self.fp.seek(offset) + + camerainfo = {"ModelID": self.fp.read(4)} + + self.fp.read(4) + # Seconds since 2000 + camerainfo["TimeStamp"] = i32le(self.fp.read(12)) + + self.fp.read(4) + camerainfo["InternalSerialNumber"] = self.fp.read(4) + + self.fp.read(12) + parallax = self.fp.read(4) + handler = ImageFileDirectory_v2._load_dispatch[ + TiffTags.FLOAT + ][1] + camerainfo["Parallax"] = handler( + ImageFileDirectory_v2(), parallax, False + ) + + self.fp.read(4) + camerainfo["Category"] = self.fp.read(2) + + makernote = {0x1101: dict(self._fixup_dict(camerainfo))} + self._ifds[tag] = makernote + else: + # Interop + self._ifds[tag] = self._get_ifd_dict(tag_data, tag) + ifd = self._ifds.get(tag, {}) + if tag == ExifTags.IFD.Exif and self._hidden_data: + ifd = { + k: v + for (k, v) in ifd.items() + if k not in (ExifTags.IFD.Interop, ExifTags.IFD.Makernote) + } + return ifd + + def hide_offsets(self) -> None: + for tag in (ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo): + if tag in self: + self._hidden_data[tag] = self[tag] + del self[tag] + + def __str__(self) -> str: + if self._info is not None: + # Load all keys into self._data + for tag in self._info: + self[tag] + + return str(self._data) + + def __len__(self) -> int: + keys = set(self._data) + if self._info is not None: + keys.update(self._info) + return len(keys) + + def __getitem__(self, tag): + if self._info is not None and tag not in self._data and tag in self._info: + self._data[tag] = self._fixup(self._info[tag]) + del self._info[tag] + return self._data[tag] + + def __contains__(self, tag) -> bool: + return tag in self._data or (self._info is not None and tag in self._info) + + def __setitem__(self, tag, value) -> None: + if self._info is not None and tag in self._info: + del self._info[tag] + self._data[tag] = value + + def __delitem__(self, tag: int) -> None: + if self._info is not None and tag in self._info: + del self._info[tag] + else: + del self._data[tag] + + def __iter__(self): + keys = set(self._data) + if self._info is not None: + keys.update(self._info) + return iter(keys) diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageCms.py b/.venv/lib/python3.11/site-packages/PIL/ImageCms.py new file mode 100644 index 0000000000000000000000000000000000000000..ec10230f12ba304c92b1a50e482f17610f9aaffa --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageCms.py @@ -0,0 +1,1127 @@ +# The Python Imaging Library. +# $Id$ + +# Optional color management support, based on Kevin Cazabon's PyCMS +# library. + +# Originally released under LGPL. Graciously donated to PIL in +# March 2009, for distribution under the standard PIL license + +# History: + +# 2009-03-08 fl Added to PIL. + +# Copyright (C) 2002-2003 Kevin Cazabon +# Copyright (c) 2009 by Fredrik Lundh +# Copyright (c) 2013 by Eric Soroos + +# See the README file for information on usage and redistribution. See +# below for the original description. +from __future__ import annotations + +import operator +import sys +from enum import IntEnum, IntFlag +from functools import reduce +from typing import Any, Literal, SupportsFloat, SupportsInt, Union + +from . import Image, __version__ +from ._deprecate import deprecate +from ._typing import SupportsRead + +try: + from . import _imagingcms as core +except ImportError as ex: + # Allow error import for doc purposes, but error out when accessing + # anything in core. + from ._util import DeferredError + + core = DeferredError.new(ex) + +_DESCRIPTION = """ +pyCMS + + a Python / PIL interface to the littleCMS ICC Color Management System + Copyright (C) 2002-2003 Kevin Cazabon + kevin@cazabon.com + https://www.cazabon.com + + pyCMS home page: https://www.cazabon.com/pyCMS + littleCMS home page: https://www.littlecms.com + (littleCMS is Copyright (C) 1998-2001 Marti Maria) + + Originally released under LGPL. Graciously donated to PIL in + March 2009, for distribution under the standard PIL license + + The pyCMS.py module provides a "clean" interface between Python/PIL and + pyCMSdll, taking care of some of the more complex handling of the direct + pyCMSdll functions, as well as error-checking and making sure that all + relevant data is kept together. + + While it is possible to call pyCMSdll functions directly, it's not highly + recommended. + + Version History: + + 1.0.0 pil Oct 2013 Port to LCMS 2. + + 0.1.0 pil mod March 10, 2009 + + Renamed display profile to proof profile. The proof + profile is the profile of the device that is being + simulated, not the profile of the device which is + actually used to display/print the final simulation + (that'd be the output profile) - also see LCMSAPI.txt + input colorspace -> using 'renderingIntent' -> proof + colorspace -> using 'proofRenderingIntent' -> output + colorspace + + Added LCMS FLAGS support. + Added FLAGS["SOFTPROOFING"] as default flag for + buildProofTransform (otherwise the proof profile/intent + would be ignored). + + 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms + + 0.0.2 alpha Jan 6, 2002 + + Added try/except statements around type() checks of + potential CObjects... Python won't let you use type() + on them, and raises a TypeError (stupid, if you ask + me!) + + Added buildProofTransformFromOpenProfiles() function. + Additional fixes in DLL, see DLL code for details. + + 0.0.1 alpha first public release, Dec. 26, 2002 + + Known to-do list with current version (of Python interface, not pyCMSdll): + + none + +""" + +_VERSION = "1.0.0 pil" + + +def __getattr__(name: str) -> Any: + if name == "DESCRIPTION": + deprecate("PIL.ImageCms.DESCRIPTION", 12) + return _DESCRIPTION + elif name == "VERSION": + deprecate("PIL.ImageCms.VERSION", 12) + return _VERSION + elif name == "FLAGS": + deprecate("PIL.ImageCms.FLAGS", 12, "PIL.ImageCms.Flags") + return _FLAGS + msg = f"module '{__name__}' has no attribute '{name}'" + raise AttributeError(msg) + + +# --------------------------------------------------------------------. + + +# +# intent/direction values + + +class Intent(IntEnum): + PERCEPTUAL = 0 + RELATIVE_COLORIMETRIC = 1 + SATURATION = 2 + ABSOLUTE_COLORIMETRIC = 3 + + +class Direction(IntEnum): + INPUT = 0 + OUTPUT = 1 + PROOF = 2 + + +# +# flags + + +class Flags(IntFlag): + """Flags and documentation are taken from ``lcms2.h``.""" + + NONE = 0 + NOCACHE = 0x0040 + """Inhibit 1-pixel cache""" + NOOPTIMIZE = 0x0100 + """Inhibit optimizations""" + NULLTRANSFORM = 0x0200 + """Don't transform anyway""" + GAMUTCHECK = 0x1000 + """Out of Gamut alarm""" + SOFTPROOFING = 0x4000 + """Do softproofing""" + BLACKPOINTCOMPENSATION = 0x2000 + NOWHITEONWHITEFIXUP = 0x0004 + """Don't fix scum dot""" + HIGHRESPRECALC = 0x0400 + """Use more memory to give better accuracy""" + LOWRESPRECALC = 0x0800 + """Use less memory to minimize resources""" + # this should be 8BITS_DEVICELINK, but that is not a valid name in Python: + USE_8BITS_DEVICELINK = 0x0008 + """Create 8 bits devicelinks""" + GUESSDEVICECLASS = 0x0020 + """Guess device class (for ``transform2devicelink``)""" + KEEP_SEQUENCE = 0x0080 + """Keep profile sequence for devicelink creation""" + FORCE_CLUT = 0x0002 + """Force CLUT optimization""" + CLUT_POST_LINEARIZATION = 0x0001 + """create postlinearization tables if possible""" + CLUT_PRE_LINEARIZATION = 0x0010 + """create prelinearization tables if possible""" + NONEGATIVES = 0x8000 + """Prevent negative numbers in floating point transforms""" + COPY_ALPHA = 0x04000000 + """Alpha channels are copied on ``cmsDoTransform()``""" + NODEFAULTRESOURCEDEF = 0x01000000 + + _GRIDPOINTS_1 = 1 << 16 + _GRIDPOINTS_2 = 2 << 16 + _GRIDPOINTS_4 = 4 << 16 + _GRIDPOINTS_8 = 8 << 16 + _GRIDPOINTS_16 = 16 << 16 + _GRIDPOINTS_32 = 32 << 16 + _GRIDPOINTS_64 = 64 << 16 + _GRIDPOINTS_128 = 128 << 16 + + @staticmethod + def GRIDPOINTS(n: int) -> Flags: + """ + Fine-tune control over number of gridpoints + + :param n: :py:class:`int` in range ``0 <= n <= 255`` + """ + return Flags.NONE | ((n & 0xFF) << 16) + + +_MAX_FLAG = reduce(operator.or_, Flags) + + +_FLAGS = { + "MATRIXINPUT": 1, + "MATRIXOUTPUT": 2, + "MATRIXONLY": (1 | 2), + "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot + # Don't create prelinearization tables on precalculated transforms + # (internal use): + "NOPRELINEARIZATION": 16, + "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) + "NOTCACHE": 64, # Inhibit 1-pixel cache + "NOTPRECALC": 256, + "NULLTRANSFORM": 512, # Don't transform anyway + "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy + "LOWRESPRECALC": 2048, # Use less memory to minimize resources + "WHITEBLACKCOMPENSATION": 8192, + "BLACKPOINTCOMPENSATION": 8192, + "GAMUTCHECK": 4096, # Out of Gamut alarm + "SOFTPROOFING": 16384, # Do softproofing + "PRESERVEBLACK": 32768, # Black preservation + "NODEFAULTRESOURCEDEF": 16777216, # CRD special + "GRIDPOINTS": lambda n: (n & 0xFF) << 16, # Gridpoints +} + + +# --------------------------------------------------------------------. +# Experimental PIL-level API +# --------------------------------------------------------------------. + +## +# Profile. + + +class ImageCmsProfile: + def __init__(self, profile: str | SupportsRead[bytes] | core.CmsProfile) -> None: + """ + :param profile: Either a string representing a filename, + a file like object containing a profile or a + low-level profile object + + """ + + if isinstance(profile, str): + if sys.platform == "win32": + profile_bytes_path = profile.encode() + try: + profile_bytes_path.decode("ascii") + except UnicodeDecodeError: + with open(profile, "rb") as f: + self._set(core.profile_frombytes(f.read())) + return + self._set(core.profile_open(profile), profile) + elif hasattr(profile, "read"): + self._set(core.profile_frombytes(profile.read())) + elif isinstance(profile, core.CmsProfile): + self._set(profile) + else: + msg = "Invalid type for Profile" # type: ignore[unreachable] + raise TypeError(msg) + + def _set(self, profile: core.CmsProfile, filename: str | None = None) -> None: + self.profile = profile + self.filename = filename + self.product_name = None # profile.product_name + self.product_info = None # profile.product_info + + def tobytes(self) -> bytes: + """ + Returns the profile in a format suitable for embedding in + saved images. + + :returns: a bytes object containing the ICC profile. + """ + + return core.profile_tobytes(self.profile) + + +class ImageCmsTransform(Image.ImagePointHandler): + """ + Transform. This can be used with the procedural API, or with the standard + :py:func:`~PIL.Image.Image.point` method. + + Will return the output profile in the ``output.info['icc_profile']``. + """ + + def __init__( + self, + input: ImageCmsProfile, + output: ImageCmsProfile, + input_mode: str, + output_mode: str, + intent: Intent = Intent.PERCEPTUAL, + proof: ImageCmsProfile | None = None, + proof_intent: Intent = Intent.ABSOLUTE_COLORIMETRIC, + flags: Flags = Flags.NONE, + ): + supported_modes = ( + "RGB", + "RGBA", + "RGBX", + "CMYK", + "I;16", + "I;16L", + "I;16B", + "YCbCr", + "LAB", + "L", + "1", + ) + for mode in (input_mode, output_mode): + if mode not in supported_modes: + deprecate( + mode, + 12, + { + "L;16": "I;16 or I;16L", + "L:16B": "I;16B", + "YCCA": "YCbCr", + "YCC": "YCbCr", + }.get(mode), + ) + if proof is None: + self.transform = core.buildTransform( + input.profile, output.profile, input_mode, output_mode, intent, flags + ) + else: + self.transform = core.buildProofTransform( + input.profile, + output.profile, + proof.profile, + input_mode, + output_mode, + intent, + proof_intent, + flags, + ) + # Note: inputMode and outputMode are for pyCMS compatibility only + self.input_mode = self.inputMode = input_mode + self.output_mode = self.outputMode = output_mode + + self.output_profile = output + + def point(self, im: Image.Image) -> Image.Image: + return self.apply(im) + + def apply(self, im: Image.Image, imOut: Image.Image | None = None) -> Image.Image: + im.load() + if imOut is None: + imOut = Image.new(self.output_mode, im.size, None) + self.transform.apply(im.im.id, imOut.im.id) + imOut.info["icc_profile"] = self.output_profile.tobytes() + return imOut + + def apply_in_place(self, im: Image.Image) -> Image.Image: + im.load() + if im.mode != self.output_mode: + msg = "mode mismatch" + raise ValueError(msg) # wrong output mode + self.transform.apply(im.im.id, im.im.id) + im.info["icc_profile"] = self.output_profile.tobytes() + return im + + +def get_display_profile(handle: SupportsInt | None = None) -> ImageCmsProfile | None: + """ + (experimental) Fetches the profile for the current display device. + + :returns: ``None`` if the profile is not known. + """ + + if sys.platform != "win32": + return None + + from . import ImageWin # type: ignore[unused-ignore, unreachable] + + if isinstance(handle, ImageWin.HDC): + profile = core.get_display_profile_win32(int(handle), 1) + else: + profile = core.get_display_profile_win32(int(handle or 0)) + if profile is None: + return None + return ImageCmsProfile(profile) + + +# --------------------------------------------------------------------. +# pyCMS compatible layer +# --------------------------------------------------------------------. + +_CmsProfileCompatible = Union[ + str, SupportsRead[bytes], core.CmsProfile, ImageCmsProfile +] + + +class PyCMSError(Exception): + """(pyCMS) Exception class. + This is used for all errors in the pyCMS API.""" + + pass + + +def profileToProfile( + im: Image.Image, + inputProfile: _CmsProfileCompatible, + outputProfile: _CmsProfileCompatible, + renderingIntent: Intent = Intent.PERCEPTUAL, + outputMode: str | None = None, + inPlace: bool = False, + flags: Flags = Flags.NONE, +) -> Image.Image | None: + """ + (pyCMS) Applies an ICC transformation to a given image, mapping from + ``inputProfile`` to ``outputProfile``. + + If the input or output profiles specified are not valid filenames, a + :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and + ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. + If an error occurs during application of the profiles, + a :exc:`PyCMSError` will be raised. + If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), + a :exc:`PyCMSError` will be raised. + + This function applies an ICC transformation to im from ``inputProfile``'s + color space to ``outputProfile``'s color space using the specified rendering + intent to decide how to handle out-of-gamut colors. + + ``outputMode`` can be used to specify that a color mode conversion is to + be done using these profiles, but the specified profiles must be able + to handle that mode. I.e., if converting im from RGB to CMYK using + profiles, the input profile must handle RGB data, and the output + profile must handle CMYK data. + + :param im: An open :py:class:`~PIL.Image.Image` object (i.e. Image.new(...) + or Image.open(...), etc.) + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this image, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this image, or a profile object + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param outputMode: A valid PIL mode for the output image (i.e. "RGB", + "CMYK", etc.). Note: if rendering the image "inPlace", outputMode + MUST be the same mode as the input, or omitted completely. If + omitted, the outputMode will be the same as the mode of the input + image (im.mode) + :param inPlace: Boolean. If ``True``, the original image is modified in-place, + and ``None`` is returned. If ``False`` (default), a new + :py:class:`~PIL.Image.Image` object is returned with the transform applied. + :param flags: Integer (0-...) specifying additional flags + :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on + the value of ``inPlace`` + :exception PyCMSError: + """ + + if outputMode is None: + outputMode = im.mode + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + msg = "renderingIntent must be an integer between 0 and 3" + raise PyCMSError(msg) + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + msg = f"flags must be an integer between 0 and {_MAX_FLAG}" + raise PyCMSError(msg) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + transform = ImageCmsTransform( + inputProfile, + outputProfile, + im.mode, + outputMode, + renderingIntent, + flags=flags, + ) + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + return imOut + + +def getOpenProfile( + profileFilename: str | SupportsRead[bytes] | core.CmsProfile, +) -> ImageCmsProfile: + """ + (pyCMS) Opens an ICC profile file. + + The PyCMSProfile object can be passed back into pyCMS for use in creating + transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). + + If ``profileFilename`` is not a valid filename for an ICC profile, + a :exc:`PyCMSError` will be raised. + + :param profileFilename: String, as a valid filename path to the ICC profile + you wish to open, or a file-like object. + :returns: A CmsProfile class object. + :exception PyCMSError: + """ + + try: + return ImageCmsProfile(profileFilename) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def buildTransform( + inputProfile: _CmsProfileCompatible, + outputProfile: _CmsProfileCompatible, + inMode: str, + outMode: str, + renderingIntent: Intent = Intent.PERCEPTUAL, + flags: Flags = Flags.NONE, +) -> ImageCmsTransform: + """ + (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the + ``outputProfile``. Use applyTransform to apply the transform to a given + image. + + If the input or output profiles specified are not valid filenames, a + :exc:`PyCMSError` will be raised. If an error occurs during creation + of the transform, a :exc:`PyCMSError` will be raised. + + If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` + (or by pyCMS), a :exc:`PyCMSError` will be raised. + + This function builds and returns an ICC transform from the ``inputProfile`` + to the ``outputProfile`` using the ``renderingIntent`` to determine what to do + with out-of-gamut colors. It will ONLY work for converting images that + are in ``inMode`` to images that are in ``outMode`` color format (PIL mode, + i.e. "RGB", "RGBA", "CMYK", etc.). + + Building the transform is a fair part of the overhead in + ImageCms.profileToProfile(), so if you're planning on converting multiple + images using the same input/output settings, this can save you time. + Once you have a transform object, it can be used with + ImageCms.applyProfile() to convert images without the need to re-compute + the lookup table for the transform. + + The reason pyCMS returns a class object rather than a handle directly + to the transform is that it needs to keep track of the PIL input/output + modes that the transform is meant for. These attributes are stored in + the ``inMode`` and ``outMode`` attributes of the object (which can be + manually overridden if you really want to, but I don't know of any + time that would be of use, or would even work). + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + msg = "renderingIntent must be an integer between 0 and 3" + raise PyCMSError(msg) + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + msg = f"flags must be an integer between 0 and {_MAX_FLAG}" + raise PyCMSError(msg) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + return ImageCmsTransform( + inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags + ) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def buildProofTransform( + inputProfile: _CmsProfileCompatible, + outputProfile: _CmsProfileCompatible, + proofProfile: _CmsProfileCompatible, + inMode: str, + outMode: str, + renderingIntent: Intent = Intent.PERCEPTUAL, + proofRenderingIntent: Intent = Intent.ABSOLUTE_COLORIMETRIC, + flags: Flags = Flags.SOFTPROOFING, +) -> ImageCmsTransform: + """ + (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the + ``outputProfile``, but tries to simulate the result that would be + obtained on the ``proofProfile`` device. + + If the input, output, or proof profiles specified are not valid + filenames, a :exc:`PyCMSError` will be raised. + + If an error occurs during creation of the transform, + a :exc:`PyCMSError` will be raised. + + If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` + (or by pyCMS), a :exc:`PyCMSError` will be raised. + + This function builds and returns an ICC transform from the ``inputProfile`` + to the ``outputProfile``, but tries to simulate the result that would be + obtained on the ``proofProfile`` device using ``renderingIntent`` and + ``proofRenderingIntent`` to determine what to do with out-of-gamut + colors. This is known as "soft-proofing". It will ONLY work for + converting images that are in ``inMode`` to images that are in outMode + color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). + + Usage of the resulting transform object is exactly the same as with + ImageCms.buildTransform(). + + Proof profiling is generally used when using an output device to get a + good idea of what the final printed/displayed image would look like on + the ``proofProfile`` device when it's quicker and easier to use the + output device for judging color. Generally, this means that the + output device is a monitor, or a dye-sub printer (etc.), and the simulated + device is something more expensive, complicated, or time consuming + (making it difficult to make a real print for color judgement purposes). + + Soft-proofing basically functions by adjusting the colors on the + output device to match the colors of the device being simulated. However, + when the simulated device has a much wider gamut than the output + device, you may obtain marginal results. + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + (monitor, usually) profile you wish to use for this transform, or a + profile object + :param proofProfile: String, as a valid filename path to the ICC proof + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the input->proof (simulated) transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param proofRenderingIntent: Integer (0-3) specifying the rendering intent + you wish to use for proof->output transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + msg = "renderingIntent must be an integer between 0 and 3" + raise PyCMSError(msg) + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + msg = f"flags must be an integer between 0 and {_MAX_FLAG}" + raise PyCMSError(msg) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + if not isinstance(proofProfile, ImageCmsProfile): + proofProfile = ImageCmsProfile(proofProfile) + return ImageCmsTransform( + inputProfile, + outputProfile, + inMode, + outMode, + renderingIntent, + proofProfile, + proofRenderingIntent, + flags, + ) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +buildTransformFromOpenProfiles = buildTransform +buildProofTransformFromOpenProfiles = buildProofTransform + + +def applyTransform( + im: Image.Image, transform: ImageCmsTransform, inPlace: bool = False +) -> Image.Image | None: + """ + (pyCMS) Applies a transform to a given image. + + If ``im.mode != transform.input_mode``, a :exc:`PyCMSError` is raised. + + If ``inPlace`` is ``True`` and ``transform.input_mode != transform.output_mode``, a + :exc:`PyCMSError` is raised. + + If ``im.mode``, ``transform.input_mode`` or ``transform.output_mode`` is not + supported by pyCMSdll or the profiles you used for the transform, a + :exc:`PyCMSError` is raised. + + If an error occurs while the transform is being applied, + a :exc:`PyCMSError` is raised. + + This function applies a pre-calculated transform (from + ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) + to an image. The transform can be used for multiple images, saving + considerable calculation time if doing the same conversion multiple times. + + If you want to modify im in-place instead of receiving a new image as + the return value, set ``inPlace`` to ``True``. This can only be done if + ``transform.input_mode`` and ``transform.output_mode`` are the same, because we + can't change the mode in-place (the buffer sizes for some modes are + different). The default behavior is to return a new :py:class:`~PIL.Image.Image` + object of the same dimensions in mode ``transform.output_mode``. + + :param im: An :py:class:`~PIL.Image.Image` object, and ``im.mode`` must be the same + as the ``input_mode`` supported by the transform. + :param transform: A valid CmsTransform class object + :param inPlace: Bool. If ``True``, ``im`` is modified in place and ``None`` is + returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the + transform applied is returned (and ``im`` is not changed). The default is + ``False``. + :returns: Either ``None``, or a new :py:class:`~PIL.Image.Image` object, + depending on the value of ``inPlace``. The profile will be returned in + the image's ``info['icc_profile']``. + :exception PyCMSError: + """ + + try: + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (TypeError, ValueError) as v: + raise PyCMSError(v) from v + + return imOut + + +def createProfile( + colorSpace: Literal["LAB", "XYZ", "sRGB"], colorTemp: SupportsFloat = 0 +) -> core.CmsProfile: + """ + (pyCMS) Creates a profile. + + If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, + a :exc:`PyCMSError` is raised. + + If using LAB and ``colorTemp`` is not a positive integer, + a :exc:`PyCMSError` is raised. + + If an error occurs while creating the profile, + a :exc:`PyCMSError` is raised. + + Use this function to create common profiles on-the-fly instead of + having to supply a profile on disk and knowing the path to it. It + returns a normal CmsProfile object that can be passed to + ImageCms.buildTransformFromOpenProfiles() to create a transform to apply + to images. + + :param colorSpace: String, the color space of the profile you wish to + create. + Currently only "LAB", "XYZ", and "sRGB" are supported. + :param colorTemp: Positive number for the white point for the profile, in + degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 + illuminant if omitted (5000k). colorTemp is ONLY applied to LAB + profiles, and is ignored for XYZ and sRGB. + :returns: A CmsProfile class object + :exception PyCMSError: + """ + + if colorSpace not in ["LAB", "XYZ", "sRGB"]: + msg = ( + f"Color space not supported for on-the-fly profile creation ({colorSpace})" + ) + raise PyCMSError(msg) + + if colorSpace == "LAB": + try: + colorTemp = float(colorTemp) + except (TypeError, ValueError) as e: + msg = f'Color temperature must be numeric, "{colorTemp}" not valid' + raise PyCMSError(msg) from e + + try: + return core.createProfile(colorSpace, colorTemp) + except (TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileName(profile: _CmsProfileCompatible) -> str: + """ + + (pyCMS) Gets the internal product name for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, + a :exc:`PyCMSError` is raised If an error occurs while trying + to obtain the name tag, a :exc:`PyCMSError` is raised. + + Use this function to obtain the INTERNAL name of the profile (stored + in an ICC tag in the profile itself), usually the one used when the + profile was originally created. Sometimes this tag also contains + additional information supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal name of the profile as stored + in an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # do it in python, not c. + # // name was "%s - %s" (model, manufacturer) || Description , + # // but if the Model and Manufacturer were the same or the model + # // was long, Just the model, in 1.x + model = profile.profile.model + manufacturer = profile.profile.manufacturer + + if not (model or manufacturer): + return (profile.profile.profile_description or "") + "\n" + if not manufacturer or (model and len(model) > 30): + return f"{model}\n" + return f"{model} - {manufacturer}\n" + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileInfo(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the internal product information for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, + a :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the info tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + info tag. This often contains details about the profile, and how it + was created, as supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # add an extra newline to preserve pyCMS compatibility + # Python, not C. the white point bits weren't working well, + # so skipping. + # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint + description = profile.profile.profile_description + cpright = profile.profile.copyright + elements = [element for element in (description, cpright) if element] + return "\r\n\r\n".join(elements) + "\r\n\r\n" + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileCopyright(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the copyright for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the copyright tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + copyright tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.copyright or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileManufacturer(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the manufacturer for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the manufacturer tag, a + :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + manufacturer tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.manufacturer or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileModel(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the model for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the model tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + model tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.model or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileDescription(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the description for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the description tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + description tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in an + ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.profile_description or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getDefaultIntent(profile: _CmsProfileCompatible) -> int: + """ + (pyCMS) Gets the default intent name for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the default intent, a + :exc:`PyCMSError` is raised. + + Use this function to determine the default (and usually best optimized) + rendering intent for this profile. Most profiles support multiple + rendering intents, but are intended mostly for one type of conversion. + If you wish to use a different intent than returned, use + ImageCms.isIntentSupported() to verify it will work first. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: Integer 0-3 specifying the default rendering intent for this + profile. + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.rendering_intent + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def isIntentSupported( + profile: _CmsProfileCompatible, intent: Intent, direction: Direction +) -> Literal[-1, 1]: + """ + (pyCMS) Checks if a given intent is supported. + + Use this function to verify that you can use your desired + ``intent`` with ``profile``, and that ``profile`` can be used for the + input/output/proof profile as you desire. + + Some profiles are created specifically for one "direction", can cannot + be used for others. Some profiles can only be used for certain + rendering intents, so it's best to either verify this before trying + to create a transform with them (using this function), or catch the + potential :exc:`PyCMSError` that will occur if they don't + support the modes you select. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :param intent: Integer (0-3) specifying the rendering intent you wish to + use with this profile + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param direction: Integer specifying if the profile is to be used for + input, output, or proof + + INPUT = 0 (or use ImageCms.Direction.INPUT) + OUTPUT = 1 (or use ImageCms.Direction.OUTPUT) + PROOF = 2 (or use ImageCms.Direction.PROOF) + + :returns: 1 if the intent/direction are supported, -1 if they are not. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # FIXME: I get different results for the same data w. different + # compilers. Bug in LittleCMS or in the binding? + if profile.profile.is_intent_supported(intent, direction): + return 1 + else: + return -1 + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def versions() -> tuple[str, str | None, str, str]: + """ + (pyCMS) Fetches versions. + """ + + deprecate( + "PIL.ImageCms.versions()", + 12, + '(PIL.features.version("littlecms2"), sys.version, PIL.__version__)', + ) + return _VERSION, core.littlecms_version, sys.version.split()[0], __version__ diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageColor.py b/.venv/lib/python3.11/site-packages/PIL/ImageColor.py new file mode 100644 index 0000000000000000000000000000000000000000..9a15a8eb7597998f1bc9a01e8eae3588c087838b --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageColor.py @@ -0,0 +1,320 @@ +# +# The Python Imaging Library +# $Id$ +# +# map CSS3-style colour description strings to RGB +# +# History: +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-15 fl Added RGBA support +# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 +# 2004-07-19 fl Fixed gray/grey spelling issues +# 2009-03-05 fl Fixed rounding error in grayscale calculation +# +# Copyright (c) 2002-2004 by Secret Labs AB +# Copyright (c) 2002-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re +from functools import lru_cache + +from . import Image + + +@lru_cache +def getrgb(color: str) -> tuple[int, int, int] | tuple[int, int, int, int]: + """ + Convert a color string to an RGB or RGBA tuple. If the string cannot be + parsed, this function raises a :py:exc:`ValueError` exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :return: ``(red, green, blue[, alpha])`` + """ + if len(color) > 100: + msg = "color specifier is too long" + raise ValueError(msg) + color = color.lower() + + rgb = colormap.get(color, None) + if rgb: + if isinstance(rgb, tuple): + return rgb + rgb_tuple = getrgb(rgb) + assert len(rgb_tuple) == 3 + colormap[color] = rgb_tuple + return rgb_tuple + + # check for known string formats + if re.match("#[a-f0-9]{3}$", color): + return int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16) + + if re.match("#[a-f0-9]{4}$", color): + return ( + int(color[1] * 2, 16), + int(color[2] * 2, 16), + int(color[3] * 2, 16), + int(color[4] * 2, 16), + ) + + if re.match("#[a-f0-9]{6}$", color): + return int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16) + + if re.match("#[a-f0-9]{8}$", color): + return ( + int(color[1:3], 16), + int(color[3:5], 16), + int(color[5:7], 16), + int(color[7:9], 16), + ) + + m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return int(m.group(1)), int(m.group(2)), int(m.group(3)) + + m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) + if m: + return ( + int((int(m.group(1)) * 255) / 100.0 + 0.5), + int((int(m.group(2)) * 255) / 100.0 + 0.5), + int((int(m.group(3)) * 255) / 100.0 + 0.5), + ) + + m = re.match( + r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color + ) + if m: + from colorsys import hls_to_rgb + + rgb_floats = hls_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(3)) / 100.0, + float(m.group(2)) / 100.0, + ) + return ( + int(rgb_floats[0] * 255 + 0.5), + int(rgb_floats[1] * 255 + 0.5), + int(rgb_floats[2] * 255 + 0.5), + ) + + m = re.match( + r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color + ) + if m: + from colorsys import hsv_to_rgb + + rgb_floats = hsv_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(2)) / 100.0, + float(m.group(3)) / 100.0, + ) + return ( + int(rgb_floats[0] * 255 + 0.5), + int(rgb_floats[1] * 255 + 0.5), + int(rgb_floats[2] * 255 + 0.5), + ) + + m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)) + msg = f"unknown color specifier: {repr(color)}" + raise ValueError(msg) + + +@lru_cache +def getcolor(color: str, mode: str) -> int | tuple[int, ...]: + """ + Same as :py:func:`~PIL.ImageColor.getrgb` for most modes. However, if + ``mode`` is HSV, converts the RGB value to a HSV value, or if ``mode`` is + not color or a palette image, converts the RGB value to a grayscale value. + If the string cannot be parsed, this function raises a :py:exc:`ValueError` + exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :param mode: Convert result to this mode + :return: ``graylevel, (graylevel, alpha) or (red, green, blue[, alpha])`` + """ + # same as getrgb, but converts the result to the given mode + rgb, alpha = getrgb(color), 255 + if len(rgb) == 4: + alpha = rgb[3] + rgb = rgb[:3] + + if mode == "HSV": + from colorsys import rgb_to_hsv + + r, g, b = rgb + h, s, v = rgb_to_hsv(r / 255, g / 255, b / 255) + return int(h * 255), int(s * 255), int(v * 255) + elif Image.getmodebase(mode) == "L": + r, g, b = rgb + # ITU-R Recommendation 601-2 for nonlinear RGB + # scaled to 24 bits to match the convert's implementation. + graylevel = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 + if mode[-1] == "A": + return graylevel, alpha + return graylevel + elif mode[-1] == "A": + return rgb + (alpha,) + return rgb + + +colormap: dict[str, str | tuple[int, int, int]] = { + # X11 colour table from https://drafts.csswg.org/css-color-4/, with + # gray/grey spelling issues fixed. This is a superset of HTML 4.0 + # colour names used in CSS 1. + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgrey": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkslategrey": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dimgrey": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "grey": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgreen": "#90ee90", + "lightgray": "#d3d3d3", + "lightgrey": "#d3d3d3", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightslategrey": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370db", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#db7093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "rebeccapurple": "#663399", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "slategrey": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", +} diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageEnhance.py b/.venv/lib/python3.11/site-packages/PIL/ImageEnhance.py new file mode 100644 index 0000000000000000000000000000000000000000..d7e99a968152a244a99e1706bad2d4652ac7f566 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageEnhance.py @@ -0,0 +1,107 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image enhancement classes +# +# For a background, see "Image Processing By Interpolation and +# Extrapolation", Paul Haeberli and Douglas Voorhies. Available +# at http://www.graficaobscura.com/interp/index.html +# +# History: +# 1996-03-23 fl Created +# 2009-06-16 fl Fixed mean calculation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFilter, ImageStat + + +class _Enhance: + image: Image.Image + degenerate: Image.Image + + def enhance(self, factor: float) -> Image.Image: + """ + Returns an enhanced image. + + :param factor: A floating point value controlling the enhancement. + Factor 1.0 always returns a copy of the original image, + lower factors mean less color (brightness, contrast, + etc), and higher values more. There are no restrictions + on this value. + :rtype: :py:class:`~PIL.Image.Image` + """ + return Image.blend(self.degenerate, self.image, factor) + + +class Color(_Enhance): + """Adjust image color balance. + + This class can be used to adjust the colour balance of an image, in + a manner similar to the controls on a colour TV set. An enhancement + factor of 0.0 gives a black and white image. A factor of 1.0 gives + the original image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + self.intermediate_mode = "L" + if "A" in image.getbands(): + self.intermediate_mode = "LA" + + self.degenerate = image.convert(self.intermediate_mode).convert(image.mode) + + +class Contrast(_Enhance): + """Adjust image contrast. + + This class can be used to control the contrast of an image, similar + to the contrast control on a TV set. An enhancement factor of 0.0 + gives a solid gray image. A factor of 1.0 gives the original image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5) + self.degenerate = Image.new("L", image.size, mean).convert(image.mode) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) + + +class Brightness(_Enhance): + """Adjust image brightness. + + This class can be used to control the brightness of an image. An + enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the + original image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + self.degenerate = Image.new(image.mode, image.size, 0) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) + + +class Sharpness(_Enhance): + """Adjust image sharpness. + + This class can be used to adjust the sharpness of an image. An + enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the + original image, and a factor of 2.0 gives a sharpened image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + self.degenerate = image.filter(ImageFilter.SMOOTH) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageFile.py b/.venv/lib/python3.11/site-packages/PIL/ImageFile.py new file mode 100644 index 0000000000000000000000000000000000000000..69e7ee548114251c7af911960692a8ab821782ac --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageFile.py @@ -0,0 +1,810 @@ +# +# The Python Imaging Library. +# $Id$ +# +# base class for image file handlers +# +# history: +# 1995-09-09 fl Created +# 1996-03-11 fl Fixed load mechanism. +# 1996-04-15 fl Added pcx/xbm decoders. +# 1996-04-30 fl Added encoders. +# 1996-12-14 fl Added load helpers +# 1997-01-11 fl Use encode_to_file where possible +# 1997-08-27 fl Flush output in _save +# 1998-03-05 fl Use memory mapping for some modes +# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" +# 1999-05-31 fl Added image parser +# 2000-10-12 fl Set readonly flag on memory-mapped images +# 2002-03-20 fl Use better messages for common decoder errors +# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available +# 2003-10-30 fl Added StubImageFile class +# 2004-02-25 fl Made incremental parser more robust +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import abc +import io +import itertools +import struct +import sys +from typing import IO, Any, NamedTuple + +from . import Image +from ._deprecate import deprecate +from ._util import is_path + +MAXBLOCK = 65536 + +SAFEBLOCK = 1024 * 1024 + +LOAD_TRUNCATED_IMAGES = False +"""Whether or not to load truncated image files. User code may change this.""" + +ERRORS = { + -1: "image buffer overrun error", + -2: "decoding error", + -3: "unknown error", + -8: "bad configuration", + -9: "out of memory error", +} +""" +Dict of known error codes returned from :meth:`.PyDecoder.decode`, +:meth:`.PyEncoder.encode` :meth:`.PyEncoder.encode_to_pyfd` and +:meth:`.PyEncoder.encode_to_file`. +""" + + +# +# -------------------------------------------------------------------- +# Helpers + + +def _get_oserror(error: int, *, encoder: bool) -> OSError: + try: + msg = Image.core.getcodecstatus(error) + except AttributeError: + msg = ERRORS.get(error) + if not msg: + msg = f"{'encoder' if encoder else 'decoder'} error {error}" + msg += f" when {'writing' if encoder else 'reading'} image file" + return OSError(msg) + + +def raise_oserror(error: int) -> OSError: + deprecate( + "raise_oserror", + 12, + action="It is only useful for translating error codes returned by a codec's " + "decode() method, which ImageFile already does automatically.", + ) + raise _get_oserror(error, encoder=False) + + +def _tilesort(t): + # sort on offset + return t[2] + + +class _Tile(NamedTuple): + codec_name: str + extents: tuple[int, int, int, int] + offset: int + args: tuple[Any, ...] | str | None + + +# +# -------------------------------------------------------------------- +# ImageFile base class + + +class ImageFile(Image.Image): + """Base class for image file format handlers.""" + + def __init__(self, fp=None, filename=None): + super().__init__() + + self._min_frame = 0 + + self.custom_mimetype = None + + self.tile = None + """ A list of tile descriptors, or ``None`` """ + + self.readonly = 1 # until we know better + + self.decoderconfig = () + self.decodermaxblock = MAXBLOCK + + if is_path(fp): + # filename + self.fp = open(fp, "rb") + self.filename = fp + self._exclusive_fp = True + else: + # stream + self.fp = fp + self.filename = filename + # can be overridden + self._exclusive_fp = None + + try: + try: + self._open() + except ( + IndexError, # end of data + TypeError, # end of data (ord) + KeyError, # unsupported mode + EOFError, # got header but not the first frame + struct.error, + ) as v: + raise SyntaxError(v) from v + + if not self.mode or self.size[0] <= 0 or self.size[1] <= 0: + msg = "not identified by this driver" + raise SyntaxError(msg) + except BaseException: + # close the file only if we have opened it this constructor + if self._exclusive_fp: + self.fp.close() + raise + + def get_format_mimetype(self) -> str | None: + if self.custom_mimetype: + return self.custom_mimetype + if self.format is not None: + return Image.MIME.get(self.format.upper()) + return None + + def __setstate__(self, state): + self.tile = [] + super().__setstate__(state) + + def verify(self) -> None: + """Check file integrity""" + + # raise exception if something's wrong. must be called + # directly after open, and closes file when finished. + if self._exclusive_fp: + self.fp.close() + self.fp = None + + def load(self): + """Load image data based on tile list""" + + if self.tile is None: + msg = "cannot load this image" + raise OSError(msg) + + pixel = Image.Image.load(self) + if not self.tile: + return pixel + + self.map = None + use_mmap = self.filename and len(self.tile) == 1 + # As of pypy 2.1.0, memory mapping was failing here. + use_mmap = use_mmap and not hasattr(sys, "pypy_version_info") + + readonly = 0 + + # look for read/seek overrides + try: + read = self.load_read + # don't use mmap if there are custom read/seek functions + use_mmap = False + except AttributeError: + read = self.fp.read + + try: + seek = self.load_seek + use_mmap = False + except AttributeError: + seek = self.fp.seek + + if use_mmap: + # try memory mapping + decoder_name, extents, offset, args = self.tile[0] + if isinstance(args, str): + args = (args, 0, 1) + if ( + decoder_name == "raw" + and len(args) >= 3 + and args[0] == self.mode + and args[0] in Image._MAPMODES + ): + try: + # use mmap, if possible + import mmap + + with open(self.filename) as fp: + self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) + if offset + self.size[1] * args[1] > self.map.size(): + msg = "buffer is not large enough" + raise OSError(msg) + self.im = Image.core.map_buffer( + self.map, self.size, decoder_name, offset, args + ) + readonly = 1 + # After trashing self.im, + # we might need to reload the palette data. + if self.palette: + self.palette.dirty = 1 + except (AttributeError, OSError, ImportError): + self.map = None + + self.load_prepare() + err_code = -3 # initialize to unknown error + if not self.map: + # sort tiles in file order + self.tile.sort(key=_tilesort) + + try: + # FIXME: This is a hack to handle TIFF's JpegTables tag. + prefix = self.tile_prefix + except AttributeError: + prefix = b"" + + # Remove consecutive duplicates that only differ by their offset + self.tile = [ + list(tiles)[-1] + for _, tiles in itertools.groupby( + self.tile, lambda tile: (tile[0], tile[1], tile[3]) + ) + ] + for decoder_name, extents, offset, args in self.tile: + seek(offset) + decoder = Image._getdecoder( + self.mode, decoder_name, args, self.decoderconfig + ) + try: + decoder.setimage(self.im, extents) + if decoder.pulls_fd: + decoder.setfd(self.fp) + err_code = decoder.decode(b"")[1] + else: + b = prefix + while True: + try: + s = read(self.decodermaxblock) + except (IndexError, struct.error) as e: + # truncated png/gif + if LOAD_TRUNCATED_IMAGES: + break + else: + msg = "image file is truncated" + raise OSError(msg) from e + + if not s: # truncated jpeg + if LOAD_TRUNCATED_IMAGES: + break + else: + msg = ( + "image file is truncated " + f"({len(b)} bytes not processed)" + ) + raise OSError(msg) + + b = b + s + n, err_code = decoder.decode(b) + if n < 0: + break + b = b[n:] + finally: + # Need to cleanup here to prevent leaks + decoder.cleanup() + + self.tile = [] + self.readonly = readonly + + self.load_end() + + if self._exclusive_fp and self._close_exclusive_fp_after_loading: + self.fp.close() + self.fp = None + + if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: + # still raised if decoder fails to return anything + raise _get_oserror(err_code, encoder=False) + + return Image.Image.load(self) + + def load_prepare(self) -> None: + # create image memory if necessary + if not self.im or self.im.mode != self.mode or self.im.size != self.size: + self.im = Image.core.new(self.mode, self.size) + # create palette (optional) + if self.mode == "P": + Image.Image.load(self) + + def load_end(self) -> None: + # may be overridden + pass + + # may be defined for contained formats + # def load_seek(self, pos: int) -> None: + # pass + + # may be defined for blocked formats (e.g. PNG) + # def load_read(self, read_bytes: int) -> bytes: + # pass + + def _seek_check(self, frame): + if ( + frame < self._min_frame + # Only check upper limit on frames if additional seek operations + # are not required to do so + or ( + not (hasattr(self, "_n_frames") and self._n_frames is None) + and frame >= self.n_frames + self._min_frame + ) + ): + msg = "attempt to seek outside sequence" + raise EOFError(msg) + + return self.tell() != frame + + +class StubHandler: + def open(self, im: StubImageFile) -> None: + pass + + @abc.abstractmethod + def load(self, im: StubImageFile) -> Image.Image: + pass + + +class StubImageFile(ImageFile): + """ + Base class for stub image loaders. + + A stub loader is an image loader that can identify files of a + certain format, but relies on external code to load the file. + """ + + def _open(self) -> None: + msg = "StubImageFile subclass must implement _open" + raise NotImplementedError(msg) + + def load(self): + loader = self._load() + if loader is None: + msg = f"cannot find loader for this {self.format} file" + raise OSError(msg) + image = loader.load(self) + assert image is not None + # become the other object (!) + self.__class__ = image.__class__ + self.__dict__ = image.__dict__ + return image.load() + + def _load(self) -> StubHandler | None: + """(Hook) Find actual image loader.""" + msg = "StubImageFile subclass must implement _load" + raise NotImplementedError(msg) + + +class Parser: + """ + Incremental image parser. This class implements the standard + feed/close consumer interface. + """ + + incremental = None + image: Image.Image | None = None + data = None + decoder = None + offset = 0 + finished = 0 + + def reset(self) -> None: + """ + (Consumer) Reset the parser. Note that you can only call this + method immediately after you've created a parser; parser + instances cannot be reused. + """ + assert self.data is None, "cannot reuse parsers" + + def feed(self, data): + """ + (Consumer) Feed data to the parser. + + :param data: A string buffer. + :exception OSError: If the parser failed to parse the image file. + """ + # collect data + + if self.finished: + return + + if self.data is None: + self.data = data + else: + self.data = self.data + data + + # parse what we have + if self.decoder: + if self.offset > 0: + # skip header + skip = min(len(self.data), self.offset) + self.data = self.data[skip:] + self.offset = self.offset - skip + if self.offset > 0 or not self.data: + return + + n, e = self.decoder.decode(self.data) + + if n < 0: + # end of stream + self.data = None + self.finished = 1 + if e < 0: + # decoding error + self.image = None + raise _get_oserror(e, encoder=False) + else: + # end of image + return + self.data = self.data[n:] + + elif self.image: + # if we end up here with no decoder, this file cannot + # be incrementally parsed. wait until we've gotten all + # available data + pass + + else: + # attempt to open this file + try: + with io.BytesIO(self.data) as fp: + im = Image.open(fp) + except OSError: + pass # not enough data + else: + flag = hasattr(im, "load_seek") or hasattr(im, "load_read") + if flag or len(im.tile) != 1: + # custom load code, or multiple tiles + self.decode = None + else: + # initialize decoder + im.load_prepare() + d, e, o, a = im.tile[0] + im.tile = [] + self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig) + self.decoder.setimage(im.im, e) + + # calculate decoder offset + self.offset = o + if self.offset <= len(self.data): + self.data = self.data[self.offset :] + self.offset = 0 + + self.image = im + + def __enter__(self): + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def close(self): + """ + (Consumer) Close the stream. + + :returns: An image object. + :exception OSError: If the parser failed to parse the image file either + because it cannot be identified or cannot be + decoded. + """ + # finish decoding + if self.decoder: + # get rid of what's left in the buffers + self.feed(b"") + self.data = self.decoder = None + if not self.finished: + msg = "image was incomplete" + raise OSError(msg) + if not self.image: + msg = "cannot parse this image" + raise OSError(msg) + if self.data: + # incremental parsing not possible; reopen the file + # not that we have all data + with io.BytesIO(self.data) as fp: + try: + self.image = Image.open(fp) + finally: + self.image.load() + return self.image + + +# -------------------------------------------------------------------- + + +def _save(im, fp, tile, bufsize=0) -> None: + """Helper to save image based on tile list + + :param im: Image object. + :param fp: File object. + :param tile: Tile list. + :param bufsize: Optional buffer size + """ + + im.load() + if not hasattr(im, "encoderconfig"): + im.encoderconfig = () + tile.sort(key=_tilesort) + # FIXME: make MAXBLOCK a configuration parameter + # It would be great if we could have the encoder specify what it needs + # But, it would need at least the image size in most cases. RawEncode is + # a tricky case. + bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c + try: + fh = fp.fileno() + fp.flush() + _encode_tile(im, fp, tile, bufsize, fh) + except (AttributeError, io.UnsupportedOperation) as exc: + _encode_tile(im, fp, tile, bufsize, None, exc) + if hasattr(fp, "flush"): + fp.flush() + + +def _encode_tile(im, fp, tile: list[_Tile], bufsize, fh, exc=None): + for encoder_name, extents, offset, args in tile: + if offset > 0: + fp.seek(offset) + encoder = Image._getencoder(im.mode, encoder_name, args, im.encoderconfig) + try: + encoder.setimage(im.im, extents) + if encoder.pushes_fd: + encoder.setfd(fp) + errcode = encoder.encode_to_pyfd()[1] + else: + if exc: + # compress to Python file-compatible object + while True: + errcode, data = encoder.encode(bufsize)[1:] + fp.write(data) + if errcode: + break + else: + # slight speedup: compress to real file object + errcode = encoder.encode_to_file(fh, bufsize) + if errcode < 0: + raise _get_oserror(errcode, encoder=True) from exc + finally: + encoder.cleanup() + + +def _safe_read(fp, size): + """ + Reads large blocks in a safe way. Unlike fp.read(n), this function + doesn't trust the user. If the requested size is larger than + SAFEBLOCK, the file is read block by block. + + :param fp: File handle. Must implement a read method. + :param size: Number of bytes to read. + :returns: A string containing size bytes of data. + + Raises an OSError if the file is truncated and the read cannot be completed + + """ + if size <= 0: + return b"" + if size <= SAFEBLOCK: + data = fp.read(size) + if len(data) < size: + msg = "Truncated File Read" + raise OSError(msg) + return data + data = [] + remaining_size = size + while remaining_size > 0: + block = fp.read(min(remaining_size, SAFEBLOCK)) + if not block: + break + data.append(block) + remaining_size -= len(block) + if sum(len(d) for d in data) < size: + msg = "Truncated File Read" + raise OSError(msg) + return b"".join(data) + + +class PyCodecState: + def __init__(self) -> None: + self.xsize = 0 + self.ysize = 0 + self.xoff = 0 + self.yoff = 0 + + def extents(self) -> tuple[int, int, int, int]: + return self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize + + +class PyCodec: + fd: IO[bytes] | None + + def __init__(self, mode, *args): + self.im = None + self.state = PyCodecState() + self.fd = None + self.mode = mode + self.init(args) + + def init(self, args): + """ + Override to perform codec specific initialization + + :param args: Array of args items from the tile entry + :returns: None + """ + self.args = args + + def cleanup(self) -> None: + """ + Override to perform codec specific cleanup + + :returns: None + """ + pass + + def setfd(self, fd): + """ + Called from ImageFile to set the Python file-like object + + :param fd: A Python file-like object + :returns: None + """ + self.fd = fd + + def setimage(self, im, extents: tuple[int, int, int, int] | None = None) -> None: + """ + Called from ImageFile to set the core output image for the codec + + :param im: A core image object + :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle + for this tile + :returns: None + """ + + # following c code + self.im = im + + if extents: + (x0, y0, x1, y1) = extents + else: + (x0, y0, x1, y1) = (0, 0, 0, 0) + + if x0 == 0 and x1 == 0: + self.state.xsize, self.state.ysize = self.im.size + else: + self.state.xoff = x0 + self.state.yoff = y0 + self.state.xsize = x1 - x0 + self.state.ysize = y1 - y0 + + if self.state.xsize <= 0 or self.state.ysize <= 0: + msg = "Size cannot be negative" + raise ValueError(msg) + + if ( + self.state.xsize + self.state.xoff > self.im.size[0] + or self.state.ysize + self.state.yoff > self.im.size[1] + ): + msg = "Tile cannot extend outside image" + raise ValueError(msg) + + +class PyDecoder(PyCodec): + """ + Python implementation of a format decoder. Override this class and + add the decoding logic in the :meth:`decode` method. + + See :ref:`Writing Your Own File Codec in Python` + """ + + _pulls_fd = False + + @property + def pulls_fd(self) -> bool: + return self._pulls_fd + + def decode(self, buffer: bytes) -> tuple[int, int]: + """ + Override to perform the decoding process. + + :param buffer: A bytes object with the data to be decoded. + :returns: A tuple of ``(bytes consumed, errcode)``. + If finished with decoding return -1 for the bytes consumed. + Err codes are from :data:`.ImageFile.ERRORS`. + """ + msg = "unavailable in base decoder" + raise NotImplementedError(msg) + + def set_as_raw(self, data: bytes, rawmode=None) -> None: + """ + Convenience method to set the internal image from a stream of raw data + + :param data: Bytes to be set + :param rawmode: The rawmode to be used for the decoder. + If not specified, it will default to the mode of the image + :returns: None + """ + + if not rawmode: + rawmode = self.mode + d = Image._getdecoder(self.mode, "raw", rawmode) + assert self.im is not None + d.setimage(self.im, self.state.extents()) + s = d.decode(data) + + if s[0] >= 0: + msg = "not enough image data" + raise ValueError(msg) + if s[1] != 0: + msg = "cannot decode image data" + raise ValueError(msg) + + +class PyEncoder(PyCodec): + """ + Python implementation of a format encoder. Override this class and + add the decoding logic in the :meth:`encode` method. + + See :ref:`Writing Your Own File Codec in Python` + """ + + _pushes_fd = False + + @property + def pushes_fd(self) -> bool: + return self._pushes_fd + + def encode(self, bufsize: int) -> tuple[int, int, bytes]: + """ + Override to perform the encoding process. + + :param bufsize: Buffer size. + :returns: A tuple of ``(bytes encoded, errcode, bytes)``. + If finished with encoding return 1 for the error code. + Err codes are from :data:`.ImageFile.ERRORS`. + """ + msg = "unavailable in base encoder" + raise NotImplementedError(msg) + + def encode_to_pyfd(self) -> tuple[int, int]: + """ + If ``pushes_fd`` is ``True``, then this method will be used, + and ``encode()`` will only be called once. + + :returns: A tuple of ``(bytes consumed, errcode)``. + Err codes are from :data:`.ImageFile.ERRORS`. + """ + if not self.pushes_fd: + return 0, -8 # bad configuration + bytes_consumed, errcode, data = self.encode(0) + if data: + assert self.fd is not None + self.fd.write(data) + return bytes_consumed, errcode + + def encode_to_file(self, fh, bufsize): + """ + :param fh: File handle. + :param bufsize: Buffer size. + + :returns: If finished successfully, return 0. + Otherwise, return an error code. Err codes are from + :data:`.ImageFile.ERRORS`. + """ + errcode = 0 + while errcode == 0: + status, errcode, buf = self.encode(bufsize) + if status > 0: + fh.write(buf[status:]) + return errcode diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageFilter.py b/.venv/lib/python3.11/site-packages/PIL/ImageFilter.py new file mode 100644 index 0000000000000000000000000000000000000000..e18b4a4466a419ce8e582f36aca5042ff9e5e206 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageFilter.py @@ -0,0 +1,604 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard filters +# +# History: +# 1995-11-27 fl Created +# 2002-06-08 fl Added rank and mode filters +# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2002 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import abc +import functools +from types import ModuleType +from typing import TYPE_CHECKING, Any, Callable, Sequence, cast + +if TYPE_CHECKING: + from . import _imaging + from ._typing import NumpyArray + + +class Filter: + @abc.abstractmethod + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + pass + + +class MultibandFilter(Filter): + pass + + +class BuiltinFilter(MultibandFilter): + filterargs: tuple[Any, ...] + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + if image.mode == "P": + msg = "cannot filter palette images" + raise ValueError(msg) + return image.filter(*self.filterargs) + + +class Kernel(BuiltinFilter): + """ + Create a convolution kernel. This only supports 3x3 and 5x5 integer and floating + point kernels. + + Kernels can only be applied to "L" and "RGB" images. + + :param size: Kernel size, given as (width, height). This must be (3,3) or (5,5). + :param kernel: A sequence containing kernel weights. The kernel will be flipped + vertically before being applied to the image. + :param scale: Scale factor. If given, the result for each pixel is divided by this + value. The default is the sum of the kernel weights. + :param offset: Offset. If given, this value is added to the result, after it has + been divided by the scale factor. + """ + + name = "Kernel" + + def __init__( + self, + size: tuple[int, int], + kernel: Sequence[float], + scale: float | None = None, + offset: float = 0, + ) -> None: + if scale is None: + # default scale is sum of kernel + scale = functools.reduce(lambda a, b: a + b, kernel) + if size[0] * size[1] != len(kernel): + msg = "not enough coefficients in kernel" + raise ValueError(msg) + self.filterargs = size, scale, offset, kernel + + +class RankFilter(Filter): + """ + Create a rank filter. The rank filter sorts all pixels in + a window of the given size, and returns the ``rank``'th value. + + :param size: The kernel size, in pixels. + :param rank: What pixel value to pick. Use 0 for a min filter, + ``size * size / 2`` for a median filter, ``size * size - 1`` + for a max filter, etc. + """ + + name = "Rank" + + def __init__(self, size: int, rank: int) -> None: + self.size = size + self.rank = rank + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + if image.mode == "P": + msg = "cannot filter palette images" + raise ValueError(msg) + image = image.expand(self.size // 2, self.size // 2) + return image.rankfilter(self.size, self.rank) + + +class MedianFilter(RankFilter): + """ + Create a median filter. Picks the median pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Median" + + def __init__(self, size: int = 3) -> None: + self.size = size + self.rank = size * size // 2 + + +class MinFilter(RankFilter): + """ + Create a min filter. Picks the lowest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Min" + + def __init__(self, size: int = 3) -> None: + self.size = size + self.rank = 0 + + +class MaxFilter(RankFilter): + """ + Create a max filter. Picks the largest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Max" + + def __init__(self, size: int = 3) -> None: + self.size = size + self.rank = size * size - 1 + + +class ModeFilter(Filter): + """ + Create a mode filter. Picks the most frequent pixel value in a box with the + given size. Pixel values that occur only once or twice are ignored; if no + pixel value occurs more than twice, the original pixel value is preserved. + + :param size: The kernel size, in pixels. + """ + + name = "Mode" + + def __init__(self, size: int = 3) -> None: + self.size = size + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + return image.modefilter(self.size) + + +class GaussianBlur(MultibandFilter): + """Blurs the image with a sequence of extended box filters, which + approximates a Gaussian kernel. For details on accuracy see + + + :param radius: Standard deviation of the Gaussian kernel. Either a sequence of two + numbers for x and y, or a single number for both. + """ + + name = "GaussianBlur" + + def __init__(self, radius: float | Sequence[float] = 2) -> None: + self.radius = radius + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + xy = self.radius + if isinstance(xy, (int, float)): + xy = (xy, xy) + if xy == (0, 0): + return image.copy() + return image.gaussian_blur(xy) + + +class BoxBlur(MultibandFilter): + """Blurs the image by setting each pixel to the average value of the pixels + in a square box extending radius pixels in each direction. + Supports float radius of arbitrary size. Uses an optimized implementation + which runs in linear time relative to the size of the image + for any radius value. + + :param radius: Size of the box in a direction. Either a sequence of two numbers for + x and y, or a single number for both. + + Radius 0 does not blur, returns an identical image. + Radius 1 takes 1 pixel in each direction, i.e. 9 pixels in total. + """ + + name = "BoxBlur" + + def __init__(self, radius: float | Sequence[float]) -> None: + xy = radius if isinstance(radius, (tuple, list)) else (radius, radius) + if xy[0] < 0 or xy[1] < 0: + msg = "radius must be >= 0" + raise ValueError(msg) + self.radius = radius + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + xy = self.radius + if isinstance(xy, (int, float)): + xy = (xy, xy) + if xy == (0, 0): + return image.copy() + return image.box_blur(xy) + + +class UnsharpMask(MultibandFilter): + """Unsharp mask filter. + + See Wikipedia's entry on `digital unsharp masking`_ for an explanation of + the parameters. + + :param radius: Blur Radius + :param percent: Unsharp strength, in percent + :param threshold: Threshold controls the minimum brightness change that + will be sharpened + + .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking + + """ + + name = "UnsharpMask" + + def __init__( + self, radius: float = 2, percent: int = 150, threshold: int = 3 + ) -> None: + self.radius = radius + self.percent = percent + self.threshold = threshold + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + return image.unsharp_mask(self.radius, self.percent, self.threshold) + + +class BLUR(BuiltinFilter): + name = "Blur" + # fmt: off + filterargs = (5, 5), 16, 0, ( + 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, + ) + # fmt: on + + +class CONTOUR(BuiltinFilter): + name = "Contour" + # fmt: off + filterargs = (3, 3), 1, 255, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1, + ) + # fmt: on + + +class DETAIL(BuiltinFilter): + name = "Detail" + # fmt: off + filterargs = (3, 3), 6, 0, ( + 0, -1, 0, + -1, 10, -1, + 0, -1, 0, + ) + # fmt: on + + +class EDGE_ENHANCE(BuiltinFilter): + name = "Edge-enhance" + # fmt: off + filterargs = (3, 3), 2, 0, ( + -1, -1, -1, + -1, 10, -1, + -1, -1, -1, + ) + # fmt: on + + +class EDGE_ENHANCE_MORE(BuiltinFilter): + name = "Edge-enhance More" + # fmt: off + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 9, -1, + -1, -1, -1, + ) + # fmt: on + + +class EMBOSS(BuiltinFilter): + name = "Emboss" + # fmt: off + filterargs = (3, 3), 1, 128, ( + -1, 0, 0, + 0, 1, 0, + 0, 0, 0, + ) + # fmt: on + + +class FIND_EDGES(BuiltinFilter): + name = "Find Edges" + # fmt: off + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1, + ) + # fmt: on + + +class SHARPEN(BuiltinFilter): + name = "Sharpen" + # fmt: off + filterargs = (3, 3), 16, 0, ( + -2, -2, -2, + -2, 32, -2, + -2, -2, -2, + ) + # fmt: on + + +class SMOOTH(BuiltinFilter): + name = "Smooth" + # fmt: off + filterargs = (3, 3), 13, 0, ( + 1, 1, 1, + 1, 5, 1, + 1, 1, 1, + ) + # fmt: on + + +class SMOOTH_MORE(BuiltinFilter): + name = "Smooth More" + # fmt: off + filterargs = (5, 5), 100, 0, ( + 1, 1, 1, 1, 1, + 1, 5, 5, 5, 1, + 1, 5, 44, 5, 1, + 1, 5, 5, 5, 1, + 1, 1, 1, 1, 1, + ) + # fmt: on + + +class Color3DLUT(MultibandFilter): + """Three-dimensional color lookup table. + + Transforms 3-channel pixels using the values of the channels as coordinates + in the 3D lookup table and interpolating the nearest elements. + + This method allows you to apply almost any color transformation + in constant time by using pre-calculated decimated tables. + + .. versionadded:: 5.2.0 + + :param size: Size of the table. One int or tuple of (int, int, int). + Minimal size in any dimension is 2, maximum is 65. + :param table: Flat lookup table. A list of ``channels * size**3`` + float elements or a list of ``size**3`` channels-sized + tuples with floats. Channels are changed first, + then first dimension, then second, then third. + Value 0.0 corresponds lowest value of output, 1.0 highest. + :param channels: Number of channels in the table. Could be 3 or 4. + Default is 3. + :param target_mode: A mode for the result image. Should have not less + than ``channels`` channels. Default is ``None``, + which means that mode wouldn't be changed. + """ + + name = "Color 3D LUT" + + def __init__( + self, + size: int | tuple[int, int, int], + table: Sequence[float] | Sequence[Sequence[int]] | NumpyArray, + channels: int = 3, + target_mode: str | None = None, + **kwargs: bool, + ) -> None: + if channels not in (3, 4): + msg = "Only 3 or 4 output channels are supported" + raise ValueError(msg) + self.size = size = self._check_size(size) + self.channels = channels + self.mode = target_mode + + # Hidden flag `_copy_table=False` could be used to avoid extra copying + # of the table if the table is specially made for the constructor. + copy_table = kwargs.get("_copy_table", True) + items = size[0] * size[1] * size[2] + wrong_size = False + + numpy: ModuleType | None = None + if hasattr(table, "shape"): + try: + import numpy + except ImportError: + pass + + if numpy and isinstance(table, numpy.ndarray): + numpy_table: NumpyArray = table + if copy_table: + numpy_table = numpy_table.copy() + + if numpy_table.shape in [ + (items * channels,), + (items, channels), + (size[2], size[1], size[0], channels), + ]: + table = numpy_table.reshape(items * channels) + else: + wrong_size = True + + else: + if copy_table: + table = list(table) + + # Convert to a flat list + if table and isinstance(table[0], (list, tuple)): + raw_table = cast(Sequence[Sequence[int]], table) + flat_table: list[int] = [] + for pixel in raw_table: + if len(pixel) != channels: + msg = ( + "The elements of the table should " + f"have a length of {channels}." + ) + raise ValueError(msg) + flat_table.extend(pixel) + table = flat_table + + if wrong_size or len(table) != items * channels: + msg = ( + "The table should have either channels * size**3 float items " + "or size**3 items of channels-sized tuples with floats. " + f"Table should be: {channels}x{size[0]}x{size[1]}x{size[2]}. " + f"Actual length: {len(table)}" + ) + raise ValueError(msg) + self.table = table + + @staticmethod + def _check_size(size: Any) -> tuple[int, int, int]: + try: + _, _, _ = size + except ValueError as e: + msg = "Size should be either an integer or a tuple of three integers." + raise ValueError(msg) from e + except TypeError: + size = (size, size, size) + size = tuple(int(x) for x in size) + for size_1d in size: + if not 2 <= size_1d <= 65: + msg = "Size should be in [2, 65] range." + raise ValueError(msg) + return size + + @classmethod + def generate( + cls, + size: int | tuple[int, int, int], + callback: Callable[[float, float, float], tuple[float, ...]], + channels: int = 3, + target_mode: str | None = None, + ) -> Color3DLUT: + """Generates new LUT using provided callback. + + :param size: Size of the table. Passed to the constructor. + :param callback: Function with three parameters which correspond + three color channels. Will be called ``size**3`` + times with values from 0.0 to 1.0 and should return + a tuple with ``channels`` elements. + :param channels: The number of channels which should return callback. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + size_1d, size_2d, size_3d = cls._check_size(size) + if channels not in (3, 4): + msg = "Only 3 or 4 output channels are supported" + raise ValueError(msg) + + table: list[float] = [0] * (size_1d * size_2d * size_3d * channels) + idx_out = 0 + for b in range(size_3d): + for g in range(size_2d): + for r in range(size_1d): + table[idx_out : idx_out + channels] = callback( + r / (size_1d - 1), g / (size_2d - 1), b / (size_3d - 1) + ) + idx_out += channels + + return cls( + (size_1d, size_2d, size_3d), + table, + channels=channels, + target_mode=target_mode, + _copy_table=False, + ) + + def transform( + self, + callback: Callable[..., tuple[float, ...]], + with_normals: bool = False, + channels: int | None = None, + target_mode: str | None = None, + ) -> Color3DLUT: + """Transforms the table values using provided callback and returns + a new LUT with altered values. + + :param callback: A function which takes old lookup table values + and returns a new set of values. The number + of arguments which function should take is + ``self.channels`` or ``3 + self.channels`` + if ``with_normals`` flag is set. + Should return a tuple of ``self.channels`` or + ``channels`` elements if it is set. + :param with_normals: If true, ``callback`` will be called with + coordinates in the color cube as the first + three arguments. Otherwise, ``callback`` + will be called only with actual color values. + :param channels: The number of channels in the resulting lookup table. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + if channels not in (None, 3, 4): + msg = "Only 3 or 4 output channels are supported" + raise ValueError(msg) + ch_in = self.channels + ch_out = channels or ch_in + size_1d, size_2d, size_3d = self.size + + table = [0] * (size_1d * size_2d * size_3d * ch_out) + idx_in = 0 + idx_out = 0 + for b in range(size_3d): + for g in range(size_2d): + for r in range(size_1d): + values = self.table[idx_in : idx_in + ch_in] + if with_normals: + values = callback( + r / (size_1d - 1), + g / (size_2d - 1), + b / (size_3d - 1), + *values, + ) + else: + values = callback(*values) + table[idx_out : idx_out + ch_out] = values + idx_in += ch_in + idx_out += ch_out + + return type(self)( + self.size, + table, + channels=ch_out, + target_mode=target_mode or self.mode, + _copy_table=False, + ) + + def __repr__(self) -> str: + r = [ + f"{self.__class__.__name__} from {self.table.__class__.__name__}", + "size={:d}x{:d}x{:d}".format(*self.size), + f"channels={self.channels:d}", + ] + if self.mode: + r.append(f"target_mode={self.mode}") + return "<{}>".format(" ".join(r)) + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + from . import Image + + return image.color_lut_3d( + self.mode or image.mode, + Image.Resampling.BILINEAR, + self.channels, + self.size[0], + self.size[1], + self.size[2], + self.table, + ) diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageFont.py b/.venv/lib/python3.11/site-packages/PIL/ImageFont.py new file mode 100644 index 0000000000000000000000000000000000000000..d260eef6946dab0f7b7b20d9e1463ddc38f4d04c --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageFont.py @@ -0,0 +1,1290 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIL raster font management +# +# History: +# 1996-08-07 fl created (experimental) +# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 +# 1999-02-06 fl rewrote most font management stuff in C +# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) +# 2001-02-17 fl added freetype support +# 2001-05-09 fl added TransposedFont wrapper class +# 2002-03-04 fl make sure we have a "L" or "1" font +# 2002-12-04 fl skip non-directory entries in the system path +# 2003-04-29 fl add embedded default font +# 2003-09-27 fl added support for truetype charmap encodings +# +# Todo: +# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from __future__ import annotations + +import base64 +import os +import sys +import warnings +from enum import IntEnum +from io import BytesIO +from types import ModuleType +from typing import IO, TYPE_CHECKING, Any, BinaryIO + +from . import Image +from ._typing import StrOrBytesPath +from ._util import DeferredError, is_path + +if TYPE_CHECKING: + from . import ImageFile + from ._imaging import ImagingFont + from ._imagingft import Font + + +class Layout(IntEnum): + BASIC = 0 + RAQM = 1 + + +MAX_STRING_LENGTH = 1_000_000 + + +core: ModuleType | DeferredError +try: + from . import _imagingft as core +except ImportError as ex: + core = DeferredError.new(ex) + + +def _string_length_check(text: str | bytes | bytearray) -> None: + if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH: + msg = "too many characters in string" + raise ValueError(msg) + + +# FIXME: add support for pilfont2 format (see FontFile.py) + +# -------------------------------------------------------------------- +# Font metrics format: +# "PILfont" LF +# fontdescriptor LF +# (optional) key=value... LF +# "DATA" LF +# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) +# +# To place a character, cut out srcbox and paste at dstbox, +# relative to the character position. Then move the character +# position according to dx, dy. +# -------------------------------------------------------------------- + + +class ImageFont: + """PIL font wrapper""" + + font: ImagingFont + + def _load_pilfont(self, filename: str) -> None: + with open(filename, "rb") as fp: + image: ImageFile.ImageFile | None = None + for ext in (".png", ".gif", ".pbm"): + if image: + image.close() + try: + fullname = os.path.splitext(filename)[0] + ext + image = Image.open(fullname) + except Exception: + pass + else: + if image and image.mode in ("1", "L"): + break + else: + if image: + image.close() + msg = "cannot find glyph data file" + raise OSError(msg) + + self.file = fullname + + self._load_pilfont_data(fp, image) + image.close() + + def _load_pilfont_data(self, file: IO[bytes], image: Image.Image) -> None: + # read PILfont header + if file.readline() != b"PILfont\n": + msg = "Not a PILfont file" + raise SyntaxError(msg) + file.readline().split(b";") + self.info = [] # FIXME: should be a dictionary + while True: + s = file.readline() + if not s or s == b"DATA\n": + break + self.info.append(s) + + # read PILfont metrics + data = file.read(256 * 20) + + # check image + if image.mode not in ("1", "L"): + msg = "invalid font image mode" + raise TypeError(msg) + + image.load() + + self.font = Image.core.font(image.im, data) + + def getmask(self, text, mode="", *args, **kwargs): + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :return: An internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module. + """ + _string_length_check(text) + Image._decompression_bomb_check(self.font.getsize(text)) + return self.font.getmask(text, mode) + + def getbbox( + self, text: str | bytes | bytearray, *args: Any, **kwargs: Any + ) -> tuple[int, int, int, int]: + """ + Returns bounding box (in pixels) of given text. + + .. versionadded:: 9.2.0 + + :param text: Text to render. + + :return: ``(left, top, right, bottom)`` bounding box + """ + _string_length_check(text) + width, height = self.font.getsize(text) + return 0, 0, width, height + + def getlength( + self, text: str | bytes | bytearray, *args: Any, **kwargs: Any + ) -> int: + """ + Returns length (in pixels) of given text. + This is the amount by which following text should be offset. + + .. versionadded:: 9.2.0 + """ + _string_length_check(text) + width, height = self.font.getsize(text) + return width + + +## +# Wrapper for FreeType fonts. Application code should use the +# truetype factory function to create font objects. + + +class FreeTypeFont: + """FreeType font wrapper (requires _imagingft service)""" + + font: Font + font_bytes: bytes + + def __init__( + self, + font: StrOrBytesPath | BinaryIO | None = None, + size: float = 10, + index: int = 0, + encoding: str = "", + layout_engine: Layout | None = None, + ) -> None: + # FIXME: use service provider instead + + if isinstance(core, DeferredError): + raise core.ex + + if size <= 0: + msg = "font size must be greater than 0" + raise ValueError(msg) + + self.path = font + self.size = size + self.index = index + self.encoding = encoding + + if layout_engine not in (Layout.BASIC, Layout.RAQM): + layout_engine = Layout.BASIC + if core.HAVE_RAQM: + layout_engine = Layout.RAQM + elif layout_engine == Layout.RAQM and not core.HAVE_RAQM: + warnings.warn( + "Raqm layout was requested, but Raqm is not available. " + "Falling back to basic layout." + ) + layout_engine = Layout.BASIC + + self.layout_engine = layout_engine + + def load_from_bytes(f): + self.font_bytes = f.read() + self.font = core.getfont( + "", size, index, encoding, self.font_bytes, layout_engine + ) + + if is_path(font): + font = os.path.realpath(os.fspath(font)) + if sys.platform == "win32": + font_bytes_path = font if isinstance(font, bytes) else font.encode() + try: + font_bytes_path.decode("ascii") + except UnicodeDecodeError: + # FreeType cannot load fonts with non-ASCII characters on Windows + # So load it into memory first + with open(font, "rb") as f: + load_from_bytes(f) + return + self.font = core.getfont( + font, size, index, encoding, layout_engine=layout_engine + ) + else: + load_from_bytes(font) + + def __getstate__(self): + return [self.path, self.size, self.index, self.encoding, self.layout_engine] + + def __setstate__(self, state): + path, size, index, encoding, layout_engine = state + self.__init__(path, size, index, encoding, layout_engine) + + def getname(self) -> tuple[str | None, str | None]: + """ + :return: A tuple of the font family (e.g. Helvetica) and the font style + (e.g. Bold) + """ + return self.font.family, self.font.style + + def getmetrics(self) -> tuple[int, int]: + """ + :return: A tuple of the font ascent (the distance from the baseline to + the highest outline point) and descent (the distance from the + baseline to the lowest outline point, a negative value) + """ + return self.font.ascent, self.font.descent + + def getlength( + self, text: str | bytes, mode="", direction=None, features=None, language=None + ) -> float: + """ + Returns length (in pixels with 1/64 precision) of given text when rendered + in font with provided direction, features, and language. + + This is the amount by which following text should be offset. + Text bounding box may extend past the length in some fonts, + e.g. when using italics or accents. + + The result is returned as a float; it is a whole number if using basic layout. + + Note that the sum of two lengths may not equal the length of a concatenated + string due to kerning. If you need to adjust for kerning, include the following + character and subtract its length. + + For example, instead of :: + + hello = font.getlength("Hello") + world = font.getlength("World") + hello_world = hello + world # not adjusted for kerning + assert hello_world == font.getlength("HelloWorld") # may fail + + use :: + + hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning + world = font.getlength("World") + hello_world = hello + world # adjusted for kerning + assert hello_world == font.getlength("HelloWorld") # True + + or disable kerning with (requires libraqm) :: + + hello = draw.textlength("Hello", font, features=["-kern"]) + world = draw.textlength("World", font, features=["-kern"]) + hello_world = hello + world # kerning is disabled, no need to adjust + assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"]) + + .. versionadded:: 8.0.0 + + :param text: Text to measure. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + :return: Either width for horizontal text, or height for vertical text. + """ + _string_length_check(text) + return self.font.getlength(text, mode, direction, features, language) / 64 + + def getbbox( + self, + text: str | bytes, + mode: str = "", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + anchor: str | None = None, + ) -> tuple[float, float, float, float]: + """ + Returns bounding box (in pixels) of given text relative to given anchor + when rendered in font with provided direction, features, and language. + + Use :py:meth:`getlength()` to get the offset of following text with + 1/64 pixel precision. The bounding box includes extra margins for + some fonts, e.g. italics or accents. + + .. versionadded:: 8.0.0 + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + :param stroke_width: The width of the text stroke. + + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + + :return: ``(left, top, right, bottom)`` bounding box + """ + _string_length_check(text) + size, offset = self.font.getsize( + text, mode, direction, features, language, anchor + ) + left, top = offset[0] - stroke_width, offset[1] - stroke_width + width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width + return left, top, left + width, top + height + + def getmask( + self, + text, + mode="", + direction=None, + features=None, + language=None, + stroke_width=0, + anchor=None, + ink=0, + start=None, + ): + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. If the font has embedded color data, the bitmap + should have mode ``RGBA``. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + + .. versionadded:: 8.0.0 + + :param ink: Foreground ink for rendering in RGBA mode. + + .. versionadded:: 8.0.0 + + :param start: Tuple of horizontal and vertical offset, as text may render + differently when starting at fractional coordinates. + + .. versionadded:: 9.4.0 + + :return: An internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module. + """ + return self.getmask2( + text, + mode, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + anchor=anchor, + ink=ink, + start=start, + )[0] + + def getmask2( + self, + text: str | bytes, + mode="", + direction=None, + features=None, + language=None, + stroke_width=0, + anchor=None, + ink=0, + start=None, + *args, + **kwargs, + ): + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. If the font has embedded color data, the bitmap + should have mode ``RGBA``. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + + .. versionadded:: 8.0.0 + + :param ink: Foreground ink for rendering in RGBA mode. + + .. versionadded:: 8.0.0 + + :param start: Tuple of horizontal and vertical offset, as text may render + differently when starting at fractional coordinates. + + .. versionadded:: 9.4.0 + + :return: A tuple of an internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module, and the text offset, the + gap between the starting coordinate and the first marking + """ + _string_length_check(text) + if start is None: + start = (0, 0) + + def fill(width, height): + size = (width, height) + Image._decompression_bomb_check(size) + return Image.core.fill("RGBA" if mode == "RGBA" else "L", size) + + return self.font.render( + text, + fill, + mode, + direction, + features, + language, + stroke_width, + anchor, + ink, + start[0], + start[1], + ) + + def font_variant( + self, font=None, size=None, index=None, encoding=None, layout_engine=None + ): + """ + Create a copy of this FreeTypeFont object, + using any specified arguments to override the settings. + + Parameters are identical to the parameters used to initialize this + object. + + :return: A FreeTypeFont object. + """ + if font is None: + try: + font = BytesIO(self.font_bytes) + except AttributeError: + font = self.path + return FreeTypeFont( + font=font, + size=self.size if size is None else size, + index=self.index if index is None else index, + encoding=self.encoding if encoding is None else encoding, + layout_engine=layout_engine or self.layout_engine, + ) + + def get_variation_names(self) -> list[bytes]: + """ + :returns: A list of the named styles in a variation font. + :exception OSError: If the font is not a variation font. + """ + try: + names = self.font.getvarnames() + except AttributeError as e: + msg = "FreeType 2.9.1 or greater is required" + raise NotImplementedError(msg) from e + return [name.replace(b"\x00", b"") for name in names] + + def set_variation_by_name(self, name): + """ + :param name: The name of the style. + :exception OSError: If the font is not a variation font. + """ + names = self.get_variation_names() + if not isinstance(name, bytes): + name = name.encode() + index = names.index(name) + 1 + + if index == getattr(self, "_last_variation_index", None): + # When the same name is set twice in a row, + # there is an 'unknown freetype error' + # https://savannah.nongnu.org/bugs/?56186 + return + self._last_variation_index = index + + self.font.setvarname(index) + + def get_variation_axes(self): + """ + :returns: A list of the axes in a variation font. + :exception OSError: If the font is not a variation font. + """ + try: + axes = self.font.getvaraxes() + except AttributeError as e: + msg = "FreeType 2.9.1 or greater is required" + raise NotImplementedError(msg) from e + for axis in axes: + if axis["name"]: + axis["name"] = axis["name"].replace(b"\x00", b"") + return axes + + def set_variation_by_axes(self, axes: list[float]) -> None: + """ + :param axes: A list of values for each axis. + :exception OSError: If the font is not a variation font. + """ + try: + self.font.setvaraxes(axes) + except AttributeError as e: + msg = "FreeType 2.9.1 or greater is required" + raise NotImplementedError(msg) from e + + +class TransposedFont: + """Wrapper for writing rotated or mirrored text""" + + def __init__(self, font, orientation=None): + """ + Wrapper that creates a transposed font from any existing font + object. + + :param font: A font object. + :param orientation: An optional orientation. If given, this should + be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM, + Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or + Image.Transpose.ROTATE_270. + """ + self.font = font + self.orientation = orientation # any 'transpose' argument, or None + + def getmask(self, text, mode="", *args, **kwargs): + im = self.font.getmask(text, mode, *args, **kwargs) + if self.orientation is not None: + return im.transpose(self.orientation) + return im + + def getbbox(self, text, *args, **kwargs): + # TransposedFont doesn't support getmask2, move top-left point to (0, 0) + # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont + left, top, right, bottom = self.font.getbbox(text, *args, **kwargs) + width = right - left + height = bottom - top + if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): + return 0, 0, height, width + return 0, 0, width, height + + def getlength(self, text: str | bytes, *args, **kwargs) -> float: + if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): + msg = "text length is undefined for text rotated by 90 or 270 degrees" + raise ValueError(msg) + return self.font.getlength(text, *args, **kwargs) + + +def load(filename: str) -> ImageFont: + """ + Load a font file. This function loads a font object from the given + bitmap font file, and returns the corresponding font object. + + :param filename: Name of font file. + :return: A font object. + :exception OSError: If the file could not be read. + """ + f = ImageFont() + f._load_pilfont(filename) + return f + + +def truetype( + font: StrOrBytesPath | BinaryIO | None = None, + size: float = 10, + index: int = 0, + encoding: str = "", + layout_engine: Layout | None = None, +) -> FreeTypeFont: + """ + Load a TrueType or OpenType font from a file or file-like object, + and create a font object. + This function loads a font object from the given file or file-like + object, and creates a font object for a font of the given size. + + Pillow uses FreeType to open font files. On Windows, be aware that FreeType + will keep the file open as long as the FreeTypeFont object exists. Windows + limits the number of files that can be open in C at once to 512, so if many + fonts are opened simultaneously and that limit is approached, an + ``OSError`` may be thrown, reporting that FreeType "cannot open resource". + A workaround would be to copy the file(s) into memory, and open that instead. + + This function requires the _imagingft service. + + :param font: A filename or file-like object containing a TrueType font. + If the file is not found in this filename, the loader may also + search in other directories, such as: + + * The :file:`fonts/` directory on Windows, + * :file:`/Library/Fonts/`, :file:`/System/Library/Fonts/` + and :file:`~/Library/Fonts/` on macOS. + * :file:`~/.local/share/fonts`, :file:`/usr/local/share/fonts`, + and :file:`/usr/share/fonts` on Linux; or those specified by + the ``XDG_DATA_HOME`` and ``XDG_DATA_DIRS`` environment variables + for user-installed and system-wide fonts, respectively. + + :param size: The requested size, in pixels. + :param index: Which font face to load (default is first available face). + :param encoding: Which font encoding to use (default is Unicode). Possible + encodings include (see the FreeType documentation for more + information): + + * "unic" (Unicode) + * "symb" (Microsoft Symbol) + * "ADOB" (Adobe Standard) + * "ADBE" (Adobe Expert) + * "ADBC" (Adobe Custom) + * "armn" (Apple Roman) + * "sjis" (Shift JIS) + * "gb " (PRC) + * "big5" + * "wans" (Extended Wansung) + * "joha" (Johab) + * "lat1" (Latin-1) + + This specifies the character set to use. It does not alter the + encoding of any text provided in subsequent operations. + :param layout_engine: Which layout engine to use, if available: + :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`. + If it is available, Raqm layout will be used by default. + Otherwise, basic layout will be used. + + Raqm layout is recommended for all non-English text. If Raqm layout + is not required, basic layout will have better performance. + + You can check support for Raqm layout using + :py:func:`PIL.features.check_feature` with ``feature="raqm"``. + + .. versionadded:: 4.2.0 + :return: A font object. + :exception OSError: If the file could not be read. + :exception ValueError: If the font size is not greater than zero. + """ + + def freetype(font: StrOrBytesPath | BinaryIO | None) -> FreeTypeFont: + return FreeTypeFont(font, size, index, encoding, layout_engine) + + try: + return freetype(font) + except OSError: + if not is_path(font): + raise + ttf_filename = os.path.basename(font) + + dirs = [] + if sys.platform == "win32": + # check the windows font repository + # NOTE: must use uppercase WINDIR, to work around bugs in + # 1.5.2's os.environ.get() + windir = os.environ.get("WINDIR") + if windir: + dirs.append(os.path.join(windir, "fonts")) + elif sys.platform in ("linux", "linux2"): + data_home = os.environ.get("XDG_DATA_HOME") + if not data_home: + # The freedesktop spec defines the following default directory for + # when XDG_DATA_HOME is unset or empty. This user-level directory + # takes precedence over system-level directories. + data_home = os.path.expanduser("~/.local/share") + xdg_dirs = [data_home] + + data_dirs = os.environ.get("XDG_DATA_DIRS") + if not data_dirs: + # Similarly, defaults are defined for the system-level directories + data_dirs = "/usr/local/share:/usr/share" + xdg_dirs += data_dirs.split(":") + + dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs] + elif sys.platform == "darwin": + dirs += [ + "/Library/Fonts", + "/System/Library/Fonts", + os.path.expanduser("~/Library/Fonts"), + ] + + ext = os.path.splitext(ttf_filename)[1] + first_font_with_a_different_extension = None + for directory in dirs: + for walkroot, walkdir, walkfilenames in os.walk(directory): + for walkfilename in walkfilenames: + if ext and walkfilename == ttf_filename: + return freetype(os.path.join(walkroot, walkfilename)) + elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: + fontpath = os.path.join(walkroot, walkfilename) + if os.path.splitext(fontpath)[1] == ".ttf": + return freetype(fontpath) + if not ext and first_font_with_a_different_extension is None: + first_font_with_a_different_extension = fontpath + if first_font_with_a_different_extension: + return freetype(first_font_with_a_different_extension) + raise + + +def load_path(filename: str | bytes) -> ImageFont: + """ + Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a + bitmap font along the Python path. + + :param filename: Name of font file. + :return: A font object. + :exception OSError: If the file could not be read. + """ + if not isinstance(filename, str): + filename = filename.decode("utf-8") + for directory in sys.path: + try: + return load(os.path.join(directory, filename)) + except OSError: + pass + msg = "cannot find font file" + raise OSError(msg) + + +def load_default_imagefont() -> ImageFont: + f = ImageFont() + f._load_pilfont_data( + # courB08 + BytesIO( + base64.b64decode( + b""" +UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA +BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL +AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA +AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB +ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A +BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB +//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA +AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH +AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA +ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv +AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ +/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 +AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA +AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG +AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA +BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA +AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA +2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF +AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// ++gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA +////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA +BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv +AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA +AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA +AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA +BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// +//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA +AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF +AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB +mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn +AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA +AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 +AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA +Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB +//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA +AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ +AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC +DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ +AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ ++wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 +AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ +///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG +AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA +BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA +Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC +eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG +AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// ++gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA +////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA +BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT +AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A +AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA +Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA +Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// +//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA +AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ +AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA +LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 +AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA +AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 +AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA +AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG +AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA +EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK +AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA +pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG +AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// ++QAGAAIAzgAKANUAEw== +""" + ) + ), + Image.open( + BytesIO( + base64.b64decode( + b""" +iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u +Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 +M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g +LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F +IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA +Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 +NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx +in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 +SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY +AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt +y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG +ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY +lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H +/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 +AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 +c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ +/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw +pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv +oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR +evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA +AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// +Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR +w7IkEbzhVQAAAABJRU5ErkJggg== +""" + ) + ) + ), + ) + return f + + +def load_default(size: float | None = None) -> FreeTypeFont | ImageFont: + """If FreeType support is available, load a version of Aileron Regular, + https://dotcolon.net/font/aileron, with a more limited character set. + + Otherwise, load a "better than nothing" font. + + .. versionadded:: 1.1.4 + + :param size: The font size of Aileron Regular. + + .. versionadded:: 10.1.0 + + :return: A font object. + """ + if isinstance(core, ModuleType) or size is not None: + return truetype( + BytesIO( + base64.b64decode( + b""" +AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA +AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA +MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh +tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk +OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/ +2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ +AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI +BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA +AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ +AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk +QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB +kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC +ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA +EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg +JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y +AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q +AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq +QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB// +//4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT +FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT +U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA +AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9 +ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO +AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ +gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG +oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz +qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA +DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA +P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA +LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc +jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb +2ziMONvb29s4jAAAAAMANf+mAg4DDAAfACYALAAAJRQGBxUjNS4BJzMeARcRLgE0Njc1MxUeARcjJ +icVHgEBFBYXNQ4BExU+ATU0Ag5xWDpgcgRcBz41Xl9oVTpVYwpcC1ttXP6cLTQuM5szOrVRZwlOTQ +ZqVzZECAEAGlukZAlOTQdrUG8O7iNlAQgxNhDlCDj+8/YGOjReAAAAAAUAKf/yArsCvAAHAAsAFQA +dACcAABIyFhQGIiY0EyMBMwQiBhUUFjI2NTQSMhYUBiImNDYiBhUUFjI2NTR5iFBQiFCVVwHAV/5c +OiMjOiPmiFBQiFCxOiMjOiMCvFaSVlaS/ZoCsjIzMC80NC8w/uNWklZWkhozMC80NC8wAAAAAgBA/ +/ICbgLAACIALgAAARUjEQYjIiY1NDY3LgE1NDYzMhcVJiMiBhUUFhcWOwE1MxUFFBYzMjc1IyIHDg +ECbmBcYYOOVkg7R4hsQjY4Q0RNRD4SLDxW/pJUXzksPCkUUk0BgUb+zBVUZ0BkDw5RO1huCkULQzp +COAMBcHDHRz0J/AIHRQAAAAEAKwHlAIUC3wADAAATIycze0YKWgHl+gAAAAABAGT/sAEXAwwACQAA +EzMGEBcjLgE0Nt06dXU6OUBAAwzG/jDGVePs4wAAAAEAHv+wANEDDAAJAAATMx4BFAYHIzYQHjo5Q +EA5OnUDDFXj7ONVxgHQAAAAAQBVAFIB2wHbAA4AAAE3FwcXBycHJzcnNxcnMwEtmxOfcTJjYzJxnx +ObCj4BKD07KYolmZkliik7PbMAAQBQAFUB9AIlAAsAAAEjFSM1IzUzNTMVMwH0tTq1tTq1AR/Kyjj +OzgAAAAAB/+H/iACMAGQABAAANwcjNzOMWlFOXVrS3AAAAQAgAP8A8gE3AAMAABMjNTPy0tIA/zgA +AQAl//IApQByAAcAADYyFhQGIiY0STgkJDgkciQ4JCQ4AAAAAf/7/+IBNALQAAMAABcjEzM5Pvs+H +gLuAAAAAAIAKf/yAhsCwAADAAcAABIgECA2IBAgKQHy/g5gATL+zgLA/TJEAkYAAAAAAQCCAAABlg +KyAAgAAAERIxEHNTc2MwGWVr6SIygCsv1OAldxW1sWAAEAPAAAAg4CwAAZAAA3IRUhNRM+ATU0JiM +iDwEjNz4BMzIWFRQGB7kBUv4x+kI2QTt+EAFWAQp8aGVtSl5GRjEA/0RVLzlLmAoKa3FsUkNxXQAA +AAEALf/yAhYCwAAqAAABHgEVFAYjIi8BMxceATMyNjU0KwE1MzI2NTQmIyIGDwEjNz4BMzIWFRQGA +YxBSZJo2RUBVgEHV0JBUaQREUBUQzc5TQcBVgEKfGhfcEMBbxJbQl1x0AoKRkZHPn9GSD80QUVCCg +pfbGBPOlgAAAACACEAAAIkArIACgAPAAAlIxUjNSE1ATMRMyMRBg8BAiRXVv6qAVZWV60dHLCurq4 +rAdn+QgFLMibzAAABADn/8gIZArIAHQAAATIWFRQGIyIvATMXFjMyNjU0JiMiByMTIRUhBzc2ATNv +d5Fl1RQBVgIad0VSTkVhL1IwAYj+vh8rMAHHgGdtgcUKCoFXTU5bYgGRRvAuHQAAAAACACv/8gITA +sAAFwAjAAABMhYVFAYjIhE0NjMyFh8BIycmIyIDNzYTMjY1NCYjIgYVFBYBLmp7imr0l3RZdAgBXA +IYZ5wKJzU6QVNJSz5SUAHSgWltiQFGxcNlVQoKdv7sPiz+ZF1LTmJbU0lhAAAAAQAyAAACGgKyAAY +AAAEVASMBITUCGv6oXAFL/oECsij9dgJsRgAAAAMALP/xAhgCwAAWACAALAAAAR4BFRQGIyImNTQ2 +Ny4BNTQ2MhYVFAYmIgYVFBYyNjU0AzI2NTQmIyIGFRQWAZQ5S5BmbIpPOjA7ecp5P2F8Q0J8RIVJS +0pLTEtOAW0TXTxpZ2ZqPF0SE1A3VWVlVTdQ/UU0N0RENzT9/ko+Ok1NOj1LAAIAMf/yAhkCwAAXAC +MAAAEyERQGIyImLwEzFxYzMhMHBiMiJjU0NhMyNjU0JiMiBhUUFgEl9Jd0WXQIAVwCGGecCic1SWp +7imo+UlBAQVNJAsD+usXDZVUKCnYBFD4sgWltif5kW1NJYV1LTmIAAAACACX/8gClAiAABwAPAAAS +MhYUBiImNBIyFhQGIiY0STgkJDgkJDgkJDgkAiAkOCQkOP52JDgkJDgAAAAC/+H/iAClAiAABwAMA +AASMhYUBiImNBMHIzczSTgkJDgkaFpSTl4CICQ4JCQ4/mba5gAAAQBnAB4B+AH0AAYAAAENARUlNS +UB+P6qAVb+bwGRAbCmpkbJRMkAAAIAUAC7AfQBuwADAAcAAAEhNSERITUhAfT+XAGk/lwBpAGDOP8 +AOAABAEQAHgHVAfQABgAAARUFNS0BNQHV/m8BVv6qAStEyUSmpkYAAAAAAgAj//IB1ALAABgAIAAA +ATIWFRQHDgEHIz4BNz4BNTQmIyIGByM+ARIyFhQGIiY0AQRibmktIAJWBSEqNig+NTlHBFoDezQ4J +CQ4JALAZ1BjaS03JS1DMD5LLDQ/SUVgcv2yJDgkJDgAAAAAAgA2/5gDFgKYADYAQgAAAQMGFRQzMj +Y1NCYjIg4CFRQWMzI2NxcGIyImNTQ+AjMyFhUUBiMiJwcGIyImNTQ2MzIfATcHNzYmIyIGFRQzMjY +Cej8EJjJJlnBAfGQ+oHtAhjUYg5OPx0h2k06Os3xRWQsVLjY5VHtdPBwJETcJDyUoOkZEJz8B0f74 +EQ8kZl6EkTFZjVOLlyknMVm1pmCiaTq4lX6CSCknTVRmmR8wPdYnQzxuSWVGAAIAHQAAAncCsgAHA +AoAACUjByMTMxMjATMDAcj+UVz4dO5d/sjPZPT0ArL9TgE6ATQAAAADAGQAAAJMArIAEAAbACcAAA +EeARUUBgcGKwERMzIXFhUUJRUzMjc2NTQnJiMTPgE1NCcmKwEVMzIBvkdHZkwiNt7LOSGq/oeFHBt +hahIlSTM+cB8Yj5UWAW8QT0VYYgwFArIEF5Fv1eMED2NfDAL93AU+N24PBP0AAAAAAQAv//ICjwLA +ABsAAAEyFh8BIycmIyIGFRQWMzI/ATMHDgEjIiY1NDYBdX+PCwFWAiKiaHx5ZaIiAlYBCpWBk6a0A +sCAagoKpqN/gaOmCgplhcicn8sAAAIAZAAAAp8CsgAMABkAAAEeARUUBgcGKwERMzITPgE1NCYnJi +sBETMyAY59lJp8IzXN0jUVWmdjWRs5d3I4Aq4QqJWUug8EArL9mQ+PeHGHDgX92gAAAAABAGQAAAI +vArIACwAAJRUhESEVIRUhFSEVAi/+NQHB/pUBTf6zRkYCskbwRvAAAAABAGQAAAIlArIACQAAExUh +FSERIxEhFboBQ/69VgHBAmzwRv7KArJGAAAAAAEAL//yAo8CwAAfAAABMxEjNQcGIyImNTQ2MzIWH +wEjJyYjIgYVFBYzMjY1IwGP90wfPnWTprSSf48LAVYCIqJofHllVG+hAU3+s3hARsicn8uAagoKpq +N/gaN1XAAAAAEAZAAAAowCsgALAAABESMRIREjETMRIRECjFb+hFZWAXwCsv1OAS7+0gKy/sQBPAA +AAAABAGQAAAC6ArIAAwAAMyMRM7pWVgKyAAABADf/8gHoArIAEwAAAREUBw4BIyImLwEzFxYzMjc2 +NREB6AIFcGpgbQIBVgIHfXQKAQKy/lYxIltob2EpKYyEFD0BpwAAAAABAGQAAAJ0ArIACwAACQEjA +wcVIxEzEQEzATsBJ3ntQlZWAVVlAWH+nwEnR+ACsv6RAW8AAQBkAAACLwKyAAUAACUVIREzEQIv/j +VWRkYCsv2UAAABAGQAAAMUArIAFAAAAREjETQ3BgcDIwMmJxYVESMRMxsBAxRWAiMxemx8NxsCVo7 +MywKy/U4BY7ZLco7+nAFmoFxLtP6dArL9lwJpAAAAAAEAZAAAAoACsgANAAAhIwEWFREjETMBJjUR +MwKAhP67A1aEAUUDVAJeeov+pwKy/aJ5jAFZAAAAAgAv//ICuwLAAAkAEwAAEiAWFRQGICY1NBIyN +jU0JiIGFRTbATSsrP7MrNrYenrYegLAxaKhxsahov47nIeIm5uIhwACAGQAAAJHArIADgAYAAABHg +EVFAYHBisBESMRMzITNjQnJisBETMyAZRUX2VOHzuAVtY7GlxcGDWIiDUCrgtnVlVpCgT+5gKy/rU +V1BUF/vgAAAACAC//zAK9AsAAEgAcAAAlFhcHJiMiBwYjIiY1NDYgFhUUJRQWMjY1NCYiBgI9PUMx +UDcfKh8omqysATSs/dR62Hp62HpICTg7NgkHxqGixcWitbWHnJyHiJubAAIAZAAAAlgCsgAXACMAA +CUWFyMmJyYnJisBESMRMzIXHgEVFAYHFiUzMjc+ATU0JyYrAQIqDCJfGQwNWhAhglbiOx9QXEY1Tv +6bhDATMj1lGSyMtYgtOXR0BwH+1wKyBApbU0BSESRAAgVAOGoQBAABADT/8gIoAsAAJQAAATIWFyM +uASMiBhUUFhceARUUBiMiJiczHgEzMjY1NCYnLgE1NDYBOmd2ClwGS0E6SUNRdW+HZnKKC1wPWkQ9 +Uk1cZGuEAsBwXUJHNjQ3OhIbZVZZbm5kREo+NT5DFRdYUFdrAAAAAAEAIgAAAmQCsgAHAAABIxEjE +SM1IQJk9lb2AkICbP2UAmxGAAEAXv/yAmQCsgAXAAABERQHDgEiJicmNREzERQXHgEyNjc2NRECZA +IIgfCBCAJWAgZYmlgGAgKy/k0qFFxzc1wUKgGz/lUrEkRQUEQSKwGrAAAAAAEAIAAAAnoCsgAGAAA +hIwMzGwEzAYJ07l3N1FwCsv2PAnEAAAEAGgAAA7ECsgAMAAABAyMLASMDMxsBMxsBA7HAcZyicrZi +kaB0nJkCsv1OAlP9rQKy/ZsCW/2kAmYAAAEAGQAAAm8CsgALAAAhCwEjEwMzGwEzAxMCCsrEY/bkY +re+Y/D6AST+3AFcAVb+5gEa/q3+oQAAAQATAAACUQKyAAgAAAERIxEDMxsBMwFdVvRjwLphARD+8A +EQAaL+sQFPAAABAC4AAAI5ArIACQAAJRUhNQEhNSEVAQI5/fUBof57Aen+YUZGQgIqRkX92QAAAAA +BAGL/sAEFAwwABwAAARUjETMVIxEBBWlpowMMOP0UOANcAAAB//v/4gE0AtAAAwAABSMDMwE0Pvs+ +HgLuAAAAAQAi/7AAxQMMAAcAABcjNTMRIzUzxaNpaaNQOALsOAABAFAA1wH0AmgABgAAJQsBIxMzE +wGwjY1GsESw1wFZ/qcBkf5vAAAAAQAy/6oBwv/iAAMAAAUhNSEBwv5wAZBWOAAAAAEAKQJEALYCsg +ADAAATIycztjhVUAJEbgAAAAACACT/8gHQAiAAHQAlAAAhJwcGIyImNTQ2OwE1NCcmIyIHIz4BMzI +XFh0BFBcnMjY9ASYVFAF6CR0wVUtgkJoiAgdgaQlaBm1Zrg4DCuQ9R+5MOSFQR1tbDiwUUXBUXowf +J8c9SjRORzYSgVwAAAAAAgBK//ICRQLfABEAHgAAATIWFRQGIyImLwEVIxEzETc2EzI2NTQmIyIGH +QEUFgFUcYCVbiNJEyNWVigySElcU01JXmECIJd4i5QTEDRJAt/+3jkq/hRuZV55ZWsdX14AAQAe// +IB9wIgABgAAAEyFhcjJiMiBhUUFjMyNjczDgEjIiY1NDYBF152DFocbEJXU0A1Rw1aE3pbaoKQAiB +oWH5qZm1tPDlaXYuLgZcAAAACAB7/8gIZAt8AEQAeAAABESM1BwYjIiY1NDYzMhYfAREDMjY9ATQm +IyIGFRQWAhlWKDJacYCVbiNJEyOnSV5hQUlcUwLf/SFVOSqXeIuUExA0ARb9VWVrHV9ebmVeeQACA +B7/8gH9AiAAFQAbAAABFAchHgEzMjY3Mw4BIyImNTQ2MzIWJyIGByEmAf0C/oAGUkA1SwlaD4FXbI +WObmt45UBVBwEqDQEYFhNjWD84W16Oh3+akU9aU60AAAEAFQAAARoC8gAWAAATBh0BMxUjESMRIzU +zNTQ3PgEzMhcVJqcDbW1WOTkDB0k8Hx5oAngVITRC/jQBzEIsJRs5PwVHEwAAAAIAHv8uAhkCIAAi +AC8AAAERFAcOASMiLwEzFx4BMzI2NzY9AQcGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZAQSEd +NwRAVcBBU5DTlUDASgyWnGAlW4jSRMjp0leYUFJXFMCEv5wSh1zeq8KCTI8VU0ZIQk5Kpd4i5QTED +RJ/iJlax1fXm5lXnkAAQBKAAACCgLkABcAAAEWFREjETQnLgEHDgEdASMRMxE3NjMyFgIIAlYCBDs +6RVRWViE5UVViAYUbQP7WASQxGzI7AQJyf+kC5P7TPSxUAAACAD4AAACsAsAABwALAAASMhYUBiIm +NBMjETNeLiAgLiBiVlYCwCAuICAu/WACEgAC//P/LgCnAsAABwAVAAASMhYUBiImNBcRFAcGIyInN +RY3NjURWS4gIC4gYgMLcRwNSgYCAsAgLiAgLo79wCUbZAJGBzMOHgJEAAAAAQBKAAACCALfAAsAAC +EnBxUjETMREzMHEwGTwTJWVvdu9/rgN6kC3/4oAQv6/ugAAQBG//wA3gLfAA8AABMRFBceATcVBiM +iJicmNRGcAQIcIxkkKi4CAQLf/bkhERoSBD4EJC8SNAJKAAAAAQBKAAADEAIgACQAAAEWFREjETQn +JiMiFREjETQnJiMiFREjETMVNzYzMhYXNzYzMhYDCwVWBAxedFYEDF50VlYiJko7ThAvJkpEVAGfI +jn+vAEcQyRZ1v76ARxDJFnW/voCEk08HzYtRB9HAAAAAAEASgAAAgoCIAAWAAABFhURIxE0JyYjIg +YdASMRMxU3NjMyFgIIAlYCCXBEVVZWITlRVWIBhRtA/tYBJDEbbHR/6QISWz0sVAAAAAACAB7/8gI +sAiAABwARAAASIBYUBiAmNBIyNjU0JiIGFRSlAQCHh/8Ah7ieWlqeWgIgn/Cfn/D+s3ZfYHV1YF8A +AgBK/zwCRQIgABEAHgAAATIWFRQGIyImLwERIxEzFTc2EzI2NTQmIyIGHQEUFgFUcYCVbiNJEyNWV +igySElcU01JXmECIJd4i5QTEDT+8wLWVTkq/hRuZV55ZWsdX14AAgAe/zwCGQIgABEAHgAAAREjEQ +cGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZVigyWnGAlW4jSRMjp0leYUFJXFMCEv0qARk5Kpd +4i5QTEDRJ/iJlax1fXm5lXnkAAQBKAAABPgIeAA0AAAEyFxUmBhURIxEzFTc2ARoWDkdXVlYwIwIe +B0EFVlf+0gISU0cYAAEAGP/yAa0CIAAjAAATMhYXIyYjIgYVFBYXHgEVFAYjIiYnMxYzMjY1NCYnL +gE1NDbkV2MJWhNdKy04PF1XbVhWbgxaE2ktOjlEUllkAiBaS2MrJCUoEBlPQkhOVFZoKCUmLhIWSE +BIUwAAAAEAFP/4ARQCiQAXAAATERQXHgE3FQYjIiYnJjURIzUzNTMVMxWxAQMmMx8qMjMEAUdHVmM +BzP7PGw4mFgY/BSwxDjQBNUJ7e0IAAAABAEL/8gICAhIAFwAAAREjNQcGIyImJyY1ETMRFBceATMy +Nj0BAgJWITlRT2EKBVYEBkA1RFECEv3uWj4qTToiOQE+/tIlJC43c4DpAAAAAAEAAQAAAfwCEgAGA +AABAyMDMxsBAfzJaclfop8CEv3uAhL+LQHTAAABAAEAAAMLAhIADAAAAQMjCwEjAzMbATMbAQMLqW +Z2dmapY3t0a3Z7AhL97gG+/kICEv5AAcD+QwG9AAAB//oAAAHWAhIACwAAARMjJwcjEwMzFzczARq +8ZIuKY763ZoWFYwEO/vLV1QEMAQbNzQAAAQAB/y4B+wISABEAAAEDDgEjIic1FjMyNj8BAzMbAQH7 +2iFZQB8NDRIpNhQH02GenQIS/cFVUAJGASozEwIt/i4B0gABABQAAAGxAg4ACQAAJRUhNQEhNSEVA +QGx/mMBNP7iAYL+zkREQgGIREX+ewAAAAABAED/sAEOAwwALAAAASMiBhUUFxYVFAYHHgEVFAcGFR +QWOwEVIyImNTQ3NjU0JzU2NTQnJjU0NjsBAQ4MKiMLDS4pKS4NCyMqDAtERAwLUlILDERECwLUGBk +WTlsgKzUFBTcrIFtOFhkYOC87GFVMIkUIOAhFIkxVGDsvAAAAAAEAYP84AJoDIAADAAAXIxEzmjo6 +yAPoAAEAIf+wAO8DDAAsAAATFQYVFBcWFRQGKwE1MzI2NTQnJjU0NjcuATU0NzY1NCYrATUzMhYVF +AcGFRTvUgsMREQLDCojCw0uKSkuDQsjKgwLREQMCwF6OAhFIkxVGDsvOBgZFk5bICs1BQU3KyBbTh +YZGDgvOxhVTCJFAAABAE0A3wH2AWQAEwAAATMUIyImJyYjIhUjNDMyFhcWMzIBvjhuGywtQR0xOG4 +bLC1BHTEBZIURGCNMhREYIwAAAwAk/94DIgLoAAcAEQApAAAAIBYQBiAmECQgBhUUFiA2NTQlMhYX +IyYjIgYUFjMyNjczDgEjIiY1NDYBAQFE3d3+vN0CB/7wubkBELn+xVBnD1wSWDo+QTcqOQZcEmZWX +HN2Aujg/rbg4AFKpr+Mjb6+jYxbWEldV5ZZNShLVn5na34AAgB4AFIB9AGeAAUACwAAAQcXIyc3Mw +cXIyc3AUqJiUmJifOJiUmJiQGepqampqampqYAAAIAHAHSAQ4CwAAHAA8AABIyFhQGIiY0NiIGFBY +yNjRgakREakSTNCEhNCECwEJqQkJqCiM4IyM4AAAAAAIAUAAAAfQCCwALAA8AAAEzFSMVIzUjNTM1 +MxMhNSEBP7W1OrW1OrX+XAGkAVs4tLQ4sP31OAAAAQB0AkQBAQKyAAMAABMjNzOsOD1QAkRuAAAAA +AEAIADsAKoBdgAHAAASMhYUBiImNEg6KCg6KAF2KDooKDoAAAIAOQBSAbUBngAFAAsAACUHIzcnMw +UHIzcnMwELiUmJiUkBM4lJiYlJ+KampqampqYAAAABADYB5QDhAt8ABAAAEzczByM2Xk1OXQHv8Po +AAQAWAeUAwQLfAAQAABMHIzczwV5NTl0C1fD6AAIANgHlAYsC3wAEAAkAABM3MwcjPwEzByM2Xk1O +XapeTU5dAe/w+grw+gAAAgAWAeUBawLfAAQACQAAEwcjNzMXByM3M8FeTU5dql5NTl0C1fD6CvD6A +AADACX/8gI1AHIABwAPABcAADYyFhQGIiY0NjIWFAYiJjQ2MhYUBiImNEk4JCQ4JOw4JCQ4JOw4JC +Q4JHIkOCQkOCQkOCQkOCQkOCQkOAAAAAEAeABSAUoBngAFAAABBxcjJzcBSomJSYmJAZ6mpqamAAA +AAAEAOQBSAQsBngAFAAAlByM3JzMBC4lJiYlJ+KampgAAAf9qAAABgQKyAAMAACsBATM/VwHAVwKy +AAAAAAIAFAHIAdwClAAHABQAABMVIxUjNSM1BRUjNwcjJxcjNTMXN9pKMkoByDICKzQqATJLKysCl +CmjoykBy46KiY3Lm5sAAQAVAAABvALyABgAAAERIxEjESMRIzUzNTQ3NjMyFxUmBgcGHQEBvFbCVj +k5AxHHHx5iVgcDAg798gHM/jQBzEIOJRuWBUcIJDAVIRYAAAABABX//AHkAvIAJQAAJR4BNxUGIyI +mJyY1ESYjIgcGHQEzFSMRIxEjNTM1NDc2MzIXERQBowIcIxkkKi4CAR4nXgwDbW1WLy8DEbNdOmYa +EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA +QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA +AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA +BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A +AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA +gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm +lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV +ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy +AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA +HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg +B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk +AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41 +ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA +HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3 +JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB +odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs +AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA +AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB +QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA +xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A +TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A +LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA +AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ +ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG +AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE +AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE +kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ +PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA +AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA +AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA +ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD +/4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA +AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA +BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA +AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ +ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA +gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC +YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA +AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ== +""" + ) + ), + 10 if size is None else size, + layout_engine=Layout.BASIC, + ) + return load_default_imagefont() diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageMode.py b/.venv/lib/python3.11/site-packages/PIL/ImageMode.py new file mode 100644 index 0000000000000000000000000000000000000000..92a08d2cbcb4f8f2f7e24a265b83cd6c1012b41f --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageMode.py @@ -0,0 +1,92 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard mode descriptors +# +# History: +# 2006-03-20 fl Added +# +# Copyright (c) 2006 by Secret Labs AB. +# Copyright (c) 2006 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import sys +from functools import lru_cache +from typing import NamedTuple + +from ._deprecate import deprecate + + +class ModeDescriptor(NamedTuple): + """Wrapper for mode strings.""" + + mode: str + bands: tuple[str, ...] + basemode: str + basetype: str + typestr: str + + def __str__(self) -> str: + return self.mode + + +@lru_cache +def getmode(mode: str) -> ModeDescriptor: + """Gets a mode descriptor for the given mode.""" + endian = "<" if sys.byteorder == "little" else ">" + + modes = { + # core modes + # Bits need to be extended to bytes + "1": ("L", "L", ("1",), "|b1"), + "L": ("L", "L", ("L",), "|u1"), + "I": ("L", "I", ("I",), f"{endian}i4"), + "F": ("L", "F", ("F",), f"{endian}f4"), + "P": ("P", "L", ("P",), "|u1"), + "RGB": ("RGB", "L", ("R", "G", "B"), "|u1"), + "RGBX": ("RGB", "L", ("R", "G", "B", "X"), "|u1"), + "RGBA": ("RGB", "L", ("R", "G", "B", "A"), "|u1"), + "CMYK": ("RGB", "L", ("C", "M", "Y", "K"), "|u1"), + "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr"), "|u1"), + # UNDONE - unsigned |u1i1i1 + "LAB": ("RGB", "L", ("L", "A", "B"), "|u1"), + "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), + # extra experimental modes + "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), + "BGR;15": ("RGB", "L", ("B", "G", "R"), "|u1"), + "BGR;16": ("RGB", "L", ("B", "G", "R"), "|u1"), + "BGR;24": ("RGB", "L", ("B", "G", "R"), "|u1"), + "LA": ("L", "L", ("L", "A"), "|u1"), + "La": ("L", "L", ("L", "a"), "|u1"), + "PA": ("RGB", "L", ("P", "A"), "|u1"), + } + if mode in modes: + if mode in ("BGR;15", "BGR;16", "BGR;24"): + deprecate(mode, 12) + base_mode, base_type, bands, type_str = modes[mode] + return ModeDescriptor(mode, bands, base_mode, base_type, type_str) + + mapping_modes = { + # I;16 == I;16L, and I;32 == I;32L + "I;16": "u2", + "I;16BS": ">i2", + "I;16N": f"{endian}u2", + "I;16NS": f"{endian}i2", + "I;32": "u4", + "I;32L": "i4", + "I;32LS": " None: + """ + The :py:func:`register` function is used to register additional viewers:: + + from PIL import ImageShow + ImageShow.register(MyViewer()) # MyViewer will be used as a last resort + ImageShow.register(MySecondViewer(), 0) # MySecondViewer will be prioritised + ImageShow.register(ImageShow.XVViewer(), 0) # XVViewer will be prioritised + + :param viewer: The viewer to be registered. + :param order: + Zero or a negative integer to prepend this viewer to the list, + a positive integer to append it. + """ + try: + if issubclass(viewer, Viewer): + viewer = viewer() + except TypeError: + pass # raised if viewer wasn't a class + if order > 0: + _viewers.append(viewer) + else: + _viewers.insert(0, viewer) + + +def show(image: Image.Image, title: str | None = None, **options: Any) -> bool: + r""" + Display a given image. + + :param image: An image object. + :param title: Optional title. Not all viewers can display the title. + :param \**options: Additional viewer options. + :returns: ``True`` if a suitable viewer was found, ``False`` otherwise. + """ + for viewer in _viewers: + if viewer.show(image, title=title, **options): + return True + return False + + +class Viewer: + """Base class for viewers.""" + + # main api + + def show(self, image: Image.Image, **options: Any) -> int: + """ + The main function for displaying an image. + Converts the given image to the target format and displays it. + """ + + if not ( + image.mode in ("1", "RGBA") + or (self.format == "PNG" and image.mode in ("I;16", "LA")) + ): + base = Image.getmodebase(image.mode) + if image.mode != base: + image = image.convert(base) + + return self.show_image(image, **options) + + # hook methods + + format: str | None = None + """The format to convert the image into.""" + options: dict[str, Any] = {} + """Additional options used to convert the image.""" + + def get_format(self, image: Image.Image) -> str | None: + """Return format name, or ``None`` to save as PGM/PPM.""" + return self.format + + def get_command(self, file: str, **options: Any) -> str: + """ + Returns the command used to display the file. + Not implemented in the base class. + """ + msg = "unavailable in base viewer" + raise NotImplementedError(msg) + + def save_image(self, image: Image.Image) -> str: + """Save to temporary file and return filename.""" + return image._dump(format=self.get_format(image), **self.options) + + def show_image(self, image: Image.Image, **options: Any) -> int: + """Display the given image.""" + return self.show_file(self.save_image(image), **options) + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + os.system(self.get_command(path, **options)) # nosec + return 1 + + +# -------------------------------------------------------------------- + + +class WindowsViewer(Viewer): + """The default viewer on Windows is the default system application for PNG files.""" + + format = "PNG" + options = {"compress_level": 1, "save_all": True} + + def get_command(self, file: str, **options: Any) -> str: + return ( + f'start "Pillow" /WAIT "{file}" ' + "&& ping -n 4 127.0.0.1 >NUL " + f'&& del /f "{file}"' + ) + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen( + self.get_command(path, **options), + shell=True, + creationflags=getattr(subprocess, "CREATE_NO_WINDOW"), + ) # nosec + return 1 + + +if sys.platform == "win32": + register(WindowsViewer) + + +class MacViewer(Viewer): + """The default viewer on macOS using ``Preview.app``.""" + + format = "PNG" + options = {"compress_level": 1, "save_all": True} + + def get_command(self, file: str, **options: Any) -> str: + # on darwin open returns immediately resulting in the temp + # file removal while app is opening + command = "open -a Preview.app" + command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&" + return command + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.call(["open", "-a", "Preview.app", path]) + executable = sys.executable or shutil.which("python3") + if executable: + subprocess.Popen( + [ + executable, + "-c", + "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])", + path, + ] + ) + return 1 + + +if sys.platform == "darwin": + register(MacViewer) + + +class UnixViewer(Viewer): + format = "PNG" + options = {"compress_level": 1, "save_all": True} + + @abc.abstractmethod + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + pass + + def get_command(self, file: str, **options: Any) -> str: + command = self.get_command_ex(file, **options)[0] + return f"{command} {quote(file)}" + + +class XDGViewer(UnixViewer): + """ + The freedesktop.org ``xdg-open`` command. + """ + + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + command = executable = "xdg-open" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen(["xdg-open", path]) + return 1 + + +class DisplayViewer(UnixViewer): + """ + The ImageMagick ``display`` command. + This viewer supports the ``title`` parameter. + """ + + def get_command_ex( + self, file: str, title: str | None = None, **options: Any + ) -> tuple[str, str]: + command = executable = "display" + if title: + command += f" -title {quote(title)}" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + args = ["display"] + title = options.get("title") + if title: + args += ["-title", title] + args.append(path) + + subprocess.Popen(args) + return 1 + + +class GmDisplayViewer(UnixViewer): + """The GraphicsMagick ``gm display`` command.""" + + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + executable = "gm" + command = "gm display" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen(["gm", "display", path]) + return 1 + + +class EogViewer(UnixViewer): + """The GNOME Image Viewer ``eog`` command.""" + + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + executable = "eog" + command = "eog -n" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen(["eog", "-n", path]) + return 1 + + +class XVViewer(UnixViewer): + """ + The X Viewer ``xv`` command. + This viewer supports the ``title`` parameter. + """ + + def get_command_ex( + self, file: str, title: str | None = None, **options: Any + ) -> tuple[str, str]: + # note: xv is pretty outdated. most modern systems have + # imagemagick's display command instead. + command = executable = "xv" + if title: + command += f" -name {quote(title)}" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + args = ["xv"] + title = options.get("title") + if title: + args += ["-name", title] + args.append(path) + + subprocess.Popen(args) + return 1 + + +if sys.platform not in ("win32", "darwin"): # unixoids + if shutil.which("xdg-open"): + register(XDGViewer) + if shutil.which("display"): + register(DisplayViewer) + if shutil.which("gm"): + register(GmDisplayViewer) + if shutil.which("eog"): + register(EogViewer) + if shutil.which("xv"): + register(XVViewer) + + +class IPythonViewer(Viewer): + """The viewer for IPython frontends.""" + + def show_image(self, image: Image.Image, **options: Any) -> int: + ipython_display(image) + return 1 + + +try: + from IPython.display import display as ipython_display +except ImportError: + pass +else: + register(IPythonViewer) + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Syntax: python3 ImageShow.py imagefile [title]") + sys.exit() + + with Image.open(sys.argv[1]) as im: + print(show(im, *sys.argv[2:])) diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageStat.py b/.venv/lib/python3.11/site-packages/PIL/ImageStat.py new file mode 100644 index 0000000000000000000000000000000000000000..8bc504526f0a00cde1229798234d4f0c5db95138 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageStat.py @@ -0,0 +1,160 @@ +# +# The Python Imaging Library. +# $Id$ +# +# global image statistics +# +# History: +# 1996-04-05 fl Created +# 1997-05-21 fl Added mask; added rms, var, stddev attributes +# 1997-08-05 fl Added median +# 1998-07-05 hk Fixed integer overflow error +# +# Notes: +# This class shows how to implement delayed evaluation of attributes. +# To get a certain value, simply access the corresponding attribute. +# The __getattr__ dispatcher takes care of the rest. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996-97. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import math +from functools import cached_property + +from . import Image + + +class Stat: + def __init__( + self, image_or_list: Image.Image | list[int], mask: Image.Image | None = None + ) -> None: + """ + Calculate statistics for the given image. If a mask is included, + only the regions covered by that mask are included in the + statistics. You can also pass in a previously calculated histogram. + + :param image: A PIL image, or a precalculated histogram. + + .. note:: + + For a PIL image, calculations rely on the + :py:meth:`~PIL.Image.Image.histogram` method. The pixel counts are + grouped into 256 bins, even if the image has more than 8 bits per + channel. So ``I`` and ``F`` mode images have a maximum ``mean``, + ``median`` and ``rms`` of 255, and cannot have an ``extrema`` maximum + of more than 255. + + :param mask: An optional mask. + """ + if isinstance(image_or_list, Image.Image): + self.h = image_or_list.histogram(mask) + elif isinstance(image_or_list, list): + self.h = image_or_list + else: + msg = "first argument must be image or list" # type: ignore[unreachable] + raise TypeError(msg) + self.bands = list(range(len(self.h) // 256)) + + @cached_property + def extrema(self) -> list[tuple[int, int]]: + """ + Min/max values for each band in the image. + + .. note:: + This relies on the :py:meth:`~PIL.Image.Image.histogram` method, and + simply returns the low and high bins used. This is correct for + images with 8 bits per channel, but fails for other modes such as + ``I`` or ``F``. Instead, use :py:meth:`~PIL.Image.Image.getextrema` to + return per-band extrema for the image. This is more correct and + efficient because, for non-8-bit modes, the histogram method uses + :py:meth:`~PIL.Image.Image.getextrema` to determine the bins used. + """ + + def minmax(histogram: list[int]) -> tuple[int, int]: + res_min, res_max = 255, 0 + for i in range(256): + if histogram[i]: + res_min = i + break + for i in range(255, -1, -1): + if histogram[i]: + res_max = i + break + return res_min, res_max + + return [minmax(self.h[i:]) for i in range(0, len(self.h), 256)] + + @cached_property + def count(self) -> list[int]: + """Total number of pixels for each band in the image.""" + return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)] + + @cached_property + def sum(self) -> list[float]: + """Sum of all pixels for each band in the image.""" + + v = [] + for i in range(0, len(self.h), 256): + layer_sum = 0.0 + for j in range(256): + layer_sum += j * self.h[i + j] + v.append(layer_sum) + return v + + @cached_property + def sum2(self) -> list[float]: + """Squared sum of all pixels for each band in the image.""" + + v = [] + for i in range(0, len(self.h), 256): + sum2 = 0.0 + for j in range(256): + sum2 += (j**2) * float(self.h[i + j]) + v.append(sum2) + return v + + @cached_property + def mean(self) -> list[float]: + """Average (arithmetic mean) pixel level for each band in the image.""" + return [self.sum[i] / self.count[i] for i in self.bands] + + @cached_property + def median(self) -> list[int]: + """Median pixel level for each band in the image.""" + + v = [] + for i in self.bands: + s = 0 + half = self.count[i] // 2 + b = i * 256 + for j in range(256): + s = s + self.h[b + j] + if s > half: + break + v.append(j) + return v + + @cached_property + def rms(self) -> list[float]: + """RMS (root-mean-square) for each band in the image.""" + return [math.sqrt(self.sum2[i] / self.count[i]) for i in self.bands] + + @cached_property + def var(self) -> list[float]: + """Variance for each band in the image.""" + return [ + (self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i] + for i in self.bands + ] + + @cached_property + def stddev(self) -> list[float]: + """Standard deviation for each band in the image.""" + return [math.sqrt(self.var[i]) for i in self.bands] + + +Global = Stat # compatibility diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageTk.py b/.venv/lib/python3.11/site-packages/PIL/ImageTk.py new file mode 100644 index 0000000000000000000000000000000000000000..90defdbbc23777dfba5b58c70374fe162a2a7cb9 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageTk.py @@ -0,0 +1,284 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Tk display interface +# +# History: +# 96-04-08 fl Created +# 96-09-06 fl Added getimage method +# 96-11-01 fl Rewritten, removed image attribute and crop method +# 97-05-09 fl Use PyImagingPaste method instead of image type +# 97-05-12 fl Minor tweaks to match the IFUNC95 interface +# 97-05-17 fl Support the "pilbitmap" booster patch +# 97-06-05 fl Added file= and data= argument to image constructors +# 98-03-09 fl Added width and height methods to Image classes +# 98-07-02 fl Use default mode for "P" images without palette attribute +# 98-07-02 fl Explicitly destroy Tkinter image objects +# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) +# 99-07-26 fl Automatically hook into Tkinter (if possible) +# 99-08-15 fl Hook uses _imagingtk instead of _imaging +# +# Copyright (c) 1997-1999 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import tkinter +from io import BytesIO + +from . import Image + +# -------------------------------------------------------------------- +# Check for Tkinter interface hooks + +_pilbitmap_ok = None + + +def _pilbitmap_check() -> int: + global _pilbitmap_ok + if _pilbitmap_ok is None: + try: + im = Image.new("1", (1, 1)) + tkinter.BitmapImage(data=f"PIL:{im.im.id}") + _pilbitmap_ok = 1 + except tkinter.TclError: + _pilbitmap_ok = 0 + return _pilbitmap_ok + + +def _get_image_from_kw(kw): + source = None + if "file" in kw: + source = kw.pop("file") + elif "data" in kw: + source = BytesIO(kw.pop("data")) + if source: + return Image.open(source) + + +def _pyimagingtkcall(command, photo, id): + tk = photo.tk + try: + tk.call(command, photo, id) + except tkinter.TclError: + # activate Tkinter hook + # may raise an error if it cannot attach to Tkinter + from . import _imagingtk + + _imagingtk.tkinit(tk.interpaddr()) + tk.call(command, photo, id) + + +# -------------------------------------------------------------------- +# PhotoImage + + +class PhotoImage: + """ + A Tkinter-compatible photo image. This can be used + everywhere Tkinter expects an image object. If the image is an RGBA + image, pixels having alpha 0 are treated as transparent. + + The constructor takes either a PIL image, or a mode and a size. + Alternatively, you can use the ``file`` or ``data`` options to initialize + the photo image object. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. + :param size: If the first argument is a mode string, this defines the size + of the image. + :keyword file: A filename to load the image from (using + ``Image.open(file)``). + :keyword data: An 8-bit string containing image data (as loaded from an + image file). + """ + + def __init__(self, image=None, size=None, **kw): + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + if hasattr(image, "mode") and hasattr(image, "size"): + # got an image instead of a mode + mode = image.mode + if mode == "P": + # palette mapped data + image.apply_transparency() + image.load() + try: + mode = image.palette.mode + except AttributeError: + mode = "RGB" # default + size = image.size + kw["width"], kw["height"] = size + else: + mode = image + image = None + + if mode not in ["1", "L", "RGB", "RGBA"]: + mode = Image.getmodebase(mode) + + self.__mode = mode + self.__size = size + self.__photo = tkinter.PhotoImage(**kw) + self.tk = self.__photo.tk + if image: + self.paste(image) + + def __del__(self) -> None: + name = self.__photo.name + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except Exception: + pass # ignore internal errors + + def __str__(self) -> str: + """ + Get the Tkinter photo image identifier. This method is automatically + called by Tkinter whenever a PhotoImage object is passed to a Tkinter + method. + + :return: A Tkinter photo image identifier (a string). + """ + return str(self.__photo) + + def width(self) -> int: + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self) -> int: + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def paste(self, im: Image.Image) -> None: + """ + Paste a PIL image into the photo image. Note that this can + be very slow if the photo image is displayed. + + :param im: A PIL image. The size must match the target region. If the + mode does not match, the image is converted to the mode of + the bitmap image. + """ + # convert to blittable + im.load() + image = im.im + if image.isblock() and im.mode == self.__mode: + block = image + else: + block = image.new_block(self.__mode, im.size) + image.convert2(block, image) # convert directly between buffers + + _pyimagingtkcall("PyImagingPhoto", self.__photo, block.id) + + +# -------------------------------------------------------------------- +# BitmapImage + + +class BitmapImage: + """ + A Tkinter-compatible bitmap image. This can be used everywhere Tkinter + expects an image object. + + The given image must have mode "1". Pixels having value 0 are treated as + transparent. Options, if any, are passed on to Tkinter. The most commonly + used option is ``foreground``, which is used to specify the color for the + non-transparent parts. See the Tkinter documentation for information on + how to specify colours. + + :param image: A PIL image. + """ + + def __init__(self, image=None, **kw): + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + self.__mode = image.mode + self.__size = image.size + + if _pilbitmap_check(): + # fast way (requires the pilbitmap booster patch) + image.load() + kw["data"] = f"PIL:{image.im.id}" + self.__im = image # must keep a reference + else: + # slow but safe way + kw["data"] = image.tobitmap() + self.__photo = tkinter.BitmapImage(**kw) + + def __del__(self) -> None: + name = self.__photo.name + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except Exception: + pass # ignore internal errors + + def width(self) -> int: + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self) -> int: + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def __str__(self) -> str: + """ + Get the Tkinter bitmap image identifier. This method is automatically + called by Tkinter whenever a BitmapImage object is passed to a Tkinter + method. + + :return: A Tkinter bitmap image identifier (a string). + """ + return str(self.__photo) + + +def getimage(photo: PhotoImage) -> Image.Image: + """Copies the contents of a PhotoImage to a PIL image memory.""" + im = Image.new("RGBA", (photo.width(), photo.height())) + block = im.im + + _pyimagingtkcall("PyImagingPhotoGet", photo, block.id) + + return im + + +def _show(image, title): + """Helper for the Image.show method.""" + + class UI(tkinter.Label): + def __init__(self, master, im): + if im.mode == "1": + self.image = BitmapImage(im, foreground="white", master=master) + else: + self.image = PhotoImage(im, master=master) + super().__init__(master, image=self.image, bg="black", bd=0) + + if not tkinter._default_root: + msg = "tkinter not initialized" + raise OSError(msg) + top = tkinter.Toplevel() + if title: + top.title(title) + UI(top, image).pack() diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageTransform.py b/.venv/lib/python3.11/site-packages/PIL/ImageTransform.py new file mode 100644 index 0000000000000000000000000000000000000000..ffd7916745c2d8e1b0bbfb41b68eb3b1b591c801 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageTransform.py @@ -0,0 +1,135 @@ +# +# The Python Imaging Library. +# $Id$ +# +# transform wrappers +# +# History: +# 2002-04-08 fl Created +# +# Copyright (c) 2002 by Secret Labs AB +# Copyright (c) 2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from typing import Any, Sequence + +from . import Image + + +class Transform(Image.ImageTransformHandler): + """Base class for other transforms defined in :py:mod:`~PIL.ImageTransform`.""" + + method: Image.Transform + + def __init__(self, data: Sequence[Any]) -> None: + self.data = data + + def getdata(self) -> tuple[Image.Transform, Sequence[int]]: + return self.method, self.data + + def transform( + self, + size: tuple[int, int], + image: Image.Image, + **options: Any, + ) -> Image.Image: + """Perform the transform. Called from :py:meth:`.Image.transform`.""" + # can be overridden + method, data = self.getdata() + return image.transform(size, method, data, **options) + + +class AffineTransform(Transform): + """ + Define an affine image transform. + + This function takes a 6-tuple (a, b, c, d, e, f) which contain the first + two rows from an affine transform matrix. For each pixel (x, y) in the + output image, the new value is taken from a position (a x + b y + c, + d x + e y + f) in the input image, rounded to nearest pixel. + + This function can be used to scale, translate, rotate, and shear the + original image. + + See :py:meth:`.Image.transform` + + :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows + from an affine transform matrix. + """ + + method = Image.Transform.AFFINE + + +class PerspectiveTransform(Transform): + """ + Define a perspective image transform. + + This function takes an 8-tuple (a, b, c, d, e, f, g, h). For each pixel + (x, y) in the output image, the new value is taken from a position + ((a x + b y + c) / (g x + h y + 1), (d x + e y + f) / (g x + h y + 1)) in + the input image, rounded to nearest pixel. + + This function can be used to scale, translate, rotate, and shear the + original image. + + See :py:meth:`.Image.transform` + + :param matrix: An 8-tuple (a, b, c, d, e, f, g, h). + """ + + method = Image.Transform.PERSPECTIVE + + +class ExtentTransform(Transform): + """ + Define a transform to extract a subregion from an image. + + Maps a rectangle (defined by two corners) from the image to a rectangle of + the given size. The resulting image will contain data sampled from between + the corners, such that (x0, y0) in the input image will end up at (0,0) in + the output image, and (x1, y1) at size. + + This method can be used to crop, stretch, shrink, or mirror an arbitrary + rectangle in the current image. It is slightly slower than crop, but about + as fast as a corresponding resize operation. + + See :py:meth:`.Image.transform` + + :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the + input image's coordinate system. See :ref:`coordinate-system`. + """ + + method = Image.Transform.EXTENT + + +class QuadTransform(Transform): + """ + Define a quad image transform. + + Maps a quadrilateral (a region defined by four corners) from the image to a + rectangle of the given size. + + See :py:meth:`.Image.transform` + + :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the + upper left, lower left, lower right, and upper right corner of the + source quadrilateral. + """ + + method = Image.Transform.QUAD + + +class MeshTransform(Transform): + """ + Define a mesh image transform. A mesh transform consists of one or more + individual quad transforms. + + See :py:meth:`.Image.transform` + + :param data: A list of (bbox, quad) tuples. + """ + + method = Image.Transform.MESH diff --git a/.venv/lib/python3.11/site-packages/PIL/ImageWin.py b/.venv/lib/python3.11/site-packages/PIL/ImageWin.py new file mode 100644 index 0000000000000000000000000000000000000000..978c5a9d176c55e7f2f4be7848c1ade2c0e12c44 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImageWin.py @@ -0,0 +1,238 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Windows DIB display interface +# +# History: +# 1996-05-20 fl Created +# 1996-09-20 fl Fixed subregion exposure +# 1997-09-21 fl Added draw primitive (for tzPrint) +# 2003-05-21 fl Added experimental Window/ImageWindow classes +# 2003-09-05 fl Added fromstring/tostring methods +# +# Copyright (c) Secret Labs AB 1997-2003. +# Copyright (c) Fredrik Lundh 1996-2003. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image + + +class HDC: + """ + Wraps an HDC integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods. + """ + + def __init__(self, dc: int) -> None: + self.dc = dc + + def __int__(self) -> int: + return self.dc + + +class HWND: + """ + Wraps an HWND integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods, instead of a DC. + """ + + def __init__(self, wnd: int) -> None: + self.wnd = wnd + + def __int__(self) -> int: + return self.wnd + + +class Dib: + """ + A Windows bitmap with the given mode and size. The mode can be one of "1", + "L", "P", or "RGB". + + If the display requires a palette, this constructor creates a suitable + palette and associates it with the image. For an "L" image, 128 graylevels + are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together + with 20 graylevels. + + To make sure that palettes work properly under Windows, you must call the + ``palette`` method upon certain events from Windows. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. The mode can be one of "1", + "L", "P", or "RGB". + :param size: If the first argument is a mode string, this + defines the size of the image. + """ + + def __init__( + self, image: Image.Image | str, size: tuple[int, int] | list[int] | None = None + ) -> None: + if isinstance(image, str): + mode = image + image = "" + else: + mode = image.mode + size = image.size + if mode not in ["1", "L", "P", "RGB"]: + mode = Image.getmodebase(mode) + self.image = Image.core.display(mode, size) + self.mode = mode + self.size = size + if image: + assert not isinstance(image, str) + self.paste(image) + + def expose(self, handle): + """ + Copy the bitmap contents to a device context. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. In PythonWin, you can use + ``CDC.GetHandleAttrib()`` to get a suitable handle. + """ + if isinstance(handle, HWND): + dc = self.image.getdc(handle) + try: + result = self.image.expose(dc) + finally: + self.image.releasedc(handle, dc) + else: + result = self.image.expose(handle) + return result + + def draw(self, handle, dst, src=None): + """ + Same as expose, but allows you to specify where to draw the image, and + what part of it to draw. + + The destination and source areas are given as 4-tuple rectangles. If + the source is omitted, the entire image is copied. If the source and + the destination have different sizes, the image is resized as + necessary. + """ + if not src: + src = (0, 0) + self.size + if isinstance(handle, HWND): + dc = self.image.getdc(handle) + try: + result = self.image.draw(dc, dst, src) + finally: + self.image.releasedc(handle, dc) + else: + result = self.image.draw(handle, dst, src) + return result + + def query_palette(self, handle): + """ + Installs the palette associated with the image in the given device + context. + + This method should be called upon **QUERYNEWPALETTE** and + **PALETTECHANGED** events from Windows. If this method returns a + non-zero value, one or more display palette entries were changed, and + the image should be redrawn. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. + :return: A true value if one or more entries were changed (this + indicates that the image should be redrawn). + """ + if isinstance(handle, HWND): + handle = self.image.getdc(handle) + try: + result = self.image.query_palette(handle) + finally: + self.image.releasedc(handle, handle) + else: + result = self.image.query_palette(handle) + return result + + def paste( + self, im: Image.Image, box: tuple[int, int, int, int] | None = None + ) -> None: + """ + Paste a PIL image into the bitmap image. + + :param im: A PIL image. The size must match the target region. + If the mode does not match, the image is converted to the + mode of the bitmap image. + :param box: A 4-tuple defining the left, upper, right, and + lower pixel coordinate. See :ref:`coordinate-system`. If + None is given instead of a tuple, all of the image is + assumed. + """ + im.load() + if self.mode != im.mode: + im = im.convert(self.mode) + if box: + self.image.paste(im.im, box) + else: + self.image.paste(im.im) + + def frombytes(self, buffer: bytes) -> None: + """ + Load display memory contents from byte data. + + :param buffer: A buffer containing display data (usually + data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) + """ + self.image.frombytes(buffer) + + def tobytes(self) -> bytes: + """ + Copy display memory contents to bytes object. + + :return: A bytes object containing display data. + """ + return self.image.tobytes() + + +class Window: + """Create a Window with the given title size.""" + + def __init__( + self, title: str = "PIL", width: int | None = None, height: int | None = None + ) -> None: + self.hwnd = Image.core.createwindow( + title, self.__dispatcher, width or 0, height or 0 + ) + + def __dispatcher(self, action, *args): + return getattr(self, f"ui_handle_{action}")(*args) + + def ui_handle_clear(self, dc, x0, y0, x1, y1): + pass + + def ui_handle_damage(self, x0, y0, x1, y1): + pass + + def ui_handle_destroy(self) -> None: + pass + + def ui_handle_repair(self, dc, x0, y0, x1, y1): + pass + + def ui_handle_resize(self, width, height): + pass + + def mainloop(self) -> None: + Image.core.eventloop() + + +class ImageWindow(Window): + """Create an image window which displays the given image.""" + + def __init__(self, image, title="PIL"): + if not isinstance(image, Dib): + image = Dib(image) + self.image = image + width, height = image.size + super().__init__(title, width=width, height=height) + + def ui_handle_repair(self, dc, x0, y0, x1, y1): + self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/.venv/lib/python3.11/site-packages/PIL/ImtImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/ImtImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..abb3fb762e7cd9eb849bb36fc887217c42ebd01a --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/ImtImagePlugin.py @@ -0,0 +1,103 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IM Tools support for PIL +# +# history: +# 1996-05-27 fl Created (read 8-bit images only) +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re + +from . import Image, ImageFile + +# +# -------------------------------------------------------------------- + +field = re.compile(rb"([a-z]*) ([^ \r\n]*)") + + +## +# Image plugin for IM Tools images. + + +class ImtImageFile(ImageFile.ImageFile): + format = "IMT" + format_description = "IM Tools" + + def _open(self) -> None: + # Quick rejection: if there's not a LF among the first + # 100 bytes, this is (probably) not a text header. + + assert self.fp is not None + + buffer = self.fp.read(100) + if b"\n" not in buffer: + msg = "not an IM file" + raise SyntaxError(msg) + + xsize = ysize = 0 + + while True: + if buffer: + s = buffer[:1] + buffer = buffer[1:] + else: + s = self.fp.read(1) + if not s: + break + + if s == b"\x0C": + # image data begins + self.tile = [ + ( + "raw", + (0, 0) + self.size, + self.fp.tell() - len(buffer), + (self.mode, 0, 1), + ) + ] + + break + + else: + # read key/value pair + if b"\n" not in buffer: + buffer += self.fp.read(100) + lines = buffer.split(b"\n") + s += lines.pop(0) + buffer = b"\n".join(lines) + if len(s) == 1 or len(s) > 100: + break + if s[0] == ord(b"*"): + continue # comment + + m = field.match(s) + if not m: + break + k, v = m.group(1, 2) + if k == b"width": + xsize = int(v) + self._size = xsize, ysize + elif k == b"height": + ysize = int(v) + self._size = xsize, ysize + elif k == b"pixel" and v == b"n8": + self._mode = "L" + + +# +# -------------------------------------------------------------------- + +Image.register_open(ImtImageFile.format, ImtImageFile) + +# +# no extension registered (".im" is simply too common) diff --git a/.venv/lib/python3.11/site-packages/PIL/Jpeg2KImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/Jpeg2KImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..e50cd7799a390bc7cfd7b9be188f91d92e8e3fd8 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/Jpeg2KImagePlugin.py @@ -0,0 +1,408 @@ +# +# The Python Imaging Library +# $Id$ +# +# JPEG2000 file handling +# +# History: +# 2014-03-12 ajh Created +# 2021-06-30 rogermb Extract dpi information from the 'resc' header box +# +# Copyright (c) 2014 Coriolis Systems Limited +# Copyright (c) 2014 Alastair Houghton +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import struct +from typing import IO, Tuple, cast + +from . import Image, ImageFile, ImagePalette, _binary + + +class BoxReader: + """ + A small helper class to read fields stored in JPEG2000 header boxes + and to easily step into and read sub-boxes. + """ + + def __init__(self, fp, length=-1): + self.fp = fp + self.has_length = length >= 0 + self.length = length + self.remaining_in_box = -1 + + def _can_read(self, num_bytes: int) -> bool: + if self.has_length and self.fp.tell() + num_bytes > self.length: + # Outside box: ensure we don't read past the known file length + return False + if self.remaining_in_box >= 0: + # Inside box contents: ensure read does not go past box boundaries + return num_bytes <= self.remaining_in_box + else: + return True # No length known, just read + + def _read_bytes(self, num_bytes: int) -> bytes: + if not self._can_read(num_bytes): + msg = "Not enough data in header" + raise SyntaxError(msg) + + data = self.fp.read(num_bytes) + if len(data) < num_bytes: + msg = f"Expected to read {num_bytes} bytes but only got {len(data)}." + raise OSError(msg) + + if self.remaining_in_box > 0: + self.remaining_in_box -= num_bytes + return data + + def read_fields(self, field_format: str) -> tuple[int | bytes, ...]: + size = struct.calcsize(field_format) + data = self._read_bytes(size) + return struct.unpack(field_format, data) + + def read_boxes(self) -> BoxReader: + size = self.remaining_in_box + data = self._read_bytes(size) + return BoxReader(io.BytesIO(data), size) + + def has_next_box(self) -> bool: + if self.has_length: + return self.fp.tell() + self.remaining_in_box < self.length + else: + return True + + def next_box_type(self) -> bytes: + # Skip the rest of the box if it has not been read + if self.remaining_in_box > 0: + self.fp.seek(self.remaining_in_box, os.SEEK_CUR) + self.remaining_in_box = -1 + + # Read the length and type of the next box + lbox, tbox = cast(Tuple[int, bytes], self.read_fields(">I4s")) + if lbox == 1: + lbox = cast(int, self.read_fields(">Q")[0]) + hlen = 16 + else: + hlen = 8 + + if lbox < hlen or not self._can_read(lbox - hlen): + msg = "Invalid header length" + raise SyntaxError(msg) + + self.remaining_in_box = lbox - hlen + return tbox + + +def _parse_codestream(fp) -> tuple[tuple[int, int], str]: + """Parse the JPEG 2000 codestream to extract the size and component + count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" + + hdr = fp.read(2) + lsiz = _binary.i16be(hdr) + siz = hdr + fp.read(lsiz - 2) + lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( + ">HHIIIIIIIIH", siz + ) + + size = (xsiz - xosiz, ysiz - yosiz) + if csiz == 1: + ssiz = struct.unpack_from(">B", siz, 38) + if (ssiz[0] & 0x7F) + 1 > 8: + mode = "I;16" + else: + mode = "L" + elif csiz == 2: + mode = "LA" + elif csiz == 3: + mode = "RGB" + elif csiz == 4: + mode = "RGBA" + else: + msg = "unable to determine J2K image mode" + raise SyntaxError(msg) + + return size, mode + + +def _res_to_dpi(num: int, denom: int, exp: int) -> float | None: + """Convert JPEG2000's (numerator, denominator, exponent-base-10) resolution, + calculated as (num / denom) * 10^exp and stored in dots per meter, + to floating-point dots per inch.""" + if denom == 0: + return None + return (254 * num * (10**exp)) / (10000 * denom) + + +def _parse_jp2_header(fp): + """Parse the JP2 header box to extract size, component count, + color space information, and optionally DPI information, + returning a (size, mode, mimetype, dpi) tuple.""" + + # Find the JP2 header box + reader = BoxReader(fp) + header = None + mimetype = None + while reader.has_next_box(): + tbox = reader.next_box_type() + + if tbox == b"jp2h": + header = reader.read_boxes() + break + elif tbox == b"ftyp": + if reader.read_fields(">4s")[0] == b"jpx ": + mimetype = "image/jpx" + + size = None + mode = None + bpc = None + nc = None + dpi = None # 2-tuple of DPI info, or None + palette = None + + while header.has_next_box(): + tbox = header.next_box_type() + + if tbox == b"ihdr": + height, width, nc, bpc = header.read_fields(">IIHB") + size = (width, height) + if nc == 1 and (bpc & 0x7F) > 8: + mode = "I;16" + elif nc == 1: + mode = "L" + elif nc == 2: + mode = "LA" + elif nc == 3: + mode = "RGB" + elif nc == 4: + mode = "RGBA" + elif tbox == b"colr" and nc == 4: + meth, _, _, enumcs = header.read_fields(">BBBI") + if meth == 1 and enumcs == 12: + mode = "CMYK" + elif tbox == b"pclr" and mode in ("L", "LA"): + ne, npc = header.read_fields(">HB") + bitdepths = header.read_fields(">" + ("B" * npc)) + if max(bitdepths) <= 8: + palette = ImagePalette.ImagePalette() + for i in range(ne): + palette.getcolor(header.read_fields(">" + ("B" * npc))) + mode = "P" if mode == "L" else "PA" + elif tbox == b"res ": + res = header.read_boxes() + while res.has_next_box(): + tres = res.next_box_type() + if tres == b"resc": + vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB") + hres = _res_to_dpi(hrcn, hrcd, hrce) + vres = _res_to_dpi(vrcn, vrcd, vrce) + if hres is not None and vres is not None: + dpi = (hres, vres) + break + + if size is None or mode is None: + msg = "Malformed JP2 header" + raise SyntaxError(msg) + + return size, mode, mimetype, dpi, palette + + +## +# Image plugin for JPEG2000 images. + + +class Jpeg2KImageFile(ImageFile.ImageFile): + format = "JPEG2000" + format_description = "JPEG 2000 (ISO 15444)" + + def _open(self) -> None: + sig = self.fp.read(4) + if sig == b"\xff\x4f\xff\x51": + self.codec = "j2k" + self._size, self._mode = _parse_codestream(self.fp) + else: + sig = sig + self.fp.read(8) + + if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a": + self.codec = "jp2" + header = _parse_jp2_header(self.fp) + self._size, self._mode, self.custom_mimetype, dpi, self.palette = header + if dpi is not None: + self.info["dpi"] = dpi + if self.fp.read(12).endswith(b"jp2c\xff\x4f\xff\x51"): + self._parse_comment() + else: + msg = "not a JPEG 2000 file" + raise SyntaxError(msg) + + self._reduce = 0 + self.layers = 0 + + fd = -1 + length = -1 + + try: + fd = self.fp.fileno() + length = os.fstat(fd).st_size + except Exception: + fd = -1 + try: + pos = self.fp.tell() + self.fp.seek(0, io.SEEK_END) + length = self.fp.tell() + self.fp.seek(pos) + except Exception: + length = -1 + + self.tile = [ + ( + "jpeg2k", + (0, 0) + self.size, + 0, + (self.codec, self._reduce, self.layers, fd, length), + ) + ] + + def _parse_comment(self) -> None: + hdr = self.fp.read(2) + length = _binary.i16be(hdr) + self.fp.seek(length - 2, os.SEEK_CUR) + + while True: + marker = self.fp.read(2) + if not marker: + break + typ = marker[1] + if typ in (0x90, 0xD9): + # Start of tile or end of codestream + break + hdr = self.fp.read(2) + length = _binary.i16be(hdr) + if typ == 0x64: + # Comment + self.info["comment"] = self.fp.read(length - 2)[2:] + break + else: + self.fp.seek(length - 2, os.SEEK_CUR) + + @property + def reduce(self): + # https://github.com/python-pillow/Pillow/issues/4343 found that the + # new Image 'reduce' method was shadowed by this plugin's 'reduce' + # property. This attempts to allow for both scenarios + return self._reduce or super().reduce + + @reduce.setter + def reduce(self, value): + self._reduce = value + + def load(self): + if self.tile and self._reduce: + power = 1 << self._reduce + adjust = power >> 1 + self._size = ( + int((self.size[0] + adjust) / power), + int((self.size[1] + adjust) / power), + ) + + # Update the reduce and layers settings + t = self.tile[0] + t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4]) + self.tile = [(t[0], (0, 0) + self.size, t[2], t3)] + + return ImageFile.ImageFile.load(self) + + +def _accept(prefix: bytes) -> bool: + return ( + prefix[:4] == b"\xff\x4f\xff\x51" + or prefix[:12] == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" + ) + + +# ------------------------------------------------------------ +# Save support + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + # Get the keyword arguments + info = im.encoderinfo + + if isinstance(filename, str): + filename = filename.encode() + if filename.endswith(b".j2k") or info.get("no_jp2", False): + kind = "j2k" + else: + kind = "jp2" + + offset = info.get("offset", None) + tile_offset = info.get("tile_offset", None) + tile_size = info.get("tile_size", None) + quality_mode = info.get("quality_mode", "rates") + quality_layers = info.get("quality_layers", None) + if quality_layers is not None and not ( + isinstance(quality_layers, (list, tuple)) + and all( + isinstance(quality_layer, (int, float)) for quality_layer in quality_layers + ) + ): + msg = "quality_layers must be a sequence of numbers" + raise ValueError(msg) + + num_resolutions = info.get("num_resolutions", 0) + cblk_size = info.get("codeblock_size", None) + precinct_size = info.get("precinct_size", None) + irreversible = info.get("irreversible", False) + progression = info.get("progression", "LRCP") + cinema_mode = info.get("cinema_mode", "no") + mct = info.get("mct", 0) + signed = info.get("signed", False) + comment = info.get("comment") + if isinstance(comment, str): + comment = comment.encode() + plt = info.get("plt", False) + + fd = -1 + if hasattr(fp, "fileno"): + try: + fd = fp.fileno() + except Exception: + fd = -1 + + im.encoderconfig = ( + offset, + tile_offset, + tile_size, + quality_mode, + quality_layers, + num_resolutions, + cblk_size, + precinct_size, + irreversible, + progression, + cinema_mode, + mct, + signed, + fd, + comment, + plt, + ) + + ImageFile._save(im, fp, [("jpeg2k", (0, 0) + im.size, 0, kind)]) + + +# ------------------------------------------------------------ +# Registry stuff + + +Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) +Image.register_save(Jpeg2KImageFile.format, _save) + +Image.register_extensions( + Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"] +) + +Image.register_mime(Jpeg2KImageFile.format, "image/jp2") diff --git a/.venv/lib/python3.11/site-packages/PIL/JpegPresets.py b/.venv/lib/python3.11/site-packages/PIL/JpegPresets.py new file mode 100644 index 0000000000000000000000000000000000000000..3aefa073ce2259c70f6e6ab1158722ec7ebf7822 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/JpegPresets.py @@ -0,0 +1,242 @@ +""" +JPEG quality settings equivalent to the Photoshop settings. +Can be used when saving JPEG files. + +The following presets are available by default: +``web_low``, ``web_medium``, ``web_high``, ``web_very_high``, ``web_maximum``, +``low``, ``medium``, ``high``, ``maximum``. +More presets can be added to the :py:data:`presets` dict if needed. + +To apply the preset, specify:: + + quality="preset_name" + +To apply only the quantization table:: + + qtables="preset_name" + +To apply only the subsampling setting:: + + subsampling="preset_name" + +Example:: + + im.save("image_name.jpg", quality="web_high") + +Subsampling +----------- + +Subsampling is the practice of encoding images by implementing less resolution +for chroma information than for luma information. +(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) + +Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and +4:2:0. + +You can get the subsampling of a JPEG with the +:func:`.JpegImagePlugin.get_sampling` function. + +In JPEG compressed data a JPEG marker is used instead of an EXIF tag. +(ref.: https://web.archive.org/web/20240227115053/https://exiv2.org/tags.html) + + +Quantization tables +------------------- + +They are values use by the DCT (Discrete cosine transform) to remove +*unnecessary* information from the image (the lossy part of the compression). +(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, +https://en.wikipedia.org/wiki/JPEG#Quantization) + +You can get the quantization tables of a JPEG with:: + + im.quantization + +This will return a dict with a number of lists. You can pass this dict +directly as the qtables argument when saving a JPEG. + +The quantization table format in presets is a list with sublists. These formats +are interchangeable. + +Libjpeg ref.: +https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html + +""" + +from __future__ import annotations + +# fmt: off +presets = { + 'web_low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [20, 16, 25, 39, 50, 46, 62, 68, + 16, 18, 23, 38, 38, 53, 65, 68, + 25, 23, 31, 38, 53, 65, 68, 68, + 39, 38, 38, 53, 65, 68, 68, 68, + 50, 38, 53, 65, 68, 68, 68, 68, + 46, 53, 65, 68, 68, 68, 68, 68, + 62, 65, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68], + [21, 25, 32, 38, 54, 68, 68, 68, + 25, 28, 24, 38, 54, 68, 68, 68, + 32, 24, 32, 43, 66, 68, 68, 68, + 38, 38, 43, 53, 68, 68, 68, 68, + 54, 54, 66, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68] + ]}, + 'web_medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [16, 11, 11, 16, 23, 27, 31, 30, + 11, 12, 12, 15, 20, 23, 23, 30, + 11, 12, 13, 16, 23, 26, 35, 47, + 16, 15, 16, 23, 26, 37, 47, 64, + 23, 20, 23, 26, 39, 51, 64, 64, + 27, 23, 26, 37, 51, 64, 64, 64, + 31, 23, 35, 47, 64, 64, 64, 64, + 30, 30, 47, 64, 64, 64, 64, 64], + [17, 15, 17, 21, 20, 26, 38, 48, + 15, 19, 18, 17, 20, 26, 35, 43, + 17, 18, 20, 22, 26, 30, 46, 53, + 21, 17, 22, 28, 30, 39, 53, 64, + 20, 20, 26, 30, 39, 48, 64, 64, + 26, 26, 30, 39, 48, 63, 64, 64, + 38, 35, 46, 53, 64, 64, 64, 64, + 48, 43, 53, 64, 64, 64, 64, 64] + ]}, + 'web_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 14, 19, + 6, 6, 6, 11, 12, 15, 19, 28, + 9, 8, 10, 12, 16, 20, 27, 31, + 11, 10, 12, 15, 20, 27, 31, 31, + 12, 12, 14, 19, 27, 31, 31, 31, + 16, 12, 19, 28, 31, 31, 31, 31], + [7, 7, 13, 24, 26, 31, 31, 31, + 7, 12, 16, 21, 31, 31, 31, 31, + 13, 16, 17, 31, 31, 31, 31, 31, + 24, 21, 31, 31, 31, 31, 31, 31, + 26, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31] + ]}, + 'web_very_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 11, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 11, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'web_maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 2, 2, 3, + 1, 1, 1, 1, 2, 2, 3, 3, + 1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 2, 2, 3, 3, 3, 3], + [1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 1, 2, 3, 3, 3, 3, + 1, 1, 1, 3, 3, 3, 3, 3, + 2, 2, 3, 3, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3] + ]}, + 'low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [18, 14, 14, 21, 30, 35, 34, 17, + 14, 16, 16, 19, 26, 23, 12, 12, + 14, 16, 17, 21, 23, 12, 12, 12, + 21, 19, 21, 23, 12, 12, 12, 12, + 30, 26, 23, 12, 12, 12, 12, 12, + 35, 23, 12, 12, 12, 12, 12, 12, + 34, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [20, 19, 22, 27, 20, 20, 17, 17, + 19, 25, 23, 14, 14, 12, 12, 12, + 22, 23, 14, 14, 12, 12, 12, 12, + 27, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [12, 8, 8, 12, 17, 21, 24, 17, + 8, 9, 9, 11, 15, 19, 12, 12, + 8, 9, 10, 12, 19, 12, 12, 12, + 12, 11, 12, 21, 12, 12, 12, 12, + 17, 15, 19, 12, 12, 12, 12, 12, + 21, 19, 12, 12, 12, 12, 12, 12, + 24, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [13, 11, 13, 16, 20, 20, 17, 17, + 11, 14, 14, 14, 14, 12, 12, 12, + 13, 14, 14, 14, 12, 12, 12, 12, + 16, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 12, 12, + 6, 6, 6, 11, 12, 12, 12, 12, + 9, 8, 10, 12, 12, 12, 12, 12, + 11, 10, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 16, 12, 12, 12, 12, 12, 12, 12], + [7, 7, 13, 24, 20, 20, 17, 17, + 7, 12, 16, 14, 14, 12, 12, 12, + 13, 16, 14, 14, 12, 12, 12, 12, + 24, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 10, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 10, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, +} +# fmt: on diff --git a/.venv/lib/python3.11/site-packages/PIL/McIdasImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/McIdasImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..27972236c0adc1986af35264a1653cea22f41fad --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/McIdasImagePlugin.py @@ -0,0 +1,78 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Basic McIdas support for PIL +# +# History: +# 1997-05-05 fl Created (8-bit images only) +# 2009-03-08 fl Added 16/32-bit support. +# +# Thanks to Richard Jones and Craig Swank for specs and samples. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import struct + +from . import Image, ImageFile + + +def _accept(prefix: bytes) -> bool: + return prefix[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" + + +## +# Image plugin for McIdas area images. + + +class McIdasImageFile(ImageFile.ImageFile): + format = "MCIDAS" + format_description = "McIdas area file" + + def _open(self) -> None: + # parse area file directory + assert self.fp is not None + + s = self.fp.read(256) + if not _accept(s) or len(s) != 256: + msg = "not an McIdas area file" + raise SyntaxError(msg) + + self.area_descriptor_raw = s + self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) + + # get mode + if w[11] == 1: + mode = rawmode = "L" + elif w[11] == 2: + # FIXME: add memory map support + mode = "I" + rawmode = "I;16B" + elif w[11] == 4: + # FIXME: add memory map support + mode = "I" + rawmode = "I;32B" + else: + msg = "unsupported McIdas format" + raise SyntaxError(msg) + + self._mode = mode + self._size = w[10], w[9] + + offset = w[34] + w[15] + stride = w[15] + w[10] * w[11] * w[14] + + self.tile = [("raw", (0, 0) + self.size, offset, (rawmode, stride, 1))] + + +# -------------------------------------------------------------------- +# registry + +Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) + +# no default extension diff --git a/.venv/lib/python3.11/site-packages/PIL/MpoImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/MpoImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..f21570661f8f94407f87344e82e890fa68885cbc --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/MpoImagePlugin.py @@ -0,0 +1,180 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPO file handling +# +# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the +# Camera & Imaging Products Association) +# +# The multi-picture object combines multiple JPEG images (with a modified EXIF +# data format) into a single file. While it can theoretically be used much like +# a GIF animation, it is commonly used to represent 3D photographs and is (as +# of this writing) the most commonly used format by 3D cameras. +# +# History: +# 2014-03-13 Feneric Created +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import itertools +import os +import struct +from typing import IO + +from . import ( + Image, + ImageSequence, + JpegImagePlugin, + TiffImagePlugin, +) +from ._binary import o32le + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + JpegImagePlugin._save(im, fp, filename) + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + append_images = im.encoderinfo.get("append_images", []) + if not append_images and not getattr(im, "is_animated", False): + _save(im, fp, filename) + return + + mpf_offset = 28 + offsets: list[int] = [] + for imSequence in itertools.chain([im], append_images): + for im_frame in ImageSequence.Iterator(imSequence): + if not offsets: + # APP2 marker + im_frame.encoderinfo["extra"] = ( + b"\xFF\xE2" + struct.pack(">H", 6 + 82) + b"MPF\0" + b" " * 82 + ) + exif = im_frame.encoderinfo.get("exif") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + im_frame.encoderinfo["exif"] = exif + if exif: + mpf_offset += 4 + len(exif) + + JpegImagePlugin._save(im_frame, fp, filename) + offsets.append(fp.tell()) + else: + im_frame.save(fp, "JPEG") + offsets.append(fp.tell() - offsets[-1]) + + ifd = TiffImagePlugin.ImageFileDirectory_v2() + ifd[0xB000] = b"0100" + ifd[0xB001] = len(offsets) + + mpentries = b"" + data_offset = 0 + for i, size in enumerate(offsets): + if i == 0: + mptype = 0x030000 # Baseline MP Primary Image + else: + mptype = 0x000000 # Undefined + mpentries += struct.pack(" None: + self.fp.seek(0) # prep the fp in order to pass the JPEG test + JpegImagePlugin.JpegImageFile._open(self) + self._after_jpeg_open() + + def _after_jpeg_open(self, mpheader=None): + self.mpinfo = mpheader if mpheader is not None else self._getmp() + self.n_frames = self.mpinfo[0xB001] + self.__mpoffsets = [ + mpent["DataOffset"] + self.info["mpoffset"] for mpent in self.mpinfo[0xB002] + ] + self.__mpoffsets[0] = 0 + # Note that the following assertion will only be invalid if something + # gets broken within JpegImagePlugin. + assert self.n_frames == len(self.__mpoffsets) + del self.info["mpoffset"] # no longer needed + self.is_animated = self.n_frames > 1 + self._fp = self.fp # FIXME: hack + self._fp.seek(self.__mpoffsets[0]) # get ready to read first frame + self.__frame = 0 + self.offset = 0 + # for now we can only handle reading and individual frame extraction + self.readonly = 1 + + def load_seek(self, pos: int) -> None: + self._fp.seek(pos) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + self.fp = self._fp + self.offset = self.__mpoffsets[frame] + + original_exif = self.info.get("exif") + if "exif" in self.info: + del self.info["exif"] + + self.fp.seek(self.offset + 2) # skip SOI marker + if not self.fp.read(2): + msg = "No data found for frame" + raise ValueError(msg) + self.fp.seek(self.offset) + JpegImagePlugin.JpegImageFile._open(self) + if self.info.get("exif") != original_exif: + self._reload_exif() + + self.tile = [("jpeg", (0, 0) + self.size, self.offset, self.tile[0][-1])] + self.__frame = frame + + def tell(self) -> int: + return self.__frame + + @staticmethod + def adopt(jpeg_instance, mpheader=None): + """ + Transform the instance of JpegImageFile into + an instance of MpoImageFile. + After the call, the JpegImageFile is extended + to be an MpoImageFile. + + This is essentially useful when opening a JPEG + file that reveals itself as an MPO, to avoid + double call to _open. + """ + jpeg_instance.__class__ = MpoImageFile + jpeg_instance._after_jpeg_open(mpheader) + return jpeg_instance + + +# --------------------------------------------------------------------- +# Registry stuff + +# Note that since MPO shares a factory with JPEG, we do not need to do a +# separate registration for it here. +# Image.register_open(MpoImageFile.format, +# JpegImagePlugin.jpeg_factory, _accept) +Image.register_save(MpoImageFile.format, _save) +Image.register_save_all(MpoImageFile.format, _save_all) + +Image.register_extension(MpoImageFile.format, ".mpo") + +Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/.venv/lib/python3.11/site-packages/PIL/MspImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/MspImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..0a75c868b9707d3da3ff91d9934ed648c97ed8e5 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/MspImagePlugin.py @@ -0,0 +1,200 @@ +# +# The Python Imaging Library. +# +# MSP file handling +# +# This is the format used by the Paint program in Windows 1 and 2. +# +# History: +# 95-09-05 fl Created +# 97-01-03 fl Read/write MSP images +# 17-02-21 es Fixed RLE interpretation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-97. +# Copyright (c) Eric Soroos 2017. +# +# See the README file for information on usage and redistribution. +# +# More info on this format: https://archive.org/details/gg243631 +# Page 313: +# Figure 205. Windows Paint Version 1: "DanM" Format +# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 +# +# See also: https://www.fileformat.info/format/mspaint/egff.htm +from __future__ import annotations + +import io +import struct +from typing import IO + +from . import Image, ImageFile +from ._binary import i16le as i16 +from ._binary import o16le as o16 + +# +# read MSP files + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] in [b"DanM", b"LinS"] + + +## +# Image plugin for Windows MSP images. This plugin supports both +# uncompressed (Windows 1.0). + + +class MspImageFile(ImageFile.ImageFile): + format = "MSP" + format_description = "Windows Paint" + + def _open(self) -> None: + # Header + assert self.fp is not None + + s = self.fp.read(32) + if not _accept(s): + msg = "not an MSP file" + raise SyntaxError(msg) + + # Header checksum + checksum = 0 + for i in range(0, 32, 2): + checksum = checksum ^ i16(s, i) + if checksum != 0: + msg = "bad MSP checksum" + raise SyntaxError(msg) + + self._mode = "1" + self._size = i16(s, 4), i16(s, 6) + + if s[:4] == b"DanM": + self.tile = [("raw", (0, 0) + self.size, 32, ("1", 0, 1))] + else: + self.tile = [("MSP", (0, 0) + self.size, 32, None)] + + +class MspDecoder(ImageFile.PyDecoder): + # The algo for the MSP decoder is from + # https://www.fileformat.info/format/mspaint/egff.htm + # cc-by-attribution -- That page references is taken from the + # Encyclopedia of Graphics File Formats and is licensed by + # O'Reilly under the Creative Common/Attribution license + # + # For RLE encoded files, the 32byte header is followed by a scan + # line map, encoded as one 16bit word of encoded byte length per + # line. + # + # NOTE: the encoded length of the line can be 0. This was not + # handled in the previous version of this encoder, and there's no + # mention of how to handle it in the documentation. From the few + # examples I've seen, I've assumed that it is a fill of the + # background color, in this case, white. + # + # + # Pseudocode of the decoder: + # Read a BYTE value as the RunType + # If the RunType value is zero + # Read next byte as the RunCount + # Read the next byte as the RunValue + # Write the RunValue byte RunCount times + # If the RunType value is non-zero + # Use this value as the RunCount + # Read and write the next RunCount bytes literally + # + # e.g.: + # 0x00 03 ff 05 00 01 02 03 04 + # would yield the bytes: + # 0xff ff ff 00 01 02 03 04 + # + # which are then interpreted as a bit packed mode '1' image + + _pulls_fd = True + + def decode(self, buffer: bytes) -> tuple[int, int]: + assert self.fd is not None + + img = io.BytesIO() + blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) + try: + self.fd.seek(32) + rowmap = struct.unpack_from( + f"<{self.state.ysize}H", self.fd.read(self.state.ysize * 2) + ) + except struct.error as e: + msg = "Truncated MSP file in row map" + raise OSError(msg) from e + + for x, rowlen in enumerate(rowmap): + try: + if rowlen == 0: + img.write(blank_line) + continue + row = self.fd.read(rowlen) + if len(row) != rowlen: + msg = f"Truncated MSP file, expected {rowlen} bytes on row {x}" + raise OSError(msg) + idx = 0 + while idx < rowlen: + runtype = row[idx] + idx += 1 + if runtype == 0: + (runcount, runval) = struct.unpack_from("Bc", row, idx) + img.write(runval * runcount) + idx += 2 + else: + runcount = runtype + img.write(row[idx : idx + runcount]) + idx += runcount + + except struct.error as e: + msg = f"Corrupted MSP file in row {x}" + raise OSError(msg) from e + + self.set_as_raw(img.getvalue(), ("1", 0, 1)) + + return -1, 0 + + +Image.register_decoder("MSP", MspDecoder) + + +# +# write MSP files (uncompressed only) + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode != "1": + msg = f"cannot write mode {im.mode} as MSP" + raise OSError(msg) + + # create MSP header + header = [0] * 16 + + header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 + header[2], header[3] = im.size + header[4], header[5] = 1, 1 + header[6], header[7] = 1, 1 + header[8], header[9] = im.size + + checksum = 0 + for h in header: + checksum = checksum ^ h + header[12] = checksum # FIXME: is this the right field? + + # header + for h in header: + fp.write(o16(h)) + + # image body + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 32, ("1", 0, 1))]) + + +# +# registry + +Image.register_open(MspImageFile.format, MspImageFile, _accept) +Image.register_save(MspImageFile.format, _save) + +Image.register_extension(MspImageFile.format, ".msp") diff --git a/.venv/lib/python3.11/site-packages/PIL/PaletteFile.py b/.venv/lib/python3.11/site-packages/PIL/PaletteFile.py new file mode 100644 index 0000000000000000000000000000000000000000..81652e5eec2ff0137a0d34b552362c90c8bac52b --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PaletteFile.py @@ -0,0 +1,54 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read simple, teragon-style palette files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from typing import IO + +from ._binary import o8 + + +class PaletteFile: + """File handler for Teragon-style palette files.""" + + rawmode = "RGB" + + def __init__(self, fp: IO[bytes]) -> None: + palette = [o8(i) * 3 for i in range(256)] + + while True: + s = fp.readline() + + if not s: + break + if s[:1] == b"#": + continue + if len(s) > 100: + msg = "bad palette file" + raise SyntaxError(msg) + + v = [int(x) for x in s.split()] + try: + [i, r, g, b] = v + except ValueError: + [i, r] = v + g = b = r + + if 0 <= i <= 255: + palette[i] = o8(r) + o8(g) + o8(b) + + self.palette = b"".join(palette) + + def getpalette(self) -> tuple[bytes, str]: + return self.palette, self.rawmode diff --git a/.venv/lib/python3.11/site-packages/PIL/PalmImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/PalmImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..1735070f81beb350d368712792bcf08882c559d8 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PalmImagePlugin.py @@ -0,0 +1,229 @@ +# +# The Python Imaging Library. +# $Id$ +# + +## +# Image plugin for Palm pixmap images (output only). +## +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile +from ._binary import o8 +from ._binary import o16be as o16b + +# fmt: off +_Palm8BitColormapValues = ( + (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), + (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), + (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), + (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), + (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), + (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), + (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), + (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), + (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), + (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), + (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), + (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), + (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), + (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), + (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), + (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), + (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), + (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), + (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), + (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), + (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), + (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), + (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), + (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), + (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), + (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), + (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), + (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), + (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), + (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), + (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), + (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), + (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), + (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), + (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), + (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), + (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), + (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), + (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), + (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), + (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), + (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), + (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), + (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), + (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), + (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), + (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), + (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), + (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), + (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), + (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), + (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), + (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), + (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), + (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), + (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), + (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), + (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)) +# fmt: on + + +# so build a prototype image to be used for palette resampling +def build_prototype_image() -> Image.Image: + image = Image.new("L", (1, len(_Palm8BitColormapValues))) + image.putdata(list(range(len(_Palm8BitColormapValues)))) + palettedata: tuple[int, ...] = () + for colormapValue in _Palm8BitColormapValues: + palettedata += colormapValue + palettedata += (0, 0, 0) * (256 - len(_Palm8BitColormapValues)) + image.putpalette(palettedata) + return image + + +Palm8BitColormapImage = build_prototype_image() + +# OK, we now have in Palm8BitColormapImage, +# a "P"-mode image with the right palette +# +# -------------------------------------------------------------------- + +_FLAGS = {"custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000} + +_COMPRESSION_TYPES = {"none": 0xFF, "rle": 0x01, "scanline": 0x00} + + +# +# -------------------------------------------------------------------- + +## +# (Internal) Image save plugin for the Palm format. + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode == "P": + # we assume this is a color Palm image with the standard colormap, + # unless the "info" dict has a "custom-colormap" field + + rawmode = "P" + bpp = 8 + version = 1 + + elif im.mode == "L": + if im.encoderinfo.get("bpp") in (1, 2, 4): + # this is 8-bit grayscale, so we shift it to get the high-order bits, + # and invert it because + # Palm does grayscale from white (0) to black (1) + bpp = im.encoderinfo["bpp"] + maxval = (1 << bpp) - 1 + shift = 8 - bpp + im = im.point(lambda x: maxval - (x >> shift)) + elif im.info.get("bpp") in (1, 2, 4): + # here we assume that even though the inherent mode is 8-bit grayscale, + # only the lower bpp bits are significant. + # We invert them to match the Palm. + bpp = im.info["bpp"] + maxval = (1 << bpp) - 1 + im = im.point(lambda x: maxval - (x & maxval)) + else: + msg = f"cannot write mode {im.mode} as Palm" + raise OSError(msg) + + # we ignore the palette here + im._mode = "P" + rawmode = f"P;{bpp}" + version = 1 + + elif im.mode == "1": + # monochrome -- write it inverted, as is the Palm standard + rawmode = "1;I" + bpp = 1 + version = 0 + + else: + msg = f"cannot write mode {im.mode} as Palm" + raise OSError(msg) + + # + # make sure image data is available + im.load() + + # write header + + cols = im.size[0] + rows = im.size[1] + + rowbytes = int((cols + (16 // bpp - 1)) / (16 // bpp)) * 2 + transparent_index = 0 + compression_type = _COMPRESSION_TYPES["none"] + + flags = 0 + if im.mode == "P" and "custom-colormap" in im.info: + flags = flags & _FLAGS["custom-colormap"] + colormapsize = 4 * 256 + 2 + colormapmode = im.palette.mode + colormap = im.getdata().getpalette() + else: + colormapsize = 0 + + if "offset" in im.info: + offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 + else: + offset = 0 + + fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) + fp.write(o8(bpp)) + fp.write(o8(version)) + fp.write(o16b(offset)) + fp.write(o8(transparent_index)) + fp.write(o8(compression_type)) + fp.write(o16b(0)) # reserved by Palm + + # now write colormap if necessary + + if colormapsize > 0: + fp.write(o16b(256)) + for i in range(256): + fp.write(o8(i)) + if colormapmode == "RGB": + fp.write( + o8(colormap[3 * i]) + + o8(colormap[3 * i + 1]) + + o8(colormap[3 * i + 2]) + ) + elif colormapmode == "RGBA": + fp.write( + o8(colormap[4 * i]) + + o8(colormap[4 * i + 1]) + + o8(colormap[4 * i + 2]) + ) + + # now convert data to raw form + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, rowbytes, 1))]) + + if hasattr(fp, "flush"): + fp.flush() + + +# +# -------------------------------------------------------------------- + +Image.register_save("Palm", _save) + +Image.register_extension("Palm", ".palm") + +Image.register_mime("Palm", "image/palm") diff --git a/.venv/lib/python3.11/site-packages/PIL/PcxImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/PcxImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..dd42003b5a3f980c4beec7b52d7fb3cea6de73c3 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PcxImagePlugin.py @@ -0,0 +1,227 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCX file handling +# +# This format was originally used by ZSoft's popular PaintBrush +# program for the IBM PC. It is also supported by many MS-DOS and +# Windows applications, including the Windows PaintBrush program in +# Windows 3. +# +# history: +# 1995-09-01 fl Created +# 1996-05-20 fl Fixed RGB support +# 1997-01-03 fl Fixed 2-bit and 4-bit support +# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) +# 1999-02-07 fl Added write support +# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust +# 2002-07-30 fl Seek from to current position, not beginning of file +# 2003-06-03 fl Extract DPI settings (info["dpi"]) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import logging +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import o8 +from ._binary import o16le as o16 + +logger = logging.getLogger(__name__) + + +def _accept(prefix: bytes) -> bool: + return prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] + + +## +# Image plugin for Paintbrush images. + + +class PcxImageFile(ImageFile.ImageFile): + format = "PCX" + format_description = "Paintbrush" + + def _open(self) -> None: + # header + assert self.fp is not None + + s = self.fp.read(128) + if not _accept(s): + msg = "not a PCX file" + raise SyntaxError(msg) + + # image + bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1 + if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: + msg = "bad PCX image size" + raise SyntaxError(msg) + logger.debug("BBox: %s %s %s %s", *bbox) + + # format + version = s[1] + bits = s[3] + planes = s[65] + provided_stride = i16(s, 66) + logger.debug( + "PCX version %s, bits %s, planes %s, stride %s", + version, + bits, + planes, + provided_stride, + ) + + self.info["dpi"] = i16(s, 12), i16(s, 14) + + if bits == 1 and planes == 1: + mode = rawmode = "1" + + elif bits == 1 and planes in (2, 4): + mode = "P" + rawmode = "P;%dL" % planes + self.palette = ImagePalette.raw("RGB", s[16:64]) + + elif version == 5 and bits == 8 and planes == 1: + mode = rawmode = "L" + # FIXME: hey, this doesn't work with the incremental loader !!! + self.fp.seek(-769, io.SEEK_END) + s = self.fp.read(769) + if len(s) == 769 and s[0] == 12: + # check if the palette is linear grayscale + for i in range(256): + if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: + mode = rawmode = "P" + break + if mode == "P": + self.palette = ImagePalette.raw("RGB", s[1:]) + self.fp.seek(128) + + elif version == 5 and bits == 8 and planes == 3: + mode = "RGB" + rawmode = "RGB;L" + + else: + msg = "unknown PCX mode" + raise OSError(msg) + + self._mode = mode + self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] + + # Don't trust the passed in stride. + # Calculate the approximate position for ourselves. + # CVE-2020-35653 + stride = (self._size[0] * bits + 7) // 8 + + # While the specification states that this must be even, + # not all images follow this + if provided_stride != stride: + stride += stride % 2 + + bbox = (0, 0) + self.size + logger.debug("size: %sx%s", *self.size) + + self.tile = [("pcx", bbox, self.fp.tell(), (rawmode, planes * stride))] + + +# -------------------------------------------------------------------- +# save PCX files + + +SAVE = { + # mode: (version, bits, planes, raw mode) + "1": (2, 1, 1, "1"), + "L": (5, 8, 1, "L"), + "P": (5, 8, 1, "P"), + "RGB": (5, 8, 3, "RGB;L"), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + version, bits, planes, rawmode = SAVE[im.mode] + except KeyError as e: + msg = f"Cannot save {im.mode} images as PCX" + raise ValueError(msg) from e + + # bytes per plane + stride = (im.size[0] * bits + 7) // 8 + # stride should be even + stride += stride % 2 + # Stride needs to be kept in sync with the PcxEncode.c version. + # Ideally it should be passed in in the state, but the bytes value + # gets overwritten. + + logger.debug( + "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", + im.size[0], + bits, + stride, + ) + + # under windows, we could determine the current screen size with + # "Image.core.display_mode()[1]", but I think that's overkill... + + screen = im.size + + dpi = 100, 100 + + # PCX header + fp.write( + o8(10) + + o8(version) + + o8(1) + + o8(bits) + + o16(0) + + o16(0) + + o16(im.size[0] - 1) + + o16(im.size[1] - 1) + + o16(dpi[0]) + + o16(dpi[1]) + + b"\0" * 24 + + b"\xFF" * 24 + + b"\0" + + o8(planes) + + o16(stride) + + o16(1) + + o16(screen[0]) + + o16(screen[1]) + + b"\0" * 54 + ) + + assert fp.tell() == 128 + + ImageFile._save(im, fp, [("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))]) + + if im.mode == "P": + # colour palette + assert im.im is not None + + fp.write(o8(12)) + palette = im.im.getpalette("RGB", "RGB") + palette += b"\x00" * (768 - len(palette)) + fp.write(palette) # 768 bytes + elif im.mode == "L": + # grayscale palette + fp.write(o8(12)) + for i in range(256): + fp.write(o8(i) * 3) + + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PcxImageFile.format, PcxImageFile, _accept) +Image.register_save(PcxImageFile.format, _save) + +Image.register_extension(PcxImageFile.format, ".pcx") + +Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/.venv/lib/python3.11/site-packages/PIL/PdfImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/PdfImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..f0da1e04797d63f45aac0fefd69a5733141a1579 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PdfImagePlugin.py @@ -0,0 +1,304 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PDF (Acrobat) file handling +# +# History: +# 1996-07-16 fl Created +# 1997-01-18 fl Fixed header +# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. +# 2004-02-24 fl Fixes for 1 and P images. +# +# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996-1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## +# Image plugin for PDF images (output only). +## +from __future__ import annotations + +import io +import math +import os +import time +from typing import IO + +from . import Image, ImageFile, ImageSequence, PdfParser, __version__, features + +# +# -------------------------------------------------------------------- + +# object ids: +# 1. catalogue +# 2. pages +# 3. image +# 4. page +# 5. page contents + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +## +# (Internal) Image save plugin for the PDF format. + + +def _write_image(im, filename, existing_pdf, image_refs): + # FIXME: Should replace ASCIIHexDecode with RunLengthDecode + # (packbits) or LZWDecode (tiff/lzw compression). Note that + # PDF 1.2 also supports Flatedecode (zip compression). + + params = None + decode = None + + # + # Get image characteristics + + width, height = im.size + + dict_obj = {"BitsPerComponent": 8} + if im.mode == "1": + if features.check("libtiff"): + filter = "CCITTFaxDecode" + dict_obj["BitsPerComponent"] = 1 + params = PdfParser.PdfArray( + [ + PdfParser.PdfDict( + { + "K": -1, + "BlackIs1": True, + "Columns": width, + "Rows": height, + } + ) + ] + ) + else: + filter = "DCTDecode" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "L": + filter = "DCTDecode" + # params = f"<< /Predictor 15 /Columns {width-2} >>" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "LA": + filter = "JPXDecode" + # params = f"<< /Predictor 15 /Columns {width-2} >>" + procset = "ImageB" # grayscale + dict_obj["SMaskInData"] = 1 + elif im.mode == "P": + filter = "ASCIIHexDecode" + palette = im.getpalette() + dict_obj["ColorSpace"] = [ + PdfParser.PdfName("Indexed"), + PdfParser.PdfName("DeviceRGB"), + len(palette) // 3 - 1, + PdfParser.PdfBinary(palette), + ] + procset = "ImageI" # indexed color + + if "transparency" in im.info: + smask = im.convert("LA").getchannel("A") + smask.encoderinfo = {} + + image_ref = _write_image(smask, filename, existing_pdf, image_refs)[0] + dict_obj["SMask"] = image_ref + elif im.mode == "RGB": + filter = "DCTDecode" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceRGB") + procset = "ImageC" # color images + elif im.mode == "RGBA": + filter = "JPXDecode" + procset = "ImageC" # color images + dict_obj["SMaskInData"] = 1 + elif im.mode == "CMYK": + filter = "DCTDecode" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceCMYK") + procset = "ImageC" # color images + decode = [1, 0, 1, 0, 1, 0, 1, 0] + else: + msg = f"cannot save mode {im.mode}" + raise ValueError(msg) + + # + # image + + op = io.BytesIO() + + if filter == "ASCIIHexDecode": + ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)]) + elif filter == "CCITTFaxDecode": + im.save( + op, + "TIFF", + compression="group4", + # use a single strip + strip_size=math.ceil(width / 8) * height, + ) + elif filter == "DCTDecode": + Image.SAVE["JPEG"](im, op, filename) + elif filter == "JPXDecode": + del dict_obj["BitsPerComponent"] + Image.SAVE["JPEG2000"](im, op, filename) + else: + msg = f"unsupported PDF filter ({filter})" + raise ValueError(msg) + + stream = op.getvalue() + if filter == "CCITTFaxDecode": + stream = stream[8:] + filter = PdfParser.PdfArray([PdfParser.PdfName(filter)]) + else: + filter = PdfParser.PdfName(filter) + + image_ref = image_refs.pop(0) + existing_pdf.write_obj( + image_ref, + stream=stream, + Type=PdfParser.PdfName("XObject"), + Subtype=PdfParser.PdfName("Image"), + Width=width, # * 72.0 / x_resolution, + Height=height, # * 72.0 / y_resolution, + Filter=filter, + Decode=decode, + DecodeParms=params, + **dict_obj, + ) + + return image_ref, procset + + +def _save(im, fp, filename, save_all=False): + is_appending = im.encoderinfo.get("append", False) + if is_appending: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b") + else: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b") + + dpi = im.encoderinfo.get("dpi") + if dpi: + x_resolution = dpi[0] + y_resolution = dpi[1] + else: + x_resolution = y_resolution = im.encoderinfo.get("resolution", 72.0) + + info = { + "title": ( + None if is_appending else os.path.splitext(os.path.basename(filename))[0] + ), + "author": None, + "subject": None, + "keywords": None, + "creator": None, + "producer": None, + "creationDate": None if is_appending else time.gmtime(), + "modDate": None if is_appending else time.gmtime(), + } + for k, default in info.items(): + v = im.encoderinfo.get(k) if k in im.encoderinfo else default + if v: + existing_pdf.info[k[0].upper() + k[1:]] = v + + # + # make sure image data is available + im.load() + + existing_pdf.start_writing() + existing_pdf.write_header() + existing_pdf.write_comment(f"created by Pillow {__version__} PDF driver") + + # + # pages + ims = [im] + if save_all: + append_images = im.encoderinfo.get("append_images", []) + for append_im in append_images: + append_im.encoderinfo = im.encoderinfo.copy() + ims.append(append_im) + number_of_pages = 0 + image_refs = [] + page_refs = [] + contents_refs = [] + for im in ims: + im_number_of_pages = 1 + if save_all: + try: + im_number_of_pages = im.n_frames + except AttributeError: + # Image format does not have n_frames. + # It is a single frame image + pass + number_of_pages += im_number_of_pages + for i in range(im_number_of_pages): + image_refs.append(existing_pdf.next_object_id(0)) + if im.mode == "P" and "transparency" in im.info: + image_refs.append(existing_pdf.next_object_id(0)) + + page_refs.append(existing_pdf.next_object_id(0)) + contents_refs.append(existing_pdf.next_object_id(0)) + existing_pdf.pages.append(page_refs[-1]) + + # + # catalog and list of pages + existing_pdf.write_catalog() + + page_number = 0 + for im_sequence in ims: + im_pages = ImageSequence.Iterator(im_sequence) if save_all else [im_sequence] + for im in im_pages: + image_ref, procset = _write_image(im, filename, existing_pdf, image_refs) + + # + # page + + existing_pdf.write_page( + page_refs[page_number], + Resources=PdfParser.PdfDict( + ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], + XObject=PdfParser.PdfDict(image=image_ref), + ), + MediaBox=[ + 0, + 0, + im.width * 72.0 / x_resolution, + im.height * 72.0 / y_resolution, + ], + Contents=contents_refs[page_number], + ) + + # + # page contents + + page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( + im.width * 72.0 / x_resolution, + im.height * 72.0 / y_resolution, + ) + + existing_pdf.write_obj(contents_refs[page_number], stream=page_contents) + + page_number += 1 + + # + # trailer + existing_pdf.write_xref_and_trailer() + if hasattr(fp, "flush"): + fp.flush() + existing_pdf.close() + + +# +# -------------------------------------------------------------------- + + +Image.register_save("PDF", _save) +Image.register_save_all("PDF", _save_all) + +Image.register_extension("PDF", ".pdf") + +Image.register_mime("PDF", "application/pdf") diff --git a/.venv/lib/python3.11/site-packages/PIL/PdfParser.py b/.venv/lib/python3.11/site-packages/PIL/PdfParser.py new file mode 100644 index 0000000000000000000000000000000000000000..9e22313475e66220662772be314103878681724b --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PdfParser.py @@ -0,0 +1,1003 @@ +from __future__ import annotations + +import calendar +import codecs +import collections +import mmap +import os +import re +import time +import zlib +from typing import TYPE_CHECKING, Any, List, NamedTuple, Union + + +# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set +# on page 656 +def encode_text(s: str) -> bytes: + return codecs.BOM_UTF16_BE + s.encode("utf_16_be") + + +PDFDocEncoding = { + 0x16: "\u0017", + 0x18: "\u02D8", + 0x19: "\u02C7", + 0x1A: "\u02C6", + 0x1B: "\u02D9", + 0x1C: "\u02DD", + 0x1D: "\u02DB", + 0x1E: "\u02DA", + 0x1F: "\u02DC", + 0x80: "\u2022", + 0x81: "\u2020", + 0x82: "\u2021", + 0x83: "\u2026", + 0x84: "\u2014", + 0x85: "\u2013", + 0x86: "\u0192", + 0x87: "\u2044", + 0x88: "\u2039", + 0x89: "\u203A", + 0x8A: "\u2212", + 0x8B: "\u2030", + 0x8C: "\u201E", + 0x8D: "\u201C", + 0x8E: "\u201D", + 0x8F: "\u2018", + 0x90: "\u2019", + 0x91: "\u201A", + 0x92: "\u2122", + 0x93: "\uFB01", + 0x94: "\uFB02", + 0x95: "\u0141", + 0x96: "\u0152", + 0x97: "\u0160", + 0x98: "\u0178", + 0x99: "\u017D", + 0x9A: "\u0131", + 0x9B: "\u0142", + 0x9C: "\u0153", + 0x9D: "\u0161", + 0x9E: "\u017E", + 0xA0: "\u20AC", +} + + +def decode_text(b): + if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: + return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") + else: + return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) + + +class PdfFormatError(RuntimeError): + """An error that probably indicates a syntactic or semantic error in the + PDF file structure""" + + pass + + +def check_format_condition(condition: bool, error_message: str) -> None: + if not condition: + raise PdfFormatError(error_message) + + +class IndirectReferenceTuple(NamedTuple): + object_id: int + generation: int + + +class IndirectReference(IndirectReferenceTuple): + def __str__(self) -> str: + return f"{self.object_id} {self.generation} R" + + def __bytes__(self) -> bytes: + return self.__str__().encode("us-ascii") + + def __eq__(self, other: object) -> bool: + if self.__class__ is not other.__class__: + return False + assert isinstance(other, IndirectReference) + return other.object_id == self.object_id and other.generation == self.generation + + def __ne__(self, other): + return not (self == other) + + def __hash__(self) -> int: + return hash((self.object_id, self.generation)) + + +class IndirectObjectDef(IndirectReference): + def __str__(self) -> str: + return f"{self.object_id} {self.generation} obj" + + +class XrefTable: + def __init__(self): + self.existing_entries = {} # object ID => (offset, generation) + self.new_entries = {} # object ID => (offset, generation) + self.deleted_entries = {0: 65536} # object ID => generation + self.reading_finished = False + + def __setitem__(self, key, value): + if self.reading_finished: + self.new_entries[key] = value + else: + self.existing_entries[key] = value + if key in self.deleted_entries: + del self.deleted_entries[key] + + def __getitem__(self, key): + try: + return self.new_entries[key] + except KeyError: + return self.existing_entries[key] + + def __delitem__(self, key): + if key in self.new_entries: + generation = self.new_entries[key][1] + 1 + del self.new_entries[key] + self.deleted_entries[key] = generation + elif key in self.existing_entries: + generation = self.existing_entries[key][1] + 1 + self.deleted_entries[key] = generation + elif key in self.deleted_entries: + generation = self.deleted_entries[key] + else: + msg = f"object ID {key} cannot be deleted because it doesn't exist" + raise IndexError(msg) + + def __contains__(self, key): + return key in self.existing_entries or key in self.new_entries + + def __len__(self) -> int: + return len( + set(self.existing_entries.keys()) + | set(self.new_entries.keys()) + | set(self.deleted_entries.keys()) + ) + + def keys(self): + return ( + set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) + ) | set(self.new_entries.keys()) + + def write(self, f): + keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + deleted_keys = sorted(set(self.deleted_entries.keys())) + startxref = f.tell() + f.write(b"xref\n") + while keys: + # find a contiguous sequence of object IDs + prev = None + for index, key in enumerate(keys): + if prev is None or prev + 1 == key: + prev = key + else: + contiguous_keys = keys[:index] + keys = keys[index:] + break + else: + contiguous_keys = keys + keys = None + f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) + for object_id in contiguous_keys: + if object_id in self.new_entries: + f.write(b"%010d %05d n \n" % self.new_entries[object_id]) + else: + this_deleted_object_id = deleted_keys.pop(0) + check_format_condition( + object_id == this_deleted_object_id, + f"expected the next deleted object ID to be {object_id}, " + f"instead found {this_deleted_object_id}", + ) + try: + next_in_linked_list = deleted_keys[0] + except IndexError: + next_in_linked_list = 0 + f.write( + b"%010d %05d f \n" + % (next_in_linked_list, self.deleted_entries[object_id]) + ) + return startxref + + +class PdfName: + def __init__(self, name): + if isinstance(name, PdfName): + self.name = name.name + elif isinstance(name, bytes): + self.name = name + else: + self.name = name.encode("us-ascii") + + def name_as_str(self) -> str: + return self.name.decode("us-ascii") + + def __eq__(self, other): + return ( + isinstance(other, PdfName) and other.name == self.name + ) or other == self.name + + def __hash__(self) -> int: + return hash(self.name) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({repr(self.name)})" + + @classmethod + def from_pdf_stream(cls, data): + return cls(PdfParser.interpret_name(data)) + + allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} + + def __bytes__(self) -> bytes: + result = bytearray(b"/") + for b in self.name: + if b in self.allowed_chars: + result.append(b) + else: + result.extend(b"#%02X" % b) + return bytes(result) + + +class PdfArray(List[Any]): + def __bytes__(self) -> bytes: + return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" + + +if TYPE_CHECKING: + _DictBase = collections.UserDict[Union[str, bytes], Any] +else: + _DictBase = collections.UserDict + + +class PdfDict(_DictBase): + def __setattr__(self, key, value): + if key == "data": + collections.UserDict.__setattr__(self, key, value) + else: + self[key.encode("us-ascii")] = value + + def __getattr__(self, key): + try: + value = self[key.encode("us-ascii")] + except KeyError as e: + raise AttributeError(key) from e + if isinstance(value, bytes): + value = decode_text(value) + if key.endswith("Date"): + if value.startswith("D:"): + value = value[2:] + + relationship = "Z" + if len(value) > 17: + relationship = value[14] + offset = int(value[15:17]) * 60 + if len(value) > 20: + offset += int(value[18:20]) + + format = "%Y%m%d%H%M%S"[: len(value) - 2] + value = time.strptime(value[: len(format) + 2], format) + if relationship in ["+", "-"]: + offset *= 60 + if relationship == "+": + offset *= -1 + value = time.gmtime(calendar.timegm(value) + offset) + return value + + def __bytes__(self) -> bytes: + out = bytearray(b"<<") + for key, value in self.items(): + if value is None: + continue + value = pdf_repr(value) + out.extend(b"\n") + out.extend(bytes(PdfName(key))) + out.extend(b" ") + out.extend(value) + out.extend(b"\n>>") + return bytes(out) + + +class PdfBinary: + def __init__(self, data): + self.data = data + + def __bytes__(self) -> bytes: + return b"<%s>" % b"".join(b"%02X" % b for b in self.data) + + +class PdfStream: + def __init__(self, dictionary, buf): + self.dictionary = dictionary + self.buf = buf + + def decode(self): + try: + filter = self.dictionary.Filter + except AttributeError: + return self.buf + if filter == b"FlateDecode": + try: + expected_length = self.dictionary.DL + except AttributeError: + expected_length = self.dictionary.Length + return zlib.decompress(self.buf, bufsize=int(expected_length)) + else: + msg = f"stream filter {repr(self.dictionary.Filter)} unknown/unsupported" + raise NotImplementedError(msg) + + +def pdf_repr(x): + if x is True: + return b"true" + elif x is False: + return b"false" + elif x is None: + return b"null" + elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): + return bytes(x) + elif isinstance(x, (int, float)): + return str(x).encode("us-ascii") + elif isinstance(x, time.struct_time): + return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" + elif isinstance(x, dict): + return bytes(PdfDict(x)) + elif isinstance(x, list): + return bytes(PdfArray(x)) + elif isinstance(x, str): + return pdf_repr(encode_text(x)) + elif isinstance(x, bytes): + # XXX escape more chars? handle binary garbage + x = x.replace(b"\\", b"\\\\") + x = x.replace(b"(", b"\\(") + x = x.replace(b")", b"\\)") + return b"(" + x + b")" + else: + return bytes(x) + + +class PdfParser: + """Based on + https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf + Supports PDF up to 1.4 + """ + + def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): + if buf and f: + msg = "specify buf or f or filename, but not both buf and f" + raise RuntimeError(msg) + self.filename = filename + self.buf = buf + self.f = f + self.start_offset = start_offset + self.should_close_buf = False + self.should_close_file = False + if filename is not None and f is None: + self.f = f = open(filename, mode) + self.should_close_file = True + if f is not None: + self.buf = buf = self.get_buf_from_file(f) + self.should_close_buf = True + if not filename and hasattr(f, "name"): + self.filename = f.name + self.cached_objects = {} + if buf: + self.read_pdf_info() + else: + self.file_size_total = self.file_size_this = 0 + self.root = PdfDict() + self.root_ref = None + self.info = PdfDict() + self.info_ref = None + self.page_tree_root = {} + self.pages = [] + self.orig_pages = [] + self.pages_ref = None + self.last_xref_section_offset = None + self.trailer_dict = {} + self.xref_table = XrefTable() + self.xref_table.reading_finished = True + if f: + self.seek_end() + + def __enter__(self) -> PdfParser: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def start_writing(self) -> None: + self.close_buf() + self.seek_end() + + def close_buf(self) -> None: + try: + self.buf.close() + except AttributeError: + pass + self.buf = None + + def close(self) -> None: + if self.should_close_buf: + self.close_buf() + if self.f is not None and self.should_close_file: + self.f.close() + self.f = None + + def seek_end(self) -> None: + self.f.seek(0, os.SEEK_END) + + def write_header(self) -> None: + self.f.write(b"%PDF-1.4\n") + + def write_comment(self, s): + self.f.write(f"% {s}\n".encode()) + + def write_catalog(self) -> IndirectReference: + self.del_root() + self.root_ref = self.next_object_id(self.f.tell()) + self.pages_ref = self.next_object_id(0) + self.rewrite_pages() + self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) + self.write_obj( + self.pages_ref, + Type=PdfName(b"Pages"), + Count=len(self.pages), + Kids=self.pages, + ) + return self.root_ref + + def rewrite_pages(self) -> None: + pages_tree_nodes_to_delete = [] + for i, page_ref in enumerate(self.orig_pages): + page_info = self.cached_objects[page_ref] + del self.xref_table[page_ref.object_id] + pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) + if page_ref not in self.pages: + # the page has been deleted + continue + # make dict keys into strings for passing to write_page + stringified_page_info = {} + for key, value in page_info.items(): + # key should be a PdfName + stringified_page_info[key.name_as_str()] = value + stringified_page_info["Parent"] = self.pages_ref + new_page_ref = self.write_page(None, **stringified_page_info) + for j, cur_page_ref in enumerate(self.pages): + if cur_page_ref == page_ref: + # replace the page reference with the new one + self.pages[j] = new_page_ref + # delete redundant Pages tree nodes from xref table + for pages_tree_node_ref in pages_tree_nodes_to_delete: + while pages_tree_node_ref: + pages_tree_node = self.cached_objects[pages_tree_node_ref] + if pages_tree_node_ref.object_id in self.xref_table: + del self.xref_table[pages_tree_node_ref.object_id] + pages_tree_node_ref = pages_tree_node.get(b"Parent", None) + self.orig_pages = [] + + def write_xref_and_trailer(self, new_root_ref=None): + if new_root_ref: + self.del_root() + self.root_ref = new_root_ref + if self.info: + self.info_ref = self.write_obj(None, self.info) + start_xref = self.xref_table.write(self.f) + num_entries = len(self.xref_table) + trailer_dict = {b"Root": self.root_ref, b"Size": num_entries} + if self.last_xref_section_offset is not None: + trailer_dict[b"Prev"] = self.last_xref_section_offset + if self.info: + trailer_dict[b"Info"] = self.info_ref + self.last_xref_section_offset = start_xref + self.f.write( + b"trailer\n" + + bytes(PdfDict(trailer_dict)) + + b"\nstartxref\n%d\n%%%%EOF" % start_xref + ) + + def write_page(self, ref, *objs, **dict_obj): + if isinstance(ref, int): + ref = self.pages[ref] + if "Type" not in dict_obj: + dict_obj["Type"] = PdfName(b"Page") + if "Parent" not in dict_obj: + dict_obj["Parent"] = self.pages_ref + return self.write_obj(ref, *objs, **dict_obj) + + def write_obj(self, ref, *objs, **dict_obj): + f = self.f + if ref is None: + ref = self.next_object_id(f.tell()) + else: + self.xref_table[ref.object_id] = (f.tell(), ref.generation) + f.write(bytes(IndirectObjectDef(*ref))) + stream = dict_obj.pop("stream", None) + if stream is not None: + dict_obj["Length"] = len(stream) + if dict_obj: + f.write(pdf_repr(dict_obj)) + for obj in objs: + f.write(pdf_repr(obj)) + if stream is not None: + f.write(b"stream\n") + f.write(stream) + f.write(b"\nendstream\n") + f.write(b"endobj\n") + return ref + + def del_root(self) -> None: + if self.root_ref is None: + return + del self.xref_table[self.root_ref.object_id] + del self.xref_table[self.root[b"Pages"].object_id] + + @staticmethod + def get_buf_from_file(f): + if hasattr(f, "getbuffer"): + return f.getbuffer() + elif hasattr(f, "getvalue"): + return f.getvalue() + else: + try: + return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + except ValueError: # cannot mmap an empty file + return b"" + + def read_pdf_info(self) -> None: + self.file_size_total = len(self.buf) + self.file_size_this = self.file_size_total - self.start_offset + self.read_trailer() + self.root_ref = self.trailer_dict[b"Root"] + self.info_ref = self.trailer_dict.get(b"Info", None) + self.root = PdfDict(self.read_indirect(self.root_ref)) + if self.info_ref is None: + self.info = PdfDict() + else: + self.info = PdfDict(self.read_indirect(self.info_ref)) + check_format_condition(b"Type" in self.root, "/Type missing in Root") + check_format_condition( + self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" + ) + check_format_condition(b"Pages" in self.root, "/Pages missing in Root") + check_format_condition( + isinstance(self.root[b"Pages"], IndirectReference), + "/Pages in Root is not an indirect reference", + ) + self.pages_ref = self.root[b"Pages"] + self.page_tree_root = self.read_indirect(self.pages_ref) + self.pages = self.linearize_page_tree(self.page_tree_root) + # save the original list of page references + # in case the user modifies, adds or deletes some pages + # and we need to rewrite the pages and their list + self.orig_pages = self.pages[:] + + def next_object_id(self, offset=None): + try: + # TODO: support reuse of deleted objects + reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) + except ValueError: + reference = IndirectReference(1, 0) + if offset is not None: + self.xref_table[reference.object_id] = (offset, 0) + return reference + + delimiter = rb"[][()<>{}/%]" + delimiter_or_ws = rb"[][()<>{}/%\000\011\012\014\015\040]" + whitespace = rb"[\000\011\012\014\015\040]" + whitespace_or_hex = rb"[\000\011\012\014\015\0400-9a-fA-F]" + whitespace_optional = whitespace + b"*" + whitespace_mandatory = whitespace + b"+" + # No "\012" aka "\n" or "\015" aka "\r": + whitespace_optional_no_nl = rb"[\000\011\014\040]*" + newline_only = rb"[\r\n]+" + newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl + re_trailer_end = re.compile( + whitespace_mandatory + + rb"trailer" + + whitespace_optional + + rb"<<(.*>>)" + + newline + + rb"startxref" + + newline + + rb"([0-9]+)" + + newline + + rb"%%EOF" + + whitespace_optional + + rb"$", + re.DOTALL, + ) + re_trailer_prev = re.compile( + whitespace_optional + + rb"trailer" + + whitespace_optional + + rb"<<(.*?>>)" + + newline + + rb"startxref" + + newline + + rb"([0-9]+)" + + newline + + rb"%%EOF" + + whitespace_optional, + re.DOTALL, + ) + + def read_trailer(self): + search_start_offset = len(self.buf) - 16384 + if search_start_offset < self.start_offset: + search_start_offset = self.start_offset + m = self.re_trailer_end.search(self.buf, search_start_offset) + check_format_condition(m, "trailer end not found") + # make sure we found the LAST trailer + last_match = m + while m: + last_match = m + m = self.re_trailer_end.search(self.buf, m.start() + 16) + if not m: + m = last_match + trailer_data = m.group(1) + self.last_xref_section_offset = int(m.group(2)) + self.trailer_dict = self.interpret_trailer(trailer_data) + self.xref_table = XrefTable() + self.read_xref_table(xref_section_offset=self.last_xref_section_offset) + if b"Prev" in self.trailer_dict: + self.read_prev_trailer(self.trailer_dict[b"Prev"]) + + def read_prev_trailer(self, xref_section_offset): + trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) + m = self.re_trailer_prev.search( + self.buf[trailer_offset : trailer_offset + 16384] + ) + check_format_condition(m, "previous trailer not found") + trailer_data = m.group(1) + check_format_condition( + int(m.group(2)) == xref_section_offset, + "xref section offset in previous trailer doesn't match what was expected", + ) + trailer_dict = self.interpret_trailer(trailer_data) + if b"Prev" in trailer_dict: + self.read_prev_trailer(trailer_dict[b"Prev"]) + + re_whitespace_optional = re.compile(whitespace_optional) + re_name = re.compile( + whitespace_optional + + rb"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" + + delimiter_or_ws + + rb")" + ) + re_dict_start = re.compile(whitespace_optional + rb"<<") + re_dict_end = re.compile(whitespace_optional + rb">>" + whitespace_optional) + + @classmethod + def interpret_trailer(cls, trailer_data): + trailer = {} + offset = 0 + while True: + m = cls.re_name.match(trailer_data, offset) + if not m: + m = cls.re_dict_end.match(trailer_data, offset) + check_format_condition( + m and m.end() == len(trailer_data), + "name not found in trailer, remaining data: " + + repr(trailer_data[offset:]), + ) + break + key = cls.interpret_name(m.group(1)) + value, offset = cls.get_value(trailer_data, m.end()) + trailer[key] = value + check_format_condition( + b"Size" in trailer and isinstance(trailer[b"Size"], int), + "/Size not in trailer or not an integer", + ) + check_format_condition( + b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), + "/Root not in trailer or not an indirect reference", + ) + return trailer + + re_hashes_in_name = re.compile(rb"([^#]*)(#([0-9a-fA-F]{2}))?") + + @classmethod + def interpret_name(cls, raw, as_text=False): + name = b"" + for m in cls.re_hashes_in_name.finditer(raw): + if m.group(3): + name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) + else: + name += m.group(1) + if as_text: + return name.decode("utf-8") + else: + return bytes(name) + + re_null = re.compile(whitespace_optional + rb"null(?=" + delimiter_or_ws + rb")") + re_true = re.compile(whitespace_optional + rb"true(?=" + delimiter_or_ws + rb")") + re_false = re.compile(whitespace_optional + rb"false(?=" + delimiter_or_ws + rb")") + re_int = re.compile( + whitespace_optional + rb"([-+]?[0-9]+)(?=" + delimiter_or_ws + rb")" + ) + re_real = re.compile( + whitespace_optional + + rb"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" + + delimiter_or_ws + + rb")" + ) + re_array_start = re.compile(whitespace_optional + rb"\[") + re_array_end = re.compile(whitespace_optional + rb"]") + re_string_hex = re.compile( + whitespace_optional + rb"<(" + whitespace_or_hex + rb"*)>" + ) + re_string_lit = re.compile(whitespace_optional + rb"\(") + re_indirect_reference = re.compile( + whitespace_optional + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"R(?=" + + delimiter_or_ws + + rb")" + ) + re_indirect_def_start = re.compile( + whitespace_optional + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"obj(?=" + + delimiter_or_ws + + rb")" + ) + re_indirect_def_end = re.compile( + whitespace_optional + rb"endobj(?=" + delimiter_or_ws + rb")" + ) + re_comment = re.compile( + rb"(" + whitespace_optional + rb"%[^\r\n]*" + newline + rb")*" + ) + re_stream_start = re.compile(whitespace_optional + rb"stream\r?\n") + re_stream_end = re.compile( + whitespace_optional + rb"endstream(?=" + delimiter_or_ws + rb")" + ) + + @classmethod + def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): + if max_nesting == 0: + return None, None + m = cls.re_comment.match(data, offset) + if m: + offset = m.end() + m = cls.re_indirect_def_start.match(data, offset) + if m: + check_format_condition( + int(m.group(1)) > 0, + "indirect object definition: object ID must be greater than 0", + ) + check_format_condition( + int(m.group(2)) >= 0, + "indirect object definition: generation must be non-negative", + ) + check_format_condition( + expect_indirect is None + or expect_indirect + == IndirectReference(int(m.group(1)), int(m.group(2))), + "indirect object definition different than expected", + ) + object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting - 1) + if offset is None: + return object, None + m = cls.re_indirect_def_end.match(data, offset) + check_format_condition(m, "indirect object definition end not found") + return object, m.end() + check_format_condition( + not expect_indirect, "indirect object definition not found" + ) + m = cls.re_indirect_reference.match(data, offset) + if m: + check_format_condition( + int(m.group(1)) > 0, + "indirect object reference: object ID must be greater than 0", + ) + check_format_condition( + int(m.group(2)) >= 0, + "indirect object reference: generation must be non-negative", + ) + return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() + m = cls.re_dict_start.match(data, offset) + if m: + offset = m.end() + result = {} + m = cls.re_dict_end.match(data, offset) + while not m: + key, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) + if offset is None: + return result, None + value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) + result[key] = value + if offset is None: + return result, None + m = cls.re_dict_end.match(data, offset) + offset = m.end() + m = cls.re_stream_start.match(data, offset) + if m: + try: + stream_len_str = result.get(b"Length") + stream_len = int(stream_len_str) + except (TypeError, ValueError) as e: + msg = f"bad or missing Length in stream dict ({stream_len_str})" + raise PdfFormatError(msg) from e + stream_data = data[m.end() : m.end() + stream_len] + m = cls.re_stream_end.match(data, m.end() + stream_len) + check_format_condition(m, "stream end not found") + offset = m.end() + result = PdfStream(PdfDict(result), stream_data) + else: + result = PdfDict(result) + return result, offset + m = cls.re_array_start.match(data, offset) + if m: + offset = m.end() + result = [] + m = cls.re_array_end.match(data, offset) + while not m: + value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) + result.append(value) + if offset is None: + return result, None + m = cls.re_array_end.match(data, offset) + return result, m.end() + m = cls.re_null.match(data, offset) + if m: + return None, m.end() + m = cls.re_true.match(data, offset) + if m: + return True, m.end() + m = cls.re_false.match(data, offset) + if m: + return False, m.end() + m = cls.re_name.match(data, offset) + if m: + return PdfName(cls.interpret_name(m.group(1))), m.end() + m = cls.re_int.match(data, offset) + if m: + return int(m.group(1)), m.end() + m = cls.re_real.match(data, offset) + if m: + # XXX Decimal instead of float??? + return float(m.group(1)), m.end() + m = cls.re_string_hex.match(data, offset) + if m: + # filter out whitespace + hex_string = bytearray( + b for b in m.group(1) if b in b"0123456789abcdefABCDEF" + ) + if len(hex_string) % 2 == 1: + # append a 0 if the length is not even - yes, at the end + hex_string.append(ord(b"0")) + return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() + m = cls.re_string_lit.match(data, offset) + if m: + return cls.get_literal_string(data, m.end()) + # return None, offset # fallback (only for debugging) + msg = f"unrecognized object: {repr(data[offset : offset + 32])}" + raise PdfFormatError(msg) + + re_lit_str_token = re.compile( + rb"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" + ) + escaped_chars = { + b"n": b"\n", + b"r": b"\r", + b"t": b"\t", + b"b": b"\b", + b"f": b"\f", + b"(": b"(", + b")": b")", + b"\\": b"\\", + ord(b"n"): b"\n", + ord(b"r"): b"\r", + ord(b"t"): b"\t", + ord(b"b"): b"\b", + ord(b"f"): b"\f", + ord(b"("): b"(", + ord(b")"): b")", + ord(b"\\"): b"\\", + } + + @classmethod + def get_literal_string(cls, data, offset): + nesting_depth = 0 + result = bytearray() + for m in cls.re_lit_str_token.finditer(data, offset): + result.extend(data[offset : m.start()]) + if m.group(1): + result.extend(cls.escaped_chars[m.group(1)[1]]) + elif m.group(2): + result.append(int(m.group(2)[1:], 8)) + elif m.group(3): + pass + elif m.group(5): + result.extend(b"\n") + elif m.group(6): + result.extend(b"(") + nesting_depth += 1 + elif m.group(7): + if nesting_depth == 0: + return bytes(result), m.end() + result.extend(b")") + nesting_depth -= 1 + offset = m.end() + msg = "unfinished literal string" + raise PdfFormatError(msg) + + re_xref_section_start = re.compile(whitespace_optional + rb"xref" + newline) + re_xref_subsection_start = re.compile( + whitespace_optional + + rb"([0-9]+)" + + whitespace_mandatory + + rb"([0-9]+)" + + whitespace_optional + + newline_only + ) + re_xref_entry = re.compile(rb"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") + + def read_xref_table(self, xref_section_offset): + subsection_found = False + m = self.re_xref_section_start.match( + self.buf, xref_section_offset + self.start_offset + ) + check_format_condition(m, "xref section start not found") + offset = m.end() + while True: + m = self.re_xref_subsection_start.match(self.buf, offset) + if not m: + check_format_condition( + subsection_found, "xref subsection start not found" + ) + break + subsection_found = True + offset = m.end() + first_object = int(m.group(1)) + num_objects = int(m.group(2)) + for i in range(first_object, first_object + num_objects): + m = self.re_xref_entry.match(self.buf, offset) + check_format_condition(m, "xref entry not found") + offset = m.end() + is_free = m.group(3) == b"f" + if not is_free: + generation = int(m.group(2)) + new_entry = (int(m.group(1)), generation) + if i not in self.xref_table: + self.xref_table[i] = new_entry + return offset + + def read_indirect(self, ref, max_nesting=-1): + offset, generation = self.xref_table[ref[0]] + check_format_condition( + generation == ref[1], + f"expected to find generation {ref[1]} for object ID {ref[0]} in xref " + f"table, instead found generation {generation} at offset {offset}", + ) + value = self.get_value( + self.buf, + offset + self.start_offset, + expect_indirect=IndirectReference(*ref), + max_nesting=max_nesting, + )[0] + self.cached_objects[ref] = value + return value + + def linearize_page_tree(self, node=None): + if node is None: + node = self.page_tree_root + check_format_condition( + node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" + ) + pages = [] + for kid in node[b"Kids"]: + kid_object = self.read_indirect(kid) + if kid_object[b"Type"] == b"Page": + pages.append(kid) + else: + pages.extend(self.linearize_page_tree(node=kid_object)) + return pages diff --git a/.venv/lib/python3.11/site-packages/PIL/PixarImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/PixarImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..887b6568bf72dfda4a6330e5eed17c07e6e293da --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PixarImagePlugin.py @@ -0,0 +1,72 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIXAR raster support for PIL +# +# history: +# 97-01-29 fl Created +# +# notes: +# This is incomplete; it is based on a few samples created with +# Photoshop 2.5 and 3.0, and a summary description provided by +# Greg Coats . Hopefully, "L" and +# "RGBA" support will be added in future versions. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFile +from ._binary import i16le as i16 + +# +# helpers + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"\200\350\000\000" + + +## +# Image plugin for PIXAR raster images. + + +class PixarImageFile(ImageFile.ImageFile): + format = "PIXAR" + format_description = "PIXAR raster image" + + def _open(self) -> None: + # assuming a 4-byte magic label + assert self.fp is not None + + s = self.fp.read(4) + if not _accept(s): + msg = "not a PIXAR file" + raise SyntaxError(msg) + + # read rest of header + s = s + self.fp.read(508) + + self._size = i16(s, 418), i16(s, 416) + + # get channel/depth descriptions + mode = i16(s, 424), i16(s, 426) + + if mode == (14, 2): + self._mode = "RGB" + # FIXME: to be continued... + + # create tile descriptor (assuming "dumped") + self.tile = [("raw", (0, 0) + self.size, 1024, (self.mode, 0, 1))] + + +# +# -------------------------------------------------------------------- + +Image.register_open(PixarImageFile.format, PixarImageFile, _accept) + +Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/.venv/lib/python3.11/site-packages/PIL/PngImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/PngImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..d2834929b8f9ec16436900ace0053d3db9f6ca5a --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PngImagePlugin.py @@ -0,0 +1,1489 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PNG support code +# +# See "PNG (Portable Network Graphics) Specification, version 1.0; +# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). +# +# history: +# 1996-05-06 fl Created (couldn't resist it) +# 1996-12-14 fl Upgraded, added read and verify support (0.2) +# 1996-12-15 fl Separate PNG stream parser +# 1996-12-29 fl Added write support, added getchunks +# 1996-12-30 fl Eliminated circular references in decoder (0.3) +# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) +# 2001-02-08 fl Added transparency support (from Zircon) (0.5) +# 2001-04-16 fl Don't close data source in "open" method (0.6) +# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) +# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) +# 2004-09-20 fl Added PngInfo chunk container +# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) +# 2008-08-13 fl Added tRNS support for RGB images +# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) +# 2009-03-08 fl Added zTXT support (from Lowell Alleman) +# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) +# +# Copyright (c) 1997-2009 by Secret Labs AB +# Copyright (c) 1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import itertools +import logging +import re +import struct +import warnings +import zlib +from enum import IntEnum +from typing import IO, TYPE_CHECKING, Any, NoReturn + +from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +from ._binary import o16be as o16 +from ._binary import o32be as o32 + +if TYPE_CHECKING: + from . import _imaging + +logger = logging.getLogger(__name__) + +is_cid = re.compile(rb"\w\w\w\w").match + + +_MAGIC = b"\211PNG\r\n\032\n" + + +_MODES = { + # supported bits/color combinations, and corresponding modes/rawmodes + # Grayscale + (1, 0): ("1", "1"), + (2, 0): ("L", "L;2"), + (4, 0): ("L", "L;4"), + (8, 0): ("L", "L"), + (16, 0): ("I;16", "I;16B"), + # Truecolour + (8, 2): ("RGB", "RGB"), + (16, 2): ("RGB", "RGB;16B"), + # Indexed-colour + (1, 3): ("P", "P;1"), + (2, 3): ("P", "P;2"), + (4, 3): ("P", "P;4"), + (8, 3): ("P", "P"), + # Grayscale with alpha + (8, 4): ("LA", "LA"), + (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available + # Truecolour with alpha + (8, 6): ("RGBA", "RGBA"), + (16, 6): ("RGBA", "RGBA;16B"), +} + + +_simple_palette = re.compile(b"^\xff*\x00\xff*$") + +MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK +""" +Maximum decompressed size for a iTXt or zTXt chunk. +Eliminates decompression bombs where compressed chunks can expand 1000x. +See :ref:`Text in PNG File Format`. +""" +MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK +""" +Set the maximum total text chunk size. +See :ref:`Text in PNG File Format`. +""" + + +# APNG frame disposal modes +class Disposal(IntEnum): + OP_NONE = 0 + """ + No disposal is done on this frame before rendering the next frame. + See :ref:`Saving APNG sequences`. + """ + OP_BACKGROUND = 1 + """ + This frame’s modified region is cleared to fully transparent black before rendering + the next frame. + See :ref:`Saving APNG sequences`. + """ + OP_PREVIOUS = 2 + """ + This frame’s modified region is reverted to the previous frame’s contents before + rendering the next frame. + See :ref:`Saving APNG sequences`. + """ + + +# APNG frame blend modes +class Blend(IntEnum): + OP_SOURCE = 0 + """ + All color components of this frame, including alpha, overwrite the previous output + image contents. + See :ref:`Saving APNG sequences`. + """ + OP_OVER = 1 + """ + This frame should be alpha composited with the previous output image contents. + See :ref:`Saving APNG sequences`. + """ + + +def _safe_zlib_decompress(s): + dobj = zlib.decompressobj() + plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) + if dobj.unconsumed_tail: + msg = "Decompressed Data Too Large" + raise ValueError(msg) + return plaintext + + +def _crc32(data, seed=0): + return zlib.crc32(data, seed) & 0xFFFFFFFF + + +# -------------------------------------------------------------------- +# Support classes. Suitable for PNG and related formats like MNG etc. + + +class ChunkStream: + def __init__(self, fp: IO[bytes]) -> None: + self.fp: IO[bytes] | None = fp + self.queue: list[tuple[bytes, int, int]] | None = [] + + def read(self) -> tuple[bytes, int, int]: + """Fetch a new chunk. Returns header information.""" + cid = None + + assert self.fp is not None + if self.queue: + cid, pos, length = self.queue.pop() + self.fp.seek(pos) + else: + s = self.fp.read(8) + cid = s[4:] + pos = self.fp.tell() + length = i32(s) + + if not is_cid(cid): + if not ImageFile.LOAD_TRUNCATED_IMAGES: + msg = f"broken PNG file (chunk {repr(cid)})" + raise SyntaxError(msg) + + return cid, pos, length + + def __enter__(self) -> ChunkStream: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def close(self) -> None: + self.queue = self.fp = None + + def push(self, cid: bytes, pos: int, length: int) -> None: + assert self.queue is not None + self.queue.append((cid, pos, length)) + + def call(self, cid, pos, length): + """Call the appropriate chunk handler""" + + logger.debug("STREAM %r %s %s", cid, pos, length) + return getattr(self, f"chunk_{cid.decode('ascii')}")(pos, length) + + def crc(self, cid: bytes, data: bytes) -> None: + """Read and verify checksum""" + + # Skip CRC checks for ancillary chunks if allowed to load truncated + # images + # 5th byte of first char is 1 [specs, section 5.4] + if ImageFile.LOAD_TRUNCATED_IMAGES and (cid[0] >> 5 & 1): + self.crc_skip(cid, data) + return + + assert self.fp is not None + try: + crc1 = _crc32(data, _crc32(cid)) + crc2 = i32(self.fp.read(4)) + if crc1 != crc2: + msg = f"broken PNG file (bad header checksum in {repr(cid)})" + raise SyntaxError(msg) + except struct.error as e: + msg = f"broken PNG file (incomplete checksum in {repr(cid)})" + raise SyntaxError(msg) from e + + def crc_skip(self, cid: bytes, data: bytes) -> None: + """Read checksum""" + + assert self.fp is not None + self.fp.read(4) + + def verify(self, endchunk: bytes = b"IEND") -> list[bytes]: + # Simple approach; just calculate checksum for all remaining + # blocks. Must be called directly after open. + + cids = [] + + while True: + try: + cid, pos, length = self.read() + except struct.error as e: + msg = "truncated PNG file" + raise OSError(msg) from e + + if cid == endchunk: + break + self.crc(cid, ImageFile._safe_read(self.fp, length)) + cids.append(cid) + + return cids + + +class iTXt(str): + """ + Subclass of string to allow iTXt chunks to look like strings while + keeping their extra information + + """ + + lang: str | bytes | None + tkey: str | bytes | None + + @staticmethod + def __new__(cls, text, lang=None, tkey=None): + """ + :param cls: the class to use when creating the instance + :param text: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + """ + + self = str.__new__(cls, text) + self.lang = lang + self.tkey = tkey + return self + + +class PngInfo: + """ + PNG chunk container (for use with save(pnginfo=)) + + """ + + def __init__(self) -> None: + self.chunks: list[tuple[bytes, bytes, bool]] = [] + + def add(self, cid: bytes, data: bytes, after_idat: bool = False) -> None: + """Appends an arbitrary chunk. Use with caution. + + :param cid: a byte string, 4 bytes long. + :param data: a byte string of the encoded data + :param after_idat: for use with private chunks. Whether the chunk + should be written after IDAT + + """ + + self.chunks.append((cid, data, after_idat)) + + def add_itxt( + self, + key: str | bytes, + value: str | bytes, + lang: str | bytes = "", + tkey: str | bytes = "", + zip: bool = False, + ) -> None: + """Appends an iTXt chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + :param zip: compression flag + + """ + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + if not isinstance(value, bytes): + value = value.encode("utf-8", "strict") + if not isinstance(lang, bytes): + lang = lang.encode("utf-8", "strict") + if not isinstance(tkey, bytes): + tkey = tkey.encode("utf-8", "strict") + + if zip: + self.add( + b"iTXt", + key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value), + ) + else: + self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value) + + def add_text( + self, key: str | bytes, value: str | bytes | iTXt, zip: bool = False + ) -> None: + """Appends a text chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key, text or an + :py:class:`PIL.PngImagePlugin.iTXt` instance + :param zip: compression flag + + """ + if isinstance(value, iTXt): + return self.add_itxt( + key, + value, + value.lang if value.lang is not None else b"", + value.tkey if value.tkey is not None else b"", + zip=zip, + ) + + # The tEXt chunk stores latin-1 text + if not isinstance(value, bytes): + try: + value = value.encode("latin-1", "strict") + except UnicodeError: + return self.add_itxt(key, value, zip=zip) + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + + if zip: + self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) + else: + self.add(b"tEXt", key + b"\0" + value) + + +# -------------------------------------------------------------------- +# PNG image stream (IHDR/IEND) + + +class PngStream(ChunkStream): + def __init__(self, fp): + super().__init__(fp) + + # local copies of Image attributes + self.im_info = {} + self.im_text = {} + self.im_size = (0, 0) + self.im_mode = None + self.im_tile = None + self.im_palette = None + self.im_custom_mimetype = None + self.im_n_frames = None + self._seq_num = None + self.rewind_state = None + + self.text_memory = 0 + + def check_text_memory(self, chunklen: int) -> None: + self.text_memory += chunklen + if self.text_memory > MAX_TEXT_MEMORY: + msg = ( + "Too much memory used in text chunks: " + f"{self.text_memory}>MAX_TEXT_MEMORY" + ) + raise ValueError(msg) + + def save_rewind(self) -> None: + self.rewind_state = { + "info": self.im_info.copy(), + "tile": self.im_tile, + "seq_num": self._seq_num, + } + + def rewind(self) -> None: + self.im_info = self.rewind_state["info"].copy() + self.im_tile = self.rewind_state["tile"] + self._seq_num = self.rewind_state["seq_num"] + + def chunk_iCCP(self, pos: int, length: int) -> bytes: + # ICC profile + s = ImageFile._safe_read(self.fp, length) + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + i = s.find(b"\0") + logger.debug("iCCP profile name %r", s[:i]) + comp_method = s[i + 1] + logger.debug("Compression method %s", comp_method) + if comp_method != 0: + msg = f"Unknown compression method {comp_method} in iCCP chunk" + raise SyntaxError(msg) + try: + icc_profile = _safe_zlib_decompress(s[i + 2 :]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + icc_profile = None + else: + raise + except zlib.error: + icc_profile = None # FIXME + self.im_info["icc_profile"] = icc_profile + return s + + def chunk_IHDR(self, pos: int, length: int) -> bytes: + # image header + s = ImageFile._safe_read(self.fp, length) + if length < 13: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "Truncated IHDR chunk" + raise ValueError(msg) + self.im_size = i32(s, 0), i32(s, 4) + try: + self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] + except Exception: + pass + if s[12]: + self.im_info["interlace"] = 1 + if s[11]: + msg = "unknown filter category" + raise SyntaxError(msg) + return s + + def chunk_IDAT(self, pos: int, length: int) -> NoReturn: + # image data + if "bbox" in self.im_info: + tile = [("zip", self.im_info["bbox"], pos, self.im_rawmode)] + else: + if self.im_n_frames is not None: + self.im_info["default_image"] = True + tile = [("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] + self.im_tile = tile + self.im_idat = length + msg = "image data found" + raise EOFError(msg) + + def chunk_IEND(self, pos: int, length: int) -> NoReturn: + msg = "end of PNG image" + raise EOFError(msg) + + def chunk_PLTE(self, pos: int, length: int) -> bytes: + # palette + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + self.im_palette = "RGB", s + return s + + def chunk_tRNS(self, pos: int, length: int) -> bytes: + # transparency + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + if _simple_palette.match(s): + # tRNS contains only one full-transparent entry, + # other entries are full opaque + i = s.find(b"\0") + if i >= 0: + self.im_info["transparency"] = i + else: + # otherwise, we have a byte string with one alpha value + # for each palette entry + self.im_info["transparency"] = s + elif self.im_mode in ("1", "L", "I;16"): + self.im_info["transparency"] = i16(s) + elif self.im_mode == "RGB": + self.im_info["transparency"] = i16(s), i16(s, 2), i16(s, 4) + return s + + def chunk_gAMA(self, pos: int, length: int) -> bytes: + # gamma setting + s = ImageFile._safe_read(self.fp, length) + self.im_info["gamma"] = i32(s) / 100000.0 + return s + + def chunk_cHRM(self, pos: int, length: int) -> bytes: + # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 + # WP x,y, Red x,y, Green x,y Blue x,y + + s = ImageFile._safe_read(self.fp, length) + raw_vals = struct.unpack(">%dI" % (len(s) // 4), s) + self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) + return s + + def chunk_sRGB(self, pos: int, length: int) -> bytes: + # srgb rendering intent, 1 byte + # 0 perceptual + # 1 relative colorimetric + # 2 saturation + # 3 absolute colorimetric + + s = ImageFile._safe_read(self.fp, length) + if length < 1: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "Truncated sRGB chunk" + raise ValueError(msg) + self.im_info["srgb"] = s[0] + return s + + def chunk_pHYs(self, pos: int, length: int) -> bytes: + # pixels per unit + s = ImageFile._safe_read(self.fp, length) + if length < 9: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "Truncated pHYs chunk" + raise ValueError(msg) + px, py = i32(s, 0), i32(s, 4) + unit = s[8] + if unit == 1: # meter + dpi = px * 0.0254, py * 0.0254 + self.im_info["dpi"] = dpi + elif unit == 0: + self.im_info["aspect"] = px, py + return s + + def chunk_tEXt(self, pos: int, length: int) -> bytes: + # text + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + # fallback for broken tEXt tags + k = s + v = b"" + if k: + k = k.decode("latin-1", "strict") + v_str = v.decode("latin-1", "replace") + + self.im_info[k] = v if k == "exif" else v_str + self.im_text[k] = v_str + self.check_text_memory(len(v_str)) + + return s + + def chunk_zTXt(self, pos: int, length: int) -> bytes: + # compressed text + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + k = s + v = b"" + if v: + comp_method = v[0] + else: + comp_method = 0 + if comp_method != 0: + msg = f"Unknown compression method {comp_method} in zTXt chunk" + raise SyntaxError(msg) + try: + v = _safe_zlib_decompress(v[1:]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + v = b"" + else: + raise + except zlib.error: + v = b"" + + if k: + k = k.decode("latin-1", "strict") + v = v.decode("latin-1", "replace") + + self.im_info[k] = self.im_text[k] = v + self.check_text_memory(len(v)) + + return s + + def chunk_iTXt(self, pos: int, length: int) -> bytes: + # international text + r = s = ImageFile._safe_read(self.fp, length) + try: + k, r = r.split(b"\0", 1) + except ValueError: + return s + if len(r) < 2: + return s + cf, cm, r = r[0], r[1], r[2:] + try: + lang, tk, v = r.split(b"\0", 2) + except ValueError: + return s + if cf != 0: + if cm == 0: + try: + v = _safe_zlib_decompress(v) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + else: + raise + except zlib.error: + return s + else: + return s + if k == b"XML:com.adobe.xmp": + self.im_info["xmp"] = v + try: + k = k.decode("latin-1", "strict") + lang = lang.decode("utf-8", "strict") + tk = tk.decode("utf-8", "strict") + v = v.decode("utf-8", "strict") + except UnicodeError: + return s + + self.im_info[k] = self.im_text[k] = iTXt(v, lang, tk) + self.check_text_memory(len(v)) + + return s + + def chunk_eXIf(self, pos: int, length: int) -> bytes: + s = ImageFile._safe_read(self.fp, length) + self.im_info["exif"] = b"Exif\x00\x00" + s + return s + + # APNG chunks + def chunk_acTL(self, pos: int, length: int) -> bytes: + s = ImageFile._safe_read(self.fp, length) + if length < 8: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "APNG contains truncated acTL chunk" + raise ValueError(msg) + if self.im_n_frames is not None: + self.im_n_frames = None + warnings.warn("Invalid APNG, will use default PNG image if possible") + return s + n_frames = i32(s) + if n_frames == 0 or n_frames > 0x80000000: + warnings.warn("Invalid APNG, will use default PNG image if possible") + return s + self.im_n_frames = n_frames + self.im_info["loop"] = i32(s, 4) + self.im_custom_mimetype = "image/apng" + return s + + def chunk_fcTL(self, pos: int, length: int) -> bytes: + s = ImageFile._safe_read(self.fp, length) + if length < 26: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "APNG contains truncated fcTL chunk" + raise ValueError(msg) + seq = i32(s) + if (self._seq_num is None and seq != 0) or ( + self._seq_num is not None and self._seq_num != seq - 1 + ): + msg = "APNG contains frame sequence errors" + raise SyntaxError(msg) + self._seq_num = seq + width, height = i32(s, 4), i32(s, 8) + px, py = i32(s, 12), i32(s, 16) + im_w, im_h = self.im_size + if px + width > im_w or py + height > im_h: + msg = "APNG contains invalid frames" + raise SyntaxError(msg) + self.im_info["bbox"] = (px, py, px + width, py + height) + delay_num, delay_den = i16(s, 20), i16(s, 22) + if delay_den == 0: + delay_den = 100 + self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 + self.im_info["disposal"] = s[24] + self.im_info["blend"] = s[25] + return s + + def chunk_fdAT(self, pos: int, length: int) -> bytes: + if length < 4: + if ImageFile.LOAD_TRUNCATED_IMAGES: + s = ImageFile._safe_read(self.fp, length) + return s + msg = "APNG contains truncated fDAT chunk" + raise ValueError(msg) + s = ImageFile._safe_read(self.fp, 4) + seq = i32(s) + if self._seq_num != seq - 1: + msg = "APNG contains frame sequence errors" + raise SyntaxError(msg) + self._seq_num = seq + return self.chunk_IDAT(pos + 4, length - 4) + + +# -------------------------------------------------------------------- +# PNG reader + + +def _accept(prefix: bytes) -> bool: + return prefix[:8] == _MAGIC + + +## +# Image plugin for PNG images. + + +class PngImageFile(ImageFile.ImageFile): + format = "PNG" + format_description = "Portable network graphics" + + def _open(self) -> None: + if not _accept(self.fp.read(8)): + msg = "not a PNG file" + raise SyntaxError(msg) + self._fp = self.fp + self.__frame = 0 + + # + # Parse headers up to the first IDAT or fDAT chunk + + self.private_chunks: list[tuple[bytes, bytes] | tuple[bytes, bytes, bool]] = [] + self.png: PngStream | None = PngStream(self.fp) + + while True: + # + # get next chunk + + cid, pos, length = self.png.read() + + try: + s = self.png.call(cid, pos, length) + except EOFError: + break + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + s = ImageFile._safe_read(self.fp, length) + if cid[1:2].islower(): + self.private_chunks.append((cid, s)) + + self.png.crc(cid, s) + + # + # Copy relevant attributes from the PngStream. An alternative + # would be to let the PngStream class modify these attributes + # directly, but that introduces circular references which are + # difficult to break if things go wrong in the decoder... + # (believe me, I've tried ;-) + + self._mode = self.png.im_mode + self._size = self.png.im_size + self.info = self.png.im_info + self._text = None + self.tile = self.png.im_tile + self.custom_mimetype = self.png.im_custom_mimetype + self.n_frames = self.png.im_n_frames or 1 + self.default_image = self.info.get("default_image", False) + + if self.png.im_palette: + rawmode, data = self.png.im_palette + self.palette = ImagePalette.raw(rawmode, data) + + if cid == b"fdAT": + self.__prepare_idat = length - 4 + else: + self.__prepare_idat = length # used by load_prepare() + + if self.png.im_n_frames is not None: + self._close_exclusive_fp_after_loading = False + self.png.save_rewind() + self.__rewind_idat = self.__prepare_idat + self.__rewind = self._fp.tell() + if self.default_image: + # IDAT chunk contains default image and not first animation frame + self.n_frames += 1 + self._seek(0) + self.is_animated = self.n_frames > 1 + + @property + def text(self): + # experimental + if self._text is None: + # iTxt, tEXt and zTXt chunks may appear at the end of the file + # So load the file to ensure that they are read + if self.is_animated: + frame = self.__frame + # for APNG, seek to the final frame before loading + self.seek(self.n_frames - 1) + self.load() + if self.is_animated: + self.seek(frame) + return self._text + + def verify(self) -> None: + """Verify PNG file""" + + if self.fp is None: + msg = "verify must be called directly after open" + raise RuntimeError(msg) + + # back up to beginning of IDAT block + self.fp.seek(self.tile[0][2] - 8) + + assert self.png is not None + self.png.verify() + self.png.close() + + if self._exclusive_fp: + self.fp.close() + self.fp = None + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0, True) + + last_frame = self.__frame + for f in range(self.__frame + 1, frame + 1): + try: + self._seek(f) + except EOFError as e: + self.seek(last_frame) + msg = "no more images in APNG file" + raise EOFError(msg) from e + + def _seek(self, frame: int, rewind: bool = False) -> None: + assert self.png is not None + + self.dispose: _imaging.ImagingCore | None + if frame == 0: + if rewind: + self._fp.seek(self.__rewind) + self.png.rewind() + self.__prepare_idat = self.__rewind_idat + self.im = None + if self.pyaccess: + self.pyaccess = None + self.info = self.png.im_info + self.tile = self.png.im_tile + self.fp = self._fp + self._prev_im = None + self.dispose = None + self.default_image = self.info.get("default_image", False) + self.dispose_op = self.info.get("disposal") + self.blend_op = self.info.get("blend") + self.dispose_extent = self.info.get("bbox") + self.__frame = 0 + else: + if frame != self.__frame + 1: + msg = f"cannot seek to frame {frame}" + raise ValueError(msg) + + # ensure previous frame was loaded + self.load() + + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + self._prev_im = self.im.copy() + + self.fp = self._fp + + # advance to the next frame + if self.__prepare_idat: + ImageFile._safe_read(self.fp, self.__prepare_idat) + self.__prepare_idat = 0 + frame_start = False + while True: + self.fp.read(4) # CRC + + try: + cid, pos, length = self.png.read() + except (struct.error, SyntaxError): + break + + if cid == b"IEND": + msg = "No more images in APNG file" + raise EOFError(msg) + if cid == b"fcTL": + if frame_start: + # there must be at least one fdAT chunk between fcTL chunks + msg = "APNG missing frame data" + raise SyntaxError(msg) + frame_start = True + + try: + self.png.call(cid, pos, length) + except UnicodeDecodeError: + break + except EOFError: + if cid == b"fdAT": + length -= 4 + if frame_start: + self.__prepare_idat = length + break + ImageFile._safe_read(self.fp, length) + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + ImageFile._safe_read(self.fp, length) + + self.__frame = frame + self.tile = self.png.im_tile + self.dispose_op = self.info.get("disposal") + self.blend_op = self.info.get("blend") + self.dispose_extent = self.info.get("bbox") + + if not self.tile: + msg = "image not found in APNG frame" + raise EOFError(msg) + + # setup frame disposal (actual disposal done when needed in the next _seek()) + if self._prev_im is None and self.dispose_op == Disposal.OP_PREVIOUS: + self.dispose_op = Disposal.OP_BACKGROUND + + self.dispose = None + if self.dispose_op == Disposal.OP_PREVIOUS: + if self._prev_im: + self.dispose = self._prev_im.copy() + self.dispose = self._crop(self.dispose, self.dispose_extent) + elif self.dispose_op == Disposal.OP_BACKGROUND: + self.dispose = Image.core.fill(self.mode, self.size) + self.dispose = self._crop(self.dispose, self.dispose_extent) + + def tell(self) -> int: + return self.__frame + + def load_prepare(self) -> None: + """internal: prepare to read PNG file""" + + if self.info.get("interlace"): + self.decoderconfig = self.decoderconfig + (1,) + + self.__idat = self.__prepare_idat # used by load_read() + ImageFile.ImageFile.load_prepare(self) + + def load_read(self, read_bytes: int) -> bytes: + """internal: read more image data""" + + assert self.png is not None + while self.__idat == 0: + # end of chunk, skip forward to next one + + self.fp.read(4) # CRC + + cid, pos, length = self.png.read() + + if cid not in [b"IDAT", b"DDAT", b"fdAT"]: + self.png.push(cid, pos, length) + return b"" + + if cid == b"fdAT": + try: + self.png.call(cid, pos, length) + except EOFError: + pass + self.__idat = length - 4 # sequence_num has already been read + else: + self.__idat = length # empty chunks are allowed + + # read more data from this chunk + if read_bytes <= 0: + read_bytes = self.__idat + else: + read_bytes = min(read_bytes, self.__idat) + + self.__idat = self.__idat - read_bytes + + return self.fp.read(read_bytes) + + def load_end(self) -> None: + """internal: finished reading image data""" + assert self.png is not None + if self.__idat != 0: + self.fp.read(self.__idat) + while True: + self.fp.read(4) # CRC + + try: + cid, pos, length = self.png.read() + except (struct.error, SyntaxError): + break + + if cid == b"IEND": + break + elif cid == b"fcTL" and self.is_animated: + # start of the next frame, stop reading + self.__prepare_idat = 0 + self.png.push(cid, pos, length) + break + + try: + self.png.call(cid, pos, length) + except UnicodeDecodeError: + break + except EOFError: + if cid == b"fdAT": + length -= 4 + try: + ImageFile._safe_read(self.fp, length) + except OSError as e: + if ImageFile.LOAD_TRUNCATED_IMAGES: + break + else: + raise e + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + s = ImageFile._safe_read(self.fp, length) + if cid[1:2].islower(): + self.private_chunks.append((cid, s, True)) + self._text = self.png.im_text + if not self.is_animated: + self.png.close() + self.png = None + else: + if self._prev_im and self.blend_op == Blend.OP_OVER: + updated = self._crop(self.im, self.dispose_extent) + if self.im.mode == "RGB" and "transparency" in self.info: + mask = updated.convert_transparent( + "RGBA", self.info["transparency"] + ) + else: + mask = updated.convert("RGBA") + self._prev_im.paste(updated, self.dispose_extent, mask) + self.im = self._prev_im + if self.pyaccess: + self.pyaccess = None + + def _getexif(self) -> dict[str, Any] | None: + if "exif" not in self.info: + self.load() + if "exif" not in self.info and "Raw profile type exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + def getexif(self) -> Image.Exif: + if "exif" not in self.info: + self.load() + + return super().getexif() + + +# -------------------------------------------------------------------- +# PNG writer + +_OUTMODES = { + # supported PIL modes, and corresponding rawmode, bit depth and color type + "1": ("1", b"\x01", b"\x00"), + "L;1": ("L;1", b"\x01", b"\x00"), + "L;2": ("L;2", b"\x02", b"\x00"), + "L;4": ("L;4", b"\x04", b"\x00"), + "L": ("L", b"\x08", b"\x00"), + "LA": ("LA", b"\x08", b"\x04"), + "I": ("I;16B", b"\x10", b"\x00"), + "I;16": ("I;16B", b"\x10", b"\x00"), + "I;16B": ("I;16B", b"\x10", b"\x00"), + "P;1": ("P;1", b"\x01", b"\x03"), + "P;2": ("P;2", b"\x02", b"\x03"), + "P;4": ("P;4", b"\x04", b"\x03"), + "P": ("P", b"\x08", b"\x03"), + "RGB": ("RGB", b"\x08", b"\x02"), + "RGBA": ("RGBA", b"\x08", b"\x06"), +} + + +def putchunk(fp, cid, *data): + """Write a PNG chunk (including CRC field)""" + + data = b"".join(data) + + fp.write(o32(len(data)) + cid) + fp.write(data) + crc = _crc32(data, _crc32(cid)) + fp.write(o32(crc)) + + +class _idat: + # wrap output from the encoder in IDAT chunks + + def __init__(self, fp, chunk): + self.fp = fp + self.chunk = chunk + + def write(self, data: bytes) -> None: + self.chunk(self.fp, b"IDAT", data) + + +class _fdat: + # wrap encoder output in fdAT chunks + + def __init__(self, fp, chunk, seq_num): + self.fp = fp + self.chunk = chunk + self.seq_num = seq_num + + def write(self, data: bytes) -> None: + self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) + self.seq_num += 1 + + +def _write_multiple_frames(im, fp, chunk, mode, rawmode, default_image, append_images): + duration = im.encoderinfo.get("duration") + loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) + disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE)) + blend = im.encoderinfo.get("blend", im.info.get("blend", Blend.OP_SOURCE)) + + if default_image: + chain = itertools.chain(append_images) + else: + chain = itertools.chain([im], append_images) + + im_frames = [] + frame_count = 0 + for im_seq in chain: + for im_frame in ImageSequence.Iterator(im_seq): + if im_frame.mode == mode: + im_frame = im_frame.copy() + else: + im_frame = im_frame.convert(mode) + encoderinfo = im.encoderinfo.copy() + if isinstance(duration, (list, tuple)): + encoderinfo["duration"] = duration[frame_count] + elif duration is None and "duration" in im_frame.info: + encoderinfo["duration"] = im_frame.info["duration"] + if isinstance(disposal, (list, tuple)): + encoderinfo["disposal"] = disposal[frame_count] + if isinstance(blend, (list, tuple)): + encoderinfo["blend"] = blend[frame_count] + frame_count += 1 + + if im_frames: + previous = im_frames[-1] + prev_disposal = previous["encoderinfo"].get("disposal") + prev_blend = previous["encoderinfo"].get("blend") + if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2: + prev_disposal = Disposal.OP_BACKGROUND + + if prev_disposal == Disposal.OP_BACKGROUND: + base_im = previous["im"].copy() + dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) + bbox = previous["bbox"] + if bbox: + dispose = dispose.crop(bbox) + else: + bbox = (0, 0) + im.size + base_im.paste(dispose, bbox) + elif prev_disposal == Disposal.OP_PREVIOUS: + base_im = im_frames[-2]["im"] + else: + base_im = previous["im"] + delta = ImageChops.subtract_modulo( + im_frame.convert("RGBA"), base_im.convert("RGBA") + ) + bbox = delta.getbbox(alpha_only=False) + if ( + not bbox + and prev_disposal == encoderinfo.get("disposal") + and prev_blend == encoderinfo.get("blend") + and "duration" in encoderinfo + ): + previous["encoderinfo"]["duration"] += encoderinfo["duration"] + continue + else: + bbox = None + im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) + + if len(im_frames) == 1 and not default_image: + return im_frames[0]["im"] + + # animation control + chunk( + fp, + b"acTL", + o32(len(im_frames)), # 0: num_frames + o32(loop), # 4: num_plays + ) + + # default image IDAT (if it exists) + if default_image: + if im.mode != mode: + im = im.convert(mode) + ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) + + seq_num = 0 + for frame, frame_data in enumerate(im_frames): + im_frame = frame_data["im"] + if not frame_data["bbox"]: + bbox = (0, 0) + im_frame.size + else: + bbox = frame_data["bbox"] + im_frame = im_frame.crop(bbox) + size = im_frame.size + encoderinfo = frame_data["encoderinfo"] + frame_duration = int(round(encoderinfo.get("duration", 0))) + frame_disposal = encoderinfo.get("disposal", disposal) + frame_blend = encoderinfo.get("blend", blend) + # frame control + chunk( + fp, + b"fcTL", + o32(seq_num), # sequence_number + o32(size[0]), # width + o32(size[1]), # height + o32(bbox[0]), # x_offset + o32(bbox[1]), # y_offset + o16(frame_duration), # delay_numerator + o16(1000), # delay_denominator + o8(frame_disposal), # dispose_op + o8(frame_blend), # blend_op + ) + seq_num += 1 + # frame data + if frame == 0 and not default_image: + # first frame must be in IDAT chunks for backwards compatibility + ImageFile._save( + im_frame, + _idat(fp, chunk), + [("zip", (0, 0) + im_frame.size, 0, rawmode)], + ) + else: + fdat_chunks = _fdat(fp, chunk, seq_num) + ImageFile._save( + im_frame, + fdat_chunks, + [("zip", (0, 0) + im_frame.size, 0, rawmode)], + ) + seq_num = fdat_chunks.seq_num + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +def _save(im, fp, filename, chunk=putchunk, save_all=False): + # save an image to disk (called by the save method) + + if save_all: + default_image = im.encoderinfo.get( + "default_image", im.info.get("default_image") + ) + modes = set() + sizes = set() + append_images = im.encoderinfo.get("append_images", []) + for im_seq in itertools.chain([im], append_images): + for im_frame in ImageSequence.Iterator(im_seq): + modes.add(im_frame.mode) + sizes.add(im_frame.size) + for mode in ("RGBA", "RGB", "P"): + if mode in modes: + break + else: + mode = modes.pop() + size = tuple(max(frame_size[i] for frame_size in sizes) for i in range(2)) + else: + size = im.size + mode = im.mode + + outmode = mode + if mode == "P": + # + # attempt to minimize storage requirements for palette images + if "bits" in im.encoderinfo: + # number of bits specified by user + colors = min(1 << im.encoderinfo["bits"], 256) + else: + # check palette contents + if im.palette: + colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1) + else: + colors = 256 + + if colors <= 16: + if colors <= 2: + bits = 1 + elif colors <= 4: + bits = 2 + else: + bits = 4 + outmode += f";{bits}" + + # encoder options + im.encoderconfig = ( + im.encoderinfo.get("optimize", False), + im.encoderinfo.get("compress_level", -1), + im.encoderinfo.get("compress_type", -1), + im.encoderinfo.get("dictionary", b""), + ) + + # get the corresponding PNG mode + try: + rawmode, bit_depth, color_type = _OUTMODES[outmode] + except KeyError as e: + msg = f"cannot write mode {mode} as PNG" + raise OSError(msg) from e + + # + # write minimal PNG file + + fp.write(_MAGIC) + + chunk( + fp, + b"IHDR", + o32(size[0]), # 0: size + o32(size[1]), + bit_depth, + color_type, + b"\0", # 10: compression + b"\0", # 11: filter category + b"\0", # 12: interlace flag + ) + + chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] + + icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + # ICC profile + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + name = b"ICC Profile" + data = name + b"\0\0" + zlib.compress(icc) + chunk(fp, b"iCCP", data) + + # You must either have sRGB or iCCP. + # Disallow sRGB chunks when an iCCP-chunk has been emitted. + chunks.remove(b"sRGB") + + info = im.encoderinfo.get("pnginfo") + if info: + chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] + for info_chunk in info.chunks: + cid, data = info_chunk[:2] + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + elif cid in chunks_multiple_allowed: + chunk(fp, cid, data) + elif cid[1:2].islower(): + # Private chunk + after_idat = len(info_chunk) == 3 and info_chunk[2] + if not after_idat: + chunk(fp, cid, data) + + if im.mode == "P": + palette_byte_number = colors * 3 + palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] + while len(palette_bytes) < palette_byte_number: + palette_bytes += b"\0" + chunk(fp, b"PLTE", palette_bytes) + + transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None)) + + if transparency or transparency == 0: + if im.mode == "P": + # limit to actual palette size + alpha_bytes = colors + if isinstance(transparency, bytes): + chunk(fp, b"tRNS", transparency[:alpha_bytes]) + else: + transparency = max(0, min(255, transparency)) + alpha = b"\xFF" * transparency + b"\0" + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + elif im.mode in ("1", "L", "I", "I;16"): + transparency = max(0, min(65535, transparency)) + chunk(fp, b"tRNS", o16(transparency)) + elif im.mode == "RGB": + red, green, blue = transparency + chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) + else: + if "transparency" in im.encoderinfo: + # don't bother with transparency if it's an RGBA + # and it's in the info dict. It's probably just stale. + msg = "cannot use transparency for this mode" + raise OSError(msg) + else: + if im.mode == "P" and im.im.getpalettemode() == "RGBA": + alpha = im.im.getpalette("RGBA", "A") + alpha_bytes = colors + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + + dpi = im.encoderinfo.get("dpi") + if dpi: + chunk( + fp, + b"pHYs", + o32(int(dpi[0] / 0.0254 + 0.5)), + o32(int(dpi[1] / 0.0254 + 0.5)), + b"\x01", + ) + + if info: + chunks = [b"bKGD", b"hIST"] + for info_chunk in info.chunks: + cid, data = info_chunk[:2] + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + + exif = im.encoderinfo.get("exif") + if exif: + if isinstance(exif, Image.Exif): + exif = exif.tobytes(8) + if exif.startswith(b"Exif\x00\x00"): + exif = exif[6:] + chunk(fp, b"eXIf", exif) + + if save_all: + im = _write_multiple_frames( + im, fp, chunk, mode, rawmode, default_image, append_images + ) + if im: + ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) + + if info: + for info_chunk in info.chunks: + cid, data = info_chunk[:2] + if cid[1:2].islower(): + # Private chunk + after_idat = len(info_chunk) == 3 and info_chunk[2] + if after_idat: + chunk(fp, cid, data) + + chunk(fp, b"IEND", b"") + + if hasattr(fp, "flush"): + fp.flush() + + +# -------------------------------------------------------------------- +# PNG chunk converter + + +def getchunks(im, **params): + """Return a list of PNG chunks representing this image.""" + + class collector: + data = [] + + def write(self, data: bytes) -> None: + pass + + def append(self, chunk: bytes) -> None: + self.data.append(chunk) + + def append(fp, cid, *data): + data = b"".join(data) + crc = o32(_crc32(data, _crc32(cid))) + fp.append((cid, data, crc)) + + fp = collector() + + try: + im.encoderinfo = params + _save(im, fp, None, append) + finally: + del im.encoderinfo + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(PngImageFile.format, PngImageFile, _accept) +Image.register_save(PngImageFile.format, _save) +Image.register_save_all(PngImageFile.format, _save_all) + +Image.register_extensions(PngImageFile.format, [".png", ".apng"]) + +Image.register_mime(PngImageFile.format, "image/png") diff --git a/.venv/lib/python3.11/site-packages/PIL/PpmImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/PpmImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..16c9ccbba72a52f94b4e9c994264cdaed8143455 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PpmImagePlugin.py @@ -0,0 +1,371 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PPM support for PIL +# +# History: +# 96-03-24 fl Created +# 98-03-06 fl Write RGBA images (as RGB, that is) +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import math +from typing import IO + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import o8 +from ._binary import o32le as o32 + +# +# -------------------------------------------------------------------- + +b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" + +MODES = { + # standard + b"P1": "1", + b"P2": "L", + b"P3": "RGB", + b"P4": "1", + b"P5": "L", + b"P6": "RGB", + # extensions + b"P0CMYK": "CMYK", + b"Pf": "F", + # PIL extensions (for test purposes only) + b"PyP": "P", + b"PyRGBA": "RGBA", + b"PyCMYK": "CMYK", +} + + +def _accept(prefix: bytes) -> bool: + return prefix[0:1] == b"P" and prefix[1] in b"0123456fy" + + +## +# Image plugin for PBM, PGM, and PPM images. + + +class PpmImageFile(ImageFile.ImageFile): + format = "PPM" + format_description = "Pbmplus image" + + def _read_magic(self) -> bytes: + assert self.fp is not None + + magic = b"" + # read until whitespace or longest available magic number + for _ in range(6): + c = self.fp.read(1) + if not c or c in b_whitespace: + break + magic += c + return magic + + def _read_token(self) -> bytes: + assert self.fp is not None + + token = b"" + while len(token) <= 10: # read until next whitespace or limit of 10 characters + c = self.fp.read(1) + if not c: + break + elif c in b_whitespace: # token ended + if not token: + # skip whitespace at start + continue + break + elif c == b"#": + # ignores rest of the line; stops at CR, LF or EOF + while self.fp.read(1) not in b"\r\n": + pass + continue + token += c + if not token: + # Token was not even 1 byte + msg = "Reached EOF while reading header" + raise ValueError(msg) + elif len(token) > 10: + msg = f"Token too long in file header: {token.decode()}" + raise ValueError(msg) + return token + + def _open(self) -> None: + assert self.fp is not None + + magic_number = self._read_magic() + try: + mode = MODES[magic_number] + except KeyError: + msg = "not a PPM file" + raise SyntaxError(msg) + self._mode = mode + + if magic_number in (b"P1", b"P4"): + self.custom_mimetype = "image/x-portable-bitmap" + elif magic_number in (b"P2", b"P5"): + self.custom_mimetype = "image/x-portable-graymap" + elif magic_number in (b"P3", b"P6"): + self.custom_mimetype = "image/x-portable-pixmap" + + self._size = int(self._read_token()), int(self._read_token()) + + decoder_name = "raw" + if magic_number in (b"P1", b"P2", b"P3"): + decoder_name = "ppm_plain" + + args: str | tuple[str | int, ...] + if mode == "1": + args = "1;I" + elif mode == "F": + scale = float(self._read_token()) + if scale == 0.0 or not math.isfinite(scale): + msg = "scale must be finite and non-zero" + raise ValueError(msg) + self.info["scale"] = abs(scale) + + rawmode = "F;32F" if scale < 0 else "F;32BF" + args = (rawmode, 0, -1) + else: + maxval = int(self._read_token()) + if not 0 < maxval < 65536: + msg = "maxval must be greater than 0 and less than 65536" + raise ValueError(msg) + if maxval > 255 and mode == "L": + self._mode = "I" + + rawmode = mode + if decoder_name != "ppm_plain": + # If maxval matches a bit depth, use the raw decoder directly + if maxval == 65535 and mode == "L": + rawmode = "I;16B" + elif maxval != 255: + decoder_name = "ppm" + + args = rawmode if decoder_name == "raw" else (rawmode, maxval) + self.tile = [(decoder_name, (0, 0) + self.size, self.fp.tell(), args)] + + +# +# -------------------------------------------------------------------- + + +class PpmPlainDecoder(ImageFile.PyDecoder): + _pulls_fd = True + _comment_spans: bool + + def _read_block(self) -> bytes: + assert self.fd is not None + + return self.fd.read(ImageFile.SAFEBLOCK) + + def _find_comment_end(self, block: bytes, start: int = 0) -> int: + a = block.find(b"\n", start) + b = block.find(b"\r", start) + return min(a, b) if a * b > 0 else max(a, b) # lowest nonnegative index (or -1) + + def _ignore_comments(self, block: bytes) -> bytes: + if self._comment_spans: + # Finish current comment + while block: + comment_end = self._find_comment_end(block) + if comment_end != -1: + # Comment ends in this block + # Delete tail of comment + block = block[comment_end + 1 :] + break + else: + # Comment spans whole block + # So read the next block, looking for the end + block = self._read_block() + + # Search for any further comments + self._comment_spans = False + while True: + comment_start = block.find(b"#") + if comment_start == -1: + # No comment found + break + comment_end = self._find_comment_end(block, comment_start) + if comment_end != -1: + # Comment ends in this block + # Delete comment + block = block[:comment_start] + block[comment_end + 1 :] + else: + # Comment continues to next block(s) + block = block[:comment_start] + self._comment_spans = True + break + return block + + def _decode_bitonal(self) -> bytearray: + """ + This is a separate method because in the plain PBM format, all data tokens are + exactly one byte, so the inter-token whitespace is optional. + """ + data = bytearray() + total_bytes = self.state.xsize * self.state.ysize + + while len(data) != total_bytes: + block = self._read_block() # read next block + if not block: + # eof + break + + block = self._ignore_comments(block) + + tokens = b"".join(block.split()) + for token in tokens: + if token not in (48, 49): + msg = b"Invalid token for this mode: %s" % bytes([token]) + raise ValueError(msg) + data = (data + tokens)[:total_bytes] + invert = bytes.maketrans(b"01", b"\xFF\x00") + return data.translate(invert) + + def _decode_blocks(self, maxval: int) -> bytearray: + data = bytearray() + max_len = 10 + out_byte_count = 4 if self.mode == "I" else 1 + out_max = 65535 if self.mode == "I" else 255 + bands = Image.getmodebands(self.mode) + total_bytes = self.state.xsize * self.state.ysize * bands * out_byte_count + + half_token = b"" + while len(data) != total_bytes: + block = self._read_block() # read next block + if not block: + if half_token: + block = bytearray(b" ") # flush half_token + else: + # eof + break + + block = self._ignore_comments(block) + + if half_token: + block = half_token + block # stitch half_token to new block + half_token = b"" + + tokens = block.split() + + if block and not block[-1:].isspace(): # block might split token + half_token = tokens.pop() # save half token for later + if len(half_token) > max_len: # prevent buildup of half_token + msg = ( + b"Token too long found in data: %s" % half_token[: max_len + 1] + ) + raise ValueError(msg) + + for token in tokens: + if len(token) > max_len: + msg = b"Token too long found in data: %s" % token[: max_len + 1] + raise ValueError(msg) + value = int(token) + if value < 0: + msg_str = f"Channel value is negative: {value}" + raise ValueError(msg_str) + if value > maxval: + msg_str = f"Channel value too large for this mode: {value}" + raise ValueError(msg_str) + value = round(value / maxval * out_max) + data += o32(value) if self.mode == "I" else o8(value) + if len(data) == total_bytes: # finished! + break + return data + + def decode(self, buffer: bytes) -> tuple[int, int]: + self._comment_spans = False + if self.mode == "1": + data = self._decode_bitonal() + rawmode = "1;8" + else: + maxval = self.args[-1] + data = self._decode_blocks(maxval) + rawmode = "I;32" if self.mode == "I" else self.mode + self.set_as_raw(bytes(data), rawmode) + return -1, 0 + + +class PpmDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes) -> tuple[int, int]: + assert self.fd is not None + + data = bytearray() + maxval = self.args[-1] + in_byte_count = 1 if maxval < 256 else 2 + out_byte_count = 4 if self.mode == "I" else 1 + out_max = 65535 if self.mode == "I" else 255 + bands = Image.getmodebands(self.mode) + dest_length = self.state.xsize * self.state.ysize * bands * out_byte_count + while len(data) < dest_length: + pixels = self.fd.read(in_byte_count * bands) + if len(pixels) < in_byte_count * bands: + # eof + break + for b in range(bands): + value = ( + pixels[b] if in_byte_count == 1 else i16(pixels, b * in_byte_count) + ) + value = min(out_max, round(value / maxval * out_max)) + data += o32(value) if self.mode == "I" else o8(value) + rawmode = "I;32" if self.mode == "I" else self.mode + self.set_as_raw(bytes(data), rawmode) + return -1, 0 + + +# +# -------------------------------------------------------------------- + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode == "1": + rawmode, head = "1;I", b"P4" + elif im.mode == "L": + rawmode, head = "L", b"P5" + elif im.mode == "I": + rawmode, head = "I;16B", b"P5" + elif im.mode in ("RGB", "RGBA"): + rawmode, head = "RGB", b"P6" + elif im.mode == "F": + rawmode, head = "F;32F", b"Pf" + else: + msg = f"cannot write mode {im.mode} as PPM" + raise OSError(msg) + fp.write(head + b"\n%d %d\n" % im.size) + if head == b"P6": + fp.write(b"255\n") + elif head == b"P5": + if rawmode == "L": + fp.write(b"255\n") + else: + fp.write(b"65535\n") + elif head == b"Pf": + fp.write(b"-1.0\n") + row_order = -1 if im.mode == "F" else 1 + ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, row_order))]) + + +# +# -------------------------------------------------------------------- + + +Image.register_open(PpmImageFile.format, PpmImageFile, _accept) +Image.register_save(PpmImageFile.format, _save) + +Image.register_decoder("ppm", PpmDecoder) +Image.register_decoder("ppm_plain", PpmPlainDecoder) + +Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm", ".pfm"]) + +Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/.venv/lib/python3.11/site-packages/PIL/PsdImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/PsdImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..edf698bf02dcad8d8c341169704828deac3dd2da --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PsdImagePlugin.py @@ -0,0 +1,326 @@ +# +# The Python Imaging Library +# $Id$ +# +# Adobe PSD 2.5/3.0 file handling +# +# History: +# 1995-09-01 fl Created +# 1997-01-03 fl Read most PSD images +# 1997-01-18 fl Fixed P and CMYK support +# 2001-10-21 fl Added seek/tell support (for layers) +# +# Copyright (c) 1997-2001 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +from functools import cached_property + +from . import Image, ImageFile, ImagePalette +from ._binary import i8 +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import si16be as si16 +from ._binary import si32be as si32 + +MODES = { + # (photoshop mode, bits) -> (pil mode, required channels) + (0, 1): ("1", 1), + (0, 8): ("L", 1), + (1, 8): ("L", 1), + (2, 8): ("P", 1), + (3, 8): ("RGB", 3), + (4, 8): ("CMYK", 4), + (7, 8): ("L", 1), # FIXME: multilayer + (8, 8): ("L", 1), # duotone + (9, 8): ("LAB", 3), +} + + +# --------------------------------------------------------------------. +# read PSD images + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"8BPS" + + +## +# Image plugin for Photoshop images. + + +class PsdImageFile(ImageFile.ImageFile): + format = "PSD" + format_description = "Adobe Photoshop" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + read = self.fp.read + + # + # header + + s = read(26) + if not _accept(s) or i16(s, 4) != 1: + msg = "not a PSD file" + raise SyntaxError(msg) + + psd_bits = i16(s, 22) + psd_channels = i16(s, 12) + psd_mode = i16(s, 24) + + mode, channels = MODES[(psd_mode, psd_bits)] + + if channels > psd_channels: + msg = "not enough channels" + raise OSError(msg) + if mode == "RGB" and psd_channels == 4: + mode = "RGBA" + channels = 4 + + self._mode = mode + self._size = i32(s, 18), i32(s, 14) + + # + # color mode data + + size = i32(read(4)) + if size: + data = read(size) + if mode == "P" and size == 768: + self.palette = ImagePalette.raw("RGB;L", data) + + # + # image resources + + self.resources = [] + + size = i32(read(4)) + if size: + # load resources + end = self.fp.tell() + size + while self.fp.tell() < end: + read(4) # signature + id = i16(read(2)) + name = read(i8(read(1))) + if not (len(name) & 1): + read(1) # padding + data = read(i32(read(4))) + if len(data) & 1: + read(1) # padding + self.resources.append((id, name, data)) + if id == 1039: # ICC profile + self.info["icc_profile"] = data + + # + # layer and mask information + + self._layers_position = None + + size = i32(read(4)) + if size: + end = self.fp.tell() + size + size = i32(read(4)) + if size: + self._layers_position = self.fp.tell() + self._layers_size = size + self.fp.seek(end) + self._n_frames: int | None = None + + # + # image descriptor + + self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) + + # keep the file open + self._fp = self.fp + self.frame = 1 + self._min_frame = 1 + + @cached_property + def layers(self): + layers = [] + if self._layers_position is not None: + self._fp.seek(self._layers_position) + _layer_data = io.BytesIO(ImageFile._safe_read(self._fp, self._layers_size)) + layers = _layerinfo(_layer_data, self._layers_size) + self._n_frames = len(layers) + return layers + + @property + def n_frames(self) -> int: + if self._n_frames is None: + self._n_frames = len(self.layers) + return self._n_frames + + @property + def is_animated(self) -> bool: + return len(self.layers) > 1 + + def seek(self, layer: int) -> None: + if not self._seek_check(layer): + return + + # seek to given layer (1..max) + try: + _, mode, _, tile = self.layers[layer - 1] + self._mode = mode + self.tile = tile + self.frame = layer + self.fp = self._fp + except IndexError as e: + msg = "no such layer" + raise EOFError(msg) from e + + def tell(self) -> int: + # return layer number (0=image, 1..max=layers) + return self.frame + + +def _layerinfo(fp, ct_bytes): + # read layerinfo block + layers = [] + + def read(size): + return ImageFile._safe_read(fp, size) + + ct = si16(read(2)) + + # sanity check + if ct_bytes < (abs(ct) * 20): + msg = "Layer block too short for number of layers requested" + raise SyntaxError(msg) + + for _ in range(abs(ct)): + # bounding box + y0 = si32(read(4)) + x0 = si32(read(4)) + y1 = si32(read(4)) + x1 = si32(read(4)) + + # image info + mode = [] + ct_types = i16(read(2)) + if ct_types > 4: + fp.seek(ct_types * 6 + 12, io.SEEK_CUR) + size = i32(read(4)) + fp.seek(size, io.SEEK_CUR) + continue + + for _ in range(ct_types): + type = i16(read(2)) + + if type == 65535: + m = "A" + else: + m = "RGBA"[type] + + mode.append(m) + read(4) # size + + # figure out the image mode + mode.sort() + if mode == ["R"]: + mode = "L" + elif mode == ["B", "G", "R"]: + mode = "RGB" + elif mode == ["A", "B", "G", "R"]: + mode = "RGBA" + else: + mode = None # unknown + + # skip over blend flags and extra information + read(12) # filler + name = "" + size = i32(read(4)) # length of the extra data field + if size: + data_end = fp.tell() + size + + length = i32(read(4)) + if length: + fp.seek(length - 16, io.SEEK_CUR) + + length = i32(read(4)) + if length: + fp.seek(length, io.SEEK_CUR) + + length = i8(read(1)) + if length: + # Don't know the proper encoding, + # Latin-1 should be a good guess + name = read(length).decode("latin-1", "replace") + + fp.seek(data_end) + layers.append((name, mode, (x0, y0, x1, y1))) + + # get tiles + for i, (name, mode, bbox) in enumerate(layers): + tile = [] + for m in mode: + t = _maketile(fp, m, bbox, 1) + if t: + tile.extend(t) + layers[i] = name, mode, bbox, tile + + return layers + + +def _maketile(file, mode, bbox, channels): + tile = None + read = file.read + + compression = i16(read(2)) + + xsize = bbox[2] - bbox[0] + ysize = bbox[3] - bbox[1] + + offset = file.tell() + + if compression == 0: + # + # raw compression + tile = [] + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tile.append(("raw", bbox, offset, layer)) + offset = offset + xsize * ysize + + elif compression == 1: + # + # packbits compression + i = 0 + tile = [] + bytecount = read(channels * ysize * 2) + offset = file.tell() + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tile.append(("packbits", bbox, offset, layer)) + for y in range(ysize): + offset = offset + i16(bytecount, i) + i += 2 + + file.seek(offset) + + if offset & 1: + read(1) # padding + + return tile + + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PsdImageFile.format, PsdImageFile, _accept) + +Image.register_extension(PsdImageFile.format, ".psd") + +Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop") diff --git a/.venv/lib/python3.11/site-packages/PIL/PyAccess.py b/.venv/lib/python3.11/site-packages/PIL/PyAccess.py new file mode 100644 index 0000000000000000000000000000000000000000..3be1ccace0c94c9aa1a5b7d98e0864a637cbcb71 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/PyAccess.py @@ -0,0 +1,381 @@ +# +# The Python Imaging Library +# Pillow fork +# +# Python implementation of the PixelAccess Object +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# Copyright (c) 2013 Eric Soroos +# +# See the README file for information on usage and redistribution +# + +# Notes: +# +# * Implements the pixel access object following Access.c +# * Taking only the tuple form, which is used from python. +# * Fill.c uses the integer form, but it's still going to use the old +# Access.c implementation. +# +from __future__ import annotations + +import logging +import sys +from typing import TYPE_CHECKING + +from ._deprecate import deprecate + +FFI: type +try: + from cffi import FFI + + defs = """ + struct Pixel_RGBA { + unsigned char r,g,b,a; + }; + struct Pixel_I16 { + unsigned char l,r; + }; + """ + ffi = FFI() + ffi.cdef(defs) +except ImportError as ex: + # Allow error import for doc purposes, but error out when accessing + # anything in core. + from ._util import DeferredError + + FFI = ffi = DeferredError.new(ex) + +logger = logging.getLogger(__name__) + +if TYPE_CHECKING: + from . import Image + + +class PyAccess: + def __init__(self, img: Image.Image, readonly: bool = False) -> None: + deprecate("PyAccess", 11) + vals = dict(img.im.unsafe_ptrs) + self.readonly = readonly + self.image8 = ffi.cast("unsigned char **", vals["image8"]) + self.image32 = ffi.cast("int **", vals["image32"]) + self.image = ffi.cast("unsigned char **", vals["image"]) + self.xsize, self.ysize = img.im.size + self._img = img + + # Keep pointer to im object to prevent dereferencing. + self._im = img.im + if self._im.mode in ("P", "PA"): + self._palette = img.palette + + # Debugging is polluting test traces, only useful here + # when hacking on PyAccess + # logger.debug("%s", vals) + self._post_init() + + def _post_init(self) -> None: + pass + + def __setitem__( + self, + xy: tuple[int, int] | list[int], + color: float | tuple[int, ...] | list[int], + ) -> None: + """ + Modifies the pixel at x,y. The color is given as a single + numerical value for single band images, and a tuple for + multi-band images. In addition to this, RGB and RGBA tuples + are accepted for P and PA images. + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :param color: The pixel value. + """ + if self.readonly: + msg = "Attempt to putpixel a read only image" + raise ValueError(msg) + (x, y) = xy + if x < 0: + x = self.xsize + x + if y < 0: + y = self.ysize + y + (x, y) = self.check_xy((x, y)) + + if ( + self._im.mode in ("P", "PA") + and isinstance(color, (list, tuple)) + and len(color) in [3, 4] + ): + # RGB or RGBA value for a P or PA image + if self._im.mode == "PA": + alpha = color[3] if len(color) == 4 else 255 + color = color[:3] + palette_index = self._palette.getcolor(color, self._img) + color = (palette_index, alpha) if self._im.mode == "PA" else palette_index + + return self.set_pixel(x, y, color) + + def __getitem__(self, xy: tuple[int, int] | list[int]) -> float | tuple[int, ...]: + """ + Returns the pixel at x,y. The pixel is returned as a single + value for single band images or a tuple for multiple band + images + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :returns: a pixel value for single band images, a tuple of + pixel values for multiband images. + """ + (x, y) = xy + if x < 0: + x = self.xsize + x + if y < 0: + y = self.ysize + y + (x, y) = self.check_xy((x, y)) + return self.get_pixel(x, y) + + putpixel = __setitem__ + getpixel = __getitem__ + + def check_xy(self, xy: tuple[int, int]) -> tuple[int, int]: + (x, y) = xy + if not (0 <= x < self.xsize and 0 <= y < self.ysize): + msg = "pixel location out of range" + raise ValueError(msg) + return xy + + def get_pixel(self, x: int, y: int) -> float | tuple[int, ...]: + raise NotImplementedError() + + def set_pixel( + self, x: int, y: int, color: float | tuple[int, ...] | list[int] + ) -> None: + raise NotImplementedError() + + +class _PyAccess32_2(PyAccess): + """PA, LA, stored in first and last bytes of a 32 bit word""" + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x: int, y: int) -> tuple[int, int]: + pixel = self.pixels[y][x] + return pixel.r, pixel.a + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.a = min(color[1], 255) + + +class _PyAccess32_3(PyAccess): + """RGB and friends, stored in the first three bytes of a 32 bit word""" + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x: int, y: int) -> tuple[int, int, int]: + pixel = self.pixels[y][x] + return pixel.r, pixel.g, pixel.b + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.g = min(color[1], 255) + pixel.b = min(color[2], 255) + pixel.a = 255 + + +class _PyAccess32_4(PyAccess): + """RGBA etc, all 4 bytes of a 32 bit word""" + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_RGBA **", self.image32) + + def get_pixel(self, x: int, y: int) -> tuple[int, int, int, int]: + pixel = self.pixels[y][x] + return pixel.r, pixel.g, pixel.b, pixel.a + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + # tuple + pixel.r = min(color[0], 255) + pixel.g = min(color[1], 255) + pixel.b = min(color[2], 255) + pixel.a = min(color[3], 255) + + +class _PyAccess8(PyAccess): + """1, L, P, 8 bit images stored as uint8""" + + def _post_init(self, *args, **kwargs): + self.pixels = self.image8 + + def get_pixel(self, x: int, y: int) -> int: + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # integer + self.pixels[y][x] = min(color, 255) + except TypeError: + # tuple + self.pixels[y][x] = min(color[0], 255) + + +class _PyAccessI16_N(PyAccess): + """I;16 access, native bitendian without conversion""" + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("unsigned short **", self.image) + + def get_pixel(self, x: int, y: int) -> int: + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # integer + self.pixels[y][x] = min(color, 65535) + except TypeError: + # tuple + self.pixels[y][x] = min(color[0], 65535) + + +class _PyAccessI16_L(PyAccess): + """I;16L access, with conversion""" + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_I16 **", self.image) + + def get_pixel(self, x: int, y: int) -> int: + pixel = self.pixels[y][x] + return pixel.l + pixel.r * 256 + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + try: + color = min(color, 65535) + except TypeError: + color = min(color[0], 65535) + + pixel.l = color & 0xFF + pixel.r = color >> 8 + + +class _PyAccessI16_B(PyAccess): + """I;16B access, with conversion""" + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("struct Pixel_I16 **", self.image) + + def get_pixel(self, x: int, y: int) -> int: + pixel = self.pixels[y][x] + return pixel.l * 256 + pixel.r + + def set_pixel(self, x, y, color): + pixel = self.pixels[y][x] + try: + color = min(color, 65535) + except Exception: + color = min(color[0], 65535) + + pixel.l = color >> 8 + pixel.r = color & 0xFF + + +class _PyAccessI32_N(PyAccess): + """Signed Int32 access, native endian""" + + def _post_init(self, *args, **kwargs): + self.pixels = self.image32 + + def get_pixel(self, x: int, y: int) -> int: + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + self.pixels[y][x] = color + + +class _PyAccessI32_Swap(PyAccess): + """I;32L/B access, with byteswapping conversion""" + + def _post_init(self, *args, **kwargs): + self.pixels = self.image32 + + def reverse(self, i): + orig = ffi.new("int *", i) + chars = ffi.cast("unsigned char *", orig) + chars[0], chars[1], chars[2], chars[3] = chars[3], chars[2], chars[1], chars[0] + return ffi.cast("int *", chars)[0] + + def get_pixel(self, x: int, y: int) -> int: + return self.reverse(self.pixels[y][x]) + + def set_pixel(self, x, y, color): + self.pixels[y][x] = self.reverse(color) + + +class _PyAccessF(PyAccess): + """32 bit float access""" + + def _post_init(self, *args, **kwargs): + self.pixels = ffi.cast("float **", self.image32) + + def get_pixel(self, x: int, y: int) -> float: + return self.pixels[y][x] + + def set_pixel(self, x, y, color): + try: + # not a tuple + self.pixels[y][x] = color + except TypeError: + # tuple + self.pixels[y][x] = color[0] + + +mode_map = { + "1": _PyAccess8, + "L": _PyAccess8, + "P": _PyAccess8, + "I;16N": _PyAccessI16_N, + "LA": _PyAccess32_2, + "La": _PyAccess32_2, + "PA": _PyAccess32_2, + "RGB": _PyAccess32_3, + "LAB": _PyAccess32_3, + "HSV": _PyAccess32_3, + "YCbCr": _PyAccess32_3, + "RGBA": _PyAccess32_4, + "RGBa": _PyAccess32_4, + "RGBX": _PyAccess32_4, + "CMYK": _PyAccess32_4, + "F": _PyAccessF, + "I": _PyAccessI32_N, +} + +if sys.byteorder == "little": + mode_map["I;16"] = _PyAccessI16_N + mode_map["I;16L"] = _PyAccessI16_N + mode_map["I;16B"] = _PyAccessI16_B + + mode_map["I;32L"] = _PyAccessI32_N + mode_map["I;32B"] = _PyAccessI32_Swap +else: + mode_map["I;16"] = _PyAccessI16_L + mode_map["I;16L"] = _PyAccessI16_L + mode_map["I;16B"] = _PyAccessI16_N + + mode_map["I;32L"] = _PyAccessI32_Swap + mode_map["I;32B"] = _PyAccessI32_N + + +def new(img: Image.Image, readonly: bool = False) -> PyAccess | None: + access_type = mode_map.get(img.mode, None) + if not access_type: + logger.debug("PyAccess Not Implemented: %s", img.mode) + return None + return access_type(img, readonly) diff --git a/.venv/lib/python3.11/site-packages/PIL/QoiImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/QoiImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..202ef52d09b4dde19078c56cca974b505a3517fd --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/QoiImagePlugin.py @@ -0,0 +1,115 @@ +# +# The Python Imaging Library. +# +# QOI support for PIL +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os + +from . import Image, ImageFile +from ._binary import i32be as i32 + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"qoif" + + +class QoiImageFile(ImageFile.ImageFile): + format = "QOI" + format_description = "Quite OK Image" + + def _open(self) -> None: + if not _accept(self.fp.read(4)): + msg = "not a QOI file" + raise SyntaxError(msg) + + self._size = tuple(i32(self.fp.read(4)) for i in range(2)) + + channels = self.fp.read(1)[0] + self._mode = "RGB" if channels == 3 else "RGBA" + + self.fp.seek(1, os.SEEK_CUR) # colorspace + self.tile = [("qoi", (0, 0) + self._size, self.fp.tell(), None)] + + +class QoiDecoder(ImageFile.PyDecoder): + _pulls_fd = True + _previous_pixel: bytes | bytearray | None = None + _previously_seen_pixels: dict[int, bytes | bytearray] = {} + + def _add_to_previous_pixels(self, value: bytes | bytearray) -> None: + self._previous_pixel = value + + r, g, b, a = value + hash_value = (r * 3 + g * 5 + b * 7 + a * 11) % 64 + self._previously_seen_pixels[hash_value] = value + + def decode(self, buffer: bytes) -> tuple[int, int]: + assert self.fd is not None + + self._previously_seen_pixels = {} + self._add_to_previous_pixels(bytearray((0, 0, 0, 255))) + + data = bytearray() + bands = Image.getmodebands(self.mode) + dest_length = self.state.xsize * self.state.ysize * bands + while len(data) < dest_length: + byte = self.fd.read(1)[0] + value: bytes | bytearray + if byte == 0b11111110 and self._previous_pixel: # QOI_OP_RGB + value = bytearray(self.fd.read(3)) + self._previous_pixel[3:] + elif byte == 0b11111111: # QOI_OP_RGBA + value = self.fd.read(4) + else: + op = byte >> 6 + if op == 0: # QOI_OP_INDEX + op_index = byte & 0b00111111 + value = self._previously_seen_pixels.get( + op_index, bytearray((0, 0, 0, 0)) + ) + elif op == 1 and self._previous_pixel: # QOI_OP_DIFF + value = bytearray( + ( + (self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2) + % 256, + (self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2) + % 256, + (self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256, + self._previous_pixel[3], + ) + ) + elif op == 2 and self._previous_pixel: # QOI_OP_LUMA + second_byte = self.fd.read(1)[0] + diff_green = (byte & 0b00111111) - 32 + diff_red = ((second_byte & 0b11110000) >> 4) - 8 + diff_blue = (second_byte & 0b00001111) - 8 + + value = bytearray( + tuple( + (self._previous_pixel[i] + diff_green + diff) % 256 + for i, diff in enumerate((diff_red, 0, diff_blue)) + ) + ) + value += self._previous_pixel[3:] + elif op == 3 and self._previous_pixel: # QOI_OP_RUN + run_length = (byte & 0b00111111) + 1 + value = self._previous_pixel + if bands == 3: + value = value[:3] + data += value * run_length + continue + self._add_to_previous_pixels(value) + + if bands == 3: + value = value[:3] + data += value + self.set_as_raw(data) + return -1, 0 + + +Image.register_open(QoiImageFile.format, QoiImageFile, _accept) +Image.register_decoder("qoi", QoiDecoder) +Image.register_extension(QoiImageFile.format, ".qoi") diff --git a/.venv/lib/python3.11/site-packages/PIL/SgiImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/SgiImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..50d979109326b2f12173a38c92b4e234dd84ead0 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/SgiImagePlugin.py @@ -0,0 +1,238 @@ +# +# The Python Imaging Library. +# $Id$ +# +# SGI image file handling +# +# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. +# +# +# +# History: +# 2017-22-07 mb Add RLE decompression +# 2016-16-10 mb Add save method without compression +# 1995-09-10 fl Created +# +# Copyright (c) 2016 by Mickael Bonfill. +# Copyright (c) 2008 by Karsten Hiddemann. +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1995 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +import struct +from typing import IO + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import o8 + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 2 and i16(prefix) == 474 + + +MODES = { + (1, 1, 1): "L", + (1, 2, 1): "L", + (2, 1, 1): "L;16B", + (2, 2, 1): "L;16B", + (1, 3, 3): "RGB", + (2, 3, 3): "RGB;16B", + (1, 3, 4): "RGBA", + (2, 3, 4): "RGBA;16B", +} + + +## +# Image plugin for SGI images. +class SgiImageFile(ImageFile.ImageFile): + format = "SGI" + format_description = "SGI Image File Format" + + def _open(self) -> None: + # HEAD + assert self.fp is not None + + headlen = 512 + s = self.fp.read(headlen) + + if not _accept(s): + msg = "Not an SGI image file" + raise ValueError(msg) + + # compression : verbatim or RLE + compression = s[2] + + # bpc : 1 or 2 bytes (8bits or 16bits) + bpc = s[3] + + # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) + dimension = i16(s, 4) + + # xsize : width + xsize = i16(s, 6) + + # ysize : height + ysize = i16(s, 8) + + # zsize : channels count + zsize = i16(s, 10) + + # layout + layout = bpc, dimension, zsize + + # determine mode from bits/zsize + rawmode = "" + try: + rawmode = MODES[layout] + except KeyError: + pass + + if rawmode == "": + msg = "Unsupported SGI image mode" + raise ValueError(msg) + + self._size = xsize, ysize + self._mode = rawmode.split(";")[0] + if self.mode == "RGB": + self.custom_mimetype = "image/rgb" + + # orientation -1 : scanlines begins at the bottom-left corner + orientation = -1 + + # decoder info + if compression == 0: + pagesize = xsize * ysize * bpc + if bpc == 2: + self.tile = [ + ("SGI16", (0, 0) + self.size, headlen, (self.mode, 0, orientation)) + ] + else: + self.tile = [] + offset = headlen + for layer in self.mode: + self.tile.append( + ("raw", (0, 0) + self.size, offset, (layer, 0, orientation)) + ) + offset += pagesize + elif compression == 1: + self.tile = [ + ("sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc)) + ] + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode not in {"RGB", "RGBA", "L"}: + msg = "Unsupported SGI image mode" + raise ValueError(msg) + + # Get the keyword arguments + info = im.encoderinfo + + # Byte-per-pixel precision, 1 = 8bits per pixel + bpc = info.get("bpc", 1) + + if bpc not in (1, 2): + msg = "Unsupported number of bytes per pixel" + raise ValueError(msg) + + # Flip the image, since the origin of SGI file is the bottom-left corner + orientation = -1 + # Define the file as SGI File Format + magic_number = 474 + # Run-Length Encoding Compression - Unsupported at this time + rle = 0 + + # Number of dimensions (x,y,z) + dim = 3 + # X Dimension = width / Y Dimension = height + x, y = im.size + if im.mode == "L" and y == 1: + dim = 1 + elif im.mode == "L": + dim = 2 + # Z Dimension: Number of channels + z = len(im.mode) + + if dim in {1, 2}: + z = 1 + + # assert we've got the right number of bands. + if len(im.getbands()) != z: + msg = f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}" + raise ValueError(msg) + + # Minimum Byte value + pinmin = 0 + # Maximum Byte value (255 = 8bits per pixel) + pinmax = 255 + # Image name (79 characters max, truncated below in write) + img_name = os.path.splitext(os.path.basename(filename))[0] + if isinstance(img_name, str): + img_name = img_name.encode("ascii", "ignore") + # Standard representation of pixel in the file + colormap = 0 + fp.write(struct.pack(">h", magic_number)) + fp.write(o8(rle)) + fp.write(o8(bpc)) + fp.write(struct.pack(">H", dim)) + fp.write(struct.pack(">H", x)) + fp.write(struct.pack(">H", y)) + fp.write(struct.pack(">H", z)) + fp.write(struct.pack(">l", pinmin)) + fp.write(struct.pack(">l", pinmax)) + fp.write(struct.pack("4s", b"")) # dummy + fp.write(struct.pack("79s", img_name)) # truncates to 79 chars + fp.write(struct.pack("s", b"")) # force null byte after img_name + fp.write(struct.pack(">l", colormap)) + fp.write(struct.pack("404s", b"")) # dummy + + rawmode = "L" + if bpc == 2: + rawmode = "L;16B" + + for channel in im.split(): + fp.write(channel.tobytes("raw", rawmode, 0, orientation)) + + if hasattr(fp, "flush"): + fp.flush() + + +class SGI16Decoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes) -> tuple[int, int]: + assert self.fd is not None + assert self.im is not None + + rawmode, stride, orientation = self.args + pagesize = self.state.xsize * self.state.ysize + zsize = len(self.mode) + self.fd.seek(512) + + for band in range(zsize): + channel = Image.new("L", (self.state.xsize, self.state.ysize)) + channel.frombytes( + self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation + ) + self.im.putband(channel.im, band) + + return -1, 0 + + +# +# registry + + +Image.register_decoder("SGI16", SGI16Decoder) +Image.register_open(SgiImageFile.format, SgiImageFile, _accept) +Image.register_save(SgiImageFile.format, _save) +Image.register_mime(SgiImageFile.format, "image/sgi") + +Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) + +# End of file diff --git a/.venv/lib/python3.11/site-packages/PIL/TgaImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/TgaImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..39104aeced9706cc56fa31e4a3e53481b454c311 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/TgaImagePlugin.py @@ -0,0 +1,262 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TGA file handling +# +# History: +# 95-09-01 fl created (reads 24-bit files only) +# 97-01-04 fl support more TGA versions, including compressed images +# 98-07-04 fl fixed orientation and alpha layer bugs +# 98-09-11 fl fixed orientation for runlength decoder +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import warnings +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import o8 +from ._binary import o16le as o16 + +# +# -------------------------------------------------------------------- +# Read RGA file + + +MODES = { + # map imagetype/depth to rawmode + (1, 8): "P", + (3, 1): "1", + (3, 8): "L", + (3, 16): "LA", + (2, 16): "BGRA;15Z", + (2, 24): "BGR", + (2, 32): "BGRA", +} + + +## +# Image plugin for Targa files. + + +class TgaImageFile(ImageFile.ImageFile): + format = "TGA" + format_description = "Targa" + + def _open(self) -> None: + # process header + assert self.fp is not None + + s = self.fp.read(18) + + id_len = s[0] + + colormaptype = s[1] + imagetype = s[2] + + depth = s[16] + + flags = s[17] + + self._size = i16(s, 12), i16(s, 14) + + # validate header fields + if ( + colormaptype not in (0, 1) + or self.size[0] <= 0 + or self.size[1] <= 0 + or depth not in (1, 8, 16, 24, 32) + ): + msg = "not a TGA file" + raise SyntaxError(msg) + + # image mode + if imagetype in (3, 11): + self._mode = "L" + if depth == 1: + self._mode = "1" # ??? + elif depth == 16: + self._mode = "LA" + elif imagetype in (1, 9): + self._mode = "P" if colormaptype else "L" + elif imagetype in (2, 10): + self._mode = "RGB" if depth == 24 else "RGBA" + else: + msg = "unknown TGA mode" + raise SyntaxError(msg) + + # orientation + orientation = flags & 0x30 + self._flip_horizontally = orientation in [0x10, 0x30] + if orientation in [0x20, 0x30]: + orientation = 1 + elif orientation in [0, 0x10]: + orientation = -1 + else: + msg = "unknown TGA orientation" + raise SyntaxError(msg) + + self.info["orientation"] = orientation + + if imagetype & 8: + self.info["compression"] = "tga_rle" + + if id_len: + self.info["id_section"] = self.fp.read(id_len) + + if colormaptype: + # read palette + start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] + if mapdepth == 16: + self.palette = ImagePalette.raw( + "BGRA;15Z", bytes(2 * start) + self.fp.read(2 * size) + ) + self.palette.mode = "RGBA" + elif mapdepth == 24: + self.palette = ImagePalette.raw( + "BGR", bytes(3 * start) + self.fp.read(3 * size) + ) + elif mapdepth == 32: + self.palette = ImagePalette.raw( + "BGRA", bytes(4 * start) + self.fp.read(4 * size) + ) + else: + msg = "unknown TGA map depth" + raise SyntaxError(msg) + + # setup tile descriptor + try: + rawmode = MODES[(imagetype & 7, depth)] + if imagetype & 8: + # compressed + self.tile = [ + ( + "tga_rle", + (0, 0) + self.size, + self.fp.tell(), + (rawmode, orientation, depth), + ) + ] + else: + self.tile = [ + ( + "raw", + (0, 0) + self.size, + self.fp.tell(), + (rawmode, 0, orientation), + ) + ] + except KeyError: + pass # cannot decode + + def load_end(self) -> None: + if self._flip_horizontally: + assert self.im is not None + self.im = self.im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + + +# +# -------------------------------------------------------------------- +# Write TGA file + + +SAVE = { + "1": ("1", 1, 0, 3), + "L": ("L", 8, 0, 3), + "LA": ("LA", 16, 0, 3), + "P": ("P", 8, 1, 1), + "RGB": ("BGR", 24, 0, 2), + "RGBA": ("BGRA", 32, 0, 2), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + rawmode, bits, colormaptype, imagetype = SAVE[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as TGA" + raise OSError(msg) from e + + if "rle" in im.encoderinfo: + rle = im.encoderinfo["rle"] + else: + compression = im.encoderinfo.get("compression", im.info.get("compression")) + rle = compression == "tga_rle" + if rle: + imagetype += 8 + + id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) + id_len = len(id_section) + if id_len > 255: + id_len = 255 + id_section = id_section[:255] + warnings.warn("id_section has been trimmed to 255 characters") + + if colormaptype: + assert im.im is not None + palette = im.im.getpalette("RGB", "BGR") + colormaplength, colormapentry = len(palette) // 3, 24 + else: + colormaplength, colormapentry = 0, 0 + + if im.mode in ("LA", "RGBA"): + flags = 8 + else: + flags = 0 + + orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) + if orientation > 0: + flags = flags | 0x20 + + fp.write( + o8(id_len) + + o8(colormaptype) + + o8(imagetype) + + o16(0) # colormapfirst + + o16(colormaplength) + + o8(colormapentry) + + o16(0) + + o16(0) + + o16(im.size[0]) + + o16(im.size[1]) + + o8(bits) + + o8(flags) + ) + + if id_section: + fp.write(id_section) + + if colormaptype: + fp.write(palette) + + if rle: + ImageFile._save( + im, fp, [("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))] + ) + else: + ImageFile._save( + im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))] + ) + + # write targa version 2 footer + fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(TgaImageFile.format, TgaImageFile) +Image.register_save(TgaImageFile.format, _save) + +Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) + +Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/.venv/lib/python3.11/site-packages/PIL/TiffImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/TiffImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..ac5b63c1bc470e37bda527498ecb09e038f99ba0 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/TiffImagePlugin.py @@ -0,0 +1,2200 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF file handling +# +# TIFF is a flexible, if somewhat aged, image file format originally +# defined by Aldus. Although TIFF supports a wide variety of pixel +# layouts and compression methods, the name doesn't really stand for +# "thousands of incompatible file formats," it just feels that way. +# +# To read TIFF data from a stream, the stream must be seekable. For +# progressive decoding, make sure to use TIFF files where the tag +# directory is placed first in the file. +# +# History: +# 1995-09-01 fl Created +# 1996-05-04 fl Handle JPEGTABLES tag +# 1996-05-18 fl Fixed COLORMAP support +# 1997-01-05 fl Fixed PREDICTOR support +# 1997-08-27 fl Added support for rational tags (from Perry Stoll) +# 1998-01-10 fl Fixed seek/tell (from Jan Blom) +# 1998-07-15 fl Use private names for internal variables +# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) +# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) +# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) +# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) +# 2001-12-18 fl Added workaround for broken Matrox library +# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) +# 2003-05-19 fl Check FILLORDER tag +# 2003-09-26 fl Added RGBa support +# 2004-02-24 fl Added DPI support; fixed rational write support +# 2005-02-07 fl Added workaround for broken Corel Draw 10 files +# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) +# +# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import itertools +import logging +import math +import os +import struct +import warnings +from collections.abc import MutableMapping +from fractions import Fraction +from numbers import Number, Rational +from typing import IO, TYPE_CHECKING, Any, Callable, NoReturn + +from . import ExifTags, Image, ImageFile, ImageOps, ImagePalette, TiffTags +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +from ._deprecate import deprecate +from .TiffTags import TYPES + +logger = logging.getLogger(__name__) + +# Set these to true to force use of libtiff for reading or writing. +READ_LIBTIFF = False +WRITE_LIBTIFF = False +IFD_LEGACY_API = True +STRIP_SIZE = 65536 + +II = b"II" # little-endian (Intel style) +MM = b"MM" # big-endian (Motorola style) + +# +# -------------------------------------------------------------------- +# Read TIFF files + +# a few tag names, just to make the code below a bit more readable +OSUBFILETYPE = 255 +IMAGEWIDTH = 256 +IMAGELENGTH = 257 +BITSPERSAMPLE = 258 +COMPRESSION = 259 +PHOTOMETRIC_INTERPRETATION = 262 +FILLORDER = 266 +IMAGEDESCRIPTION = 270 +STRIPOFFSETS = 273 +SAMPLESPERPIXEL = 277 +ROWSPERSTRIP = 278 +STRIPBYTECOUNTS = 279 +X_RESOLUTION = 282 +Y_RESOLUTION = 283 +PLANAR_CONFIGURATION = 284 +RESOLUTION_UNIT = 296 +TRANSFERFUNCTION = 301 +SOFTWARE = 305 +DATE_TIME = 306 +ARTIST = 315 +PREDICTOR = 317 +COLORMAP = 320 +TILEWIDTH = 322 +TILELENGTH = 323 +TILEOFFSETS = 324 +TILEBYTECOUNTS = 325 +SUBIFD = 330 +EXTRASAMPLES = 338 +SAMPLEFORMAT = 339 +JPEGTABLES = 347 +YCBCRSUBSAMPLING = 530 +REFERENCEBLACKWHITE = 532 +COPYRIGHT = 33432 +IPTC_NAA_CHUNK = 33723 # newsphoto properties +PHOTOSHOP_CHUNK = 34377 # photoshop properties +ICCPROFILE = 34675 +EXIFIFD = 34665 +XMP = 700 +JPEGQUALITY = 65537 # pseudo-tag by libtiff + +# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java +IMAGEJ_META_DATA_BYTE_COUNTS = 50838 +IMAGEJ_META_DATA = 50839 + +COMPRESSION_INFO = { + # Compression => pil compression name + 1: "raw", + 2: "tiff_ccitt", + 3: "group3", + 4: "group4", + 5: "tiff_lzw", + 6: "tiff_jpeg", # obsolete + 7: "jpeg", + 8: "tiff_adobe_deflate", + 32771: "tiff_raw_16", # 16-bit padding + 32773: "packbits", + 32809: "tiff_thunderscan", + 32946: "tiff_deflate", + 34676: "tiff_sgilog", + 34677: "tiff_sgilog24", + 34925: "lzma", + 50000: "zstd", + 50001: "webp", +} + +COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} + +OPEN_INFO = { + # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, + # ExtraSamples) => mode, rawmode + (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (II, 1, (1,), 1, (1,), ()): ("1", "1"), + (MM, 1, (1,), 1, (1,), ()): ("1", "1"), + (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (II, 1, (1,), 1, (8,), ()): ("L", "L"), + (MM, 1, (1,), 1, (8,), ()): ("L", "L"), + (II, 1, (2,), 1, (8,), ()): ("L", "L"), + (MM, 1, (2,), 1, (8,), ()): ("L", "L"), + (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), + (II, 0, (1,), 1, (16,), ()): ("I;16", "I;16"), + (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), + (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), + (II, 1, (1,), 2, (16,), ()): ("I;16", "I;16R"), + (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), + (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), + (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), + (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), + (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), + (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), + (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), + (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (II, 3, (1,), 1, (8,), ()): ("P", "P"), + (MM, 3, (1,), 1, (8,), ()): ("P", "P"), + (II, 3, (1,), 1, (8, 8), (0,)): ("P", "PX"), + (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"), + (II, 6, (1,), 1, (8,), ()): ("L", "L"), + (MM, 6, (1,), 1, (8,), ()): ("L", "L"), + # JPEG compressed images handled by LibTiff and auto-converted to RGBX + # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel + (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), + (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), + (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), + (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), +} + +MAX_SAMPLESPERPIXEL = max(len(key_tp[4]) for key_tp in OPEN_INFO) + +PREFIXES = [ + b"MM\x00\x2A", # Valid TIFF header with big-endian byte order + b"II\x2A\x00", # Valid TIFF header with little-endian byte order + b"MM\x2A\x00", # Invalid TIFF header, assume big-endian + b"II\x00\x2A", # Invalid TIFF header, assume little-endian + b"MM\x00\x2B", # BigTIFF with big-endian byte order + b"II\x2B\x00", # BigTIFF with little-endian byte order +] + +if not getattr(Image.core, "libtiff_support_custom_tags", True): + deprecate("Support for LibTIFF earlier than version 4", 12) + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] in PREFIXES + + +def _limit_rational(val, max_val): + inv = abs(val) > 1 + n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) + return n_d[::-1] if inv else n_d + + +def _limit_signed_rational(val, max_val, min_val): + frac = Fraction(val) + n_d = frac.numerator, frac.denominator + + if min(n_d) < min_val: + n_d = _limit_rational(val, abs(min_val)) + + if max(n_d) > max_val: + val = Fraction(*n_d) + n_d = _limit_rational(val, max_val) + + return n_d + + +## +# Wrapper for TIFF IFDs. + +_load_dispatch = {} +_write_dispatch = {} + + +def _delegate(op): + def delegate(self, *args): + return getattr(self._val, op)(*args) + + return delegate + + +class IFDRational(Rational): + """Implements a rational class where 0/0 is a legal value to match + the in the wild use of exif rationals. + + e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used + """ + + """ If the denominator is 0, store this as a float('nan'), otherwise store + as a fractions.Fraction(). Delegate as appropriate + + """ + + __slots__ = ("_numerator", "_denominator", "_val") + + def __init__(self, value, denominator=1): + """ + :param value: either an integer numerator, a + float/rational/other number, or an IFDRational + :param denominator: Optional integer denominator + """ + if isinstance(value, IFDRational): + self._numerator = value.numerator + self._denominator = value.denominator + self._val = value._val + return + + if isinstance(value, Fraction): + self._numerator = value.numerator + self._denominator = value.denominator + else: + self._numerator = value + self._denominator = denominator + + if denominator == 0: + self._val = float("nan") + elif denominator == 1: + self._val = Fraction(value) + else: + self._val = Fraction(value, denominator) + + @property + def numerator(self): + return self._numerator + + @property + def denominator(self): + return self._denominator + + def limit_rational(self, max_denominator): + """ + + :param max_denominator: Integer, the maximum denominator value + :returns: Tuple of (numerator, denominator) + """ + + if self.denominator == 0: + return self.numerator, self.denominator + + f = self._val.limit_denominator(max_denominator) + return f.numerator, f.denominator + + def __repr__(self) -> str: + return str(float(self._val)) + + def __hash__(self) -> int: + return self._val.__hash__() + + def __eq__(self, other: object) -> bool: + val = self._val + if isinstance(other, IFDRational): + other = other._val + if isinstance(other, float): + val = float(val) + return val == other + + def __getstate__(self): + return [self._val, self._numerator, self._denominator] + + def __setstate__(self, state): + IFDRational.__init__(self, 0) + _val, _numerator, _denominator = state + self._val = _val + self._numerator = _numerator + self._denominator = _denominator + + """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul', + 'truediv', 'rtruediv', 'floordiv', 'rfloordiv', + 'mod','rmod', 'pow','rpow', 'pos', 'neg', + 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool', + 'ceil', 'floor', 'round'] + print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) + """ + + __add__ = _delegate("__add__") + __radd__ = _delegate("__radd__") + __sub__ = _delegate("__sub__") + __rsub__ = _delegate("__rsub__") + __mul__ = _delegate("__mul__") + __rmul__ = _delegate("__rmul__") + __truediv__ = _delegate("__truediv__") + __rtruediv__ = _delegate("__rtruediv__") + __floordiv__ = _delegate("__floordiv__") + __rfloordiv__ = _delegate("__rfloordiv__") + __mod__ = _delegate("__mod__") + __rmod__ = _delegate("__rmod__") + __pow__ = _delegate("__pow__") + __rpow__ = _delegate("__rpow__") + __pos__ = _delegate("__pos__") + __neg__ = _delegate("__neg__") + __abs__ = _delegate("__abs__") + __trunc__ = _delegate("__trunc__") + __lt__ = _delegate("__lt__") + __gt__ = _delegate("__gt__") + __le__ = _delegate("__le__") + __ge__ = _delegate("__ge__") + __bool__ = _delegate("__bool__") + __ceil__ = _delegate("__ceil__") + __floor__ = _delegate("__floor__") + __round__ = _delegate("__round__") + # Python >= 3.11 + if hasattr(Fraction, "__int__"): + __int__ = _delegate("__int__") + + +def _register_loader(idx, size): + def decorator(func): + from .TiffTags import TYPES + + if func.__name__.startswith("load_"): + TYPES[idx] = func.__name__[5:].replace("_", " ") + _load_dispatch[idx] = size, func # noqa: F821 + return func + + return decorator + + +def _register_writer(idx): + def decorator(func): + _write_dispatch[idx] = func # noqa: F821 + return func + + return decorator + + +def _register_basic(idx_fmt_name): + from .TiffTags import TYPES + + idx, fmt, name = idx_fmt_name + TYPES[idx] = name + size = struct.calcsize(f"={fmt}") + _load_dispatch[idx] = ( # noqa: F821 + size, + lambda self, data, legacy_api=True: ( + self._unpack(f"{len(data) // size}{fmt}", data) + ), + ) + _write_dispatch[idx] = lambda self, *values: ( # noqa: F821 + b"".join(self._pack(fmt, value) for value in values) + ) + + +if TYPE_CHECKING: + _IFDv2Base = MutableMapping[int, Any] +else: + _IFDv2Base = MutableMapping + + +class ImageFileDirectory_v2(_IFDv2Base): + """This class represents a TIFF tag directory. To speed things up, we + don't decode tags unless they're asked for. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v2() + ifd[key] = 'Some Data' + ifd.tagtype[key] = TiffTags.ASCII + print(ifd[key]) + 'Some Data' + + Individual values are returned as the strings or numbers, sequences are + returned as tuples of the values. + + The tiff metadata type of each item is stored in a dictionary of + tag types in + :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types + are read from a tiff file, guessed from the type added, or added + manually. + + Data Structures: + + * ``self.tagtype = {}`` + + * Key: numerical TIFF tag number + * Value: integer corresponding to the data type from + :py:data:`.TiffTags.TYPES` + + .. versionadded:: 3.0.0 + + 'Internal' data structures: + + * ``self._tags_v2 = {}`` + + * Key: numerical TIFF tag number + * Value: decoded data, as tuple for multiple values + + * ``self._tagdata = {}`` + + * Key: numerical TIFF tag number + * Value: undecoded byte string from file + + * ``self._tags_v1 = {}`` + + * Key: numerical TIFF tag number + * Value: decoded data in the v1 format + + Tags will be found in the private attributes ``self._tagdata``, and in + ``self._tags_v2`` once decoded. + + ``self.legacy_api`` is a value for internal use, and shouldn't be changed + from outside code. In cooperation with + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api`` + is true, then decoded tags will be populated into both ``_tags_v1`` and + ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF + save routine. Tags should be read from ``_tags_v1`` if + ``legacy_api == true``. + + """ + + _load_dispatch: dict[int, Callable[[ImageFileDirectory_v2, bytes, bool], Any]] = {} + _write_dispatch: dict[int, Callable[..., Any]] = {} + + def __init__( + self, + ifh: bytes = b"II\052\0\0\0\0\0", + prefix: bytes | None = None, + group: int | None = None, + ) -> None: + """Initialize an ImageFileDirectory. + + To construct an ImageFileDirectory from a real file, pass the 8-byte + magic header to the constructor. To only set the endianness, pass it + as the 'prefix' keyword argument. + + :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets + endianness. + :param prefix: Override the endianness of the file. + """ + if not _accept(ifh): + msg = f"not a TIFF file (header {repr(ifh)} not valid)" + raise SyntaxError(msg) + self._prefix = prefix if prefix is not None else ifh[:2] + if self._prefix == MM: + self._endian = ">" + elif self._prefix == II: + self._endian = "<" + else: + msg = "not a TIFF IFD" + raise SyntaxError(msg) + self._bigtiff = ifh[2] == 43 + self.group = group + self.tagtype: dict[int, int] = {} + """ Dictionary of tag types """ + self.reset() + (self.next,) = ( + self._unpack("Q", ifh[8:]) if self._bigtiff else self._unpack("L", ifh[4:]) + ) + self._legacy_api = False + + prefix = property(lambda self: self._prefix) + offset = property(lambda self: self._offset) + + @property + def legacy_api(self) -> bool: + return self._legacy_api + + @legacy_api.setter + def legacy_api(self, value: bool) -> NoReturn: + msg = "Not allowing setting of legacy api" + raise Exception(msg) + + def reset(self) -> None: + self._tags_v1: dict[int, Any] = {} # will remain empty if legacy_api is false + self._tags_v2: dict[int, Any] = {} # main tag storage + self._tagdata: dict[int, bytes] = {} + self.tagtype = {} # added 2008-06-05 by Florian Hoech + self._next = None + self._offset = None + + def __str__(self) -> str: + return str(dict(self)) + + def named(self): + """ + :returns: dict of name|key: value + + Returns the complete tag dictionary, with named tags where possible. + """ + return { + TiffTags.lookup(code, self.group).name: value + for code, value in self.items() + } + + def __len__(self) -> int: + return len(set(self._tagdata) | set(self._tags_v2)) + + def __getitem__(self, tag): + if tag not in self._tags_v2: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + self[tag] = handler(self, data, self.legacy_api) # check type + val = self._tags_v2[tag] + if self.legacy_api and not isinstance(val, (tuple, bytes)): + val = (val,) + return val + + def __contains__(self, tag): + return tag in self._tags_v2 or tag in self._tagdata + + def __setitem__(self, tag, value): + self._setitem(tag, value, self.legacy_api) + + def _setitem(self, tag, value, legacy_api): + basetypes = (Number, bytes, str) + + info = TiffTags.lookup(tag, self.group) + values = [value] if isinstance(value, basetypes) else value + + if tag not in self.tagtype: + if info.type: + self.tagtype[tag] = info.type + else: + self.tagtype[tag] = TiffTags.UNDEFINED + if all(isinstance(v, IFDRational) for v in values): + self.tagtype[tag] = ( + TiffTags.RATIONAL + if all(v >= 0 for v in values) + else TiffTags.SIGNED_RATIONAL + ) + elif all(isinstance(v, int) for v in values): + if all(0 <= v < 2**16 for v in values): + self.tagtype[tag] = TiffTags.SHORT + elif all(-(2**15) < v < 2**15 for v in values): + self.tagtype[tag] = TiffTags.SIGNED_SHORT + else: + self.tagtype[tag] = ( + TiffTags.LONG + if all(v >= 0 for v in values) + else TiffTags.SIGNED_LONG + ) + elif all(isinstance(v, float) for v in values): + self.tagtype[tag] = TiffTags.DOUBLE + elif all(isinstance(v, str) for v in values): + self.tagtype[tag] = TiffTags.ASCII + elif all(isinstance(v, bytes) for v in values): + self.tagtype[tag] = TiffTags.BYTE + + if self.tagtype[tag] == TiffTags.UNDEFINED: + values = [ + v.encode("ascii", "replace") if isinstance(v, str) else v + for v in values + ] + elif self.tagtype[tag] == TiffTags.RATIONAL: + values = [float(v) if isinstance(v, int) else v for v in values] + + is_ifd = self.tagtype[tag] == TiffTags.LONG and isinstance(values, dict) + if not is_ifd: + values = tuple(info.cvt_enum(value) for value in values) + + dest = self._tags_v1 if legacy_api else self._tags_v2 + + # Three branches: + # Spec'd length == 1, Actual length 1, store as element + # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. + # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. + # Don't mess with the legacy api, since it's frozen. + if not is_ifd and ( + (info.length == 1) + or self.tagtype[tag] == TiffTags.BYTE + or (info.length is None and len(values) == 1 and not legacy_api) + ): + # Don't mess with the legacy api, since it's frozen. + if legacy_api and self.tagtype[tag] in [ + TiffTags.RATIONAL, + TiffTags.SIGNED_RATIONAL, + ]: # rationals + values = (values,) + try: + (dest[tag],) = values + except ValueError: + # We've got a builtin tag with 1 expected entry + warnings.warn( + f"Metadata Warning, tag {tag} had too many entries: " + f"{len(values)}, expected 1" + ) + dest[tag] = values[0] + + else: + # Spec'd length > 1 or undefined + # Unspec'd, and length > 1 + dest[tag] = values + + def __delitem__(self, tag: int) -> None: + self._tags_v2.pop(tag, None) + self._tags_v1.pop(tag, None) + self._tagdata.pop(tag, None) + + def __iter__(self): + return iter(set(self._tagdata) | set(self._tags_v2)) + + def _unpack(self, fmt, data): + return struct.unpack(self._endian + fmt, data) + + def _pack(self, fmt, *values): + return struct.pack(self._endian + fmt, *values) + + list( + map( + _register_basic, + [ + (TiffTags.SHORT, "H", "short"), + (TiffTags.LONG, "L", "long"), + (TiffTags.SIGNED_BYTE, "b", "signed byte"), + (TiffTags.SIGNED_SHORT, "h", "signed short"), + (TiffTags.SIGNED_LONG, "l", "signed long"), + (TiffTags.FLOAT, "f", "float"), + (TiffTags.DOUBLE, "d", "double"), + (TiffTags.IFD, "L", "long"), + (TiffTags.LONG8, "Q", "long8"), + ], + ) + ) + + @_register_loader(1, 1) # Basic type, except for the legacy API. + def load_byte(self, data, legacy_api=True): + return data + + @_register_writer(1) # Basic type, except for the legacy API. + def write_byte(self, data): + if isinstance(data, IFDRational): + data = int(data) + if isinstance(data, int): + data = bytes((data,)) + return data + + @_register_loader(2, 1) + def load_string(self, data, legacy_api=True): + if data.endswith(b"\0"): + data = data[:-1] + return data.decode("latin-1", "replace") + + @_register_writer(2) + def write_string(self, value): + # remerge of https://github.com/python-pillow/Pillow/pull/1416 + if isinstance(value, int): + value = str(value) + if not isinstance(value, bytes): + value = value.encode("ascii", "replace") + return value + b"\0" + + @_register_loader(5, 8) + def load_rational(self, data, legacy_api=True): + vals = self._unpack(f"{len(data) // 4}L", data) + + def combine(a, b): + return (a, b) if legacy_api else IFDRational(a, b) + + return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(5) + def write_rational(self, *values): + return b"".join( + self._pack("2L", *_limit_rational(frac, 2**32 - 1)) for frac in values + ) + + @_register_loader(7, 1) + def load_undefined(self, data, legacy_api=True): + return data + + @_register_writer(7) + def write_undefined(self, value): + if isinstance(value, IFDRational): + value = int(value) + if isinstance(value, int): + value = str(value).encode("ascii", "replace") + return value + + @_register_loader(10, 8) + def load_signed_rational(self, data, legacy_api=True): + vals = self._unpack(f"{len(data) // 4}l", data) + + def combine(a, b): + return (a, b) if legacy_api else IFDRational(a, b) + + return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(10) + def write_signed_rational(self, *values): + return b"".join( + self._pack("2l", *_limit_signed_rational(frac, 2**31 - 1, -(2**31))) + for frac in values + ) + + def _ensure_read(self, fp, size): + ret = fp.read(size) + if len(ret) != size: + msg = ( + "Corrupt EXIF data. " + f"Expecting to read {size} bytes but only got {len(ret)}. " + ) + raise OSError(msg) + return ret + + def load(self, fp): + self.reset() + self._offset = fp.tell() + + try: + tag_count = ( + self._unpack("Q", self._ensure_read(fp, 8)) + if self._bigtiff + else self._unpack("H", self._ensure_read(fp, 2)) + )[0] + for i in range(tag_count): + tag, typ, count, data = ( + self._unpack("HHQ8s", self._ensure_read(fp, 20)) + if self._bigtiff + else self._unpack("HHL4s", self._ensure_read(fp, 12)) + ) + + tagname = TiffTags.lookup(tag, self.group).name + typname = TYPES.get(typ, "unknown") + msg = f"tag: {tagname} ({tag}) - type: {typname} ({typ})" + + try: + unit_size, handler = self._load_dispatch[typ] + except KeyError: + logger.debug("%s - unsupported type %s", msg, typ) + continue # ignore unsupported type + size = count * unit_size + if size > (8 if self._bigtiff else 4): + here = fp.tell() + (offset,) = self._unpack("Q" if self._bigtiff else "L", data) + msg += f" Tag Location: {here} - Data Location: {offset}" + fp.seek(offset) + data = ImageFile._safe_read(fp, size) + fp.seek(here) + else: + data = data[:size] + + if len(data) != size: + warnings.warn( + "Possibly corrupt EXIF data. " + f"Expecting to read {size} bytes but only got {len(data)}." + f" Skipping tag {tag}" + ) + logger.debug(msg) + continue + + if not data: + logger.debug(msg) + continue + + self._tagdata[tag] = data + self.tagtype[tag] = typ + + msg += " - value: " + ( + "" % size if size > 32 else repr(data) + ) + logger.debug(msg) + + (self.next,) = ( + self._unpack("Q", self._ensure_read(fp, 8)) + if self._bigtiff + else self._unpack("L", self._ensure_read(fp, 4)) + ) + except OSError as msg: + warnings.warn(str(msg)) + return + + def tobytes(self, offset=0): + # FIXME What about tagdata? + result = self._pack("H", len(self._tags_v2)) + + entries = [] + offset = offset + len(result) + len(self._tags_v2) * 12 + 4 + stripoffsets = None + + # pass 1: convert tags to binary format + # always write tags in ascending order + for tag, value in sorted(self._tags_v2.items()): + if tag == STRIPOFFSETS: + stripoffsets = len(entries) + typ = self.tagtype.get(tag) + logger.debug("Tag %s, Type: %s, Value: %s", tag, typ, repr(value)) + is_ifd = typ == TiffTags.LONG and isinstance(value, dict) + if is_ifd: + if self._endian == "<": + ifh = b"II\x2A\x00\x08\x00\x00\x00" + else: + ifh = b"MM\x00\x2A\x00\x00\x00\x08" + ifd = ImageFileDirectory_v2(ifh, group=tag) + values = self._tags_v2[tag] + for ifd_tag, ifd_value in values.items(): + ifd[ifd_tag] = ifd_value + data = ifd.tobytes(offset) + else: + values = value if isinstance(value, tuple) else (value,) + data = self._write_dispatch[typ](self, *values) + + tagname = TiffTags.lookup(tag, self.group).name + typname = "ifd" if is_ifd else TYPES.get(typ, "unknown") + msg = f"save: {tagname} ({tag}) - type: {typname} ({typ})" + msg += " - value: " + ( + "" % len(data) if len(data) >= 16 else str(values) + ) + logger.debug(msg) + + # count is sum of lengths for string and arbitrary data + if is_ifd: + count = 1 + elif typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]: + count = len(data) + else: + count = len(values) + # figure out if data fits into the entry + if len(data) <= 4: + entries.append((tag, typ, count, data.ljust(4, b"\0"), b"")) + else: + entries.append((tag, typ, count, self._pack("L", offset), data)) + offset += (len(data) + 1) // 2 * 2 # pad to word + + # update strip offset data to point beyond auxiliary data + if stripoffsets is not None: + tag, typ, count, value, data = entries[stripoffsets] + if data: + msg = "multistrip support not yet implemented" + raise NotImplementedError(msg) + value = self._pack("L", self._unpack("L", value)[0] + offset) + entries[stripoffsets] = tag, typ, count, value, data + + # pass 2: write entries to file + for tag, typ, count, value, data in entries: + logger.debug("%s %s %s %s %s", tag, typ, count, repr(value), repr(data)) + result += self._pack("HHL4s", tag, typ, count, value) + + # -- overwrite here for multi-page -- + result += b"\0\0\0\0" # end of entries + + # pass 3: write auxiliary data to file + for tag, typ, count, value, data in entries: + result += data + if len(data) & 1: + result += b"\0" + + return result + + def save(self, fp): + if fp.tell() == 0: # skip TIFF header on subsequent pages + # tiff header -- PIL always starts the first IFD at offset 8 + fp.write(self._prefix + self._pack("HL", 42, 8)) + + offset = fp.tell() + result = self.tobytes(offset) + fp.write(result) + return offset + len(result) + + +ImageFileDirectory_v2._load_dispatch = _load_dispatch +ImageFileDirectory_v2._write_dispatch = _write_dispatch +for idx, name in TYPES.items(): + name = name.replace(" ", "_") + setattr(ImageFileDirectory_v2, f"load_{name}", _load_dispatch[idx][1]) + setattr(ImageFileDirectory_v2, f"write_{name}", _write_dispatch[idx]) +del _load_dispatch, _write_dispatch, idx, name + + +# Legacy ImageFileDirectory support. +class ImageFileDirectory_v1(ImageFileDirectory_v2): + """This class represents the **legacy** interface to a TIFF tag directory. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v1() + ifd[key] = 'Some Data' + ifd.tagtype[key] = TiffTags.ASCII + print(ifd[key]) + ('Some Data',) + + Also contains a dictionary of tag types as read from the tiff image file, + :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. + + Values are returned as a tuple. + + .. deprecated:: 3.0.0 + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._legacy_api = True + + tags = property(lambda self: self._tags_v1) + tagdata = property(lambda self: self._tagdata) + + # defined in ImageFileDirectory_v2 + tagtype: dict[int, int] + """Dictionary of tag types""" + + @classmethod + def from_v2(cls, original): + """Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + + """ + + ifd = cls(prefix=original.prefix) + ifd._tagdata = original._tagdata + ifd.tagtype = original.tagtype + ifd.next = original.next # an indicator for multipage tiffs + return ifd + + def to_v2(self) -> ImageFileDirectory_v2: + """Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + + """ + + ifd = ImageFileDirectory_v2(prefix=self.prefix) + ifd._tagdata = dict(self._tagdata) + ifd.tagtype = dict(self.tagtype) + ifd._tags_v2 = dict(self._tags_v2) + return ifd + + def __contains__(self, tag): + return tag in self._tags_v1 or tag in self._tagdata + + def __len__(self) -> int: + return len(set(self._tagdata) | set(self._tags_v1)) + + def __iter__(self): + return iter(set(self._tagdata) | set(self._tags_v1)) + + def __setitem__(self, tag, value): + for legacy_api in (False, True): + self._setitem(tag, value, legacy_api) + + def __getitem__(self, tag): + if tag not in self._tags_v1: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + for legacy in (False, True): + self._setitem(tag, handler(self, data, legacy), legacy) + val = self._tags_v1[tag] + if not isinstance(val, (tuple, bytes)): + val = (val,) + return val + + +# undone -- switch this pointer when IFD_LEGACY_API == False +ImageFileDirectory = ImageFileDirectory_v1 + + +## +# Image plugin for TIFF files. + + +class TiffImageFile(ImageFile.ImageFile): + format = "TIFF" + format_description = "Adobe TIFF" + _close_exclusive_fp_after_loading = False + + def __init__(self, fp=None, filename=None): + self.tag_v2 = None + """ Image file directory (tag dictionary) """ + + self.tag = None + """ Legacy tag entries """ + + super().__init__(fp, filename) + + def _open(self) -> None: + """Open the first image in a TIFF file""" + + # Header + ifh = self.fp.read(8) + if ifh[2] == 43: + ifh += self.fp.read(8) + + self.tag_v2 = ImageFileDirectory_v2(ifh) + + # legacy IFD entries will be filled in later + self.ifd = None + + # setup frame pointers + self.__first = self.__next = self.tag_v2.next + self.__frame = -1 + self._fp = self.fp + self._frame_pos: list[int] = [] + self._n_frames: int | None = None + + logger.debug("*** TiffImageFile._open ***") + logger.debug("- __first: %s", self.__first) + logger.debug("- ifh: %s", repr(ifh)) # Use repr to avoid str(bytes) + + # and load the first frame + self._seek(0) + + @property + def n_frames(self): + if self._n_frames is None: + current = self.tell() + self._seek(len(self._frame_pos)) + while self._n_frames is None: + self._seek(self.tell() + 1) + self.seek(current) + return self._n_frames + + def seek(self, frame: int) -> None: + """Select a given frame as current image""" + if not self._seek_check(frame): + return + self._seek(frame) + # Create a new core image object on second and + # subsequent frames in the image. Image may be + # different size/mode. + Image._decompression_bomb_check(self.size) + self.im = Image.core.new(self.mode, self.size) + + def _seek(self, frame: int) -> None: + self.fp = self._fp + + # reset buffered io handle in case fp + # was passed to libtiff, invalidating the buffer + self.fp.tell() + + while len(self._frame_pos) <= frame: + if not self.__next: + msg = "no more images in TIFF file" + raise EOFError(msg) + logger.debug( + "Seeking to frame %s, on frame %s, __next %s, location: %s", + frame, + self.__frame, + self.__next, + self.fp.tell(), + ) + if self.__next >= 2**63: + msg = "Unable to seek to frame" + raise ValueError(msg) + self.fp.seek(self.__next) + self._frame_pos.append(self.__next) + logger.debug("Loading tags, location: %s", self.fp.tell()) + self.tag_v2.load(self.fp) + if self.tag_v2.next in self._frame_pos: + # This IFD has already been processed + # Declare this to be the end of the image + self.__next = 0 + else: + self.__next = self.tag_v2.next + if self.__next == 0: + self._n_frames = frame + 1 + if len(self._frame_pos) == 1: + self.is_animated = self.__next != 0 + self.__frame += 1 + self.fp.seek(self._frame_pos[frame]) + self.tag_v2.load(self.fp) + if XMP in self.tag_v2: + self.info["xmp"] = self.tag_v2[XMP] + elif "xmp" in self.info: + del self.info["xmp"] + self._reload_exif() + # fill the legacy tag/ifd entries + self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) + self.__frame = frame + self._setup() + + def tell(self) -> int: + """Return the current frame number""" + return self.__frame + + def get_photoshop_blocks(self): + """ + Returns a dictionary of Photoshop "Image Resource Blocks". + The keys are the image resource ID. For more information, see + https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727 + + :returns: Photoshop "Image Resource Blocks" in a dictionary. + """ + blocks = {} + val = self.tag_v2.get(ExifTags.Base.ImageResources) + if val: + while val[:4] == b"8BIM": + id = i16(val[4:6]) + n = math.ceil((val[6] + 1) / 2) * 2 + size = i32(val[6 + n : 10 + n]) + data = val[10 + n : 10 + n + size] + blocks[id] = {"data": data} + + val = val[math.ceil((10 + n + size) / 2) * 2 :] + return blocks + + def load(self): + if self.tile and self.use_load_libtiff: + return self._load_libtiff() + return super().load() + + def load_end(self) -> None: + # allow closing if we're on the first frame, there's no next + # This is the ImageFile.load path only, libtiff specific below. + if not self.is_animated: + self._close_exclusive_fp_after_loading = True + + # reset buffered io handle in case fp + # was passed to libtiff, invalidating the buffer + self.fp.tell() + + # load IFD data from fp before it is closed + exif = self.getexif() + for key in TiffTags.TAGS_V2_GROUPS: + if key not in exif: + continue + exif.get_ifd(key) + + ImageOps.exif_transpose(self, in_place=True) + if ExifTags.Base.Orientation in self.tag_v2: + del self.tag_v2[ExifTags.Base.Orientation] + + def _load_libtiff(self): + """Overload method triggered when we detect a compressed tiff + Calls out to libtiff""" + + Image.Image.load(self) + + self.load_prepare() + + if not len(self.tile) == 1: + msg = "Not exactly one tile" + raise OSError(msg) + + # (self._compression, (extents tuple), + # 0, (rawmode, self._compression, fp)) + extents = self.tile[0][1] + args = list(self.tile[0][3]) + + # To be nice on memory footprint, if there's a + # file descriptor, use that instead of reading + # into a string in python. + try: + fp = hasattr(self.fp, "fileno") and self.fp.fileno() + # flush the file descriptor, prevents error on pypy 2.4+ + # should also eliminate the need for fp.tell + # in _seek + if hasattr(self.fp, "flush"): + self.fp.flush() + except OSError: + # io.BytesIO have a fileno, but returns an OSError if + # it doesn't use a file descriptor. + fp = False + + if fp: + args[2] = fp + + decoder = Image._getdecoder( + self.mode, "libtiff", tuple(args), self.decoderconfig + ) + try: + decoder.setimage(self.im, extents) + except ValueError as e: + msg = "Couldn't set the image" + raise OSError(msg) from e + + close_self_fp = self._exclusive_fp and not self.is_animated + if hasattr(self.fp, "getvalue"): + # We've got a stringio like thing passed in. Yay for all in memory. + # The decoder needs the entire file in one shot, so there's not + # a lot we can do here other than give it the entire file. + # unless we could do something like get the address of the + # underlying string for stringio. + # + # Rearranging for supporting byteio items, since they have a fileno + # that returns an OSError if there's no underlying fp. Easier to + # deal with here by reordering. + logger.debug("have getvalue. just sending in a string from getvalue") + n, err = decoder.decode(self.fp.getvalue()) + elif fp: + # we've got a actual file on disk, pass in the fp. + logger.debug("have fileno, calling fileno version of the decoder.") + if not close_self_fp: + self.fp.seek(0) + # 4 bytes, otherwise the trace might error out + n, err = decoder.decode(b"fpfp") + else: + # we have something else. + logger.debug("don't have fileno or getvalue. just reading") + self.fp.seek(0) + # UNDONE -- so much for that buffer size thing. + n, err = decoder.decode(self.fp.read()) + + self.tile = [] + self.readonly = 0 + + self.load_end() + + if close_self_fp: + self.fp.close() + self.fp = None # might be shared + + if err < 0: + raise OSError(err) + + return Image.Image.load(self) + + def _setup(self): + """Setup this image object based on current tags""" + + if 0xBC01 in self.tag_v2: + msg = "Windows Media Photo files not yet supported" + raise OSError(msg) + + # extract relevant tags + self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] + self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) + + # photometric is a required tag, but not everyone is reading + # the specification + photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) + + # old style jpeg compression images most certainly are YCbCr + if self._compression == "tiff_jpeg": + photo = 6 + + fillorder = self.tag_v2.get(FILLORDER, 1) + + logger.debug("*** Summary ***") + logger.debug("- compression: %s", self._compression) + logger.debug("- photometric_interpretation: %s", photo) + logger.debug("- planar_configuration: %s", self._planar_configuration) + logger.debug("- fill_order: %s", fillorder) + logger.debug("- YCbCr subsampling: %s", self.tag.get(YCBCRSUBSAMPLING)) + + # size + xsize = int(self.tag_v2.get(IMAGEWIDTH)) + ysize = int(self.tag_v2.get(IMAGELENGTH)) + self._size = xsize, ysize + + logger.debug("- size: %s", self.size) + + sample_format = self.tag_v2.get(SAMPLEFORMAT, (1,)) + if len(sample_format) > 1 and max(sample_format) == min(sample_format) == 1: + # SAMPLEFORMAT is properly per band, so an RGB image will + # be (1,1,1). But, we don't support per band pixel types, + # and anything more than one band is a uint8. So, just + # take the first element. Revisit this if adding support + # for more exotic images. + sample_format = (1,) + + bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) + extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) + if photo in (2, 6, 8): # RGB, YCbCr, LAB + bps_count = 3 + elif photo == 5: # CMYK + bps_count = 4 + else: + bps_count = 1 + bps_count += len(extra_tuple) + bps_actual_count = len(bps_tuple) + samples_per_pixel = self.tag_v2.get( + SAMPLESPERPIXEL, + 3 if self._compression == "tiff_jpeg" and photo in (2, 6) else 1, + ) + + if samples_per_pixel > MAX_SAMPLESPERPIXEL: + # DOS check, samples_per_pixel can be a Long, and we extend the tuple below + logger.error( + "More samples per pixel than can be decoded: %s", samples_per_pixel + ) + msg = "Invalid value for samples per pixel" + raise SyntaxError(msg) + + if samples_per_pixel < bps_actual_count: + # If a file has more values in bps_tuple than expected, + # remove the excess. + bps_tuple = bps_tuple[:samples_per_pixel] + elif samples_per_pixel > bps_actual_count and bps_actual_count == 1: + # If a file has only one value in bps_tuple, when it should have more, + # presume it is the same number of bits for all of the samples. + bps_tuple = bps_tuple * samples_per_pixel + + if len(bps_tuple) != samples_per_pixel: + msg = "unknown data organization" + raise SyntaxError(msg) + + # mode: check photometric interpretation and bits per pixel + key = ( + self.tag_v2.prefix, + photo, + sample_format, + fillorder, + bps_tuple, + extra_tuple, + ) + logger.debug("format key: %s", key) + try: + self._mode, rawmode = OPEN_INFO[key] + except KeyError as e: + logger.debug("- unsupported format") + msg = "unknown pixel mode" + raise SyntaxError(msg) from e + + logger.debug("- raw mode: %s", rawmode) + logger.debug("- pil mode: %s", self.mode) + + self.info["compression"] = self._compression + + xres = self.tag_v2.get(X_RESOLUTION, 1) + yres = self.tag_v2.get(Y_RESOLUTION, 1) + + if xres and yres: + resunit = self.tag_v2.get(RESOLUTION_UNIT) + if resunit == 2: # dots per inch + self.info["dpi"] = (xres, yres) + elif resunit == 3: # dots per centimeter. convert to dpi + self.info["dpi"] = (xres * 2.54, yres * 2.54) + elif resunit is None: # used to default to 1, but now 2) + self.info["dpi"] = (xres, yres) + # For backward compatibility, + # we also preserve the old behavior + self.info["resolution"] = xres, yres + else: # No absolute unit of measurement + self.info["resolution"] = xres, yres + + # build tile descriptors + x = y = layer = 0 + self.tile = [] + self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw" + if self.use_load_libtiff: + # Decoder expects entire file as one tile. + # There's a buffer size limit in load (64k) + # so large g4 images will fail if we use that + # function. + # + # Setup the one tile for the whole image, then + # use the _load_libtiff function. + + # libtiff handles the fillmode for us, so 1;IR should + # actually be 1;I. Including the R double reverses the + # bits, so stripes of the image are reversed. See + # https://github.com/python-pillow/Pillow/issues/279 + if fillorder == 2: + # Replace fillorder with fillorder=1 + key = key[:3] + (1,) + key[4:] + logger.debug("format key: %s", key) + # this should always work, since all the + # fillorder==2 modes have a corresponding + # fillorder=1 mode + self._mode, rawmode = OPEN_INFO[key] + # libtiff always returns the bytes in native order. + # we're expecting image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if rawmode == "I;16": + rawmode = "I;16N" + if ";16B" in rawmode: + rawmode = rawmode.replace(";16B", ";16N") + if ";16L" in rawmode: + rawmode = rawmode.replace(";16L", ";16N") + + # YCbCr images with new jpeg compression with pixels in one plane + # unpacked straight into RGB values + if ( + photo == 6 + and self._compression == "jpeg" + and self._planar_configuration == 1 + ): + rawmode = "RGB" + + # Offset in the tile tuple is 0, we go from 0,0 to + # w,h, and we only do this once -- eds + a = (rawmode, self._compression, False, self.tag_v2.offset) + self.tile.append(("libtiff", (0, 0, xsize, ysize), 0, a)) + + elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: + # striped image + if STRIPOFFSETS in self.tag_v2: + offsets = self.tag_v2[STRIPOFFSETS] + h = self.tag_v2.get(ROWSPERSTRIP, ysize) + w = self.size[0] + else: + # tiled image + offsets = self.tag_v2[TILEOFFSETS] + w = self.tag_v2.get(TILEWIDTH) + h = self.tag_v2.get(TILELENGTH) + + for offset in offsets: + if x + w > xsize: + stride = w * sum(bps_tuple) / 8 # bytes per line + else: + stride = 0 + + tile_rawmode = rawmode + if self._planar_configuration == 2: + # each band on it's own layer + tile_rawmode = rawmode[layer] + # adjust stride width accordingly + stride /= bps_count + + a = (tile_rawmode, int(stride), 1) + self.tile.append( + ( + self._compression, + (x, y, min(x + w, xsize), min(y + h, ysize)), + offset, + a, + ) + ) + x = x + w + if x >= self.size[0]: + x, y = 0, y + h + if y >= self.size[1]: + x = y = 0 + layer += 1 + else: + logger.debug("- unsupported data organization") + msg = "unknown data organization" + raise SyntaxError(msg) + + # Fix up info. + if ICCPROFILE in self.tag_v2: + self.info["icc_profile"] = self.tag_v2[ICCPROFILE] + + # fixup palette descriptor + + if self.mode in ["P", "PA"]: + palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] + self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) + + +# +# -------------------------------------------------------------------- +# Write TIFF files + +# little endian is default except for image modes with +# explicit big endian byte-order + +SAVE_INFO = { + # mode => rawmode, byteorder, photometrics, + # sampleformat, bitspersample, extra + "1": ("1", II, 1, 1, (1,), None), + "L": ("L", II, 1, 1, (8,), None), + "LA": ("LA", II, 1, 1, (8, 8), 2), + "P": ("P", II, 3, 1, (8,), None), + "PA": ("PA", II, 3, 1, (8, 8), 2), + "I": ("I;32S", II, 1, 2, (32,), None), + "I;16": ("I;16", II, 1, 1, (16,), None), + "I;16S": ("I;16S", II, 1, 2, (16,), None), + "F": ("F;32F", II, 1, 3, (32,), None), + "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), + "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), + "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), + "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), + "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), + "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), + "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), + "I;16B": ("I;16B", MM, 1, 1, (16,), None), + "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), + "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), +} + + +def _save(im, fp, filename): + try: + rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as TIFF" + raise OSError(msg) from e + + ifd = ImageFileDirectory_v2(prefix=prefix) + + encoderinfo = im.encoderinfo + encoderconfig = im.encoderconfig + try: + compression = encoderinfo["compression"] + except KeyError: + compression = im.info.get("compression") + if isinstance(compression, int): + # compression value may be from BMP. Ignore it + compression = None + if compression is None: + compression = "raw" + elif compression == "tiff_jpeg": + # OJPEG is obsolete, so use new-style JPEG compression instead + compression = "jpeg" + elif compression == "tiff_deflate": + compression = "tiff_adobe_deflate" + + libtiff = WRITE_LIBTIFF or compression != "raw" + + # required for color libtiff images + ifd[PLANAR_CONFIGURATION] = 1 + + ifd[IMAGEWIDTH] = im.size[0] + ifd[IMAGELENGTH] = im.size[1] + + # write any arbitrary tags passed in as an ImageFileDirectory + if "tiffinfo" in encoderinfo: + info = encoderinfo["tiffinfo"] + elif "exif" in encoderinfo: + info = encoderinfo["exif"] + if isinstance(info, bytes): + exif = Image.Exif() + exif.load(info) + info = exif + else: + info = {} + logger.debug("Tiffinfo Keys: %s", list(info)) + if isinstance(info, ImageFileDirectory_v1): + info = info.to_v2() + for key in info: + if isinstance(info, Image.Exif) and key in TiffTags.TAGS_V2_GROUPS: + ifd[key] = info.get_ifd(key) + else: + ifd[key] = info.get(key) + try: + ifd.tagtype[key] = info.tagtype[key] + except Exception: + pass # might not be an IFD. Might not have populated type + + legacy_ifd = {} + if hasattr(im, "tag"): + legacy_ifd = im.tag.to_v2() + + supplied_tags = {**legacy_ifd, **getattr(im, "tag_v2", {})} + for tag in ( + # IFD offset that may not be correct in the saved image + EXIFIFD, + # Determined by the image format and should not be copied from legacy_ifd. + SAMPLEFORMAT, + ): + if tag in supplied_tags: + del supplied_tags[tag] + + # additions written by Greg Couch, gregc@cgl.ucsf.edu + # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com + if hasattr(im, "tag_v2"): + # preserve tags from original TIFF image file + for key in ( + RESOLUTION_UNIT, + X_RESOLUTION, + Y_RESOLUTION, + IPTC_NAA_CHUNK, + PHOTOSHOP_CHUNK, + XMP, + ): + if key in im.tag_v2: + if key == IPTC_NAA_CHUNK and im.tag_v2.tagtype[key] not in ( + TiffTags.BYTE, + TiffTags.UNDEFINED, + ): + del supplied_tags[key] + else: + ifd[key] = im.tag_v2[key] + ifd.tagtype[key] = im.tag_v2.tagtype[key] + + # preserve ICC profile (should also work when saving other formats + # which support profiles as TIFF) -- 2008-06-06 Florian Hoech + icc = encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + ifd[ICCPROFILE] = icc + + for key, name in [ + (IMAGEDESCRIPTION, "description"), + (X_RESOLUTION, "resolution"), + (Y_RESOLUTION, "resolution"), + (X_RESOLUTION, "x_resolution"), + (Y_RESOLUTION, "y_resolution"), + (RESOLUTION_UNIT, "resolution_unit"), + (SOFTWARE, "software"), + (DATE_TIME, "date_time"), + (ARTIST, "artist"), + (COPYRIGHT, "copyright"), + ]: + if name in encoderinfo: + ifd[key] = encoderinfo[name] + + dpi = encoderinfo.get("dpi") + if dpi: + ifd[RESOLUTION_UNIT] = 2 + ifd[X_RESOLUTION] = dpi[0] + ifd[Y_RESOLUTION] = dpi[1] + + if bits != (1,): + ifd[BITSPERSAMPLE] = bits + if len(bits) != 1: + ifd[SAMPLESPERPIXEL] = len(bits) + if extra is not None: + ifd[EXTRASAMPLES] = extra + if format != 1: + ifd[SAMPLEFORMAT] = format + + if PHOTOMETRIC_INTERPRETATION not in ifd: + ifd[PHOTOMETRIC_INTERPRETATION] = photo + elif im.mode in ("1", "L") and ifd[PHOTOMETRIC_INTERPRETATION] == 0: + if im.mode == "1": + inverted_im = im.copy() + px = inverted_im.load() + for y in range(inverted_im.height): + for x in range(inverted_im.width): + px[x, y] = 0 if px[x, y] == 255 else 255 + im = inverted_im + else: + im = ImageOps.invert(im) + + if im.mode in ["P", "PA"]: + lut = im.im.getpalette("RGB", "RGB;L") + colormap = [] + colors = len(lut) // 3 + for i in range(3): + colormap += [v * 256 for v in lut[colors * i : colors * (i + 1)]] + colormap += [0] * (256 - colors) + ifd[COLORMAP] = colormap + # data orientation + w, h = ifd[IMAGEWIDTH], ifd[IMAGELENGTH] + stride = len(bits) * ((w * bits[0] + 7) // 8) + if ROWSPERSTRIP not in ifd: + # aim for given strip size (64 KB by default) when using libtiff writer + if libtiff: + im_strip_size = encoderinfo.get("strip_size", STRIP_SIZE) + rows_per_strip = 1 if stride == 0 else min(im_strip_size // stride, h) + # JPEG encoder expects multiple of 8 rows + if compression == "jpeg": + rows_per_strip = min(((rows_per_strip + 7) // 8) * 8, h) + else: + rows_per_strip = h + if rows_per_strip == 0: + rows_per_strip = 1 + ifd[ROWSPERSTRIP] = rows_per_strip + strip_byte_counts = 1 if stride == 0 else stride * ifd[ROWSPERSTRIP] + strips_per_image = (h + ifd[ROWSPERSTRIP] - 1) // ifd[ROWSPERSTRIP] + if strip_byte_counts >= 2**16: + ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG + ifd[STRIPBYTECOUNTS] = (strip_byte_counts,) * (strips_per_image - 1) + ( + stride * h - strip_byte_counts * (strips_per_image - 1), + ) + ifd[STRIPOFFSETS] = tuple( + range(0, strip_byte_counts * strips_per_image, strip_byte_counts) + ) # this is adjusted by IFD writer + # no compression by default: + ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) + + if im.mode == "YCbCr": + for tag, value in { + YCBCRSUBSAMPLING: (1, 1), + REFERENCEBLACKWHITE: (0, 255, 128, 255, 128, 255), + }.items(): + ifd.setdefault(tag, value) + + blocklist = [TILEWIDTH, TILELENGTH, TILEOFFSETS, TILEBYTECOUNTS] + if libtiff: + if "quality" in encoderinfo: + quality = encoderinfo["quality"] + if not isinstance(quality, int) or quality < 0 or quality > 100: + msg = "Invalid quality setting" + raise ValueError(msg) + if compression != "jpeg": + msg = "quality setting only supported for 'jpeg' compression" + raise ValueError(msg) + ifd[JPEGQUALITY] = quality + + logger.debug("Saving using libtiff encoder") + logger.debug("Items: %s", sorted(ifd.items())) + _fp = 0 + if hasattr(fp, "fileno"): + try: + fp.seek(0) + _fp = os.dup(fp.fileno()) + except io.UnsupportedOperation: + pass + + # optional types for non core tags + types = {} + # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library + # based on the data in the strip. + # OSUBFILETYPE is deprecated. + # The other tags expect arrays with a certain length (fixed or depending on + # BITSPERSAMPLE, etc), passing arrays with a different length will result in + # segfaults. Block these tags until we add extra validation. + # SUBIFD may also cause a segfault. + blocklist += [ + OSUBFILETYPE, + REFERENCEBLACKWHITE, + STRIPBYTECOUNTS, + STRIPOFFSETS, + TRANSFERFUNCTION, + SUBIFD, + ] + + # bits per sample is a single short in the tiff directory, not a list. + atts = {BITSPERSAMPLE: bits[0]} + # Merge the ones that we have with (optional) more bits from + # the original file, e.g x,y resolution so that we can + # save(load('')) == original file. + for tag, value in itertools.chain(ifd.items(), supplied_tags.items()): + # Libtiff can only process certain core items without adding + # them to the custom dictionary. + # Custom items are supported for int, float, unicode, string and byte + # values. Other types and tuples require a tagtype. + if tag not in TiffTags.LIBTIFF_CORE: + if not getattr(Image.core, "libtiff_support_custom_tags", False): + continue + + if tag in ifd.tagtype: + types[tag] = ifd.tagtype[tag] + elif not (isinstance(value, (int, float, str, bytes))): + continue + else: + type = TiffTags.lookup(tag).type + if type: + types[tag] = type + if tag not in atts and tag not in blocklist: + if isinstance(value, str): + atts[tag] = value.encode("ascii", "replace") + b"\0" + elif isinstance(value, IFDRational): + atts[tag] = float(value) + else: + atts[tag] = value + + if SAMPLEFORMAT in atts and len(atts[SAMPLEFORMAT]) == 1: + atts[SAMPLEFORMAT] = atts[SAMPLEFORMAT][0] + + logger.debug("Converted items: %s", sorted(atts.items())) + + # libtiff always expects the bytes in native order. + # we're storing image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if im.mode in ("I;16B", "I;16"): + rawmode = "I;16N" + + # Pass tags as sorted list so that the tags are set in a fixed order. + # This is required by libtiff for some tags. For example, the JPEGQUALITY + # pseudo tag requires that the COMPRESS tag was already set. + tags = list(atts.items()) + tags.sort() + a = (rawmode, compression, _fp, filename, tags, types) + encoder = Image._getencoder(im.mode, "libtiff", a, encoderconfig) + encoder.setimage(im.im, (0, 0) + im.size) + while True: + # undone, change to self.decodermaxblock: + errcode, data = encoder.encode(16 * 1024)[1:] + if not _fp: + fp.write(data) + if errcode: + break + if _fp: + try: + os.close(_fp) + except OSError: + pass + if errcode < 0: + msg = f"encoder error {errcode} when writing image file" + raise OSError(msg) + + else: + for tag in blocklist: + del ifd[tag] + offset = ifd.save(fp) + + ImageFile._save( + im, fp, [("raw", (0, 0) + im.size, offset, (rawmode, stride, 1))] + ) + + # -- helper for multi-page save -- + if "_debug_multipage" in encoderinfo: + # just to access o32 and o16 (using correct byte order) + im._debug_multipage = ifd + + +class AppendingTiffWriter: + fieldSizes = [ + 0, # None + 1, # byte + 1, # ascii + 2, # short + 4, # long + 8, # rational + 1, # sbyte + 1, # undefined + 2, # sshort + 4, # slong + 8, # srational + 4, # float + 8, # double + 4, # ifd + 2, # unicode + 4, # complex + 8, # long8 + ] + + Tags = { + 273, # StripOffsets + 288, # FreeOffsets + 324, # TileOffsets + 519, # JPEGQTables + 520, # JPEGDCTables + 521, # JPEGACTables + } + + def __init__(self, fn, new=False): + if hasattr(fn, "read"): + self.f = fn + self.close_fp = False + else: + self.name = fn + self.close_fp = True + try: + self.f = open(fn, "w+b" if new else "r+b") + except OSError: + self.f = open(fn, "w+b") + self.beginning = self.f.tell() + self.setup() + + def setup(self) -> None: + # Reset everything. + self.f.seek(self.beginning, os.SEEK_SET) + + self.whereToWriteNewIFDOffset = None + self.offsetOfNewPage = 0 + + self.IIMM = iimm = self.f.read(4) + if not iimm: + # empty file - first page + self.isFirst = True + return + + self.isFirst = False + if iimm == b"II\x2a\x00": + self.setEndian("<") + elif iimm == b"MM\x00\x2a": + self.setEndian(">") + else: + msg = "Invalid TIFF file header" + raise RuntimeError(msg) + + self.skipIFDs() + self.goToEnd() + + def finalize(self) -> None: + if self.isFirst: + return + + # fix offsets + self.f.seek(self.offsetOfNewPage) + + iimm = self.f.read(4) + if not iimm: + # Make it easy to finish a frame without committing to a new one. + return + + if iimm != self.IIMM: + msg = "IIMM of new page doesn't match IIMM of first page" + raise RuntimeError(msg) + + ifd_offset = self.readLong() + ifd_offset += self.offsetOfNewPage + self.f.seek(self.whereToWriteNewIFDOffset) + self.writeLong(ifd_offset) + self.f.seek(ifd_offset) + self.fixIFD() + + def newFrame(self) -> None: + # Call this to finish a frame. + self.finalize() + self.setup() + + def __enter__(self) -> AppendingTiffWriter: + return self + + def __exit__(self, *args: object) -> None: + if self.close_fp: + self.close() + + def tell(self) -> int: + return self.f.tell() - self.offsetOfNewPage + + def seek(self, offset, whence=io.SEEK_SET): + if whence == os.SEEK_SET: + offset += self.offsetOfNewPage + + self.f.seek(offset, whence) + return self.tell() + + def goToEnd(self) -> None: + self.f.seek(0, os.SEEK_END) + pos = self.f.tell() + + # pad to 16 byte boundary + pad_bytes = 16 - pos % 16 + if 0 < pad_bytes < 16: + self.f.write(bytes(pad_bytes)) + self.offsetOfNewPage = self.f.tell() + + def setEndian(self, endian: str) -> None: + self.endian = endian + self.longFmt = f"{self.endian}L" + self.shortFmt = f"{self.endian}H" + self.tagFormat = f"{self.endian}HHL" + + def skipIFDs(self) -> None: + while True: + ifd_offset = self.readLong() + if ifd_offset == 0: + self.whereToWriteNewIFDOffset = self.f.tell() - 4 + break + + self.f.seek(ifd_offset) + num_tags = self.readShort() + self.f.seek(num_tags * 12, os.SEEK_CUR) + + def write(self, data: bytes) -> int | None: + return self.f.write(data) + + def readShort(self) -> int: + (value,) = struct.unpack(self.shortFmt, self.f.read(2)) + return value + + def readLong(self) -> int: + (value,) = struct.unpack(self.longFmt, self.f.read(4)) + return value + + def rewriteLastShortToLong(self, value: int) -> None: + self.f.seek(-2, os.SEEK_CUR) + bytes_written = self.f.write(struct.pack(self.longFmt, value)) + if bytes_written is not None and bytes_written != 4: + msg = f"wrote only {bytes_written} bytes but wanted 4" + raise RuntimeError(msg) + + def rewriteLastShort(self, value: int) -> None: + self.f.seek(-2, os.SEEK_CUR) + bytes_written = self.f.write(struct.pack(self.shortFmt, value)) + if bytes_written is not None and bytes_written != 2: + msg = f"wrote only {bytes_written} bytes but wanted 2" + raise RuntimeError(msg) + + def rewriteLastLong(self, value: int) -> None: + self.f.seek(-4, os.SEEK_CUR) + bytes_written = self.f.write(struct.pack(self.longFmt, value)) + if bytes_written is not None and bytes_written != 4: + msg = f"wrote only {bytes_written} bytes but wanted 4" + raise RuntimeError(msg) + + def writeShort(self, value: int) -> None: + bytes_written = self.f.write(struct.pack(self.shortFmt, value)) + if bytes_written is not None and bytes_written != 2: + msg = f"wrote only {bytes_written} bytes but wanted 2" + raise RuntimeError(msg) + + def writeLong(self, value: int) -> None: + bytes_written = self.f.write(struct.pack(self.longFmt, value)) + if bytes_written is not None and bytes_written != 4: + msg = f"wrote only {bytes_written} bytes but wanted 4" + raise RuntimeError(msg) + + def close(self) -> None: + self.finalize() + self.f.close() + + def fixIFD(self) -> None: + num_tags = self.readShort() + + for i in range(num_tags): + tag, field_type, count = struct.unpack(self.tagFormat, self.f.read(8)) + + field_size = self.fieldSizes[field_type] + total_size = field_size * count + is_local = total_size <= 4 + offset: int | None + if not is_local: + offset = self.readLong() + self.offsetOfNewPage + self.rewriteLastLong(offset) + + if tag in self.Tags: + cur_pos = self.f.tell() + + if is_local: + self.fixOffsets( + count, isShort=(field_size == 2), isLong=(field_size == 4) + ) + self.f.seek(cur_pos + 4) + else: + self.f.seek(offset) + self.fixOffsets( + count, isShort=(field_size == 2), isLong=(field_size == 4) + ) + self.f.seek(cur_pos) + + offset = cur_pos = None + + elif is_local: + # skip the locally stored value that is not an offset + self.f.seek(4, os.SEEK_CUR) + + def fixOffsets( + self, count: int, isShort: bool = False, isLong: bool = False + ) -> None: + if not isShort and not isLong: + msg = "offset is neither short nor long" + raise RuntimeError(msg) + + for i in range(count): + offset = self.readShort() if isShort else self.readLong() + offset += self.offsetOfNewPage + if isShort and offset >= 65536: + # offset is now too large - we must convert shorts to longs + if count != 1: + msg = "not implemented" + raise RuntimeError(msg) # XXX TODO + + # simple case - the offset is just one and therefore it is + # local (not referenced with another offset) + self.rewriteLastShortToLong(offset) + self.f.seek(-10, os.SEEK_CUR) + self.writeShort(TiffTags.LONG) # rewrite the type to LONG + self.f.seek(8, os.SEEK_CUR) + elif isShort: + self.rewriteLastShort(offset) + else: + self.rewriteLastLong(offset) + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + encoderinfo = im.encoderinfo.copy() + encoderconfig = im.encoderconfig + append_images = list(encoderinfo.get("append_images", [])) + if not hasattr(im, "n_frames") and not append_images: + return _save(im, fp, filename) + + cur_idx = im.tell() + try: + with AppendingTiffWriter(fp) as tf: + for ims in [im] + append_images: + ims.encoderinfo = encoderinfo + ims.encoderconfig = encoderconfig + if not hasattr(ims, "n_frames"): + nfr = 1 + else: + nfr = ims.n_frames + + for idx in range(nfr): + ims.seek(idx) + ims.load() + _save(ims, tf, filename) + tf.newFrame() + finally: + im.seek(cur_idx) + + +# +# -------------------------------------------------------------------- +# Register + +Image.register_open(TiffImageFile.format, TiffImageFile, _accept) +Image.register_save(TiffImageFile.format, _save) +Image.register_save_all(TiffImageFile.format, _save_all) + +Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) + +Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/.venv/lib/python3.11/site-packages/PIL/TiffTags.py b/.venv/lib/python3.11/site-packages/PIL/TiffTags.py new file mode 100644 index 0000000000000000000000000000000000000000..e318c87398ccb83db4e3a593838bc2a45d561667 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/TiffTags.py @@ -0,0 +1,555 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF tags +# +# This module provides clear-text names for various well-known +# TIFF tags. the TIFF codec works just fine without it. +# +# Copyright (c) Secret Labs AB 1999. +# +# See the README file for information on usage and redistribution. +# + +## +# This module provides constants and clear-text names for various +# well-known TIFF tags. +## +from __future__ import annotations + +from typing import NamedTuple + + +class _TagInfo(NamedTuple): + value: int | None + name: str + type: int | None + length: int | None + enum: dict[str, int] + + +class TagInfo(_TagInfo): + __slots__: list[str] = [] + + def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None): + return super().__new__(cls, value, name, type, length, enum or {}) + + def cvt_enum(self, value): + # Using get will call hash(value), which can be expensive + # for some types (e.g. Fraction). Since self.enum is rarely + # used, it's usually better to test it first. + return self.enum.get(value, value) if self.enum else value + + +def lookup(tag, group=None): + """ + :param tag: Integer tag number + :param group: Which :py:data:`~PIL.TiffTags.TAGS_V2_GROUPS` to look in + + .. versionadded:: 8.3.0 + + :returns: Taginfo namedtuple, From the ``TAGS_V2`` info if possible, + otherwise just populating the value and name from ``TAGS``. + If the tag is not recognized, "unknown" is returned for the name + + """ + + if group is not None: + info = TAGS_V2_GROUPS[group].get(tag) if group in TAGS_V2_GROUPS else None + else: + info = TAGS_V2.get(tag) + return info or TagInfo(tag, TAGS.get(tag, "unknown")) + + +## +# Map tag numbers to tag info. +# +# id: (Name, Type, Length[, enum_values]) +# +# The length here differs from the length in the tiff spec. For +# numbers, the tiff spec is for the number of fields returned. We +# agree here. For string-like types, the tiff spec uses the length of +# field in bytes. In Pillow, we are using the number of expected +# fields, in general 1 for string-like types. + + +BYTE = 1 +ASCII = 2 +SHORT = 3 +LONG = 4 +RATIONAL = 5 +SIGNED_BYTE = 6 +UNDEFINED = 7 +SIGNED_SHORT = 8 +SIGNED_LONG = 9 +SIGNED_RATIONAL = 10 +FLOAT = 11 +DOUBLE = 12 +IFD = 13 +LONG8 = 16 + +_tags_v2 = { + 254: ("NewSubfileType", LONG, 1), + 255: ("SubfileType", SHORT, 1), + 256: ("ImageWidth", LONG, 1), + 257: ("ImageLength", LONG, 1), + 258: ("BitsPerSample", SHORT, 0), + 259: ( + "Compression", + SHORT, + 1, + { + "Uncompressed": 1, + "CCITT 1d": 2, + "Group 3 Fax": 3, + "Group 4 Fax": 4, + "LZW": 5, + "JPEG": 6, + "PackBits": 32773, + }, + ), + 262: ( + "PhotometricInterpretation", + SHORT, + 1, + { + "WhiteIsZero": 0, + "BlackIsZero": 1, + "RGB": 2, + "RGB Palette": 3, + "Transparency Mask": 4, + "CMYK": 5, + "YCbCr": 6, + "CieLAB": 8, + "CFA": 32803, # TIFF/EP, Adobe DNG + "LinearRaw": 32892, # Adobe DNG + }, + ), + 263: ("Threshholding", SHORT, 1), + 264: ("CellWidth", SHORT, 1), + 265: ("CellLength", SHORT, 1), + 266: ("FillOrder", SHORT, 1), + 269: ("DocumentName", ASCII, 1), + 270: ("ImageDescription", ASCII, 1), + 271: ("Make", ASCII, 1), + 272: ("Model", ASCII, 1), + 273: ("StripOffsets", LONG, 0), + 274: ("Orientation", SHORT, 1), + 277: ("SamplesPerPixel", SHORT, 1), + 278: ("RowsPerStrip", LONG, 1), + 279: ("StripByteCounts", LONG, 0), + 280: ("MinSampleValue", SHORT, 0), + 281: ("MaxSampleValue", SHORT, 0), + 282: ("XResolution", RATIONAL, 1), + 283: ("YResolution", RATIONAL, 1), + 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), + 285: ("PageName", ASCII, 1), + 286: ("XPosition", RATIONAL, 1), + 287: ("YPosition", RATIONAL, 1), + 288: ("FreeOffsets", LONG, 1), + 289: ("FreeByteCounts", LONG, 1), + 290: ("GrayResponseUnit", SHORT, 1), + 291: ("GrayResponseCurve", SHORT, 0), + 292: ("T4Options", LONG, 1), + 293: ("T6Options", LONG, 1), + 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), + 297: ("PageNumber", SHORT, 2), + 301: ("TransferFunction", SHORT, 0), + 305: ("Software", ASCII, 1), + 306: ("DateTime", ASCII, 1), + 315: ("Artist", ASCII, 1), + 316: ("HostComputer", ASCII, 1), + 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), + 318: ("WhitePoint", RATIONAL, 2), + 319: ("PrimaryChromaticities", RATIONAL, 6), + 320: ("ColorMap", SHORT, 0), + 321: ("HalftoneHints", SHORT, 2), + 322: ("TileWidth", LONG, 1), + 323: ("TileLength", LONG, 1), + 324: ("TileOffsets", LONG, 0), + 325: ("TileByteCounts", LONG, 0), + 330: ("SubIFDs", LONG, 0), + 332: ("InkSet", SHORT, 1), + 333: ("InkNames", ASCII, 1), + 334: ("NumberOfInks", SHORT, 1), + 336: ("DotRange", SHORT, 0), + 337: ("TargetPrinter", ASCII, 1), + 338: ("ExtraSamples", SHORT, 0), + 339: ("SampleFormat", SHORT, 0), + 340: ("SMinSampleValue", DOUBLE, 0), + 341: ("SMaxSampleValue", DOUBLE, 0), + 342: ("TransferRange", SHORT, 6), + 347: ("JPEGTables", UNDEFINED, 1), + # obsolete JPEG tags + 512: ("JPEGProc", SHORT, 1), + 513: ("JPEGInterchangeFormat", LONG, 1), + 514: ("JPEGInterchangeFormatLength", LONG, 1), + 515: ("JPEGRestartInterval", SHORT, 1), + 517: ("JPEGLosslessPredictors", SHORT, 0), + 518: ("JPEGPointTransforms", SHORT, 0), + 519: ("JPEGQTables", LONG, 0), + 520: ("JPEGDCTables", LONG, 0), + 521: ("JPEGACTables", LONG, 0), + 529: ("YCbCrCoefficients", RATIONAL, 3), + 530: ("YCbCrSubSampling", SHORT, 2), + 531: ("YCbCrPositioning", SHORT, 1), + 532: ("ReferenceBlackWhite", RATIONAL, 6), + 700: ("XMP", BYTE, 0), + 33432: ("Copyright", ASCII, 1), + 33723: ("IptcNaaInfo", UNDEFINED, 1), + 34377: ("PhotoshopInfo", BYTE, 0), + # FIXME add more tags here + 34665: ("ExifIFD", LONG, 1), + 34675: ("ICCProfile", UNDEFINED, 1), + 34853: ("GPSInfoIFD", LONG, 1), + 36864: ("ExifVersion", UNDEFINED, 1), + 37724: ("ImageSourceData", UNDEFINED, 1), + 40965: ("InteroperabilityIFD", LONG, 1), + 41730: ("CFAPattern", UNDEFINED, 1), + # MPInfo + 45056: ("MPFVersion", UNDEFINED, 1), + 45057: ("NumberOfImages", LONG, 1), + 45058: ("MPEntry", UNDEFINED, 1), + 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check + 45060: ("TotalFrames", LONG, 1), + 45313: ("MPIndividualNum", LONG, 1), + 45569: ("PanOrientation", LONG, 1), + 45570: ("PanOverlap_H", RATIONAL, 1), + 45571: ("PanOverlap_V", RATIONAL, 1), + 45572: ("BaseViewpointNum", LONG, 1), + 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), + 45574: ("BaselineLength", RATIONAL, 1), + 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), + 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), + 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), + 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), + 45579: ("YawAngle", SIGNED_RATIONAL, 1), + 45580: ("PitchAngle", SIGNED_RATIONAL, 1), + 45581: ("RollAngle", SIGNED_RATIONAL, 1), + 40960: ("FlashPixVersion", UNDEFINED, 1), + 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), + 50780: ("BestQualityScale", RATIONAL, 1), + 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one + 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006 +} +TAGS_V2_GROUPS = { + # ExifIFD + 34665: { + 36864: ("ExifVersion", UNDEFINED, 1), + 40960: ("FlashPixVersion", UNDEFINED, 1), + 40965: ("InteroperabilityIFD", LONG, 1), + 41730: ("CFAPattern", UNDEFINED, 1), + }, + # GPSInfoIFD + 34853: { + 0: ("GPSVersionID", BYTE, 4), + 1: ("GPSLatitudeRef", ASCII, 2), + 2: ("GPSLatitude", RATIONAL, 3), + 3: ("GPSLongitudeRef", ASCII, 2), + 4: ("GPSLongitude", RATIONAL, 3), + 5: ("GPSAltitudeRef", BYTE, 1), + 6: ("GPSAltitude", RATIONAL, 1), + 7: ("GPSTimeStamp", RATIONAL, 3), + 8: ("GPSSatellites", ASCII, 0), + 9: ("GPSStatus", ASCII, 2), + 10: ("GPSMeasureMode", ASCII, 2), + 11: ("GPSDOP", RATIONAL, 1), + 12: ("GPSSpeedRef", ASCII, 2), + 13: ("GPSSpeed", RATIONAL, 1), + 14: ("GPSTrackRef", ASCII, 2), + 15: ("GPSTrack", RATIONAL, 1), + 16: ("GPSImgDirectionRef", ASCII, 2), + 17: ("GPSImgDirection", RATIONAL, 1), + 18: ("GPSMapDatum", ASCII, 0), + 19: ("GPSDestLatitudeRef", ASCII, 2), + 20: ("GPSDestLatitude", RATIONAL, 3), + 21: ("GPSDestLongitudeRef", ASCII, 2), + 22: ("GPSDestLongitude", RATIONAL, 3), + 23: ("GPSDestBearingRef", ASCII, 2), + 24: ("GPSDestBearing", RATIONAL, 1), + 25: ("GPSDestDistanceRef", ASCII, 2), + 26: ("GPSDestDistance", RATIONAL, 1), + 27: ("GPSProcessingMethod", UNDEFINED, 0), + 28: ("GPSAreaInformation", UNDEFINED, 0), + 29: ("GPSDateStamp", ASCII, 11), + 30: ("GPSDifferential", SHORT, 1), + }, + # InteroperabilityIFD + 40965: {1: ("InteropIndex", ASCII, 1), 2: ("InteropVersion", UNDEFINED, 1)}, +} + +# Legacy Tags structure +# these tags aren't included above, but were in the previous versions +TAGS = { + 347: "JPEGTables", + 700: "XMP", + # Additional Exif Info + 32932: "Wang Annotation", + 33434: "ExposureTime", + 33437: "FNumber", + 33445: "MD FileTag", + 33446: "MD ScalePixel", + 33447: "MD ColorTable", + 33448: "MD LabName", + 33449: "MD SampleInfo", + 33450: "MD PrepDate", + 33451: "MD PrepTime", + 33452: "MD FileUnits", + 33550: "ModelPixelScaleTag", + 33723: "IptcNaaInfo", + 33918: "INGR Packet Data Tag", + 33919: "INGR Flag Registers", + 33920: "IrasB Transformation Matrix", + 33922: "ModelTiepointTag", + 34264: "ModelTransformationTag", + 34377: "PhotoshopInfo", + 34735: "GeoKeyDirectoryTag", + 34736: "GeoDoubleParamsTag", + 34737: "GeoAsciiParamsTag", + 34850: "ExposureProgram", + 34852: "SpectralSensitivity", + 34855: "ISOSpeedRatings", + 34856: "OECF", + 34864: "SensitivityType", + 34865: "StandardOutputSensitivity", + 34866: "RecommendedExposureIndex", + 34867: "ISOSpeed", + 34868: "ISOSpeedLatitudeyyy", + 34869: "ISOSpeedLatitudezzz", + 34908: "HylaFAX FaxRecvParams", + 34909: "HylaFAX FaxSubAddress", + 34910: "HylaFAX FaxRecvTime", + 36864: "ExifVersion", + 36867: "DateTimeOriginal", + 36868: "DateTimeDigitized", + 37121: "ComponentsConfiguration", + 37122: "CompressedBitsPerPixel", + 37724: "ImageSourceData", + 37377: "ShutterSpeedValue", + 37378: "ApertureValue", + 37379: "BrightnessValue", + 37380: "ExposureBiasValue", + 37381: "MaxApertureValue", + 37382: "SubjectDistance", + 37383: "MeteringMode", + 37384: "LightSource", + 37385: "Flash", + 37386: "FocalLength", + 37396: "SubjectArea", + 37500: "MakerNote", + 37510: "UserComment", + 37520: "SubSec", + 37521: "SubSecTimeOriginal", + 37522: "SubsecTimeDigitized", + 40960: "FlashPixVersion", + 40961: "ColorSpace", + 40962: "PixelXDimension", + 40963: "PixelYDimension", + 40964: "RelatedSoundFile", + 40965: "InteroperabilityIFD", + 41483: "FlashEnergy", + 41484: "SpatialFrequencyResponse", + 41486: "FocalPlaneXResolution", + 41487: "FocalPlaneYResolution", + 41488: "FocalPlaneResolutionUnit", + 41492: "SubjectLocation", + 41493: "ExposureIndex", + 41495: "SensingMethod", + 41728: "FileSource", + 41729: "SceneType", + 41730: "CFAPattern", + 41985: "CustomRendered", + 41986: "ExposureMode", + 41987: "WhiteBalance", + 41988: "DigitalZoomRatio", + 41989: "FocalLengthIn35mmFilm", + 41990: "SceneCaptureType", + 41991: "GainControl", + 41992: "Contrast", + 41993: "Saturation", + 41994: "Sharpness", + 41995: "DeviceSettingDescription", + 41996: "SubjectDistanceRange", + 42016: "ImageUniqueID", + 42032: "CameraOwnerName", + 42033: "BodySerialNumber", + 42034: "LensSpecification", + 42035: "LensMake", + 42036: "LensModel", + 42037: "LensSerialNumber", + 42112: "GDAL_METADATA", + 42113: "GDAL_NODATA", + 42240: "Gamma", + 50215: "Oce Scanjob Description", + 50216: "Oce Application Selector", + 50217: "Oce Identification Number", + 50218: "Oce ImageLogic Characteristics", + # Adobe DNG + 50706: "DNGVersion", + 50707: "DNGBackwardVersion", + 50708: "UniqueCameraModel", + 50709: "LocalizedCameraModel", + 50710: "CFAPlaneColor", + 50711: "CFALayout", + 50712: "LinearizationTable", + 50713: "BlackLevelRepeatDim", + 50714: "BlackLevel", + 50715: "BlackLevelDeltaH", + 50716: "BlackLevelDeltaV", + 50717: "WhiteLevel", + 50718: "DefaultScale", + 50719: "DefaultCropOrigin", + 50720: "DefaultCropSize", + 50721: "ColorMatrix1", + 50722: "ColorMatrix2", + 50723: "CameraCalibration1", + 50724: "CameraCalibration2", + 50725: "ReductionMatrix1", + 50726: "ReductionMatrix2", + 50727: "AnalogBalance", + 50728: "AsShotNeutral", + 50729: "AsShotWhiteXY", + 50730: "BaselineExposure", + 50731: "BaselineNoise", + 50732: "BaselineSharpness", + 50733: "BayerGreenSplit", + 50734: "LinearResponseLimit", + 50735: "CameraSerialNumber", + 50736: "LensInfo", + 50737: "ChromaBlurRadius", + 50738: "AntiAliasStrength", + 50740: "DNGPrivateData", + 50778: "CalibrationIlluminant1", + 50779: "CalibrationIlluminant2", + 50784: "Alias Layer Metadata", +} + +TAGS_V2: dict[int, TagInfo] = {} + + +def _populate(): + for k, v in _tags_v2.items(): + # Populate legacy structure. + TAGS[k] = v[0] + if len(v) == 4: + for sk, sv in v[3].items(): + TAGS[(k, sv)] = sk + + TAGS_V2[k] = TagInfo(k, *v) + + for tags in TAGS_V2_GROUPS.values(): + for k, v in tags.items(): + tags[k] = TagInfo(k, *v) + + +_populate() +## +# Map type numbers to type names -- defined in ImageFileDirectory. + +TYPES: dict[int, str] = {} + +# +# These tags are handled by default in libtiff, without +# adding to the custom dictionary. From tif_dir.c, searching for +# case TIFFTAG in the _TIFFVSetField function: +# Line: item. +# 148: case TIFFTAG_SUBFILETYPE: +# 151: case TIFFTAG_IMAGEWIDTH: +# 154: case TIFFTAG_IMAGELENGTH: +# 157: case TIFFTAG_BITSPERSAMPLE: +# 181: case TIFFTAG_COMPRESSION: +# 202: case TIFFTAG_PHOTOMETRIC: +# 205: case TIFFTAG_THRESHHOLDING: +# 208: case TIFFTAG_FILLORDER: +# 214: case TIFFTAG_ORIENTATION: +# 221: case TIFFTAG_SAMPLESPERPIXEL: +# 228: case TIFFTAG_ROWSPERSTRIP: +# 238: case TIFFTAG_MINSAMPLEVALUE: +# 241: case TIFFTAG_MAXSAMPLEVALUE: +# 244: case TIFFTAG_SMINSAMPLEVALUE: +# 247: case TIFFTAG_SMAXSAMPLEVALUE: +# 250: case TIFFTAG_XRESOLUTION: +# 256: case TIFFTAG_YRESOLUTION: +# 262: case TIFFTAG_PLANARCONFIG: +# 268: case TIFFTAG_XPOSITION: +# 271: case TIFFTAG_YPOSITION: +# 274: case TIFFTAG_RESOLUTIONUNIT: +# 280: case TIFFTAG_PAGENUMBER: +# 284: case TIFFTAG_HALFTONEHINTS: +# 288: case TIFFTAG_COLORMAP: +# 294: case TIFFTAG_EXTRASAMPLES: +# 298: case TIFFTAG_MATTEING: +# 305: case TIFFTAG_TILEWIDTH: +# 316: case TIFFTAG_TILELENGTH: +# 327: case TIFFTAG_TILEDEPTH: +# 333: case TIFFTAG_DATATYPE: +# 344: case TIFFTAG_SAMPLEFORMAT: +# 361: case TIFFTAG_IMAGEDEPTH: +# 364: case TIFFTAG_SUBIFD: +# 376: case TIFFTAG_YCBCRPOSITIONING: +# 379: case TIFFTAG_YCBCRSUBSAMPLING: +# 383: case TIFFTAG_TRANSFERFUNCTION: +# 389: case TIFFTAG_REFERENCEBLACKWHITE: +# 393: case TIFFTAG_INKNAMES: + +# Following pseudo-tags are also handled by default in libtiff: +# TIFFTAG_JPEGQUALITY 65537 + +# some of these are not in our TAGS_V2 dict and were included from tiff.h + +# This list also exists in encode.c +LIBTIFF_CORE = { + 255, + 256, + 257, + 258, + 259, + 262, + 263, + 266, + 274, + 277, + 278, + 280, + 281, + 340, + 341, + 282, + 283, + 284, + 286, + 287, + 296, + 297, + 321, + 320, + 338, + 32995, + 322, + 323, + 32998, + 32996, + 339, + 32997, + 330, + 531, + 530, + 301, + 532, + 333, + # as above + 269, # this has been in our tests forever, and works + 65537, +} + +LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes +LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff +LIBTIFF_CORE.remove(323) # Tiled images +LIBTIFF_CORE.remove(333) # Ink Names either + +# Note to advanced users: There may be combinations of these +# parameters and values that when added properly, will work and +# produce valid tiff images that may work in your application. +# It is safe to add and remove tags from this set from Pillow's point +# of view so long as you test against libtiff. diff --git a/.venv/lib/python3.11/site-packages/PIL/WalImageFile.py b/.venv/lib/python3.11/site-packages/PIL/WalImageFile.py new file mode 100644 index 0000000000000000000000000000000000000000..fbd7be6ed5c7809219d7a4114d5a2ece8bd36787 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/WalImageFile.py @@ -0,0 +1,124 @@ +# +# The Python Imaging Library. +# $Id$ +# +# WAL file handling +# +# History: +# 2003-04-23 fl created +# +# Copyright (c) 2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +""" +This reader is based on the specification available from: +https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml +and has been tested with a few sample files found using google. + +.. note:: + This format cannot be automatically recognized, so the reader + is not registered for use with :py:func:`PIL.Image.open()`. + To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. +""" +from __future__ import annotations + +from . import Image, ImageFile +from ._binary import i32le as i32 + + +class WalImageFile(ImageFile.ImageFile): + format = "WAL" + format_description = "Quake2 Texture" + + def _open(self) -> None: + self._mode = "P" + + # read header fields + header = self.fp.read(32 + 24 + 32 + 12) + self._size = i32(header, 32), i32(header, 36) + Image._decompression_bomb_check(self.size) + + # load pixel data + offset = i32(header, 40) + self.fp.seek(offset) + + # strings are null-terminated + self.info["name"] = header[:32].split(b"\0", 1)[0] + next_name = header[56 : 56 + 32].split(b"\0", 1)[0] + if next_name: + self.info["next_name"] = next_name + + def load(self): + if not self.im: + self.im = Image.core.new(self.mode, self.size) + self.frombytes(self.fp.read(self.size[0] * self.size[1])) + self.putpalette(quake2palette) + return Image.Image.load(self) + + +def open(filename): + """ + Load texture from a Quake2 WAL texture file. + + By default, a Quake2 standard palette is attached to the texture. + To override the palette, use the :py:func:`PIL.Image.Image.putpalette()` method. + + :param filename: WAL file name, or an opened file handle. + :returns: An image instance. + """ + return WalImageFile(filename) + + +quake2palette = ( + # default palette taken from piffo 0.93 by Hans Häggström + b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" + b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" + b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" + b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" + b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" + b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" + b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" + b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" + b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" + b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" + b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" + b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" + b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" + b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" + b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" + b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" + b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" + b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" + b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" + b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" + b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" + b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" + b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" + b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" + b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" + b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" + b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" + b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" + b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" + b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" + b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" + b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" + b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" + b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" + b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" + b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" + b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" + b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" + b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" + b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" + b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" + b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" + b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" + b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" + b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" + b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" + b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" + b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" +) diff --git a/.venv/lib/python3.11/site-packages/PIL/WebPImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/WebPImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..59be5bf9d31b233b9045c180ea26bdab839b746c --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/WebPImagePlugin.py @@ -0,0 +1,363 @@ +from __future__ import annotations + +from io import BytesIO +from typing import IO, Any + +from . import Image, ImageFile + +try: + from . import _webp + + SUPPORTED = True +except ImportError: + SUPPORTED = False + + +_VALID_WEBP_MODES = {"RGBX": True, "RGBA": True, "RGB": True} + +_VALID_WEBP_LEGACY_MODES = {"RGB": True, "RGBA": True} + +_VP8_MODES_BY_IDENTIFIER = { + b"VP8 ": "RGB", + b"VP8X": "RGBA", + b"VP8L": "RGBA", # lossless +} + + +def _accept(prefix: bytes) -> bool | str: + is_riff_file_format = prefix[:4] == b"RIFF" + is_webp_file = prefix[8:12] == b"WEBP" + is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER + + if is_riff_file_format and is_webp_file and is_valid_vp8_mode: + if not SUPPORTED: + return ( + "image file could not be identified because WEBP support not installed" + ) + return True + return False + + +class WebPImageFile(ImageFile.ImageFile): + format = "WEBP" + format_description = "WebP image" + __loaded = 0 + __logical_frame = 0 + + def _open(self) -> None: + if not _webp.HAVE_WEBPANIM: + # Legacy mode + data, width, height, self._mode, icc_profile, exif = _webp.WebPDecode( + self.fp.read() + ) + if icc_profile: + self.info["icc_profile"] = icc_profile + if exif: + self.info["exif"] = exif + self._size = width, height + self.fp = BytesIO(data) + self.tile = [("raw", (0, 0) + self.size, 0, self.mode)] + self.n_frames = 1 + self.is_animated = False + return + + # Use the newer AnimDecoder API to parse the (possibly) animated file, + # and access muxed chunks like ICC/EXIF/XMP. + self._decoder = _webp.WebPAnimDecoder(self.fp.read()) + + # Get info from decoder + width, height, loop_count, bgcolor, frame_count, mode = self._decoder.get_info() + self._size = width, height + self.info["loop"] = loop_count + bg_a, bg_r, bg_g, bg_b = ( + (bgcolor >> 24) & 0xFF, + (bgcolor >> 16) & 0xFF, + (bgcolor >> 8) & 0xFF, + bgcolor & 0xFF, + ) + self.info["background"] = (bg_r, bg_g, bg_b, bg_a) + self.n_frames = frame_count + self.is_animated = self.n_frames > 1 + self._mode = "RGB" if mode == "RGBX" else mode + self.rawmode = mode + self.tile = [] + + # Attempt to read ICC / EXIF / XMP chunks from file + icc_profile = self._decoder.get_chunk("ICCP") + exif = self._decoder.get_chunk("EXIF") + xmp = self._decoder.get_chunk("XMP ") + if icc_profile: + self.info["icc_profile"] = icc_profile + if exif: + self.info["exif"] = exif + if xmp: + self.info["xmp"] = xmp + + # Initialize seek state + self._reset(reset=False) + + def _getexif(self) -> dict[str, Any] | None: + if "exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + + # Set logical frame to requested position + self.__logical_frame = frame + + def _reset(self, reset: bool = True) -> None: + if reset: + self._decoder.reset() + self.__physical_frame = 0 + self.__loaded = -1 + self.__timestamp = 0 + + def _get_next(self): + # Get next frame + ret = self._decoder.get_next() + self.__physical_frame += 1 + + # Check if an error occurred + if ret is None: + self._reset() # Reset just to be safe + self.seek(0) + msg = "failed to decode next frame in WebP file" + raise EOFError(msg) + + # Compute duration + data, timestamp = ret + duration = timestamp - self.__timestamp + self.__timestamp = timestamp + + # libwebp gives frame end, adjust to start of frame + timestamp -= duration + return data, timestamp, duration + + def _seek(self, frame: int) -> None: + if self.__physical_frame == frame: + return # Nothing to do + if frame < self.__physical_frame: + self._reset() # Rewind to beginning + while self.__physical_frame < frame: + self._get_next() # Advance to the requested frame + + def load(self): + if _webp.HAVE_WEBPANIM: + if self.__loaded != self.__logical_frame: + self._seek(self.__logical_frame) + + # We need to load the image data for this frame + data, timestamp, duration = self._get_next() + self.info["timestamp"] = timestamp + self.info["duration"] = duration + self.__loaded = self.__logical_frame + + # Set tile + if self.fp and self._exclusive_fp: + self.fp.close() + self.fp = BytesIO(data) + self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] + + return super().load() + + def load_seek(self, pos: int) -> None: + pass + + def tell(self) -> int: + if not _webp.HAVE_WEBPANIM: + return super().tell() + + return self.__logical_frame + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + encoderinfo = im.encoderinfo.copy() + append_images = list(encoderinfo.get("append_images", [])) + + # If total frame count is 1, then save using the legacy API, which + # will preserve non-alpha modes + total = 0 + for ims in [im] + append_images: + total += getattr(ims, "n_frames", 1) + if total == 1: + _save(im, fp, filename) + return + + background: int | tuple[int, ...] = (0, 0, 0, 0) + if "background" in encoderinfo: + background = encoderinfo["background"] + elif "background" in im.info: + background = im.info["background"] + if isinstance(background, int): + # GifImagePlugin stores a global color table index in + # info["background"]. So it must be converted to an RGBA value + palette = im.getpalette() + if palette: + r, g, b = palette[background * 3 : (background + 1) * 3] + background = (r, g, b, 255) + else: + background = (background, background, background, 255) + + duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) + loop = im.encoderinfo.get("loop", 0) + minimize_size = im.encoderinfo.get("minimize_size", False) + kmin = im.encoderinfo.get("kmin", None) + kmax = im.encoderinfo.get("kmax", None) + allow_mixed = im.encoderinfo.get("allow_mixed", False) + verbose = False + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + alpha_quality = im.encoderinfo.get("alpha_quality", 100) + method = im.encoderinfo.get("method", 0) + icc_profile = im.encoderinfo.get("icc_profile") or "" + exif = im.encoderinfo.get("exif", "") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + xmp = im.encoderinfo.get("xmp", "") + if allow_mixed: + lossless = False + + # Sensible keyframe defaults are from gif2webp.c script + if kmin is None: + kmin = 9 if lossless else 3 + if kmax is None: + kmax = 17 if lossless else 5 + + # Validate background color + if ( + not isinstance(background, (list, tuple)) + or len(background) != 4 + or not all(0 <= v < 256 for v in background) + ): + msg = f"Background color is not an RGBA tuple clamped to (0-255): {background}" + raise OSError(msg) + + # Convert to packed uint + bg_r, bg_g, bg_b, bg_a = background + background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) + + # Setup the WebP animation encoder + enc = _webp.WebPAnimEncoder( + im.size[0], + im.size[1], + background, + loop, + minimize_size, + kmin, + kmax, + allow_mixed, + verbose, + ) + + # Add each frame + frame_idx = 0 + timestamp = 0 + cur_idx = im.tell() + try: + for ims in [im] + append_images: + # Get # of frames in this image + nfr = getattr(ims, "n_frames", 1) + + for idx in range(nfr): + ims.seek(idx) + ims.load() + + # Make sure image mode is supported + frame = ims + rawmode = ims.mode + if ims.mode not in _VALID_WEBP_MODES: + alpha = ( + "A" in ims.mode + or "a" in ims.mode + or (ims.mode == "P" and "A" in ims.im.getpalettemode()) + ) + rawmode = "RGBA" if alpha else "RGB" + frame = ims.convert(rawmode) + + if rawmode == "RGB": + # For faster conversion, use RGBX + rawmode = "RGBX" + + # Append the frame to the animation encoder + enc.add( + frame.tobytes("raw", rawmode), + round(timestamp), + frame.size[0], + frame.size[1], + rawmode, + lossless, + quality, + alpha_quality, + method, + ) + + # Update timestamp and frame index + if isinstance(duration, (list, tuple)): + timestamp += duration[frame_idx] + else: + timestamp += duration + frame_idx += 1 + + finally: + im.seek(cur_idx) + + # Force encoder to flush frames + enc.add(None, round(timestamp), 0, 0, "", lossless, quality, alpha_quality, 0) + + # Get the final output from the encoder + data = enc.assemble(icc_profile, exif, xmp) + if data is None: + msg = "cannot write file as WebP (encoder returned None)" + raise OSError(msg) + + fp.write(data) + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + alpha_quality = im.encoderinfo.get("alpha_quality", 100) + icc_profile = im.encoderinfo.get("icc_profile") or "" + exif = im.encoderinfo.get("exif", b"") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + if exif.startswith(b"Exif\x00\x00"): + exif = exif[6:] + xmp = im.encoderinfo.get("xmp", "") + method = im.encoderinfo.get("method", 4) + exact = 1 if im.encoderinfo.get("exact") else 0 + + if im.mode not in _VALID_WEBP_LEGACY_MODES: + im = im.convert("RGBA" if im.has_transparency_data else "RGB") + + data = _webp.WebPEncode( + im.tobytes(), + im.size[0], + im.size[1], + lossless, + float(quality), + float(alpha_quality), + im.mode, + icc_profile, + method, + exact, + exif, + xmp, + ) + if data is None: + msg = "cannot write file as WebP (encoder returned None)" + raise OSError(msg) + + fp.write(data) + + +Image.register_open(WebPImageFile.format, WebPImageFile, _accept) +if SUPPORTED: + Image.register_save(WebPImageFile.format, _save) + if _webp.HAVE_WEBPANIM: + Image.register_save_all(WebPImageFile.format, _save_all) + Image.register_extension(WebPImageFile.format, ".webp") + Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/.venv/lib/python3.11/site-packages/PIL/WmfImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/WmfImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..3d5cddcc8f52e83c853b9e5c3265cfced7be9763 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/WmfImagePlugin.py @@ -0,0 +1,181 @@ +# +# The Python Imaging Library +# $Id$ +# +# WMF stub codec +# +# history: +# 1996-12-14 fl Created +# 2004-02-22 fl Turned into a stub driver +# 2004-02-23 fl Added EMF support +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +# WMF/EMF reference documentation: +# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf +# http://wvware.sourceforge.net/caolan/index.html +# http://wvware.sourceforge.net/caolan/ora-wmf.html +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile +from ._binary import i16le as word +from ._binary import si16le as short +from ._binary import si32le as _long + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific WMF image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +if hasattr(Image.core, "drawwmf"): + # install default handler (windows only) + + class WmfHandler(ImageFile.StubHandler): + def open(self, im: ImageFile.StubImageFile) -> None: + im._mode = "RGB" + self.bbox = im.info["wmf_bbox"] + + def load(self, im: ImageFile.StubImageFile) -> Image.Image: + im.fp.seek(0) # rewind + return Image.frombytes( + "RGB", + im.size, + Image.core.drawwmf(im.fp.read(), im.size, self.bbox), + "raw", + "BGR", + (im.size[0] * 3 + 3) & -4, + -1, + ) + + register_handler(WmfHandler()) + +# +# -------------------------------------------------------------------- +# Read WMF file + + +def _accept(prefix: bytes) -> bool: + return ( + prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or prefix[:4] == b"\x01\x00\x00\x00" + ) + + +## +# Image plugin for Windows metafiles. + + +class WmfStubImageFile(ImageFile.StubImageFile): + format = "WMF" + format_description = "Windows Metafile" + + def _open(self) -> None: + self._inch = None + + # check placable header + s = self.fp.read(80) + + if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": + # placeable windows metafile + + # get units per inch + self._inch = word(s, 14) + + # get bounding box + x0 = short(s, 6) + y0 = short(s, 8) + x1 = short(s, 10) + y1 = short(s, 12) + + # normalize size to 72 dots per inch + self.info["dpi"] = 72 + size = ( + (x1 - x0) * self.info["dpi"] // self._inch, + (y1 - y0) * self.info["dpi"] // self._inch, + ) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + # sanity check (standard metafile header) + if s[22:26] != b"\x01\x00\t\x00": + msg = "Unsupported WMF file format" + raise SyntaxError(msg) + + elif s[:4] == b"\x01\x00\x00\x00" and s[40:44] == b" EMF": + # enhanced metafile + + # get bounding box + x0 = _long(s, 8) + y0 = _long(s, 12) + x1 = _long(s, 16) + y1 = _long(s, 20) + + # get frame (in 0.01 millimeter units) + frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) + + size = x1 - x0, y1 - y0 + + # calculate dots per inch from bbox and frame + xdpi = 2540.0 * (x1 - y0) / (frame[2] - frame[0]) + ydpi = 2540.0 * (y1 - y0) / (frame[3] - frame[1]) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + if xdpi == ydpi: + self.info["dpi"] = xdpi + else: + self.info["dpi"] = xdpi, ydpi + + else: + msg = "Unsupported file format" + raise SyntaxError(msg) + + self._mode = "RGB" + self._size = size + + loader = self._load() + if loader: + loader.open(self) + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + def load(self, dpi=None): + if dpi is not None and self._inch is not None: + self.info["dpi"] = dpi + x0, y0, x1, y1 = self.info["wmf_bbox"] + self._size = ( + (x1 - x0) * self.info["dpi"] // self._inch, + (y1 - y0) * self.info["dpi"] // self._inch, + ) + return super().load() + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "WMF save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# +# -------------------------------------------------------------------- +# Registry stuff + + +Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) +Image.register_save(WmfStubImageFile.format, _save) + +Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/.venv/lib/python3.11/site-packages/PIL/XVThumbImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/XVThumbImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..c84adaca2152edd3cb88a9606da48d09d3d63a2b --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/XVThumbImagePlugin.py @@ -0,0 +1,81 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XV Thumbnail file handler by Charles E. "Gene" Cash +# (gcash@magicnet.net) +# +# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, +# available from ftp://ftp.cis.upenn.edu/pub/xv/ +# +# history: +# 98-08-15 cec created (b/w only) +# 98-12-09 cec added color palette +# 98-12-28 fl added to PIL (with only a few very minor modifications) +# +# To do: +# FIXME: make save work (this requires quantization support) +# +from __future__ import annotations + +from . import Image, ImageFile, ImagePalette +from ._binary import o8 + +_MAGIC = b"P7 332" + +# standard color palette for thumbnails (RGB332) +PALETTE = b"" +for r in range(8): + for g in range(8): + for b in range(4): + PALETTE = PALETTE + ( + o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3) + ) + + +def _accept(prefix: bytes) -> bool: + return prefix[:6] == _MAGIC + + +## +# Image plugin for XV thumbnail images. + + +class XVThumbImageFile(ImageFile.ImageFile): + format = "XVThumb" + format_description = "XV thumbnail image" + + def _open(self) -> None: + # check magic + assert self.fp is not None + + if not _accept(self.fp.read(6)): + msg = "not an XV thumbnail file" + raise SyntaxError(msg) + + # Skip to beginning of next line + self.fp.readline() + + # skip info comments + while True: + s = self.fp.readline() + if not s: + msg = "Unexpected EOF reading XV thumbnail file" + raise SyntaxError(msg) + if s[0] != 35: # ie. when not a comment: '#' + break + + # parse header line (already read) + s = s.strip().split() + + self._mode = "P" + self._size = int(s[0]), int(s[1]) + + self.palette = ImagePalette.raw("RGB", PALETTE) + + self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1))] + + +# -------------------------------------------------------------------- + +Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/.venv/lib/python3.11/site-packages/PIL/XbmImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/XbmImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..6d11bbfcf6ba2d94c34b46f4360733cdd393efc8 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/XbmImagePlugin.py @@ -0,0 +1,98 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XBM File handling +# +# History: +# 1995-09-08 fl Created +# 1996-11-01 fl Added save support +# 1997-07-07 fl Made header parser more tolerant +# 1997-07-22 fl Fixed yet another parser bug +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) +# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) +# 2004-02-24 fl Allow some whitespace before first #define +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re +from typing import IO + +from . import Image, ImageFile + +# XBM header +xbm_head = re.compile( + rb"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" + b"(?P" + b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" + b")?" + rb"[\000-\377]*_bits\[]" +) + + +def _accept(prefix: bytes) -> bool: + return prefix.lstrip()[:7] == b"#define" + + +## +# Image plugin for X11 bitmaps. + + +class XbmImageFile(ImageFile.ImageFile): + format = "XBM" + format_description = "X11 Bitmap" + + def _open(self) -> None: + assert self.fp is not None + + m = xbm_head.match(self.fp.read(512)) + + if not m: + msg = "not a XBM file" + raise SyntaxError(msg) + + xsize = int(m.group("width")) + ysize = int(m.group("height")) + + if m.group("hotspot"): + self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot"))) + + self._mode = "1" + self._size = xsize, ysize + + self.tile = [("xbm", (0, 0) + self.size, m.end(), None)] + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode != "1": + msg = f"cannot write mode {im.mode} as XBM" + raise OSError(msg) + + fp.write(f"#define im_width {im.size[0]}\n".encode("ascii")) + fp.write(f"#define im_height {im.size[1]}\n".encode("ascii")) + + hotspot = im.encoderinfo.get("hotspot") + if hotspot: + fp.write(f"#define im_x_hot {hotspot[0]}\n".encode("ascii")) + fp.write(f"#define im_y_hot {hotspot[1]}\n".encode("ascii")) + + fp.write(b"static char im_bits[] = {\n") + + ImageFile._save(im, fp, [("xbm", (0, 0) + im.size, 0, None)]) + + fp.write(b"};\n") + + +Image.register_open(XbmImageFile.format, XbmImageFile, _accept) +Image.register_save(XbmImageFile.format, _save) + +Image.register_extension(XbmImageFile.format, ".xbm") + +Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/.venv/lib/python3.11/site-packages/PIL/XpmImagePlugin.py b/.venv/lib/python3.11/site-packages/PIL/XpmImagePlugin.py new file mode 100644 index 0000000000000000000000000000000000000000..8d56331e6aae784dc0d7945b803dc8c53db47231 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/XpmImagePlugin.py @@ -0,0 +1,125 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XPM File handling +# +# History: +# 1996-12-29 fl Created +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re + +from . import Image, ImageFile, ImagePalette +from ._binary import o8 + +# XPM header +xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') + + +def _accept(prefix: bytes) -> bool: + return prefix[:9] == b"/* XPM */" + + +## +# Image plugin for X11 pixel maps. + + +class XpmImageFile(ImageFile.ImageFile): + format = "XPM" + format_description = "X11 Pixel Map" + + def _open(self) -> None: + if not _accept(self.fp.read(9)): + msg = "not an XPM file" + raise SyntaxError(msg) + + # skip forward to next string + while True: + s = self.fp.readline() + if not s: + msg = "broken XPM file" + raise SyntaxError(msg) + m = xpm_head.match(s) + if m: + break + + self._size = int(m.group(1)), int(m.group(2)) + + pal = int(m.group(3)) + bpp = int(m.group(4)) + + if pal > 256 or bpp != 1: + msg = "cannot read this XPM file" + raise ValueError(msg) + + # + # load palette description + + palette = [b"\0\0\0"] * 256 + + for _ in range(pal): + s = self.fp.readline() + if s[-2:] == b"\r\n": + s = s[:-2] + elif s[-1:] in b"\r\n": + s = s[:-1] + + c = s[1] + s = s[2:-2].split() + + for i in range(0, len(s), 2): + if s[i] == b"c": + # process colour key + rgb = s[i + 1] + if rgb == b"None": + self.info["transparency"] = c + elif rgb[:1] == b"#": + # FIXME: handle colour names (see ImagePalette.py) + rgb = int(rgb[1:], 16) + palette[c] = ( + o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255) + ) + else: + # unknown colour + msg = "cannot read this XPM file" + raise ValueError(msg) + break + + else: + # missing colour key + msg = "cannot read this XPM file" + raise ValueError(msg) + + self._mode = "P" + self.palette = ImagePalette.raw("RGB", b"".join(palette)) + + self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), ("P", 0, 1))] + + def load_read(self, read_bytes: int) -> bytes: + # + # load all image data in one chunk + + xsize, ysize = self.size + + s = [self.fp.readline()[1 : xsize + 1].ljust(xsize) for i in range(ysize)] + + return b"".join(s) + + +# +# Registry + + +Image.register_open(XpmImageFile.format, XpmImageFile, _accept) + +Image.register_extension(XpmImageFile.format, ".xpm") + +Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/.venv/lib/python3.11/site-packages/PIL/__main__.py b/.venv/lib/python3.11/site-packages/PIL/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..043156e892dadc4fb1222b33f5eda33251cd15aa --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/__main__.py @@ -0,0 +1,7 @@ +from __future__ import annotations + +import sys + +from .features import pilinfo + +pilinfo(supported_formats="--report" not in sys.argv) diff --git a/.venv/lib/python3.11/site-packages/PIL/_binary.py b/.venv/lib/python3.11/site-packages/PIL/_binary.py new file mode 100644 index 0000000000000000000000000000000000000000..4594ccce361168cf77e630cb88ffb09bb4362831 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/_binary.py @@ -0,0 +1,112 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Binary input/output support routines. +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1995-2003 by Fredrik Lundh +# Copyright (c) 2012 by Brian Crowell +# +# See the README file for information on usage and redistribution. +# + + +"""Binary input/output support routines.""" +from __future__ import annotations + +from struct import pack, unpack_from + + +def i8(c: bytes) -> int: + return c[0] + + +def o8(i: int) -> bytes: + return bytes((i & 255,)) + + +# Input, le = little endian, be = big endian +def i16le(c: bytes, o: int = 0) -> int: + """ + Converts a 2-bytes (16 bits) string to an unsigned integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 2-bytes (16 bits) string to a signed integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 2-bytes (16 bits) string to a signed integer, big endian. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(">h", c, o)[0] + + +def i32le(c: bytes, o: int = 0) -> int: + """ + Converts a 4-bytes (32 bits) string to an unsigned integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 4-bytes (32 bits) string to a signed integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 4-bytes (32 bits) string to a signed integer, big endian. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(">i", c, o)[0] + + +def i16be(c: bytes, o: int = 0) -> int: + return unpack_from(">H", c, o)[0] + + +def i32be(c: bytes, o: int = 0) -> int: + return unpack_from(">I", c, o)[0] + + +# Output, le = little endian, be = big endian +def o16le(i: int) -> bytes: + return pack(" bytes: + return pack(" bytes: + return pack(">H", i) + + +def o32be(i: int) -> bytes: + return pack(">I", i) diff --git a/.venv/lib/python3.11/site-packages/PIL/_imaging.pyi b/.venv/lib/python3.11/site-packages/PIL/_imaging.pyi new file mode 100644 index 0000000000000000000000000000000000000000..8cccd3ac73e1994055648bd9aabfae8ce43608b4 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/_imaging.pyi @@ -0,0 +1,30 @@ +from typing import Any + +class ImagingCore: + def __getattr__(self, name: str) -> Any: ... + +class ImagingFont: + def __getattr__(self, name: str) -> Any: ... + +class ImagingDraw: + def __getattr__(self, name: str) -> Any: ... + +class PixelAccess: + def __getitem__(self, xy: tuple[int, int]) -> float | tuple[int, ...]: ... + def __setitem__( + self, xy: tuple[int, int], color: float | tuple[int, ...] + ) -> None: ... + +class ImagingDecoder: + def __getattr__(self, name: str) -> Any: ... + +class ImagingEncoder: + def __getattr__(self, name: str) -> Any: ... + +class _Outline: + def close(self) -> None: ... + def __getattr__(self, name: str) -> Any: ... + +def font(image: ImagingCore, glyphdata: bytes) -> ImagingFont: ... +def outline() -> _Outline: ... +def __getattr__(name: str) -> Any: ... diff --git a/.venv/lib/python3.11/site-packages/PIL/_imagingmorph.cpython-311-x86_64-linux-gnu.so b/.venv/lib/python3.11/site-packages/PIL/_imagingmorph.cpython-311-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..ea7a6a9f77139e8178099b5711e4d8807d4af3d7 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/PIL/_imagingmorph.cpython-311-x86_64-linux-gnu.so differ diff --git a/.venv/lib/python3.11/site-packages/PIL/_imagingmorph.pyi b/.venv/lib/python3.11/site-packages/PIL/_imagingmorph.pyi new file mode 100644 index 0000000000000000000000000000000000000000..e27843e5338213713e26973127c738c14313ff98 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/_imagingmorph.pyi @@ -0,0 +1,3 @@ +from typing import Any + +def __getattr__(name: str) -> Any: ... diff --git a/.venv/lib/python3.11/site-packages/PIL/_imagingtk.cpython-311-x86_64-linux-gnu.so b/.venv/lib/python3.11/site-packages/PIL/_imagingtk.cpython-311-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..1c1f53c7c43496e540205a2cb2a064c7fcf97f80 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/PIL/_imagingtk.cpython-311-x86_64-linux-gnu.so differ diff --git a/.venv/lib/python3.11/site-packages/PIL/_tkinter_finder.py b/.venv/lib/python3.11/site-packages/PIL/_tkinter_finder.py new file mode 100644 index 0000000000000000000000000000000000000000..beddfb0628a8782f85ff507439e133cc62058c08 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/PIL/_tkinter_finder.py @@ -0,0 +1,21 @@ +""" Find compiled module linking to Tcl / Tk libraries +""" + +from __future__ import annotations + +import sys +import tkinter + +tk = getattr(tkinter, "_tkinter") + +try: + if hasattr(sys, "pypy_find_executable"): + TKINTER_LIB = tk.tklib_cffi.__file__ + else: + TKINTER_LIB = tk.__file__ +except AttributeError: + # _tkinter may be compiled directly into Python, in which case __file__ is + # not available. load_tkinter_funcs will check the binary first in any case. + TKINTER_LIB = None + +tk_version = str(tkinter.TkVersion) diff --git a/.venv/lib/python3.11/site-packages/PIL/py.typed b/.venv/lib/python3.11/site-packages/PIL/py.typed new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.venv/lib/python3.11/site-packages/colorful/__init__.py b/.venv/lib/python3.11/site-packages/colorful/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9412a7efe1ca76742be7382767236c9375c390ee --- /dev/null +++ b/.venv/lib/python3.11/site-packages/colorful/__init__.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- + +""" + colorful + ~~~~~~~~ + + Terminal string styling done right, in Python. + + :copyright: (c) 2017 by Timo Furrer + :license: MIT, see LICENSE for more details. +""" + +import os +import sys +import copy +import types +import platform +from contextlib import contextmanager + +from .core import Colorful +from . import terminal + +#: Holds the current version +__version__ = '0.5.6' + +# if we are on Windows we have to init colorama +if platform.system() == 'Windows': + os.system('color') + + +class ColorfulModule(types.ModuleType): + """ + Module Type object for dynamic attribute access on + this module. + """ + def __init__(self, colorful, *args): + super(ColorfulModule, self).__init__(*args) + self.colorful = colorful + + @contextmanager + def with_setup(self, colormode=None, colorpalette=None, extend_colors=False): + """ + Return a new Colorful object with the given color config. + """ + colorful = Colorful( + colormode=self.colorful.colormode, + colorpalette=copy.copy(self.colorful.colorpalette) + ) + + colorful.setup( + colormode=colormode, colorpalette=colorpalette, extend_colors=extend_colors + ) + yield colorful + + @contextmanager + def with_8_ansi_colors(self): + yield Colorful( + colormode=terminal.ANSI_8_COLORS, + colorpalette=copy.copy(self.colorful.colorpalette) + ) + + @contextmanager + def with_16_ansi_colors(self): + yield Colorful( + colormode=terminal.ANSI_16_COLORS, + colorpalette=copy.copy(self.colorful.colorpalette) + ) + + @contextmanager + def with_256_ansi_colors(self): + yield Colorful( + colormode=terminal.ANSI_256_COLORS, + colorpalette=copy.copy(self.colorful.colorpalette) + ) + + @contextmanager + def with_true_colors(self): + yield Colorful( + colormode=terminal.TRUE_COLORS, + colorpalette=copy.copy(self.colorful.colorpalette) + ) + + @contextmanager + def with_palette(self, colorpalette): + yield Colorful( + colormode=self.colorful.colormode, + colorpalette=colorpalette + ) + + @contextmanager + def with_updated_palette(self, colorpalette): + colorful = Colorful( + colormode=self.colorful.colormode, + colorpalette=copy.copy(self.colorful.colorpalette), + ) + colorful.update_palette(colorpalette) + yield colorful + + @contextmanager + def with_style(self, style_name): + colorful = Colorful( + colormode=self.colorful.colormode, + colorpalette={}, + ) + colorful.use_style(style_name) + yield colorful + + def __getattr__(self, name): + """ + Dynamically get methods from Colorful object. + """ + # check if original module had the requested attribute + # if yes, we have to return it since we don't want to + # break the module functionality + orig_module = __name__ + '_orig' + if orig_module in sys.modules: + try: + return getattr(sys.modules[orig_module], name) + except AttributeError: + pass # fallback to colorful functionality + + return getattr(self.colorful, name) + + +if os.environ.get('COLORFUL_NO_MODULE_OVERWRITE', '0') != '1': + # Unfortunately, prior to Python 3.4 the replaced + # modules gets garbage collected which will + # destroy all currently imported modules. + # To prevent this, is to store a backup of the original + # modules in sys.modules. + sys.modules[__name__ + '_orig'] = sys.modules[__name__] + # expose the Colorful class as module + sys.modules[__name__] = ColorfulModule(Colorful(), __name__) diff --git a/.venv/lib/python3.11/site-packages/colorful/__pycache__/__init__.cpython-311.pyc b/.venv/lib/python3.11/site-packages/colorful/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6e48d2acc2c5dd10be23e7cb96e10487bdf9476 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/colorful/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/colorful/__pycache__/ansi.cpython-311.pyc b/.venv/lib/python3.11/site-packages/colorful/__pycache__/ansi.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c2585256c4790ad9800f61e01e0a5434eefe52d Binary files /dev/null and b/.venv/lib/python3.11/site-packages/colorful/__pycache__/ansi.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/colorful/__pycache__/colors.cpython-311.pyc b/.venv/lib/python3.11/site-packages/colorful/__pycache__/colors.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45a9c3d5b5c6baaf5fd70964815c2e8c1251e9e7 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/colorful/__pycache__/colors.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/colorful/__pycache__/core.cpython-311.pyc b/.venv/lib/python3.11/site-packages/colorful/__pycache__/core.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fef9ea5760b64721cbf2b671237f7938e76f287f Binary files /dev/null and b/.venv/lib/python3.11/site-packages/colorful/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/colorful/__pycache__/styles.cpython-311.pyc b/.venv/lib/python3.11/site-packages/colorful/__pycache__/styles.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a33961eb8a4196609951c683f681e58a6c11e803 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/colorful/__pycache__/styles.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/colorful/__pycache__/terminal.cpython-311.pyc b/.venv/lib/python3.11/site-packages/colorful/__pycache__/terminal.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b692598f7955b5d3dab062f57a6ee4f239b3e2a Binary files /dev/null and b/.venv/lib/python3.11/site-packages/colorful/__pycache__/terminal.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/colorful/__pycache__/utils.cpython-311.pyc b/.venv/lib/python3.11/site-packages/colorful/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea338197fbaa7280b2856c967d2bce9fa2f61c67 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/colorful/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/colorful/ansi.py b/.venv/lib/python3.11/site-packages/colorful/ansi.py new file mode 100644 index 0000000000000000000000000000000000000000..47cc93353892280fecb31fc73a6163ceea3d14cf --- /dev/null +++ b/.venv/lib/python3.11/site-packages/colorful/ansi.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- + +""" + colorful + ~~~~~~~~ + + Terminal string styling done right, in Python. + + :copyright: (c) 2017 by Timo Furrer + :license: MIT, see LICENSE for more details. +""" + +import math + +# For the ANSI escape code sequences please consult +# https://en.wikipedia.org/wiki/ANSI_escape_code + +#: Holds the modifier names in the correct order +MODIFIERS = { + 'reset': (0, 0), + 'bold': (1, 22), + 'dimmed': (2, 22), + 'italic': (3, 23), + 'underlined': (4, 24), + 'blinkslow': (5, 25), + 'blinkrapid': (6, 25), + 'inversed': (7, 27), + 'concealed': (8, 28), + 'struckthrough': (9, 29) +} + +#: Holds the offset for resetting the modifiers +MODIFIER_RESET_OFFSET = 21 + +#: Holds the start index for the fore- and background colors +FOREGROUND_COLOR_OFFSET = 30 +BACKGROUND_COLOR_OFFSET = 40 + +#: Holds the offset to reset the color back to default. +# this number has to be added to either ``FOREGROUND_COLOR_OFFSET`` or +# ``BACKGROUND_COLOR_OFFSET`` to get an usable ANSI escape code. +COLOR_CLOSE_OFFSET = 9 + +#: Holds the Control Sequence Introducer +CSI = '\033[' + +#: Holds the base ANSI escape code +ANSI_ESCAPE_CODE = '{csi}{{code}}m'.format(csi=CSI) + +#: Holds the placeholder for the nest indicators +NEST_PLACEHOLDER = ANSI_ESCAPE_CODE.format(code=26) + + +def round(value): + x = math.floor(value) + if (value - x) < 0.5: + return int(x) + return int(math.ceil(value)) + + +def rgb_to_ansi256(r, g, b): + """ + Convert RGB to ANSI 256 color + """ + if r == g and g == b: + if r < 8: + return 16 + if r > 248: + return 231 + + return round(((r - 8) / 247.0) * 24) + 232 + + ansi_r = 36 * round(r / 255.0 * 5.0) + ansi_g = 6 * round(g / 255.0 * 5.0) + ansi_b = round(b / 255.0 * 5.0) + ansi = 16 + ansi_r + ansi_g + ansi_b + return ansi + + +def rgb_to_ansi16(r, g, b, use_bright=False): + """ + Convert RGB to ANSI 16 color + """ + ansi_b = round(b / 255.0) << 2 + ansi_g = round(g / 255.0) << 1 + ansi_r = round(r / 255.0) + ansi = (90 if use_bright else 30) + (ansi_b | ansi_g | ansi_r) + + return ansi diff --git a/.venv/lib/python3.11/site-packages/colorful/data/colornames.json b/.venv/lib/python3.11/site-packages/colorful/data/colornames.json new file mode 100644 index 0000000000000000000000000000000000000000..0828fddf28223530295a1f1d529973135c6392f4 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/colorful/data/colornames.json @@ -0,0 +1 @@ +[{"name":"18th Century Green","hex":"#a59344"},{"name":"1975 Earth Red","hex":"#7a463a"},{"name":"20000 Leagues Under the Sea","hex":"#191970"},{"name":"400XT Film","hex":"#d2d2c0"},{"name":"5-Masted Preußen","hex":"#9bafad"},{"name":"8Bit Eggplant","hex":"#990066"},{"name":"90% Cocoa","hex":"#3d1c02"},{"name":"A Hint of Incremental Blue","hex":"#456789"},{"name":"A State of Mint","hex":"#88ffcc"},{"name":"Aare River","hex":"#00b89f"},{"name":"Abaddon Black","hex":"#231f20"},{"name":"Abaidh White","hex":"#f2f1e6"},{"name":"Abalone","hex":"#f8f3f6"},{"name":"Abbey","hex":"#4c4f56"},{"name":"Abbey Road","hex":"#a79f92"},{"name":"Abbey Stone","hex":"#aba798"},{"name":"Abbey White","hex":"#ebe5d0"},{"name":"Abbot","hex":"#4d3c2d"},{"name":"Âbi Blue","hex":"#5ba8ff"},{"name":"Abilene Lace","hex":"#eae3d2"},{"name":"Absence of Light","hex":"#15151c"},{"name":"Absinthe Green","hex":"#76b583"},{"name":"Absolute Zero","hex":"#0048ba"},{"name":"Abstract White","hex":"#ede9dd"},{"name":"Abundance","hex":"#629763"},{"name":"Abura Green","hex":"#a19361"},{"name":"Abyss","hex":"#8f9e9d"},{"name":"Abyssal Anchorfish Blue","hex":"#1b2632"},{"name":"Abyssal Blue","hex":"#00035b"},{"name":"Abyssopelagic Water","hex":"#000033"},{"name":"Acacia","hex":"#dacd65"},{"name":"Academic Blue","hex":"#2c3e56"},{"name":"Acadia","hex":"#35312c"},{"name":"Acai","hex":"#46295a"},{"name":"Acai Berry","hex":"#42314b"},{"name":"Acai Juice","hex":"#942193"},{"name":"Acajou","hex":"#4c2f27"},{"name":"Acanthus","hex":"#9899a7"},{"name":"Acanthus Leaf","hex":"#90977a"},{"name":"Acapulco","hex":"#75aa94"},{"name":"Acapulco Cliffs","hex":"#4e9aa8"},{"name":"Accolade","hex":"#7c94b2"},{"name":"Accursed Black","hex":"#090807"},{"name":"Ace","hex":"#c7cce7"},{"name":"Aceto Balsamico","hex":"#4e4f48"},{"name":"Acid Candy","hex":"#a8c74d"},{"name":"Acid Green","hex":"#8ffe09"},{"name":"Acid Lime","hex":"#badf30"},{"name":"Acorn","hex":"#7e5e52"},{"name":"Acorn Squash","hex":"#eda740"},{"name":"Acoustic White","hex":"#efece1"},{"name":"Across the Bay","hex":"#b3e1e8"},{"name":"Actinic Light","hex":"#ff44ee"},{"name":"Active Volcano","hex":"#bb1133"},{"name":"Actor's Star","hex":"#a7a6a3"},{"name":"Adeline","hex":"#ccb0b5"},{"name":"Adept","hex":"#293947"},{"name":"Adeptus Battlegrey","hex":"#7c8286"},{"name":"Adhesion","hex":"#9e9cab"},{"name":"Adirondack","hex":"#b0b9c1"},{"name":"Admiral Blue","hex":"#50647f"},{"name":"Admiralty","hex":"#404e61"},{"name":"Adobe","hex":"#bd6c48"},{"name":"Adobe Avenue","hex":"#fb9587"},{"name":"Adobe Beige","hex":"#dcbfa6"},{"name":"Adobe Rose","hex":"#ba9f99"},{"name":"Adobe Sand","hex":"#e8dec5"},{"name":"Adobe South","hex":"#e5c1a7"},{"name":"Adobe White","hex":"#e6dbc4"},{"name":"Adorable","hex":"#e3beb0"},{"name":"Adriatic Blue","hex":"#5c899b"},{"name":"Adriatic Haze","hex":"#96c6cd"},{"name":"Adrift","hex":"#4b9099"},{"name":"Advantageous","hex":"#20726a"},{"name":"Adventure","hex":"#34788c"},{"name":"Adventure Island Pink","hex":"#f87858"},{"name":"Adventure Isle","hex":"#6f9fb9"},{"name":"Aegean Blue","hex":"#4e6e81"},{"name":"Aegean Green","hex":"#4c8c72"},{"name":"Aegean Mist","hex":"#9cbbe2"},{"name":"Aegean Sea","hex":"#508fa2"},{"name":"Aegean Sky","hex":"#e48b59"},{"name":"Aero","hex":"#7cb9e8"},{"name":"Aero Blue","hex":"#c0e8d5"},{"name":"Aerobic Fix","hex":"#a2c348"},{"name":"Aeronautic","hex":"#2b3448"},{"name":"Aerospace Orange","hex":"#ff4f00"},{"name":"Aerostatics","hex":"#355376"},{"name":"Affair","hex":"#745085"},{"name":"Affen Turquoise","hex":"#aaffff"},{"name":"Affinity","hex":"#fed2a5"},{"name":"Afghan Carpet","hex":"#905e26"},{"name":"Afghan Hound","hex":"#e2d7b5"},{"name":"Afghan Sand","hex":"#d3a95c"},{"name":"Afloat","hex":"#78a3c2"},{"name":"African Ambush","hex":"#8e603c"},{"name":"African Bubinga","hex":"#c7927a"},{"name":"African Mahogany","hex":"#cd4a4a"},{"name":"African Mud","hex":"#826c68"},{"name":"African Safari","hex":"#b16b40"},{"name":"African Sand","hex":"#ccaa88"},{"name":"African Violet","hex":"#b085b7"},{"name":"After Burn","hex":"#fd8b60"},{"name":"After Dark","hex":"#3c3535"},{"name":"After Dinner Mint","hex":"#e3f5e5"},{"name":"After Eight Filling","hex":"#d6eae8"},{"name":"After Midnight","hex":"#38393f"},{"name":"After Shock","hex":"#fec65f"},{"name":"After the Storm","hex":"#33616a"},{"name":"After Work Blue","hex":"#24246d"},{"name":"After-Party Pink","hex":"#c95efb"},{"name":"Aftercare","hex":"#85c0cd"},{"name":"Afterglow","hex":"#f3e6c9"},{"name":"Afterlife","hex":"#d91fff"},{"name":"Afternoon Sky","hex":"#87ceeb"},{"name":"Afternoon Stroll","hex":"#d9c5a1"},{"name":"Afternoon Tea","hex":"#594e40"},{"name":"Agate Green","hex":"#599f99"},{"name":"Agate Grey","hex":"#b1b09f"},{"name":"Agave Green","hex":"#6b7169"},{"name":"Aged Brandy","hex":"#87413f"},{"name":"Aged Chocolate","hex":"#5f4947"},{"name":"Aged Eucalyptus","hex":"#898253"},{"name":"Aged Jade","hex":"#6c6956"},{"name":"Aged Merlot","hex":"#73343a"},{"name":"Aged Mustard Green","hex":"#6e6e30"},{"name":"Aged Pewter","hex":"#889999"},{"name":"Aged Pink","hex":"#c99f99"},{"name":"Aged Plastic Casing","hex":"#fffa86"},{"name":"Aged Purple","hex":"#a442a0"},{"name":"Aged Teak","hex":"#7a4134"},{"name":"Aged Whisky","hex":"#9d7147"},{"name":"Ageless","hex":"#ececdf"},{"name":"Ageless Beauty","hex":"#e7a995"},{"name":"Aggressive Baby Blue","hex":"#6fffff"},{"name":"Agrax Earthshade","hex":"#393121"},{"name":"Agrellan Badland","hex":"#ffb347"},{"name":"Agrellan Earth","hex":"#a17c59"},{"name":"Agrodolce","hex":"#f0e2d3"},{"name":"Ahaetulla Prasina","hex":"#00fa92"},{"name":"Ahmar Red","hex":"#c22147"},{"name":"Ahoy","hex":"#2a3149"},{"name":"Ahriman Blue","hex":"#199ebd"},{"name":"Ai Indigo","hex":"#274447"},{"name":"Aida","hex":"#b4c8b6"},{"name":"Aijiro White","hex":"#ecf7f7"},{"name":"Aimiru Brown","hex":"#2e372e"},{"name":"Air Blue","hex":"#77acc7"},{"name":"Air Force Blue","hex":"#5d8aa8"},{"name":"Air of Mint","hex":"#d8f2ee"},{"name":"Air Superiority Blue","hex":"#72a0c1"},{"name":"Airborne","hex":"#a2c2d0"},{"name":"Aircraft Blue","hex":"#354f58"},{"name":"Aircraft Exterior Grey","hex":"#939498"},{"name":"Aircraft Green","hex":"#2a2c1f"},{"name":"Aircraft White","hex":"#edf2f8"},{"name":"Airforce","hex":"#364d70"},{"name":"Airy","hex":"#dae6e9"},{"name":"Ajo Lily","hex":"#faecd9"},{"name":"Akabeni","hex":"#c3272b"},{"name":"Akai Red","hex":"#bc012e"},{"name":"Akakō Red","hex":"#f07f5e"},{"name":"Akaroa","hex":"#beb29a"},{"name":"Ake Blood","hex":"#cf3a24"},{"name":"Akebi Purple","hex":"#983fb2"},{"name":"Akebono Dawn","hex":"#fa7b62"},{"name":"Akhdhar Green","hex":"#b0e313"},{"name":"Akihabara Arcade","hex":"#601ef9"},{"name":"Akira Red","hex":"#e12120"},{"name":"Akuma's Fury","hex":"#871646"},{"name":"Alabama Crimson","hex":"#a32638"},{"name":"Alabaster","hex":"#f3e7db"},{"name":"Alabaster Beauty","hex":"#e9e3d2"},{"name":"Alabaster Gleam","hex":"#f0debd"},{"name":"Aladdin's Feather","hex":"#5500ff"},{"name":"Alaitoc Blue","hex":"#8e8c97"},{"name":"Alajuela Toad","hex":"#ffae52"},{"name":"Alameda Ochre","hex":"#ca9234"},{"name":"Alaskan Blue","hex":"#6da9d2"},{"name":"Alaskan Cruise","hex":"#34466c"},{"name":"Alaskan Ice","hex":"#7e9ec2"},{"name":"Alaskan Mist","hex":"#ecf0e5"},{"name":"Alaskan Moss","hex":"#05472a"},{"name":"Alaskan Skies","hex":"#cddced"},{"name":"Albanian Red","hex":"#cc0001"},{"name":"Albeit","hex":"#38546e"},{"name":"Albert Green","hex":"#4f5845"},{"name":"Albescent White","hex":"#e1dacb"},{"name":"Alchemy","hex":"#e7cf8c"},{"name":"Aldabra","hex":"#aaa492"},{"name":"Alert Tan","hex":"#954e2c"},{"name":"Alesan","hex":"#f1ceb3"},{"name":"Aleutian","hex":"#9a9eb3"},{"name":"Alexandria's Lighthouse","hex":"#fcefc1"},{"name":"Alexandrian Sky","hex":"#bcd9dc"},{"name":"Alexis Blue","hex":"#416082"},{"name":"Alfalfa","hex":"#b7b59f"},{"name":"Alga Moss","hex":"#8da98d"},{"name":"Algae","hex":"#54ac68"},{"name":"Algae Green","hex":"#93dfb8"},{"name":"Algal Fuel","hex":"#21c36f"},{"name":"Algen Gerne","hex":"#479784"},{"name":"Algerian Coral","hex":"#fc5a50"},{"name":"Algiers Blue","hex":"#00859c"},{"name":"Alhambra","hex":"#008778"},{"name":"Alhambra Cream","hex":"#f7f2e1"},{"name":"Alibi","hex":"#d4cbc4"},{"name":"Alice Blue","hex":"#f0f8ff"},{"name":"Alien","hex":"#415764"},{"name":"Alien Abduction","hex":"#0cff0c"},{"name":"Alien Armpit","hex":"#84de02"},{"name":"Alien Purple","hex":"#490648"},{"name":"Align","hex":"#00728d"},{"name":"Alizarin","hex":"#e34636"},{"name":"Alizarin Crimson","hex":"#e32636"},{"name":"All About Olive","hex":"#676c58"},{"name":"All Nighter","hex":"#455454"},{"name":"All's Ace","hex":"#c68886"},{"name":"Allegiance","hex":"#5a6a8c"},{"name":"Allegro","hex":"#b28959"},{"name":"Alley","hex":"#b8c4d9"},{"name":"Alley Cat","hex":"#656874"},{"name":"Alliance","hex":"#2b655f"},{"name":"Alligator Egg","hex":"#eaeed7"},{"name":"Allium","hex":"#9569a3"},{"name":"Alloy","hex":"#98979a"},{"name":"Alloy Orange","hex":"#c46210"},{"name":"Allports","hex":"#1f6a7d"},{"name":"Allspice","hex":"#f8cdaa"},{"name":"Allura Red","hex":"#ed2e38"},{"name":"Allure","hex":"#7291b4"},{"name":"Alluring Gesture","hex":"#f8dbc2"},{"name":"Alluring Light","hex":"#fff7d8"},{"name":"Alluring Umber","hex":"#977b4d"},{"name":"Alluvial Inca","hex":"#bb934b"},{"name":"Allyson","hex":"#cb738b"},{"name":"Almond","hex":"#eddcc8"},{"name":"Almond Blossom","hex":"#f5bec7"},{"name":"Almond Brittle","hex":"#e5d3b9"},{"name":"Almond Buff","hex":"#ccb390"},{"name":"Almond Cookie","hex":"#eec87c"},{"name":"Almond Cream","hex":"#f4c29f"},{"name":"Almond Frost","hex":"#9a8678"},{"name":"Almond Icing","hex":"#efe3d9"},{"name":"Almond Latte","hex":"#d6c0a4"},{"name":"Almond Milk","hex":"#d6cebe"},{"name":"Almond Oil","hex":"#f4efc1"},{"name":"Almond Paste","hex":"#e5dbc5"},{"name":"Almond Roca","hex":"#f0e8e0"},{"name":"Almond Rose","hex":"#cc8888"},{"name":"Almond Silk","hex":"#e1cfb2"},{"name":"Almondine","hex":"#fedebc"},{"name":"Almost Aloe","hex":"#bfe5b1"},{"name":"Almost Apricot","hex":"#e5b39b"},{"name":"Almost Aqua","hex":"#98ddc5"},{"name":"Almost Black","hex":"#070d0d"},{"name":"Almost Mauve","hex":"#e7dcd9"},{"name":"Aloe","hex":"#817a60"},{"name":"Aloe Cream","hex":"#dbe5b9"},{"name":"Aloe Essence","hex":"#ecf1e2"},{"name":"Aloe Mist","hex":"#dcf2e3"},{"name":"Aloe Plant","hex":"#b8ba87"},{"name":"Aloe Vera","hex":"#678779"},{"name":"Aloe Vera Tea","hex":"#848b71"},{"name":"Aloe Wash","hex":"#d0d3b7"},{"name":"Aloeswood","hex":"#6a432d"},{"name":"Aloha","hex":"#1db394"},{"name":"Aloha Sunset","hex":"#e9aa91"},{"name":"Alone in the Dark","hex":"#000066"},{"name":"Aloof","hex":"#d4e2e6"},{"name":"Aloof Lama","hex":"#d6c5a0"},{"name":"Alpaca Wool","hex":"#f9ede2"},{"name":"Alpha Centauri","hex":"#4d5778"},{"name":"Alpha Gold","hex":"#ae8e5f"},{"name":"Alpha Tango","hex":"#628fb0"},{"name":"Alphabet Blue","hex":"#abcdef"},{"name":"Alpine","hex":"#ad8a3b"},{"name":"Alpine Alabaster","hex":"#badbe6"},{"name":"Alpine Blue","hex":"#dbe4e5"},{"name":"Alpine Green","hex":"#005f56"},{"name":"Alpine Haze","hex":"#abbec0"},{"name":"Alpine Landing","hex":"#117b87"},{"name":"Alpine Moon","hex":"#ded3e6"},{"name":"Alpine Race","hex":"#234162"},{"name":"Alpine Salamander","hex":"#051009"},{"name":"Alpine Summer","hex":"#a5a99a"},{"name":"Altdorf Guard Blue","hex":"#1f56a7"},{"name":"Altered Pink","hex":"#efc7be"},{"name":"Alto","hex":"#cdc6c5"},{"name":"Alucard's Night","hex":"#000055"},{"name":"Aluminium","hex":"#848789"},{"name":"Aluminium Powder","hex":"#a9a0a9"},{"name":"Aluminum Foil","hex":"#d2d9db"},{"name":"Aluminum Silver","hex":"#8c8d91"},{"name":"Aluminum Sky","hex":"#adafaf"},{"name":"Alverda","hex":"#a5c970"},{"name":"Always Almond","hex":"#ebe5d2"},{"name":"Always Apple","hex":"#a0a667"},{"name":"Always Blue","hex":"#a2bacb"},{"name":"Always Rosey","hex":"#e79db3"},{"name":"Alyssa","hex":"#f4e2d6"},{"name":"Amalfi Coast","hex":"#297cbf"},{"name":"Amaranth","hex":"#e86ead"},{"name":"Amaranth Deep Purple","hex":"#9f2b68"},{"name":"Amaranth Pink","hex":"#f19cbb"},{"name":"Amaranth Purple","hex":"#6a397b"},{"name":"Amaranth Red","hex":"#d3212d"},{"name":"Amarantha Red","hex":"#cc3311"},{"name":"Amaranthine","hex":"#5f4053"},{"name":"Amaretto","hex":"#ab6f60"},{"name":"Amaretto Sours","hex":"#c09856"},{"name":"Amarillo Yellow","hex":"#fbf1c3"},{"name":"Amarklor Violet","hex":"#551199"},{"name":"Amaya","hex":"#f2c1cb"},{"name":"Amazing Amethyst","hex":"#806568"},{"name":"Amazing Boulder","hex":"#a9a797"},{"name":"Amazing Smoke","hex":"#6680bb"},{"name":"Amazon","hex":"#387b54"},{"name":"Amazon Depths","hex":"#505338"},{"name":"Amazon Green","hex":"#786a4a"},{"name":"Amazon Mist","hex":"#ececdc"},{"name":"Amazon Queen","hex":"#948f54"},{"name":"Amazon River Dolphin","hex":"#e6b2b8"},{"name":"Amazon Vine","hex":"#abaa97"},{"name":"Amazonian","hex":"#aa6644"},{"name":"Amazonite","hex":"#00c4b0"},{"name":"Amber","hex":"#ffbf00"},{"name":"Amber Brown","hex":"#a66646"},{"name":"Amber Dawn","hex":"#f6bc77"},{"name":"Amber Gold","hex":"#c19552"},{"name":"Amber Green","hex":"#9a803a"},{"name":"Amber Romance","hex":"#b18140"},{"name":"Amber Tide","hex":"#ffafa3"},{"name":"Amber Yellow","hex":"#fab75a"},{"name":"Amberglow","hex":"#dc793e"},{"name":"Amberlight","hex":"#e2bea2"},{"name":"Ambient Glow","hex":"#f8ede0"},{"name":"Ambit","hex":"#97653f"},{"name":"Ambitious Rose","hex":"#e9687e"},{"name":"Ambrosia","hex":"#d2e7ca"},{"name":"Ambrosia Ivory","hex":"#fff4eb"},{"name":"Ambrosia Salad","hex":"#f4ded3"},{"name":"Ameixa","hex":"#6a5acd"},{"name":"Amélie's Tutu","hex":"#fea7bd"},{"name":"America's Cup","hex":"#34546d"},{"name":"American Anthem","hex":"#7595ab"},{"name":"American Beauty","hex":"#a73340"},{"name":"American Blue","hex":"#3b3b6d"},{"name":"American Bronze","hex":"#391802"},{"name":"American Brown","hex":"#804040"},{"name":"American Gold","hex":"#d3af37"},{"name":"American Green","hex":"#34b334"},{"name":"American Mahogany","hex":"#52352f"},{"name":"American Milking Devon","hex":"#63403a"},{"name":"American Orange","hex":"#ff8b00"},{"name":"American Pink","hex":"#ff9899"},{"name":"American Purple","hex":"#431c53"},{"name":"American Red","hex":"#b32134"},{"name":"American River","hex":"#626e71"},{"name":"American Rose","hex":"#ff033e"},{"name":"American Silver","hex":"#cfcfcf"},{"name":"American Violet","hex":"#551b8c"},{"name":"American Yellow","hex":"#f2b400"},{"name":"American Yorkshire","hex":"#efdcd4"},{"name":"Americana","hex":"#0477b4"},{"name":"Americano","hex":"#463732"},{"name":"Amethyst","hex":"#9966cc"},{"name":"Amethyst Ganzstar","hex":"#8f00ff"},{"name":"Amethyst Gem","hex":"#776985"},{"name":"Amethyst Haze","hex":"#a0a0aa"},{"name":"Amethyst Ice","hex":"#d0c9c6"},{"name":"Amethyst Orchid","hex":"#926aa6"},{"name":"Amethyst Paint","hex":"#9c8aa4"},{"name":"Amethyst Purple","hex":"#562f7e"},{"name":"Amethyst Show","hex":"#bd97cf"},{"name":"Amethyst Smoke","hex":"#95879c"},{"name":"Amish Bread","hex":"#e6ddbe"},{"name":"Amnesia Blue","hex":"#1560bd"},{"name":"Amore","hex":"#ae2f48"},{"name":"Amour","hex":"#ee5851"},{"name":"Amour Frais","hex":"#f5e6ea"},{"name":"Amourette","hex":"#c8c5d7"},{"name":"Amparo Blue","hex":"#4960a8"},{"name":"Amphibian","hex":"#264c47"},{"name":"Amphitrite","hex":"#384e47"},{"name":"Amphora","hex":"#9f8672"},{"name":"Amphystine","hex":"#3f425a"},{"name":"Amulet","hex":"#7d9d72"},{"name":"Amulet Gem","hex":"#01748e"},{"name":"Amygdala Purple","hex":"#69045f"},{"name":"Àn Zǐ Purple","hex":"#94568c"},{"name":"Anakiwa","hex":"#8cceea"},{"name":"Ancestral","hex":"#d0c1c3"},{"name":"Ancestral Water","hex":"#d0d0d0"},{"name":"Anchor Grey","hex":"#596062"},{"name":"Anchor Point","hex":"#435d8b"},{"name":"Anchorman","hex":"#2c3641"},{"name":"Anchors Away","hex":"#9ebbcd"},{"name":"Anchovy","hex":"#756f6b"},{"name":"Ancient Bamboo","hex":"#da6304"},{"name":"Ancient Brandy","hex":"#aa6611"},{"name":"Ancient Bronze","hex":"#9c5221"},{"name":"Ancient Chest","hex":"#99522b"},{"name":"Ancient Copper","hex":"#9f543e"},{"name":"Ancient Doeskin","hex":"#dcc9a8"},{"name":"Ancient Earth","hex":"#746550"},{"name":"Ancient Magenta","hex":"#953d55"},{"name":"Ancient Maze","hex":"#959651"},{"name":"Ancient Murasaki Purple","hex":"#895b8a"},{"name":"Ancient Olive","hex":"#6a5536"},{"name":"Ancient Red","hex":"#922a31"},{"name":"Ancient Ruins","hex":"#e0cac0"},{"name":"Ancient Scroll","hex":"#f5e6de"},{"name":"Ancient Yellow","hex":"#eecd00"},{"name":"Andorra","hex":"#603535"},{"name":"Andrea Blue","hex":"#4477dd"},{"name":"Android Green","hex":"#a4c639"},{"name":"Anemone","hex":"#842c48"},{"name":"Angel Aura","hex":"#afa8ae"},{"name":"Angel Blue","hex":"#83c5cd"},{"name":"Angel Face Rose","hex":"#fe83cc"},{"name":"Angel Falls","hex":"#a3bdd3"},{"name":"Angel Feather","hex":"#f4efee"},{"name":"Angel Finger","hex":"#b8acb4"},{"name":"Angel Food","hex":"#f0e8d9"},{"name":"Angel Green","hex":"#004225"},{"name":"Angel Heart","hex":"#a17791"},{"name":"Angel Kiss","hex":"#cec7dc"},{"name":"Angel Shark","hex":"#e19640"},{"name":"Angel Wing","hex":"#f3dfd7"},{"name":"Angel's Face","hex":"#eed4c8"},{"name":"Angel's Feather","hex":"#f3f1e6"},{"name":"Angel's Whisper","hex":"#dbdfd4"},{"name":"Angelic Blue","hex":"#bbc6d6"},{"name":"Angelic Choir","hex":"#e9d9dc"},{"name":"Angelic Eyes","hex":"#bbd1e8"},{"name":"Angelic Starlet","hex":"#ebe9d8"},{"name":"Angora","hex":"#dfd1bb"},{"name":"Angora Blue","hex":"#b9c6d8"},{"name":"Angora Pink","hex":"#ebdfea"},{"name":"Angraecum Orchid","hex":"#f4f6ec"},{"name":"Angry Flamingo","hex":"#f04e45"},{"name":"Angry Gargoyle","hex":"#9799a6"},{"name":"Angry Gremlin","hex":"#37503d"},{"name":"Angry Ocean","hex":"#4e6665"},{"name":"Aniline Mauve","hex":"#b9abad"},{"name":"Animal Blood","hex":"#a41313"},{"name":"Animal Cracker","hex":"#f4e6ce"},{"name":"Animation","hex":"#1d5c83"},{"name":"Anise Flower","hex":"#f4e3b5"},{"name":"Anita","hex":"#91a0b7"},{"name":"Annapolis Blue","hex":"#384a66"},{"name":"Annis","hex":"#6b475d"},{"name":"Annular","hex":"#e17861"},{"name":"Anode","hex":"#89a4cd"},{"name":"Anon","hex":"#bdbfc8"},{"name":"Anonymous","hex":"#dadcd3"},{"name":"Another One Bites the Dust","hex":"#c7bba4"},{"name":"Antarctic Blue","hex":"#2b3f5c"},{"name":"Antarctic Deep","hex":"#35383f"},{"name":"Antarctica","hex":"#c6c5c6"},{"name":"Antarctica Lake","hex":"#bfd2d0"},{"name":"Antelope","hex":"#b19664"},{"name":"Anthill","hex":"#7f684e"},{"name":"Anthracite","hex":"#28282d"},{"name":"Anti Rainbow Grey","hex":"#bebdbc"},{"name":"Anti-Flash White","hex":"#f2f3f4"},{"name":"Antigua Blue","hex":"#06b1c4"},{"name":"Antilles Blue","hex":"#3b5e8d"},{"name":"Antilles Garden","hex":"#8aa277"},{"name":"Antiqua Sand","hex":"#83c2cd"},{"name":"Antiquarian Gold","hex":"#ba8a45"},{"name":"Antiquate","hex":"#8d8aa0"},{"name":"Antique","hex":"#8b846d"},{"name":"Antique Bear","hex":"#9c867b"},{"name":"Antique Bourbon","hex":"#926b43"},{"name":"Antique Brass","hex":"#6c461f"},{"name":"Antique Bronze","hex":"#704a07"},{"name":"Antique Brown","hex":"#553f2d"},{"name":"Antique China","hex":"#fdf6e7"},{"name":"Antique Coin","hex":"#b5b8a8"},{"name":"Antique Coral","hex":"#ffc7b0"},{"name":"Antique Fuchsia","hex":"#915c83"},{"name":"Antique Garnet","hex":"#8e5e5e"},{"name":"Antique Gold","hex":"#b59e5f"},{"name":"Antique Green","hex":"#29675c"},{"name":"Antique Heather","hex":"#cdbacb"},{"name":"Antique Honey","hex":"#b39355"},{"name":"Antique Lace","hex":"#fdf2db"},{"name":"Antique Linen","hex":"#faeedb"},{"name":"Antique Marble","hex":"#f1e9d7"},{"name":"Antique Mauve","hex":"#bbb0b1"},{"name":"Antique Moss","hex":"#7a973b"},{"name":"Antique Paper","hex":"#f4f0e8"},{"name":"Antique Parchment","hex":"#ead8c1"},{"name":"Antique Penny","hex":"#957747"},{"name":"Antique Rose","hex":"#997165"},{"name":"Antique Rosewood","hex":"#72393f"},{"name":"Antique Ruby","hex":"#841b2d"},{"name":"Antique Silver","hex":"#918e8c"},{"name":"Antique White","hex":"#ece6d5"},{"name":"Antique Wicker Basket","hex":"#f3d3a1"},{"name":"Antique Windmill","hex":"#b6a38d"},{"name":"Antiquity","hex":"#c1a87c"},{"name":"Antler","hex":"#957a76"},{"name":"Antler Moth","hex":"#864f3e"},{"name":"Anzac","hex":"#c68e3f"},{"name":"Ao","hex":"#00800c"},{"name":"Aotake Bamboo","hex":"#006442"},{"name":"Apatite Crystal Green","hex":"#bbff99"},{"name":"Apeland","hex":"#8a843b"},{"name":"Aphrodite's Pearls","hex":"#eeffff"},{"name":"Apium","hex":"#b5d0a2"},{"name":"Apnea Dive","hex":"#284fbd"},{"name":"Apocyan","hex":"#99ccff"},{"name":"Apollo Bay","hex":"#748697"},{"name":"Apollo Landing","hex":"#e5e5e1"},{"name":"Apollo's White","hex":"#ddffff"},{"name":"Appalachian Forest","hex":"#848b80"},{"name":"Appalachian Trail","hex":"#cfb989"},{"name":"Appaloosa Spots","hex":"#876e52"},{"name":"Apparition","hex":"#c2bca9"},{"name":"Appetite","hex":"#b1e5aa"},{"name":"Appetizing Asparagus","hex":"#66aa00"},{"name":"Apple Blossom","hex":"#ddbca0"},{"name":"Apple Bob","hex":"#d5e69d"},{"name":"Apple Brown Betty","hex":"#9c6757"},{"name":"Apple Butter","hex":"#844b4d"},{"name":"Apple Cider","hex":"#da995f"},{"name":"Apple Cinnamon","hex":"#b0885a"},{"name":"Apple Cream","hex":"#b8d7a6"},{"name":"Apple Cucumber","hex":"#dbdbbc"},{"name":"Apple Custard","hex":"#fddfae"},{"name":"Apple Day","hex":"#7e976d"},{"name":"Apple Flower","hex":"#edf4eb"},{"name":"Apple Green","hex":"#76cd26"},{"name":"Apple Hill","hex":"#a69f8d"},{"name":"Apple Ice","hex":"#bdd0b1"},{"name":"Apple II Beige","hex":"#bfca87"},{"name":"Apple II Blue","hex":"#93d6bf"},{"name":"Apple II Chocolate","hex":"#da680e"},{"name":"Apple II Green","hex":"#04650d"},{"name":"Apple II Lime","hex":"#25c40d"},{"name":"Apple II Magenta","hex":"#dc41f1"},{"name":"Apple II Rose","hex":"#ac667b"},{"name":"Apple Infusion","hex":"#ddaabb"},{"name":"Apple Jack","hex":"#8b974e"},{"name":"Apple Martini","hex":"#f9fdd9"},{"name":"Apple Seed","hex":"#a77c53"},{"name":"Apple Slice","hex":"#f1f0bf"},{"name":"Apple Valley","hex":"#ea8386"},{"name":"Apple-A-Day","hex":"#903f45"},{"name":"Applegate","hex":"#8ac479"},{"name":"Applegate Park","hex":"#aead93"},{"name":"Applemint","hex":"#cdeacd"},{"name":"Applemint Soda","hex":"#f3f5e9"},{"name":"Applesauce Cake","hex":"#c2a377"},{"name":"Appleton","hex":"#6eb478"},{"name":"Approval Green","hex":"#039487"},{"name":"Apricot","hex":"#ffb16d"},{"name":"Apricot Appeal","hex":"#fec382"},{"name":"Apricot Blush","hex":"#feaea5"},{"name":"Apricot Brandy","hex":"#c26a5a"},{"name":"Apricot Buff","hex":"#cd7e4d"},{"name":"Apricot Cream","hex":"#f1bd89"},{"name":"Apricot Foam","hex":"#eeded8"},{"name":"Apricot Fool","hex":"#ffd2a0"},{"name":"Apricot Gelato","hex":"#f5d7af"},{"name":"Apricot Glow","hex":"#ffce79"},{"name":"Apricot Ice","hex":"#fff6e9"},{"name":"Apricot Ice Cream","hex":"#f8cc9c"},{"name":"Apricot Iced Tea","hex":"#fbbe99"},{"name":"Apricot Illusion","hex":"#e2c4a6"},{"name":"Apricot Mix","hex":"#b47756"},{"name":"Apricot Mousse","hex":"#fcdfaf"},{"name":"Apricot Nectar","hex":"#ecaa79"},{"name":"Apricot Obsession","hex":"#f8c4b4"},{"name":"Apricot Orange","hex":"#c86b3c"},{"name":"Apricot Preserves","hex":"#eeb192"},{"name":"Apricot Sherbet","hex":"#facd9e"},{"name":"Apricot Sorbet","hex":"#e8a760"},{"name":"Apricot Tan","hex":"#dd9760"},{"name":"Apricot Wash","hex":"#fbac82"},{"name":"Apricot White","hex":"#f7f0db"},{"name":"April Showers","hex":"#dadeb5"},{"name":"April Sunshine","hex":"#fbe198"},{"name":"April Tears","hex":"#b4cbd4"},{"name":"April Wedding","hex":"#c5cfb1"},{"name":"Aqua","hex":"#00ffff"},{"name":"Aqua Belt","hex":"#7acad0"},{"name":"Aqua Bloom","hex":"#96d3d8"},{"name":"Aqua Clear","hex":"#8bd0dd"},{"name":"Aqua Cyan","hex":"#01f1f1"},{"name":"Aqua Deep","hex":"#014b43"},{"name":"Aqua Eden","hex":"#85c7a6"},{"name":"Aqua Experience","hex":"#038e85"},{"name":"Aqua Fiesta","hex":"#8cc3c3"},{"name":"Aqua Foam","hex":"#adc3b4"},{"name":"Aqua Forest","hex":"#5fa777"},{"name":"Aqua Frost","hex":"#a9d1d7"},{"name":"Aqua Glass","hex":"#d2e8e0"},{"name":"Aqua Green","hex":"#12e193"},{"name":"Aqua Grey","hex":"#a5b2aa"},{"name":"Aqua Haze","hex":"#d9ddd5"},{"name":"Aqua Island","hex":"#a1dad7"},{"name":"Aqua Lake","hex":"#30949d"},{"name":"Aqua Mist","hex":"#a0c9cb"},{"name":"Aqua Oasis","hex":"#bce8dd"},{"name":"Aqua Sea","hex":"#6baaae"},{"name":"Aqua Sky","hex":"#7bc4c4"},{"name":"Aqua Smoke","hex":"#8c9fa0"},{"name":"Aqua Sparkle","hex":"#d3e4e6"},{"name":"Aqua Splash","hex":"#85ced1"},{"name":"Aqua Spring","hex":"#e8f3e8"},{"name":"Aqua Squeeze","hex":"#dbe4dc"},{"name":"Aqua Tint","hex":"#e5f1ee"},{"name":"Aqua Velvet","hex":"#00a29e"},{"name":"Aqua Verde","hex":"#56b3c3"},{"name":"Aqua Vitale","hex":"#7bbdc7"},{"name":"Aqua Whisper","hex":"#bfdfdf"},{"name":"Aqua Zing","hex":"#7cd8d6"},{"name":"Aquadulce","hex":"#7b9f82"},{"name":"Aqualogic","hex":"#57b7c5"},{"name":"Aquamarine","hex":"#2ee8bb"},{"name":"Aquamarine Blue","hex":"#71d9e2"},{"name":"Aquamarine Dream","hex":"#b3c4ba"},{"name":"Aquamentus Green","hex":"#00a800"},{"name":"Aquarelle","hex":"#61aab1"},{"name":"Aquarium","hex":"#356b6f"},{"name":"Aquarium Blue","hex":"#66cdaa"},{"name":"Aquarium Diver","hex":"#0a98ac"},{"name":"Aquarius","hex":"#3cadd4"},{"name":"Aquatic","hex":"#99c1cc"},{"name":"Aquatic Cool","hex":"#41a0b4"},{"name":"Aqueduct","hex":"#60b3bc"},{"name":"Aquella","hex":"#59b6d9"},{"name":"Aqueous","hex":"#388d95"},{"name":"Aquifer","hex":"#89acac"},{"name":"Arabella","hex":"#82acc4"},{"name":"Arabesque","hex":"#d16f52"},{"name":"Arabian Bake","hex":"#cd9945"},{"name":"Arabian Red","hex":"#a14c3f"},{"name":"Arabian Silk","hex":"#786e97"},{"name":"Arabian Spice","hex":"#884332"},{"name":"Arabic Coffee","hex":"#6f4d3f"},{"name":"Aragon","hex":"#b06455"},{"name":"Aragon Green","hex":"#47ba87"},{"name":"Aragonite White","hex":"#f3f1f3"},{"name":"Araigaki Orange","hex":"#ec8254"},{"name":"Arapawa","hex":"#274a5d"},{"name":"Arava","hex":"#a18d71"},{"name":"Arboretum","hex":"#70ba9f"},{"name":"Arc Light","hex":"#ccddff"},{"name":"Arcade Fire","hex":"#ee3311"},{"name":"Arcade Glow","hex":"#0022cc"},{"name":"Arcadia","hex":"#00a28a"},{"name":"Arcadian Green","hex":"#a3c893"},{"name":"Arcala Green","hex":"#3b6c3f"},{"name":"Arcane","hex":"#98687e"},{"name":"Arcavia Red","hex":"#6a0002"},{"name":"Arctic","hex":"#648589"},{"name":"Arctic Blue","hex":"#95d6dc"},{"name":"Arctic Cotton","hex":"#e6e3df"},{"name":"Arctic Daisy","hex":"#ebe4be"},{"name":"Arctic Dawn","hex":"#e3e5e8"},{"name":"Arctic Dusk","hex":"#735b6a"},{"name":"Arctic Fox","hex":"#e7e7e2"},{"name":"Arctic Glow","hex":"#c9d1e9"},{"name":"Arctic Grey","hex":"#bbccdd"},{"name":"Arctic Ice","hex":"#bfc7d6"},{"name":"Arctic Lime","hex":"#d0ff14"},{"name":"Arctic Ocean","hex":"#66c3d0"},{"name":"Arctic Paradise","hex":"#b8dff8"},{"name":"Arctic Rose","hex":"#b7abb0"},{"name":"Arctic Water","hex":"#00fcfc"},{"name":"Arctic White","hex":"#e9eae7"},{"name":"Ardcoat","hex":"#e2dedf"},{"name":"Ardósia","hex":"#232f2c"},{"name":"Ares Red","hex":"#dd2200"},{"name":"Argan Oil","hex":"#8b593e"},{"name":"Argent","hex":"#888888"},{"name":"Argyle Purple","hex":"#895c79"},{"name":"Argyle Rose","hex":"#c48677"},{"name":"Aria","hex":"#e3e4e2"},{"name":"Ariel","hex":"#aed7ea"},{"name":"Ariel's Delight","hex":"#b2a5d3"},{"name":"Arizona Clay","hex":"#ad735a"},{"name":"Arizona Tree Frog","hex":"#669264"},{"name":"Armada","hex":"#536762"},{"name":"Armadillo","hex":"#484a46"},{"name":"Armadillo Egg","hex":"#7d4638"},{"name":"Armageddon Dunes","hex":"#926a25"},{"name":"Armageddon Dust","hex":"#d3a907"},{"name":"Armagnac","hex":"#ad916c"},{"name":"Armor","hex":"#74857f"},{"name":"Armor Wash","hex":"#030303"},{"name":"Armored Steel","hex":"#747769"},{"name":"Armory","hex":"#6a6b65"},{"name":"Army Canvas","hex":"#5b6f61"},{"name":"Army Green","hex":"#4b5320"},{"name":"Army Issue","hex":"#8a806b"},{"name":"Arnica","hex":"#bf8f37"},{"name":"Aroma","hex":"#d3c1c5"},{"name":"Aroma Garden","hex":"#a1c4a8"},{"name":"Aromatic","hex":"#706986"},{"name":"Arona","hex":"#879ba3"},{"name":"Arraign","hex":"#5c546e"},{"name":"Arrow Creek","hex":"#927257"},{"name":"Arrow Quiver","hex":"#c7a998"},{"name":"Arrow Rock","hex":"#a28440"},{"name":"Arrow Shaft","hex":"#5c503a"},{"name":"Arrowhead","hex":"#514b40"},{"name":"Arrowtown","hex":"#827a67"},{"name":"Arrowwood","hex":"#bc8d1f"},{"name":"Arsenic","hex":"#3b444b"},{"name":"Art and Craft","hex":"#896956"},{"name":"Artemesia","hex":"#e3ebea"},{"name":"Artemis","hex":"#d2a96e"},{"name":"Artemis Silver ","hex":"#ddddee"},{"name":"Artesian Pool","hex":"#a6bee1"},{"name":"Artesian Well","hex":"#5eb2aa"},{"name":"Artichoke","hex":"#8f9779"},{"name":"Artichoke Dip","hex":"#a19676"},{"name":"Artichoke Green","hex":"#4b6d41"},{"name":"Artichoke Mauve","hex":"#c19aa5"},{"name":"Artificial Strawberry","hex":"#ff43a4"},{"name":"Artificial Turf","hex":"#41b45c"},{"name":"Artillery","hex":"#746f67"},{"name":"Artisan Tile","hex":"#845e40"},{"name":"Artisans Gold","hex":"#f2ab46"},{"name":"Artist's Shadow","hex":"#a1969b"},{"name":"Artiste","hex":"#987387"},{"name":"Artistic Stone","hex":"#5c6b65"},{"name":"Arts & Crafts Gold","hex":"#f5c68b"},{"name":"Aruba Blue","hex":"#81d7d3"},{"name":"Arylide Yellow","hex":"#e9d66b"},{"name":"Asagi Blue","hex":"#48929b"},{"name":"Asagi Koi","hex":"#455559"},{"name":"Asagi Yellow","hex":"#f7bb7d"},{"name":"Asfar Yellow","hex":"#fcef01"},{"name":"Ash","hex":"#bebaa7"},{"name":"Ash Blue","hex":"#c0c6c9"},{"name":"Ash Brown","hex":"#98623c"},{"name":"Ash Cherry Blossom","hex":"#e8d3d1"},{"name":"Ash Grey","hex":"#c1b5a9"},{"name":"Ash Grove","hex":"#b9b3bf"},{"name":"Ash Hollow","hex":"#a88e8b"},{"name":"Ash Plum","hex":"#e8d3c7"},{"name":"Ash Rose","hex":"#b5817d"},{"name":"Ash to Ash","hex":"#4e4e4c"},{"name":"Ash Tree","hex":"#aabb99"},{"name":"Ash White","hex":"#e9e4d4"},{"name":"Ashberry","hex":"#b495a4"},{"name":"Ashen","hex":"#c9bfb2"},{"name":"Ashen Brown","hex":"#994444"},{"name":"Ashen Plum","hex":"#9b9092"},{"name":"Ashen Wind","hex":"#94a9b7"},{"name":"Ashes to Ashes","hex":"#bbb3a2"},{"name":"Ashley Blue","hex":"#8699ab"},{"name":"Ashlite","hex":"#a7a49f"},{"name":"Ashton Blue","hex":"#4a79ba"},{"name":"Ashton Skies","hex":"#7b8eb0"},{"name":"Ashwood","hex":"#bcc4bd"},{"name":"Asian Fusion","hex":"#ece0cd"},{"name":"Asian Violet","hex":"#8b818c"},{"name":"Āsmānī Sky","hex":"#88ddbb"},{"name":"Aspara","hex":"#70b2cc"},{"name":"Asparagus","hex":"#77ab56"},{"name":"Asparagus Cream","hex":"#96af54"},{"name":"Asparagus Fern","hex":"#b9cb5a"},{"name":"Asparagus Green","hex":"#d2cdb4"},{"name":"Asparagus Sprig","hex":"#576f44"},{"name":"Aspen Gold","hex":"#ffd662"},{"name":"Aspen Green","hex":"#7e9b76"},{"name":"Aspen Hush","hex":"#6a8d88"},{"name":"Aspen Yellow","hex":"#f6df9f"},{"name":"Asphalt","hex":"#130a06"},{"name":"Asphalt Blue","hex":"#474c55"},{"name":"Assassin","hex":"#2d4f83"},{"name":"Assateague Sand","hex":"#e1d0b2"},{"name":"Assault","hex":"#1c4374"},{"name":"Aster","hex":"#867ba9"},{"name":"Aster Petal","hex":"#d4dae2"},{"name":"Aster Purple","hex":"#7d74a8"},{"name":"Astilbe","hex":"#f091a9"},{"name":"Astorath Red","hex":"#dd482b"},{"name":"Astra","hex":"#edd5a6"},{"name":"Astral","hex":"#376f89"},{"name":"Astral Aura","hex":"#363151"},{"name":"Astral Spirit","hex":"#8ec2e7"},{"name":"Astro Arcade Green","hex":"#77ff77"},{"name":"Astro Bound","hex":"#899fb9"},{"name":"Astro Sunset","hex":"#937874"},{"name":"Astro Zinger","hex":"#797eb5"},{"name":"Astrogranite","hex":"#757679"},{"name":"Astrogranite Debris","hex":"#3b424c"},{"name":"Astrolab Reef","hex":"#2d96ce"},{"name":"Astronaut","hex":"#445172"},{"name":"Astronaut Blue","hex":"#214559"},{"name":"Astronomer","hex":"#e8f2eb"},{"name":"Astronomicon Grey","hex":"#6b7c85"},{"name":"Astroscopus Grey","hex":"#afb4b6"},{"name":"Astroturf","hex":"#67a159"},{"name":"Asurmen Blue Wash","hex":"#273e51"},{"name":"Aswad Black","hex":"#17181c"},{"name":"At The Beach","hex":"#e7d9b9"},{"name":"Atelier","hex":"#a3abb8"},{"name":"Ateneo Blue","hex":"#003a6c"},{"name":"Athena Blue","hex":"#66ddff"},{"name":"Athens Grey","hex":"#dcdddd"},{"name":"Athonian Camoshade","hex":"#6d8e44"},{"name":"Aths Special","hex":"#d5cbb2"},{"name":"Atlantic Charter","hex":"#2b2f41"},{"name":"Atlantic Deep","hex":"#274e55"},{"name":"Atlantic Fig Snail","hex":"#d7ceb9"},{"name":"Atlantic Gull","hex":"#4b8eb0"},{"name":"Atlantic Mystique","hex":"#00629a"},{"name":"Atlantic Wave","hex":"#3d797c"},{"name":"Atlantis","hex":"#336172"},{"name":"Atlantis Myth","hex":"#006477"},{"name":"Atmosphere","hex":"#a89c94"},{"name":"Atoll","hex":"#2b797a"},{"name":"Atom Blue","hex":"#8f9cac"},{"name":"Atomic","hex":"#3d4b52"},{"name":"Atomic Pink","hex":"#fb7efd"},{"name":"Atomic Tangerine","hex":"#ff9966"},{"name":"Atrium White","hex":"#f1eee4"},{"name":"Attar of Rose","hex":"#994240"},{"name":"Attica","hex":"#a1bca9"},{"name":"Attitude","hex":"#a48884"},{"name":"Attorney","hex":"#3f4258"},{"name":"Au Chico","hex":"#9e6759"},{"name":"Au Naturel","hex":"#e8cac0"},{"name":"Aubergine","hex":"#372528"},{"name":"Aubergine Flesh","hex":"#f2e4dd"},{"name":"Aubergine Perl","hex":"#5500aa"},{"name":"Auburn","hex":"#712f2c"},{"name":"Auburn Lights","hex":"#78342f"},{"name":"August Morning","hex":"#ffd79d"},{"name":"Aumbry","hex":"#7c7469"},{"name":"Aunt Violet","hex":"#7c0087"},{"name":"Aura","hex":"#b2a8a1"},{"name":"Aura Orange","hex":"#b4262a"},{"name":"Aureolin","hex":"#fdee00"},{"name":"Auric Armour Gold","hex":"#e8bc6d"},{"name":"AuroMetalSaurus","hex":"#6e7f80"},{"name":"Aurora","hex":"#eddd59"},{"name":"Aurora Green","hex":"#6adc99"},{"name":"Aurora Pink","hex":"#e881a6"},{"name":"Aurora Red","hex":"#b93a32"},{"name":"Australian Mint","hex":"#eff8aa"},{"name":"Australien","hex":"#cc9911"},{"name":"Austrian Ice","hex":"#dee6e7"},{"name":"Autumn Avenue","hex":"#e3ad59"},{"name":"Autumn Bark","hex":"#9d6f46"},{"name":"Autumn Blaze","hex":"#d9922e"},{"name":"Autumn Blonde","hex":"#eed0ae"},{"name":"Autumn Bloom","hex":"#ffe0cb"},{"name":"Autumn Fall","hex":"#67423b"},{"name":"Autumn Fern","hex":"#507b49"},{"name":"Autumn Festival","hex":"#a28b36"},{"name":"Autumn Glaze","hex":"#b3573f"},{"name":"Autumn Glory","hex":"#ff8812"},{"name":"Autumn Glow","hex":"#e5c382"},{"name":"Autumn Grey","hex":"#b2aba7"},{"name":"Autumn Laurel","hex":"#9d8d66"},{"name":"Autumn Leaf","hex":"#b56a4c"},{"name":"Autumn Maple","hex":"#c46215"},{"name":"Autumn Meadow","hex":"#acb78e"},{"name":"Autumn Night","hex":"#3b5861"},{"name":"Autumn Pine Green","hex":"#158078"},{"name":"Autumn Ridge","hex":"#9b423f"},{"name":"Autumn Robin","hex":"#c2452d"},{"name":"Autumn Sage","hex":"#aea26e"},{"name":"Autumn Sunset","hex":"#f38554"},{"name":"Autumn Umber","hex":"#ae704f"},{"name":"Autumn Wisteria","hex":"#c9a0dc"},{"name":"Autumnal","hex":"#a15325"},{"name":"Avagddu Green","hex":"#106b21"},{"name":"Avalon","hex":"#799b96"},{"name":"Aventurine","hex":"#576e6a"},{"name":"Averland Sunset","hex":"#ffaa1d"},{"name":"Aviva","hex":"#c5b47f"},{"name":"Avocado","hex":"#568203"},{"name":"Avocado Cream","hex":"#b7bf6b"},{"name":"Avocado Green","hex":"#87a922"},{"name":"Avocado Pear","hex":"#555337"},{"name":"Avocado Peel","hex":"#39373b"},{"name":"Avocado Toast","hex":"#90b134"},{"name":"Awaken","hex":"#a7a3bb"},{"name":"Awakened","hex":"#e3dae9"},{"name":"Awakening","hex":"#bb9e9b"},{"name":"Awareness","hex":"#e3ebb1"},{"name":"Awesome Aura","hex":"#ccc1da"},{"name":"Awkward Purple","hex":"#d208cc"},{"name":"Axe Handle","hex":"#6b4730"},{"name":"Axis","hex":"#bab6cb"},{"name":"Axolotl","hex":"#fff0df"},{"name":"Ayame Iris","hex":"#763568"},{"name":"Ayrshire","hex":"#a07254"},{"name":"Azalea Leaf","hex":"#4a6871"},{"name":"Azalea Pink","hex":"#f9c0c4"},{"name":"Azeitona","hex":"#a5b546"},{"name":"Azraq Blue","hex":"#4c6cb3"},{"name":"Aztec","hex":"#293432"},{"name":"Aztec Aura","hex":"#ffefbc"},{"name":"Aztec Brick","hex":"#9e8352"},{"name":"Aztec Glimmer","hex":"#e7b347"},{"name":"Aztec Gold","hex":"#c39953"},{"name":"Aztec Jade","hex":"#33bb88"},{"name":"Azuki Bean","hex":"#96514d"},{"name":"Azuki Red","hex":"#672422"},{"name":"Azul","hex":"#1d5dec"},{"name":"Azul Petróleo","hex":"#36454f"},{"name":"Azure","hex":"#007fff"},{"name":"Azure Blue","hex":"#4d91c6"},{"name":"Azure Dragon","hex":"#053976"},{"name":"Azure Mist","hex":"#f0fff1"},{"name":"Azure Radiance","hex":"#007f1f"},{"name":"Azure Sky","hex":"#b0e0f6"},{"name":"Azure Tide","hex":"#2b9890"},{"name":"Azureish White","hex":"#dbe9f4"},{"name":"B'dazzled Blue","hex":"#2e5894"},{"name":"Baal Red Wash","hex":"#610023"},{"name":"Babbling Brook","hex":"#becfcd"},{"name":"Babe","hex":"#dc7b7c"},{"name":"Babiana","hex":"#876fa3"},{"name":"Baby Barn Owl","hex":"#c3c3b8"},{"name":"Baby Bear","hex":"#6f5944"},{"name":"Baby Berries","hex":"#9c4a62"},{"name":"Baby Blue","hex":"#a2cffe"},{"name":"Baby Blue Eyes","hex":"#a1caf1"},{"name":"Baby Breath","hex":"#f0d0b0"},{"name":"Baby Bunting","hex":"#abcaea"},{"name":"Baby Burro","hex":"#8c665c"},{"name":"Baby Cake","hex":"#87bea3"},{"name":"Baby Chick","hex":"#ffeda2"},{"name":"Baby Fish Mouth","hex":"#f3acb9"},{"name":"Baby Frog","hex":"#c8ba63"},{"name":"Baby Girl","hex":"#ffdfe8"},{"name":"Baby Grass","hex":"#8abd7b"},{"name":"Baby Green","hex":"#8cff9e"},{"name":"Baby Jane","hex":"#d0a7a8"},{"name":"Baby Melon","hex":"#ffa468"},{"name":"Baby Motive","hex":"#8fcbdc"},{"name":"Baby Pink","hex":"#ffb7ce"},{"name":"Baby Powder","hex":"#fefefa"},{"name":"Baby Purple","hex":"#ca9bf7"},{"name":"Baby Seal","hex":"#a1a5a8"},{"name":"Baby Shoes","hex":"#005784"},{"name":"Baby Steps","hex":"#f5c9da"},{"name":"Baby Tears","hex":"#66b9d6"},{"name":"Baby Tone","hex":"#dcc2cb"},{"name":"Baby Tooth","hex":"#eeffdd"},{"name":"Baby's Blanket","hex":"#ffaec1"},{"name":"Baby's Booties","hex":"#e8c1c2"},{"name":"Baby's Breath","hex":"#d8e4e8"},{"name":"Baca Berry","hex":"#945759"},{"name":"Bacchanalia Red","hex":"#8a3a3c"},{"name":"Bachelor Blue","hex":"#8faaca"},{"name":"Bachelor Button","hex":"#4abbd5"},{"name":"Bachimitsu Gold","hex":"#fddea5"},{"name":"Back To Basics","hex":"#726747"},{"name":"Backcountry","hex":"#7c725f"},{"name":"Backdrop","hex":"#a7a799"},{"name":"Backwoods","hex":"#4a6546"},{"name":"Backyard","hex":"#879877"},{"name":"Bacon Strips","hex":"#df3f32"},{"name":"Bad Hair Day","hex":"#f1c983"},{"name":"Bad Moon Yellow","hex":"#f2e5b4"},{"name":"Badab Black Wash","hex":"#0a0908"},{"name":"Badlands Sunset","hex":"#936a5b"},{"name":"Bagpiper","hex":"#1c5544"},{"name":"Bahama Blue","hex":"#25597f"},{"name":"Bahaman Bliss","hex":"#3fa49b"},{"name":"Baharroth Blue","hex":"#58c1cd"},{"name":"Bahia","hex":"#a9c01c"},{"name":"Bahia Grass","hex":"#c4c5ad"},{"name":"Bái Sè White","hex":"#f1f3f2"},{"name":"Baikō Brown","hex":"#887938"},{"name":"Bainganī","hex":"#8273fd"},{"name":"Baja Blue","hex":"#66a6d9"},{"name":"Baja White","hex":"#fff8d1"},{"name":"Baked Apple","hex":"#b34646"},{"name":"Baked Bean","hex":"#b2754d"},{"name":"Baked Bread","hex":"#dacba9"},{"name":"Baked Clay","hex":"#9c5642"},{"name":"Baked Potato","hex":"#b69e87"},{"name":"Baked Salmon","hex":"#df9876"},{"name":"Bakelite","hex":"#e6d4a5"},{"name":"Bakelite Yellow","hex":"#c6b788"},{"name":"Baker-Miller Pink","hex":"#ff92ae"},{"name":"Baker's Chocolate","hex":"#5c3317"},{"name":"Baklava","hex":"#efb435"},{"name":"Bakos Blue","hex":"#273f4b"},{"name":"Balanced","hex":"#d7d2d1"},{"name":"Balcony Rose","hex":"#e2bcb8"},{"name":"Baleine Blue","hex":"#155187"},{"name":"Bali Batik","hex":"#6f5937"},{"name":"Bali Hai","hex":"#849ca9"},{"name":"Bali Sand","hex":"#f6e8d5"},{"name":"Balinese Sunset","hex":"#f1a177"},{"name":"Ball Blue","hex":"#21abcd"},{"name":"Ballad Blue","hex":"#c0ceda"},{"name":"Ballerina","hex":"#f2cfdc"},{"name":"Ballerina Silk","hex":"#f0dee0"},{"name":"Ballerina Tears","hex":"#f2bbb1"},{"name":"Ballet Blue","hex":"#afc4d9"},{"name":"Ballet Shoes","hex":"#edb9bd"},{"name":"Ballet Slipper","hex":"#ebced5"},{"name":"Ballie Scott Sage","hex":"#b2b29c"},{"name":"Ballyhoo","hex":"#58a83b"},{"name":"Balor Brown","hex":"#9c6b08"},{"name":"Balsa Stone","hex":"#cbbb92"},{"name":"Balsam","hex":"#bec4b7"},{"name":"Balsam Green","hex":"#576664"},{"name":"Balsam Pear","hex":"#b19338"},{"name":"Balsamic Reduction","hex":"#434340"},{"name":"Balthasar Gold","hex":"#a47552"},{"name":"Baltic","hex":"#279d9f"},{"name":"Baltic Bream","hex":"#9fbbda"},{"name":"Baltic Prince","hex":"#135952"},{"name":"Baltic Sea","hex":"#3c3d3e"},{"name":"Baltic Trench","hex":"#125761"},{"name":"Bambino","hex":"#8edacc"},{"name":"Bamboo","hex":"#e3dec6"},{"name":"Bamboo Mat","hex":"#e5da9f"},{"name":"Bamboo Screen","hex":"#bcab8c"},{"name":"Bamboo Shoot","hex":"#a3b6a4"},{"name":"Bamboo White","hex":"#c6cfad"},{"name":"Banafš Violet","hex":"#5a1991"},{"name":"Banafsaji Purple","hex":"#a50b5e"},{"name":"Banana","hex":"#fffc79"},{"name":"Banana Biscuit","hex":"#ffde7b"},{"name":"Banana Blossom","hex":"#933e49"},{"name":"Banana Boat","hex":"#fdc838"},{"name":"Banana Bread","hex":"#ffcf73"},{"name":"Banana Brulee","hex":"#f7eab9"},{"name":"Banana Chalk","hex":"#d6d963"},{"name":"Banana Cream","hex":"#fff49c"},{"name":"Banana Crepe","hex":"#e7d3ad"},{"name":"Banana Farm","hex":"#ffdf38"},{"name":"Banana Mania","hex":"#fbe7b2"},{"name":"Banana Mash","hex":"#fafe4b"},{"name":"Banana Milkshake","hex":"#ede6cb"},{"name":"Banana Palm","hex":"#95a263"},{"name":"Banana Peel","hex":"#ffe774"},{"name":"Banana Pie","hex":"#f7efd7"},{"name":"Banana Powder","hex":"#d0c101"},{"name":"Banana Pudding","hex":"#f4efc3"},{"name":"Banana Puree","hex":"#b29705"},{"name":"Banana Split","hex":"#f7eec8"},{"name":"Banana Yellow","hex":"#ffe135"},{"name":"Banana Yogurt","hex":"#fae7b5"},{"name":"Bananarama","hex":"#e4d466"},{"name":"Bananas Foster","hex":"#dcbe97"},{"name":"Bancroft Village","hex":"#816e54"},{"name":"Banded Tulip","hex":"#e0d3bd"},{"name":"Bandicoot","hex":"#878466"},{"name":"Baneblade Brown","hex":"#937f6d"},{"name":"Bangladesh Green","hex":"#006a4f"},{"name":"Banished Brown","hex":"#745e6f"},{"name":"Bank Blue","hex":"#3e4652"},{"name":"Bank Vault","hex":"#757374"},{"name":"Banksia","hex":"#a6b29a"},{"name":"Banksia Leaf","hex":"#4b5539"},{"name":"Banner Gold","hex":"#a28557"},{"name":"Bannister Brown","hex":"#806b5d"},{"name":"Banyan Serenity","hex":"#98ab8c"},{"name":"Bara Red","hex":"#e9546b"},{"name":"Barbados","hex":"#3e6676"},{"name":"Barbados Bay","hex":"#006665"},{"name":"Barbados Blue","hex":"#2766ac"},{"name":"Barbados Cherry","hex":"#aa0a27"},{"name":"Barbarian Flesh","hex":"#f78c5a"},{"name":"Barbarian Leather","hex":"#a17308"},{"name":"Barbarossa","hex":"#a84734"},{"name":"Barbecue","hex":"#c26157"},{"name":"Barberry","hex":"#ee1133"},{"name":"Barberry Bush","hex":"#d2c61f"},{"name":"Barbie Pink","hex":"#fe46a5"},{"name":"Bare","hex":"#817e6d"},{"name":"Bare Beige","hex":"#e8d3c9"},{"name":"Bare Bone","hex":"#eeddcc"},{"name":"Bare Pink","hex":"#f2e1dd"},{"name":"Barely Bloomed","hex":"#ddaadd"},{"name":"Barely Blue","hex":"#dde0df"},{"name":"Barely Brown","hex":"#dd6655"},{"name":"Barely Butter","hex":"#f8e9c2"},{"name":"Barely Mauve","hex":"#ccbdb9"},{"name":"Barely Peach","hex":"#ffe9c7"},{"name":"Barely Pink","hex":"#f8d7dd"},{"name":"Barely Rose","hex":"#ede0e3"},{"name":"Barf Green","hex":"#94ac02"},{"name":"Barite","hex":"#9e7b5c"},{"name":"Baritone","hex":"#708e95"},{"name":"Barium","hex":"#f4e1c5"},{"name":"Barium Green","hex":"#8fff9f"},{"name":"Bark","hex":"#5f5854"},{"name":"Bark Sawdust","hex":"#ab9004"},{"name":"Barking Prairie Dog","hex":"#c5b497"},{"name":"Barley Corn","hex":"#b6935c"},{"name":"Barley Groats","hex":"#fbf2db"},{"name":"Barley White","hex":"#f7e5b7"},{"name":"Barn Door","hex":"#8e5959"},{"name":"Barn Red","hex":"#8b4044"},{"name":"Barney","hex":"#ac1db8"},{"name":"Barney Purple","hex":"#a00498"},{"name":"Barnfloor","hex":"#9c9480"},{"name":"Barnwood","hex":"#554d44"},{"name":"Barnwood Grey","hex":"#9e9589"},{"name":"Baroque Blue","hex":"#95b6b5"},{"name":"Baroque Rose","hex":"#b35a66"},{"name":"Barossa","hex":"#452e39"},{"name":"Barrel Stove","hex":"#8e7e67"},{"name":"Barren","hex":"#b9aba3"},{"name":"Barricade","hex":"#84623e"},{"name":"Barrier Reef","hex":"#0084a1"},{"name":"Basalt Grey","hex":"#999999"},{"name":"Base Camp","hex":"#575c3a"},{"name":"Base Sand","hex":"#bb9955"},{"name":"Bashful","hex":"#e3eded"},{"name":"Bashful Emu","hex":"#b2b0ac"},{"name":"Bashful Pansy","hex":"#d9cde5"},{"name":"Bashful Rose","hex":"#b88686"},{"name":"Basic Coral","hex":"#dbc3b6"},{"name":"Basil","hex":"#879f84"},{"name":"Basil Pesto","hex":"#529d6e"},{"name":"Basketball","hex":"#ee6730"},{"name":"Basketweave Beige","hex":"#caad92"},{"name":"Basmati White","hex":"#ebe1c9"},{"name":"Bassinet","hex":"#d3c1cb"},{"name":"Bastard-amber","hex":"#ffcc88"},{"name":"Bastille","hex":"#2c2c32"},{"name":"Bastion Grey","hex":"#4d4a4a"},{"name":"Bat Wing","hex":"#7e7466"},{"name":"Batch Blue","hex":"#87b2c9"},{"name":"Bateau","hex":"#1b7598"},{"name":"Bath Bubbles","hex":"#e6f2ea"},{"name":"Bathing","hex":"#93c9d0"},{"name":"Batman","hex":"#656e72"},{"name":"Batman's NES Cape","hex":"#940084"},{"name":"Baton","hex":"#866f5a"},{"name":"Baton Rouge","hex":"#973c6c"},{"name":"Battery Charged Blue","hex":"#1dacd4"},{"name":"Battle Blue","hex":"#74828f"},{"name":"Battle Dress","hex":"#7e8270"},{"name":"Battle Harbor","hex":"#9c9c82"},{"name":"Battleship Green","hex":"#828f72"},{"name":"Battleship Grey","hex":"#6f7476"},{"name":"Battletoad","hex":"#11cc55"},{"name":"Batu Cave","hex":"#595438"},{"name":"Bauhaus Tan","hex":"#ccc4ae"},{"name":"Bavarian Blue","hex":"#1c3382"},{"name":"Bavarian Cream","hex":"#fff9dd"},{"name":"Bavarian Gentian","hex":"#20006d"},{"name":"Bavarian Sweet Mustard","hex":"#4d3113"},{"name":"Bay","hex":"#bae5d6"},{"name":"Bay Area","hex":"#afa490"},{"name":"Bay Brown","hex":"#773300"},{"name":"Bay Fog","hex":"#9899b0"},{"name":"Bay Isle Pointe","hex":"#214048"},{"name":"Bay Leaf","hex":"#86793d"},{"name":"Bay of Hope","hex":"#bfc9d0"},{"name":"Bay of Many","hex":"#353e64"},{"name":"Bay Salt","hex":"#d2cdbc"},{"name":"Bay Site","hex":"#325f8a"},{"name":"Bay View","hex":"#6a819e"},{"name":"Bay Wharf","hex":"#747f89"},{"name":"Bay's Water","hex":"#7b9aad"},{"name":"Bayberry","hex":"#255958"},{"name":"Bayou","hex":"#20706f"},{"name":"Bayshore","hex":"#89cee0"},{"name":"Bayside","hex":"#5fc9bf"},{"name":"Bazaar","hex":"#8f7777"},{"name":"BBQ","hex":"#a35046"},{"name":"Be Daring","hex":"#ffc943"},{"name":"Be My Valentine","hex":"#ec9dc3"},{"name":"Be Spontaneous","hex":"#a5cb66"},{"name":"Be Yourself","hex":"#9b983d"},{"name":"Beach Bag","hex":"#adb864"},{"name":"Beach Ball","hex":"#efc700"},{"name":"Beach Boardwalk","hex":"#ceab90"},{"name":"Beach Casuarina","hex":"#665a38"},{"name":"Beach Cottage","hex":"#94adb0"},{"name":"Beach Dune","hex":"#c6bb9c"},{"name":"Beach Glass","hex":"#96dfce"},{"name":"Beach Grass","hex":"#dcddb8"},{"name":"Beach House","hex":"#edd481"},{"name":"Beach Party","hex":"#fbd05c"},{"name":"Beach Sand","hex":"#fbb995"},{"name":"Beach Towel","hex":"#fce3b3"},{"name":"Beach Umbrella","hex":"#819aaa"},{"name":"Beach Woods","hex":"#cac0b0"},{"name":"Beachcomber","hex":"#d9e4e5"},{"name":"Beachcombing","hex":"#e4c683"},{"name":"Beachside Villa","hex":"#c3b296"},{"name":"Beachy Keen","hex":"#e6d0b6"},{"name":"Beaded Blue","hex":"#494d8b"},{"name":"Beagle Brown","hex":"#8d6737"},{"name":"Beaming Sun","hex":"#fff8df"},{"name":"Bean Counter","hex":"#68755d"},{"name":"Bean Shoot","hex":"#91923a"},{"name":"Bean Sprout","hex":"#f3f9e9"},{"name":"Beanstalk","hex":"#31aa74"},{"name":"Bear Brown","hex":"#44382b"},{"name":"Bear Hug","hex":"#796359"},{"name":"Bear in Mind","hex":"#5b4a44"},{"name":"Bearsuit","hex":"#7d756d"},{"name":"Beastly Flesh","hex":"#680c08"},{"name":"Beasty Brown","hex":"#663300"},{"name":"Beaten Copper","hex":"#73372d"},{"name":"Beaten Purple","hex":"#4e0550"},{"name":"Beaten Track","hex":"#d1be92"},{"name":"Beatnik","hex":"#5f8748"},{"name":"Beatrice","hex":"#bebad9"},{"name":"Beau Blue","hex":"#bcd4e6"},{"name":"Beaujolais","hex":"#80304c"},{"name":"Beaumont Brown","hex":"#92774c"},{"name":"Beautiful Blue","hex":"#186db6"},{"name":"Beauty","hex":"#866b8d"},{"name":"Beauty Bush","hex":"#ebb9b3"},{"name":"Beauty Patch","hex":"#834f44"},{"name":"Beauty Secret","hex":"#c79ea2"},{"name":"Beauty Spot","hex":"#604938"},{"name":"Beaver","hex":"#926f5b"},{"name":"Beaver Fur","hex":"#997867"},{"name":"Beaver Kit","hex":"#9f8170"},{"name":"Beaver Pelt","hex":"#60564c"},{"name":"Bechamel","hex":"#f4eee0"},{"name":"Becker Blue","hex":"#607879"},{"name":"Beckett","hex":"#85a699"},{"name":"Bedbox","hex":"#968775"},{"name":"Bedford Brown","hex":"#aa8880"},{"name":"Bee Hall","hex":"#f2cc64"},{"name":"Bee Master","hex":"#735b3b"},{"name":"Bee Pollen","hex":"#ebca70"},{"name":"Bee Yellow","hex":"#feff32"},{"name":"Beech","hex":"#5b4f3b"},{"name":"Beech Fern","hex":"#758067"},{"name":"Beechnut","hex":"#c2c18d"},{"name":"Beekeeper","hex":"#f6e491"},{"name":"Beer","hex":"#f28e1c"},{"name":"Beer Glazed Bacon","hex":"#773311"},{"name":"Beeswax","hex":"#e9d7ab"},{"name":"Beeswing","hex":"#f5d297"},{"name":"Beet Red","hex":"#7a1f3d"},{"name":"Beetle","hex":"#55584c"},{"name":"Beetroot Purple","hex":"#cf2d71"},{"name":"Beetroot Rice","hex":"#c58f9d"},{"name":"Beets","hex":"#736a86"},{"name":"Befitting","hex":"#96496d"},{"name":"Before the Storm","hex":"#4d6a77"},{"name":"Beggar","hex":"#5a4d39"},{"name":"Begonia","hex":"#fa6e79"},{"name":"Begonia Pink","hex":"#ec9abe"},{"name":"Beige","hex":"#e6daa6"},{"name":"Beige Ganesh","hex":"#cfb095"},{"name":"Beige Linen","hex":"#e2dac6"},{"name":"Beige Red","hex":"#de9408"},{"name":"Beige Royal","hex":"#cfc8b8"},{"name":"Beige Topaz","hex":"#ffc87c"},{"name":"Bel Air Blue","hex":"#819ac1"},{"name":"Bel Esprit","hex":"#9bbcc3"},{"name":"Belgian Block","hex":"#a3a9a6"},{"name":"Belgian Blonde","hex":"#f7efd0"},{"name":"Belgian Waffle","hex":"#f3dfb6"},{"name":"Belize Green","hex":"#b9c3b3"},{"name":"Bell Blue","hex":"#618b97"},{"name":"Bell Heather","hex":"#a475b1"},{"name":"Bella","hex":"#574057"},{"name":"Bella Green","hex":"#93c3b1"},{"name":"Bella Sera","hex":"#40465d"},{"name":"Bella Vista","hex":"#0b695b"},{"name":"Belladonna","hex":"#220011"},{"name":"Belle of the Ball","hex":"#e3cbc0"},{"name":"Bellflower","hex":"#5d66aa"},{"name":"Bellini","hex":"#f4c9b1"},{"name":"Belly Fire","hex":"#773b38"},{"name":"Belly Flop","hex":"#00817f"},{"name":"Below Zero","hex":"#87cded"},{"name":"Beluga","hex":"#4a4843"},{"name":"Belyi White","hex":"#f0f1e1"},{"name":"Benevolence","hex":"#694977"},{"name":"Bengal","hex":"#cc974d"},{"name":"Bengal Blue","hex":"#38738b"},{"name":"Bengala Red","hex":"#8f2e14"},{"name":"Bengara Red","hex":"#913225"},{"name":"Beni Shoga","hex":"#b85241"},{"name":"Benifuji","hex":"#bb7796"},{"name":"Benihi Red","hex":"#f35336"},{"name":"Benikakehana Purple","hex":"#5a4f74"},{"name":"Benikeshinezumi Purple","hex":"#44312e"},{"name":"Benimidori Purple","hex":"#78779b"},{"name":"Benitoite","hex":"#007baa"},{"name":"Beniukon Bronze","hex":"#fb8136"},{"name":"Benthic Black","hex":"#000011"},{"name":"Bento Box","hex":"#cc363c"},{"name":"Bering Sea","hex":"#4b5b6e"},{"name":"Berkeley Hills","hex":"#7e613f"},{"name":"Berkshire Lace","hex":"#f0e1cf"},{"name":"Berlin Blue","hex":"#5588cc"},{"name":"Bermuda","hex":"#1b7d8d"},{"name":"Bermuda Grey","hex":"#6b8ba2"},{"name":"Bermuda Onion","hex":"#9d5a8f"},{"name":"Bermuda Sand","hex":"#dacbbf"},{"name":"Bermuda Triangle","hex":"#6f8c9f"},{"name":"Bermudagrass","hex":"#6bc271"},{"name":"Berries n Cream","hex":"#f2b8ca"},{"name":"Berry","hex":"#990f4b"},{"name":"Berry Blackmail","hex":"#662277"},{"name":"Berry Bliss","hex":"#9e8295"},{"name":"Berry Boost","hex":"#bb5588"},{"name":"Berry Burst","hex":"#ac72af"},{"name":"Berry Bush","hex":"#77424e"},{"name":"Berry Chalk","hex":"#a6aebb"},{"name":"Berry Chocolate","hex":"#3f000f"},{"name":"Berry Conserve","hex":"#765269"},{"name":"Berry Crush","hex":"#aa6772"},{"name":"Berry Frost","hex":"#ebded7"},{"name":"Berry Mix","hex":"#555a90"},{"name":"Berry Mojito","hex":"#b6caca"},{"name":"Berry Pie","hex":"#4f6d8e"},{"name":"Berry Popsicle","hex":"#d6a5cd"},{"name":"Berry Riche","hex":"#e5a2ab"},{"name":"Berry Rossi","hex":"#992244"},{"name":"Berry Smoothie","hex":"#895360"},{"name":"Berta Blue","hex":"#45dcff"},{"name":"Beru","hex":"#bfe4d4"},{"name":"Beryl Green","hex":"#bcbfa8"},{"name":"Beryllonite","hex":"#e9e5d7"},{"name":"Bessie","hex":"#685e5b"},{"name":"Best Beige","hex":"#c6b49c"},{"name":"Bestial Brown","hex":"#6b3900"},{"name":"Bestigor Flesh","hex":"#d38a57"},{"name":"Betalain Red","hex":"#7d655c"},{"name":"Betel Nut Dye","hex":"#352925"},{"name":"Bethany","hex":"#cadbbd"},{"name":"Betsy","hex":"#73c9d9"},{"name":"Better Than Beige","hex":"#ebe2cb"},{"name":"Beveled Glass","hex":"#7accb8"},{"name":"Bewitching","hex":"#75495e"},{"name":"Beyond the Pines","hex":"#688049"},{"name":"Beyond the Wall","hex":"#d7e0eb"},{"name":"Bhūrā Brown","hex":"#947706"},{"name":"Białowieża Forest","hex":"#1c5022"},{"name":"Bianca","hex":"#f4efe0"},{"name":"Bianchi Green","hex":"#3dcfc2"},{"name":"Bicyclette","hex":"#802c3a"},{"name":"Bidwell Blue","hex":"#a9b9b5"},{"name":"Bidwell Brown","hex":"#b19c8f"},{"name":"Biel-Tan Green","hex":"#1ba169"},{"name":"Big Band","hex":"#afaba0"},{"name":"Big Bang Pink","hex":"#ff0099"},{"name":"Big Cypress","hex":"#b98675"},{"name":"Big Daddy Blue","hex":"#5d6b75"},{"name":"Big Dip O’Ruby","hex":"#9c2542"},{"name":"Big Foot Feet","hex":"#e88e5a"},{"name":"Big Horn Mountains","hex":"#b79e94"},{"name":"Big Sky","hex":"#cde2de"},{"name":"Big Spender","hex":"#acddaf"},{"name":"Big Stone","hex":"#334046"},{"name":"Big Stone Beach","hex":"#886e54"},{"name":"Big Sur","hex":"#b3cadc"},{"name":"Big Sur Blue Jade","hex":"#3f6e8e"},{"name":"Bigfoot","hex":"#715145"},{"name":"Bighorn Sheep","hex":"#20120e"},{"name":"Bijou Blue","hex":"#4e5e7f"},{"name":"Bijoux Green","hex":"#676b55"},{"name":"Biking Red","hex":"#77212e"},{"name":"Bilbao","hex":"#3e8027"},{"name":"Bilberry","hex":"#71777e"},{"name":"Bile","hex":"#b5c306"},{"name":"Bilious Brown","hex":"#e39f08"},{"name":"Bilious Green","hex":"#a9d171"},{"name":"Billabong","hex":"#1b6f81"},{"name":"Billet","hex":"#ad7c35"},{"name":"Billiard","hex":"#00aa92"},{"name":"Billiard Ball","hex":"#276b40"},{"name":"Billiard Green","hex":"#305a4a"},{"name":"Billiard Table","hex":"#155843"},{"name":"Billowing Clouds","hex":"#d8dee3"},{"name":"Billowing Sail","hex":"#d8e7e7"},{"name":"Billycart Blue","hex":"#4c77a4"},{"name":"Biloba Flower","hex":"#ae99d2"},{"name":"Bimini Blue","hex":"#007a91"},{"name":"Bindi Dot","hex":"#8b3439"},{"name":"Bindi Red","hex":"#b0003c"},{"name":"Binrouji Black","hex":"#433d3c"},{"name":"Bio Blue","hex":"#465f9e"},{"name":"Biogenic Sand","hex":"#ffefd5"},{"name":"Biohazard Suit","hex":"#fbfb4c"},{"name":"Birch","hex":"#3f3726"},{"name":"Birch Beige","hex":"#d9c3a1"},{"name":"Birch Forest","hex":"#899a8b"},{"name":"Birch Strain","hex":"#dfb45f"},{"name":"Birch White","hex":"#f6eedf"},{"name":"Birchwood","hex":"#ccbeac"},{"name":"Birchy Woods","hex":"#806843"},{"name":"Bird Flower","hex":"#d0c117"},{"name":"Bird Of Paradise","hex":"#0083a8"},{"name":"Bird's Child","hex":"#fff1cf"},{"name":"Bird's Egg Green","hex":"#aaccb9"},{"name":"Bird's Nest","hex":"#cfbb9b"},{"name":"Birdhouse Brown","hex":"#6c483a"},{"name":"Birdie","hex":"#e9e424"},{"name":"Birdie Num Num","hex":"#89acda"},{"name":"Birdseed","hex":"#e2c28e"},{"name":"Biro Blue","hex":"#2f3946"},{"name":"Birōdo Green","hex":"#224634"},{"name":"Birthday Cake","hex":"#e9d2cc"},{"name":"Birthday King","hex":"#9bdcb9"},{"name":"Birthday Suit","hex":"#e2c7b6"},{"name":"Biscay","hex":"#2f3c53"},{"name":"Biscay Bay","hex":"#097988"},{"name":"Biscay Green","hex":"#55c6a9"},{"name":"Biscotti","hex":"#dac7ab"},{"name":"Biscuit","hex":"#feedca"},{"name":"Bismarck","hex":"#486c7a"},{"name":"Bison","hex":"#6e4f3a"},{"name":"Bison Beige","hex":"#9f9180"},{"name":"Bison Hide","hex":"#b5ac94"},{"name":"Bisque","hex":"#ffe4c4"},{"name":"Bisque Tan","hex":"#e5d2b0"},{"name":"Bistre","hex":"#3d2b1f"},{"name":"Bistre Brown","hex":"#967117"},{"name":"Bistro Green","hex":"#395551"},{"name":"Bit of Berry","hex":"#dd5599"},{"name":"Bit of Blue","hex":"#e2eaeb"},{"name":"Bit of Heaven","hex":"#cad7de"},{"name":"Bit of Lime","hex":"#e1e5ac"},{"name":"Bitter","hex":"#88896c"},{"name":"Bitter Chocolate","hex":"#9e5b40"},{"name":"Bitter Dandelion","hex":"#6ecb3c"},{"name":"Bitter Lemon","hex":"#d2db32"},{"name":"Bitter Lime","hex":"#cfff00"},{"name":"Bitter Melon","hex":"#cfd1b2"},{"name":"Bittersweet","hex":"#fea051"},{"name":"Bittersweet Shimmer","hex":"#bf4f51"},{"name":"Bizarre","hex":"#e7d2c8"},{"name":"Black","hex":"#000000"},{"name":"Black Bay","hex":"#474a4e"},{"name":"Black Bean","hex":"#4e4b4a"},{"name":"Black Beauty","hex":"#26262a"},{"name":"Black Blueberry","hex":"#2f2f48"},{"name":"Black Cat","hex":"#2e2f31"},{"name":"Black Chestnut Oak","hex":"#252321"},{"name":"Black Chocolate","hex":"#441100"},{"name":"Black Coffee","hex":"#3b302f"},{"name":"Black Coral","hex":"#54626f"},{"name":"Black Dahlia","hex":"#4e434d"},{"name":"Black Dragon's Caldron","hex":"#545562"},{"name":"Black Drop","hex":"#90abd9"},{"name":"Black Elder","hex":"#a66e7a"},{"name":"Black Elegance","hex":"#50484a"},{"name":"Black Flame","hex":"#484b5a"},{"name":"Black Forest","hex":"#5e6354"},{"name":"Black Glaze","hex":"#001111"},{"name":"Black Green","hex":"#384e49"},{"name":"Black Grey","hex":"#24272e"},{"name":"Black Haze","hex":"#e0ded7"},{"name":"Black Hills Gold","hex":"#c89180"},{"name":"Black Hole","hex":"#010203"},{"name":"Black Htun","hex":"#110033"},{"name":"Black Ice","hex":"#4d5051"},{"name":"Black Ink","hex":"#44413c"},{"name":"Black Iris","hex":"#2b3042"},{"name":"Black Jasmine Rice","hex":"#74563d"},{"name":"Black Kite","hex":"#351e1c"},{"name":"Black Knight","hex":"#010b13"},{"name":"Black Lead","hex":"#474c4d"},{"name":"Black Leather Jacket","hex":"#253529"},{"name":"Black Magic","hex":"#4f4554"},{"name":"Black Marlin","hex":"#383740"},{"name":"Black Metal","hex":"#060606"},{"name":"Black Oak","hex":"#4e4f4e"},{"name":"Black Olive","hex":"#3b3c36"},{"name":"Black Onyx","hex":"#2b272b"},{"name":"Black Panther","hex":"#424242"},{"name":"Black Pearl","hex":"#1e272c"},{"name":"Black Plum","hex":"#6c5765"},{"name":"Black Pool","hex":"#4f5552"},{"name":"Black Powder","hex":"#34342c"},{"name":"Black Pudding","hex":"#a44a56"},{"name":"Black Raspberry","hex":"#16110d"},{"name":"Black River Falls","hex":"#343e54"},{"name":"Black Rock","hex":"#2c2d3c"},{"name":"Black Rooster","hex":"#331111"},{"name":"Black Rose","hex":"#532934"},{"name":"Black Russian","hex":"#24252b"},{"name":"Black Sabbath","hex":"#220022"},{"name":"Black Safflower","hex":"#302833"},{"name":"Black Sand","hex":"#5b4e4b"},{"name":"Black Shadows","hex":"#bfafb2"},{"name":"Black Slug","hex":"#332211"},{"name":"Black Soap","hex":"#19443c"},{"name":"Black Spruce","hex":"#4c5752"},{"name":"Black Squeeze","hex":"#e5e6df"},{"name":"Black Swan","hex":"#332200"},{"name":"Black Tie","hex":"#464647"},{"name":"Black Tortoise","hex":"#353235"},{"name":"Black Truffle","hex":"#463d3e"},{"name":"Black Velvet","hex":"#222233"},{"name":"Black Walnut","hex":"#5e4f46"},{"name":"Black Wash","hex":"#0c0c0c"},{"name":"Black Water","hex":"#2e4846"},{"name":"Black White","hex":"#e5e4db"},{"name":"Blackadder","hex":"#292c2c"},{"name":"Blackberry","hex":"#43182f"},{"name":"Blackberry Burgundy","hex":"#4c3938"},{"name":"Blackberry Cordial","hex":"#3f2a47"},{"name":"Blackberry Jam","hex":"#87657e"},{"name":"Blackberry Pie","hex":"#323f75"},{"name":"Blackberry Sorbet","hex":"#c1a3b9"},{"name":"Blackberry Tint","hex":"#8f5973"},{"name":"Blackberry Wine","hex":"#4d3246"},{"name":"Blackberry Yogurt","hex":"#e5bddf"},{"name":"Blackcurrant","hex":"#2e183b"},{"name":"Blackcurrant Conserve","hex":"#52383d"},{"name":"Blackcurrant Elixir","hex":"#5c4f6a"},{"name":"Blackened Brown","hex":"#442200"},{"name":"Blackened Pearl","hex":"#4d4b50"},{"name":"Blackest Berry","hex":"#662266"},{"name":"Blackest Brown","hex":"#403330"},{"name":"Blackfire Earth","hex":"#7a5901"},{"name":"Blackheath","hex":"#49454b"},{"name":"Blackjack","hex":"#51504d"},{"name":"Blackwater Park","hex":"#696268"},{"name":"Blade Green","hex":"#6a9266"},{"name":"Bladed Grass","hex":"#758269"},{"name":"Bladerunner","hex":"#6a8561"},{"name":"Blair","hex":"#a1bde0"},{"name":"Blanc","hex":"#d9d0c2"},{"name":"Blanc Cassé","hex":"#f1eee2"},{"name":"Blanc De Blanc","hex":"#e7e9e7"},{"name":"Blanched Almond","hex":"#ffebcd"},{"name":"Blanched Driftwood","hex":"#ccbeb6"},{"name":"Bland","hex":"#afa88b"},{"name":"Blank Canvas","hex":"#ffefd6"},{"name":"Blanka Green","hex":"#9cd33c"},{"name":"Blarney","hex":"#00a776"},{"name":"Blarney Stone","hex":"#027944"},{"name":"Blast-Off Bronze","hex":"#a57164"},{"name":"Blaze","hex":"#fa8c4f"},{"name":"Blaze Orange","hex":"#fe6700"},{"name":"Blazing Autumn","hex":"#f3ad63"},{"name":"Blazing Orange","hex":"#ffa64f"},{"name":"Blazing Yellow","hex":"#fee715"},{"name":"Bleach White","hex":"#ebe1ce"},{"name":"Bleached Apricot","hex":"#fccaac"},{"name":"Bleached Aqua","hex":"#bce3df"},{"name":"Bleached Bare","hex":"#d0c7c3"},{"name":"Bleached Bark","hex":"#8b7f78"},{"name":"Bleached Bone","hex":"#efd9a8"},{"name":"Bleached Cedar","hex":"#2c2133"},{"name":"Bleached Coral","hex":"#ffd6d1"},{"name":"Bleached Denim","hex":"#646f9b"},{"name":"Bleached Grey","hex":"#788878"},{"name":"Bleached Maple","hex":"#c7a06c"},{"name":"Bleached Sand","hex":"#daccb4"},{"name":"Bleached Silk","hex":"#f3f3f2"},{"name":"Bleached Spruce","hex":"#bad7ae"},{"name":"Bleached Wheat","hex":"#ddd2a9"},{"name":"Bleaches","hex":"#c7c7c3"},{"name":"Bleeding Heart","hex":"#e66a77"},{"name":"Blende Blue","hex":"#a9c4c4"},{"name":"Blended Fruit","hex":"#f8e3a4"},{"name":"Blended Light","hex":"#fffbe8"},{"name":"Bleu Ciel","hex":"#007ba1"},{"name":"Bleu De France","hex":"#318ce7"},{"name":"Bleu Nattier","hex":"#9cc2bf"},{"name":"Bleuchâtel Blue","hex":"#4488ff"},{"name":"Blind Date","hex":"#bcaea1"},{"name":"Blinking Blue","hex":"#0033ff"},{"name":"Blissful","hex":"#ddc4d4"},{"name":"Blissful Berry","hex":"#aa1188"},{"name":"Blissful Meditation","hex":"#d5daee"},{"name":"Blissful Orange","hex":"#ffac39"},{"name":"Blissful Serenity","hex":"#eaeed8"},{"name":"Blissfully Mine","hex":"#dab6cd"},{"name":"Blister Pearl","hex":"#aaffee"},{"name":"Blithe","hex":"#0084bd"},{"name":"Blizzard Blue","hex":"#a3e3ed"},{"name":"Blobfish","hex":"#ffc1cc"},{"name":"Blockchain Gold","hex":"#e8bc50"},{"name":"Blond","hex":"#faf0be"},{"name":"Blonde Beauty","hex":"#f2efcd"},{"name":"Blonde Curl","hex":"#efe2c5"},{"name":"Blonde Girl","hex":"#edc558"},{"name":"Blonde Shell","hex":"#f6edcd"},{"name":"Blonde Wool","hex":"#e5d0b1"},{"name":"Blood","hex":"#770001"},{"name":"Blood Brother","hex":"#770011"},{"name":"Blood Burst","hex":"#ff474c"},{"name":"Blood God","hex":"#67080b"},{"name":"Blood Mahogany","hex":"#543839"},{"name":"Blood Omen","hex":"#8a0303"},{"name":"Blood Orange","hex":"#d1001c"},{"name":"Blood Orange Juice","hex":"#fe4b03"},{"name":"Blood Organ","hex":"#630f0f"},{"name":"Blood Pact","hex":"#771111"},{"name":"Blood Red","hex":"#980002"},{"name":"Blood Thorn","hex":"#b03060"},{"name":"Bloodletter","hex":"#e97451"},{"name":"Bloodline","hex":"#882200"},{"name":"Bloodstain","hex":"#772200"},{"name":"Bloodstone","hex":"#413431"},{"name":"Bloodthirsty","hex":"#880011"},{"name":"Bloodtracker Brown","hex":"#703f00"},{"name":"Bloody Pico-8","hex":"#ff004d"},{"name":"Bloody Red","hex":"#ca1f1b"},{"name":"Bloody Rust","hex":"#da2c43"},{"name":"Bloom","hex":"#ffaf75"},{"name":"Blooming Dahlia","hex":"#eb9687"},{"name":"Blossom","hex":"#fee9d8"},{"name":"Blossom Pink","hex":"#e6d5ce"},{"name":"Blossom Time","hex":"#e5d2c9"},{"name":"Blowout","hex":"#658499"},{"name":"Blue","hex":"#0000ff"},{"name":"Blue Accolade","hex":"#25415d"},{"name":"Blue Agave","hex":"#b1c6c7"},{"name":"Blue Alps","hex":"#89a3ae"},{"name":"Blue Angels Yellow","hex":"#f8b800"},{"name":"Blue Angora","hex":"#a7cfcb"},{"name":"Blue Antarctic","hex":"#4b789b"},{"name":"Blue Arc","hex":"#0085a1"},{"name":"Blue Ash","hex":"#414654"},{"name":"Blue Ashes","hex":"#3b5f78"},{"name":"Blue Aster","hex":"#0077b3"},{"name":"Blue Astro","hex":"#50a7d9"},{"name":"Blue Atoll","hex":"#00b1d2"},{"name":"Blue Azure","hex":"#4682bf"},{"name":"Blue Ballad","hex":"#7498bd"},{"name":"Blue Ballerina","hex":"#b4c7db"},{"name":"Blue Ballet","hex":"#576b6b"},{"name":"Blue Bay","hex":"#619ad6"},{"name":"Blue Bayberry","hex":"#2d5360"},{"name":"Blue Bayou","hex":"#bec4d3"},{"name":"Blue Bayoux","hex":"#62777e"},{"name":"Blue Beads","hex":"#5a809e"},{"name":"Blue Beauty","hex":"#7498bf"},{"name":"Blue Beetle","hex":"#220099"},{"name":"Blue Beret","hex":"#40638e"},{"name":"Blue Bird Day","hex":"#237fac"},{"name":"Blue Black Crayfish","hex":"#52593b"},{"name":"Blue Blood","hex":"#6b7f81"},{"name":"Blue Blouse","hex":"#94a4b9"},{"name":"Blue Blue","hex":"#2242c7"},{"name":"Blue Blush","hex":"#d6dbd9"},{"name":"Blue Boater","hex":"#6181a3"},{"name":"Blue Bobbin","hex":"#52b4ca"},{"name":"Blue Bolt","hex":"#00b9fb"},{"name":"Blue Booties","hex":"#c8ddee"},{"name":"Blue Bottle","hex":"#394e65"},{"name":"Blue Bouquet","hex":"#0033ee"},{"name":"Blue Bows","hex":"#a4c3d7"},{"name":"Blue Brocade","hex":"#70b8d0"},{"name":"Blue Buzz","hex":"#a1a2bd"},{"name":"Blue By You","hex":"#a0b7ba"},{"name":"Blue Calico","hex":"#a5cde1"},{"name":"Blue Calypso","hex":"#55a7b6"},{"name":"Blue Catch","hex":"#41788a"},{"name":"Blue Chalk","hex":"#94c0cc"},{"name":"Blue Charcoal","hex":"#262b2f"},{"name":"Blue Charm","hex":"#82c2db"},{"name":"Blue Chill","hex":"#408f90"},{"name":"Blue Chip","hex":"#1d5699"},{"name":"Blue Chrysocolla","hex":"#77b7d0"},{"name":"Blue Cloud","hex":"#627188"},{"name":"Blue Cola","hex":"#0088dc"},{"name":"Blue Copper Ore","hex":"#4411dd"},{"name":"Blue Coral","hex":"#1b5366"},{"name":"Blue Crab Escape","hex":"#9ebdd6"},{"name":"Blue Cuddle","hex":"#7eb4d1"},{"name":"Blue Cue","hex":"#84a5dc"},{"name":"Blue Curacao","hex":"#32becc"},{"name":"Blue Dam","hex":"#a2c6d3"},{"name":"Blue Danube","hex":"#0087b6"},{"name":"Blue Darknut","hex":"#0078f8"},{"name":"Blue Dart","hex":"#518fd1"},{"name":"Blue Dart Frog","hex":"#3a7a9b"},{"name":"Blue Depression","hex":"#4428bc"},{"name":"Blue Depths","hex":"#263056"},{"name":"Blue Diamond","hex":"#4b2d72"},{"name":"Blue Dianne","hex":"#35514f"},{"name":"Blue Dolphin","hex":"#bcc5cf"},{"name":"Blue Dove","hex":"#76799e"},{"name":"Blue Dude","hex":"#4a5c94"},{"name":"Blue Earth","hex":"#375673"},{"name":"Blue Emerald","hex":"#0f5a5e"},{"name":"Blue et une Nuit","hex":"#0652ff"},{"name":"Blue Expanse","hex":"#253f74"},{"name":"Blue Exult","hex":"#2b2f43"},{"name":"Blue Eyed Boy","hex":"#87bde3"},{"name":"Blue Fantastic","hex":"#2c3b4d"},{"name":"Blue Fin","hex":"#577fae"},{"name":"Blue Fjord","hex":"#628daa"},{"name":"Blue Flag","hex":"#3b506f"},{"name":"Blue Flame","hex":"#005e88"},{"name":"Blue Flower","hex":"#d0d9d4"},{"name":"Blue Fog","hex":"#9babbb"},{"name":"Blue Fox","hex":"#b9bcb6"},{"name":"Blue Frosting","hex":"#86d2c1"},{"name":"Blue Garter","hex":"#a2b8ce"},{"name":"Blue Gem","hex":"#4b3c8e"},{"name":"Blue Genie","hex":"#6666ff"},{"name":"Blue Glass","hex":"#c6e3e1"},{"name":"Blue Glaze","hex":"#56597c"},{"name":"Blue Glint","hex":"#92c6d7"},{"name":"Blue Glow","hex":"#b2d4dd"},{"name":"Blue Granite","hex":"#717388"},{"name":"Blue Graphite","hex":"#323137"},{"name":"Blue Grass","hex":"#007c7a"},{"name":"Blue Green","hex":"#137e6d"},{"name":"Blue Green Rules","hex":"#d8eeed"},{"name":"Blue Grey","hex":"#758da3"},{"name":"Blue Grotto","hex":"#5cacce"},{"name":"Blue Grouse","hex":"#9abcdc"},{"name":"Blue Haze","hex":"#bdbace"},{"name":"Blue Heath Butterfly","hex":"#5566ff"},{"name":"Blue Heather","hex":"#aebbc1"},{"name":"Blue Heaven","hex":"#5b7e98"},{"name":"Blue Heeler","hex":"#939cab"},{"name":"Blue Heist","hex":"#006384"},{"name":"Blue Hepatica","hex":"#6666ee"},{"name":"Blue Heron","hex":"#96a3c7"},{"name":"Blue Hijab","hex":"#d0eefb"},{"name":"Blue Horizon","hex":"#4e6482"},{"name":"Blue Horror","hex":"#a2bad2"},{"name":"Blue Hour","hex":"#0034ab"},{"name":"Blue Hue","hex":"#394d60"},{"name":"Blue Hyacinth","hex":"#8394c5"},{"name":"Blue Hydrangea","hex":"#bbc3dd"},{"name":"Blue Ice","hex":"#70789b"},{"name":"Blue Iguana","hex":"#539ccc"},{"name":"Blue Indigo","hex":"#49516d"},{"name":"Blue Insignia","hex":"#566977"},{"name":"Blue Intrigue","hex":"#7f809c"},{"name":"Blue Iris","hex":"#5a5b9f"},{"name":"Blue Jasmine","hex":"#828596"},{"name":"Blue Jay","hex":"#5588dd"},{"name":"Blue Jeans","hex":"#5dadec"},{"name":"Blue Jewel","hex":"#465383"},{"name":"Blue Kelp","hex":"#1d7881"},{"name":"Blue Lagoon","hex":"#00626f"},{"name":"Blue Lava","hex":"#2e5169"},{"name":"Blue League","hex":"#006284"},{"name":"Blue Light","hex":"#acdfdd"},{"name":"Blue Limewash","hex":"#7fcce2"},{"name":"Blue Linen","hex":"#5a5e6a"},{"name":"Blue Lips","hex":"#a6bce2"},{"name":"Blue Lobelia","hex":"#28314d"},{"name":"Blue Lobster","hex":"#0055aa"},{"name":"Blue Lullaby","hex":"#c8d7d2"},{"name":"Blue Magenta","hex":"#5f34e7"},{"name":"Blue Magenta Violet","hex":"#553592"},{"name":"Blue Marble","hex":"#6594bc"},{"name":"Blue Marguerite","hex":"#6a5bb1"},{"name":"Blue Martina","hex":"#1fcecb"},{"name":"Blue Martini","hex":"#52b4d3"},{"name":"Blue Mediterranean","hex":"#1e7e9a"},{"name":"Blue Mercury","hex":"#67a6ac"},{"name":"Blue Metal","hex":"#5a6370"},{"name":"Blue Mirage","hex":"#5c6d7c"},{"name":"Blue Mist","hex":"#5bacc3"},{"name":"Blue Monday","hex":"#637983"},{"name":"Blue Mood","hex":"#7a808d"},{"name":"Blue Moon","hex":"#3686a0"},{"name":"Blue Mosque","hex":"#21426b"},{"name":"Blue Mountain","hex":"#759dbe"},{"name":"Blue Nebula","hex":"#1199ff"},{"name":"Blue Nights","hex":"#363b48"},{"name":"Blue Nile","hex":"#779fb9"},{"name":"Blue Nude","hex":"#29518c"},{"name":"Blue Oar","hex":"#647e9c"},{"name":"Blue Oasis","hex":"#296d93"},{"name":"Blue Odyssey","hex":"#4f6997"},{"name":"Blue Opal","hex":"#0f3b57"},{"name":"Blue Overdose","hex":"#0000ee"},{"name":"Blue Paisley","hex":"#2282a8"},{"name":"Blue Pearl","hex":"#c5d9e3"},{"name":"Blue Perennial","hex":"#bcd7df"},{"name":"Blue Phlox","hex":"#d2e6e8"},{"name":"Blue Planet","hex":"#545e6a"},{"name":"Blue Plate","hex":"#5b7a9c"},{"name":"Blue Plaza","hex":"#30363c"},{"name":"Blue Pointer","hex":"#95b9d6"},{"name":"Blue Potato","hex":"#64617b"},{"name":"Blue Prince","hex":"#6a808f"},{"name":"Blue Promise","hex":"#729cc2"},{"name":"Blue Purple","hex":"#5729ce"},{"name":"Blue Quarry","hex":"#43505e"},{"name":"Blue Racer","hex":"#4ba4a9"},{"name":"Blue Radiance","hex":"#58c9d4"},{"name":"Blue Ranger","hex":"#00177d"},{"name":"Blue Raspberry","hex":"#0cbfe9"},{"name":"Blue Regal","hex":"#303048"},{"name":"Blue Regatta","hex":"#376298"},{"name":"Blue Regent","hex":"#285991"},{"name":"Blue Review","hex":"#4e5878"},{"name":"Blue Rhapsody","hex":"#3d4655"},{"name":"Blue Ribbon","hex":"#0066ff"},{"name":"Blue Ribbon Beauty","hex":"#3e6490"},{"name":"Blue Rice","hex":"#b3d9f3"},{"name":"Blue Rinse","hex":"#b7bdc6"},{"name":"Blue Romance","hex":"#d8f0d2"},{"name":"Blue Royale","hex":"#29217a"},{"name":"Blue Sabre","hex":"#575f6a"},{"name":"Blue Sail","hex":"#24549a"},{"name":"Blue Sapphire","hex":"#126180"},{"name":"Blue Sari","hex":"#666a76"},{"name":"Blue Sash","hex":"#494d58"},{"name":"Blue Satin","hex":"#9eb6d0"},{"name":"Blue Shade Wash","hex":"#293f54"},{"name":"Blue Shadow","hex":"#66829a"},{"name":"Blue Shamrock","hex":"#bacbc4"},{"name":"Blue Shell","hex":"#9bb3bc"},{"name":"Blue Shutters","hex":"#93bde7"},{"name":"Blue Silk","hex":"#d0dce8"},{"name":"Blue Slate","hex":"#5a5f68"},{"name":"Blue Smart","hex":"#5786b4"},{"name":"Blue Smoke","hex":"#d7e0e2"},{"name":"Blue Sonki","hex":"#4a87cb"},{"name":"Blue Sou'wester","hex":"#404956"},{"name":"Blue Sparkle","hex":"#0077ff"},{"name":"Blue Spruce","hex":"#adc5c9"},{"name":"Blue Steel","hex":"#535a61"},{"name":"Blue Stone","hex":"#577284"},{"name":"Blue Stream","hex":"#95cdd8"},{"name":"Blue Suede","hex":"#687b92"},{"name":"Blue Suede Shoes","hex":"#484b62"},{"name":"Blue Surf","hex":"#90a8a4"},{"name":"Blue Tang","hex":"#2a4b6e"},{"name":"Blue Tapestry","hex":"#475c62"},{"name":"Blue Thistle","hex":"#adc0d6"},{"name":"Blue Tint","hex":"#9fd9d7"},{"name":"Blue Titmouse","hex":"#4466ff"},{"name":"Blue To You","hex":"#babfc5"},{"name":"Blue Tone Ink","hex":"#2b4057"},{"name":"Blue Topaz","hex":"#78bdd4"},{"name":"Blue Tourmaline","hex":"#4997d0"},{"name":"Blue Trust","hex":"#120a8f"},{"name":"Blue Tulip","hex":"#5c4671"},{"name":"Blue Tuna","hex":"#6f95c1"},{"name":"Blue Turquoise","hex":"#53b0ae"},{"name":"Blue Vacation","hex":"#1e7eae"},{"name":"Blue Vault","hex":"#4e83bd"},{"name":"Blue Veil","hex":"#aecbe5"},{"name":"Blue Velvet","hex":"#0d6183"},{"name":"Blue Venus","hex":"#397c80"},{"name":"Blue Violet","hex":"#324ab2"},{"name":"Blue Whale","hex":"#1e3442"},{"name":"Blue Willow","hex":"#a8bbba"},{"name":"Blue Wing Teal","hex":"#2c4053"},{"name":"Blue With A Hint Of Purple","hex":"#533cc6"},{"name":"Blue Yonder","hex":"#5a77a8"},{"name":"Blue Zephyr","hex":"#5b6676"},{"name":"Blue Zodiac","hex":"#3c4354"},{"name":"Bluealicious","hex":"#0000dd"},{"name":"Bluebeard","hex":"#abb5c4"},{"name":"Bluebell","hex":"#333399"},{"name":"Bluebell Frost","hex":"#9999cc"},{"name":"Blueberry","hex":"#464196"},{"name":"Blueberry Blush","hex":"#836268"},{"name":"Blueberry Glaze","hex":"#cc66dd"},{"name":"Blueberry Muffin","hex":"#5588ab"},{"name":"Blueberry Patch","hex":"#627099"},{"name":"Blueberry Pie","hex":"#314d67"},{"name":"Blueberry Popover","hex":"#5488c0"},{"name":"Blueberry Soda","hex":"#8290a6"},{"name":"Bluebird","hex":"#009dae"},{"name":"Bluebird's Belly","hex":"#7395b8"},{"name":"Bluebonnet","hex":"#1c1cf0"},{"name":"Bluebonnet Frost","hex":"#4d6eb0"},{"name":"Bluebound","hex":"#4f9297"},{"name":"Bluejay","hex":"#157ea0"},{"name":"Blueprint","hex":"#35637c"},{"name":"Blues","hex":"#296a9d"},{"name":"Blues White Shoes","hex":"#99badd"},{"name":"Bluewash","hex":"#e2e6e0"},{"name":"Bluey","hex":"#375978"},{"name":"Bluff Stone","hex":"#d2bd9e"},{"name":"Bluish","hex":"#2976bb"},{"name":"Bluish Green","hex":"#10a674"},{"name":"Bluish Grey","hex":"#748b97"},{"name":"Bluish Purple","hex":"#703be7"},{"name":"Bluish Purple Anemone","hex":"#6666bb"},{"name":"Bluish Water","hex":"#89cfdb"},{"name":"Blumine","hex":"#305c71"},{"name":"Blunt","hex":"#b5bbc7"},{"name":"Blurple","hex":"#5539cc"},{"name":"Blush","hex":"#f29e8e"},{"name":"Blush Beige","hex":"#edd5c7"},{"name":"Blush d'Amour","hex":"#de5d83"},{"name":"Blush Essence","hex":"#cc88dd"},{"name":"Blush Pink","hex":"#ff6fff"},{"name":"Blush Tint","hex":"#f4e1e6"},{"name":"Blushed Bombshell","hex":"#ee88cc"},{"name":"Blushed Velvet","hex":"#dec5d3"},{"name":"Blushing Bride","hex":"#eedad1"},{"name":"Blushing Bud","hex":"#dd9999"},{"name":"Blushing Cherub","hex":"#ffcdaf"},{"name":"Blushing Peach","hex":"#ffd79f"},{"name":"Blushing Senorita","hex":"#f3cacb"},{"name":"Blushing Tulip","hex":"#e3a1b8"},{"name":"Bluster Blue","hex":"#4a5a6f"},{"name":"Blustery Day","hex":"#d6dfe7"},{"name":"Blustery Wind","hex":"#b6c5c1"},{"name":"Boa","hex":"#8e855f"},{"name":"Boat Anchor","hex":"#6c6b6a"},{"name":"Boat Blue","hex":"#2d5384"},{"name":"Boat Orchid","hex":"#c0448f"},{"name":"Boathouse","hex":"#577190"},{"name":"Boating Green","hex":"#087170"},{"name":"Boatswain","hex":"#243256"},{"name":"Bobby Blue","hex":"#97c5da"},{"name":"Bobcat Whiskers","hex":"#eadfd0"},{"name":"Bock","hex":"#5d341a"},{"name":"Bodacious","hex":"#b76ba3"},{"name":"Bodega Bay","hex":"#5e81c1"},{"name":"Bodhi Tree","hex":"#b09870"},{"name":"Boeing Blue","hex":"#3d4652"},{"name":"Bog","hex":"#bab696"},{"name":"Bogart","hex":"#8b8274"},{"name":"Bogey Green","hex":"#116f26"},{"name":"Bogong Moth","hex":"#663b3a"},{"name":"Bohemian Jazz","hex":"#9d777c"},{"name":"Boiling Mud","hex":"#a59c9b"},{"name":"Bok Choy","hex":"#bccab3"},{"name":"Bokara Grey","hex":"#2a2725"},{"name":"Bold Brandy","hex":"#796660"},{"name":"Bold Eagle","hex":"#463d2f"},{"name":"Bold Irish","hex":"#2a814d"},{"name":"Bold Sangria","hex":"#7a4549"},{"name":"Bole","hex":"#79443b"},{"name":"Bolognese","hex":"#bb4400"},{"name":"Boltgun Metal","hex":"#393939"},{"name":"Bombay","hex":"#aeaead"},{"name":"Bombay Brown","hex":"#9f5130"},{"name":"Bombay Pink","hex":"#c9736a"},{"name":"Bona Fide","hex":"#304471"},{"name":"Bonanza","hex":"#523b2c"},{"name":"Bondi","hex":"#16698c"},{"name":"Bondi Blue","hex":"#0095b6"},{"name":"Bone","hex":"#e0d7c6"},{"name":"Bone Brown","hex":"#9d7446"},{"name":"Bone China","hex":"#f3edde"},{"name":"Bone Dust","hex":"#e7ece6"},{"name":"Bone Trace","hex":"#d7d0c0"},{"name":"Bone White","hex":"#f1e1b0"},{"name":"Boneyard","hex":"#bb9977"},{"name":"Bonfire","hex":"#f78058"},{"name":"Bonfire Flame","hex":"#ce4e35"},{"name":"Bongo Drum","hex":"#d2c2b2"},{"name":"Bongo Skin","hex":"#dece96"},{"name":"Bonjour","hex":"#dfd7d2"},{"name":"Bonnie Blue","hex":"#8dbbd1"},{"name":"Bonnie Dune Beach","hex":"#e4d1bc"},{"name":"Bonnie's Bench","hex":"#7c644a"},{"name":"Bonny Belle","hex":"#c58eab"},{"name":"Bonsai","hex":"#787b54"},{"name":"Bonsai Garden","hex":"#9e9e7c"},{"name":"Bonus Level","hex":"#ffa00a"},{"name":"Bonza Green","hex":"#5e6b44"},{"name":"Booger","hex":"#9bb53c"},{"name":"Booger Buster","hex":"#00ff77"},{"name":"Boogie Blast","hex":"#119944"},{"name":"Boot Hill Ghost","hex":"#ddaf8e"},{"name":"Bootstrap Leather","hex":"#793721"},{"name":"Borage Blue","hex":"#5566cc"},{"name":"Bordeaux","hex":"#7b002c"},{"name":"Bordeaux Hint","hex":"#efbcde"},{"name":"Bored Accent Green","hex":"#dedd98"},{"name":"Boredom","hex":"#8c9c9c"},{"name":"Borg Drone","hex":"#06470c"},{"name":"Borg Queen","hex":"#054907"},{"name":"Boring Green","hex":"#63b365"},{"name":"Borscht","hex":"#8c2c24"},{"name":"Bosco Blue","hex":"#76a0af"},{"name":"Boson Brown","hex":"#552c1c"},{"name":"Bosphorus","hex":"#007558"},{"name":"Bossa Nova","hex":"#4c3d4e"},{"name":"Bossa Nova Blue","hex":"#767c9e"},{"name":"Boston Blue","hex":"#438eac"},{"name":"Boston University Red","hex":"#cc0000"},{"name":"Bōtan","hex":"#a2345c"},{"name":"Botanical Garden","hex":"#5e624a"},{"name":"Botanical Night","hex":"#12403c"},{"name":"Botticelli","hex":"#92acb4"},{"name":"Bottle Green","hex":"#006a4e"},{"name":"Bottlebrush Blossom","hex":"#e8edb0"},{"name":"Boudoir Blue","hex":"#7ea3d2"},{"name":"Bougainvillea","hex":"#9884b9"},{"name":"Boulder","hex":"#7c817c"},{"name":"Boundless","hex":"#5b6d84"},{"name":"Bouquet","hex":"#a78199"},{"name":"Bourbon","hex":"#af6c3e"},{"name":"Bourbon Spice","hex":"#e6be8a"},{"name":"Bourbon Truffle","hex":"#6c5654"},{"name":"Boutique Beige","hex":"#e1cead"},{"name":"Bow Tie","hex":"#be2633"},{"name":"Bowerbird Blue","hex":"#006585"},{"name":"Bowling Green","hex":"#bfdeaf"},{"name":"Bowser Shell","hex":"#536b1f"},{"name":"Boxcar","hex":"#873d30"},{"name":"Boxwood","hex":"#707b71"},{"name":"Boy Red","hex":"#0e9ca5"},{"name":"Boycott","hex":"#635c53"},{"name":"Boynton Canyon","hex":"#9f4e3e"},{"name":"Boysenberry","hex":"#873260"},{"name":"Boysenberry Shadow","hex":"#f1f3f9"},{"name":"Boyzone","hex":"#2a96d5"},{"name":"Bracken","hex":"#5b3d27"},{"name":"Bracken Fern","hex":"#31453b"},{"name":"Bracken Green","hex":"#626f5d"},{"name":"Braid","hex":"#77675b"},{"name":"Braided Raffia","hex":"#e1d0af"},{"name":"Brain Pink","hex":"#f2aeb1"},{"name":"Brainstem Grey","hex":"#b5b5b5"},{"name":"Brainstorm","hex":"#d1d3c0"},{"name":"Brake Light Trails","hex":"#ee0033"},{"name":"Bramble Jam","hex":"#c71581"},{"name":"Bran","hex":"#a66e4a"},{"name":"Brandeis Blue","hex":"#0070ff"},{"name":"Brandied Apricot","hex":"#ca848a"},{"name":"Brandied Melon","hex":"#ce7b5b"},{"name":"Brandied Pears","hex":"#eae2d1"},{"name":"Brandy","hex":"#dcb68a"},{"name":"Brandy Alexander","hex":"#f3e2dc"},{"name":"Brandy Brown","hex":"#73362a"},{"name":"Brandy Punch","hex":"#c07c40"},{"name":"Brandy Rose","hex":"#b6857a"},{"name":"Brandy Snaps","hex":"#b58e8b"},{"name":"Brandywine","hex":"#e69dad"},{"name":"Brandywine Raspberry","hex":"#5555aa"},{"name":"Brass","hex":"#b5a642"},{"name":"Brass Balls","hex":"#e7bd42"},{"name":"Brass Buttons","hex":"#dfac4c"},{"name":"Brass Mesh","hex":"#e1a84b"},{"name":"Brass Scorpion","hex":"#773b2e"},{"name":"Brass Trumpet","hex":"#ecae58"},{"name":"Brassed Off","hex":"#cfa743"},{"name":"Brassica","hex":"#788879"},{"name":"Brasso","hex":"#f3bc6b"},{"name":"Brassy","hex":"#d5ab2c"},{"name":"Brassy Brass","hex":"#776022"},{"name":"Braun","hex":"#897058"},{"name":"Brave Orange","hex":"#ff631c"},{"name":"Brazen Brass","hex":"#7b6623"},{"name":"Brazen Orange","hex":"#ce7850"},{"name":"Brazilian Sand","hex":"#dacab7"},{"name":"Bread Basket","hex":"#ab8659"},{"name":"Bread Crumb","hex":"#e4d4be"},{"name":"Bread Crust","hex":"#b78b43"},{"name":"Bread Pudding","hex":"#bfa270"},{"name":"Break of Day","hex":"#fffabd"},{"name":"Breakaway","hex":"#cedac3"},{"name":"Breakaway Blue","hex":"#424d60"},{"name":"Breaker Bay","hex":"#517b78"},{"name":"Breakfast Biscuit","hex":"#f6e3d3"},{"name":"Breaking Wave","hex":"#00a0b0"},{"name":"Breakwater","hex":"#d1dee4"},{"name":"Breath of Spring","hex":"#e9e1a7"},{"name":"Breathless","hex":"#dfdae0"},{"name":"Breathtaking View","hex":"#c3acb7"},{"name":"Bredon Green","hex":"#5e9948"},{"name":"Breen","hex":"#795d34"},{"name":"Breezeway","hex":"#d6dbc0"},{"name":"Breezy","hex":"#aec9ea"},{"name":"Breezy Aqua","hex":"#d9e4de"},{"name":"Breezy Beige","hex":"#f7f2d7"},{"name":"Breonne Blue","hex":"#2d567c"},{"name":"Bretzel Brown","hex":"#aa5555"},{"name":"Brewed Mustard","hex":"#e68364"},{"name":"Briar","hex":"#745443"},{"name":"Briar Rose","hex":"#c07281"},{"name":"Brick","hex":"#a03623"},{"name":"Brick Brown","hex":"#77603f"},{"name":"Brick Dust","hex":"#b07069"},{"name":"Brick Fence","hex":"#b38070"},{"name":"Brick Orange","hex":"#c14a09"},{"name":"Brick Red","hex":"#8f1402"},{"name":"Brick-A-Brack","hex":"#a75c3d"},{"name":"Brickhouse","hex":"#864a36"},{"name":"Bricks of Hope","hex":"#db5856"},{"name":"Bridal Blush","hex":"#eee2dd"},{"name":"Bridal Heath","hex":"#f8ebdd"},{"name":"Bridal Rose","hex":"#d69fa2"},{"name":"Bridal Veil","hex":"#e7e1de"},{"name":"Bride's Blush","hex":"#f9e2e1"},{"name":"Bridesmaid","hex":"#fae6df"},{"name":"Bridge Troll Grey","hex":"#817f6e"},{"name":"Bridgewater","hex":"#527065"},{"name":"Brierwood Green","hex":"#545e4f"},{"name":"Brig","hex":"#4fa1c0"},{"name":"Brig O'Doon","hex":"#ddcfbf"},{"name":"Brigade","hex":"#365d73"},{"name":"Brigadier Blue","hex":"#0063a0"},{"name":"Bright Aqua","hex":"#0bf9ea"},{"name":"Bright Blue","hex":"#0165fc"},{"name":"Bright Blue Violet","hex":"#8a2be2"},{"name":"Bright Bluebell","hex":"#9da7cf"},{"name":"Bright Bluebonnet","hex":"#90b3c2"},{"name":"Bright Bronze","hex":"#a05822"},{"name":"Bright Brown","hex":"#533b32"},{"name":"Bright Camouflage","hex":"#1cac78"},{"name":"Bright Cerulean","hex":"#1dacd6"},{"name":"Bright Chambray","hex":"#adbfc8"},{"name":"Bright Chartreuse","hex":"#dfff11"},{"name":"Bright Clove","hex":"#efcf9b"},{"name":"Bright Cobalt","hex":"#385d8d"},{"name":"Bright Cyan","hex":"#41fdfe"},{"name":"Bright Delight","hex":"#cd5b26"},{"name":"Bright Dusk","hex":"#eee9f9"},{"name":"Bright Ecru","hex":"#feffca"},{"name":"Bright Eggplant ","hex":"#5a4e88"},{"name":"Bright Gold","hex":"#cf9f52"},{"name":"Bright Greek","hex":"#3844f4"},{"name":"Bright Green","hex":"#66ff00"},{"name":"Bright Grey","hex":"#ebecf0"},{"name":"Bright Haze","hex":"#dcdfe5"},{"name":"Bright Idea","hex":"#ecbe63"},{"name":"Bright Indigo","hex":"#6f00fe"},{"name":"Bright Khaki","hex":"#f1e78c"},{"name":"Bright Lady","hex":"#9f3645"},{"name":"Bright Laughter","hex":"#f0edd1"},{"name":"Bright Lavender","hex":"#bf94e4"},{"name":"Bright Lettuce","hex":"#8dce65"},{"name":"Bright Light Blue","hex":"#26f7fd"},{"name":"Bright Light Green","hex":"#2dfe54"},{"name":"Bright Lilac","hex":"#d891ef"},{"name":"Bright Lime","hex":"#87fd05"},{"name":"Bright Lime Green","hex":"#65fe08"},{"name":"Bright Loam","hex":"#c1b9aa"},{"name":"Bright Magenta","hex":"#ff08e8"},{"name":"Bright Manatee","hex":"#979aaa"},{"name":"Bright Mango","hex":"#ff8830"},{"name":"Bright Marigold","hex":"#ff8d00"},{"name":"Bright Maroon","hex":"#c32148"},{"name":"Bright Midnight","hex":"#011993"},{"name":"Bright Midnight Blue","hex":"#1a4876"},{"name":"Bright Mint","hex":"#98ff98"},{"name":"Bright Nautilus","hex":"#225869"},{"name":"Bright Navy Blue","hex":"#1974d2"},{"name":"Bright Nori","hex":"#2d5e22"},{"name":"Bright Olive","hex":"#9cbb04"},{"name":"Bright Orange","hex":"#ff7034"},{"name":"Bright Pink","hex":"#fe01b1"},{"name":"Bright Purple","hex":"#be03fd"},{"name":"Bright Red","hex":"#ff000d"},{"name":"Bright Rose","hex":"#c51959"},{"name":"Bright Saffron","hex":"#ffcf09"},{"name":"Bright Sage","hex":"#d1ceb4"},{"name":"Bright Scarlet","hex":"#fc0e34"},{"name":"Bright Sea Green","hex":"#9fe2bf"},{"name":"Bright Sepia","hex":"#b1aa9c"},{"name":"Bright Sienna","hex":"#d68a59"},{"name":"Bright Sky Blue","hex":"#02ccfe"},{"name":"Bright Spark","hex":"#76c1e1"},{"name":"Bright Star","hex":"#dde2e6"},{"name":"Bright Sun","hex":"#ecbd2c"},{"name":"Bright Teal","hex":"#01f9c6"},{"name":"Bright Turquoise","hex":"#08e8de"},{"name":"Bright Ube","hex":"#d19fe8"},{"name":"Bright Umber","hex":"#826644"},{"name":"Bright Violet","hex":"#ad0afd"},{"name":"Bright White","hex":"#f4f5f0"},{"name":"Bright Wood Grain","hex":"#eecb88"},{"name":"Bright Yarrow","hex":"#face6d"},{"name":"Bright Yellow","hex":"#fffd01"},{"name":"Bright Yellow Green","hex":"#9dff00"},{"name":"Bright Zenith","hex":"#757cae"},{"name":"Brihaspati Orange","hex":"#e2681b"},{"name":"Brik Dough","hex":"#dab77f"},{"name":"Brilliance","hex":"#fdfdfd"},{"name":"Brilliant","hex":"#0094a7"},{"name":"Brilliant Azure","hex":"#3399ff"},{"name":"Brilliant Beige","hex":"#efc5b5"},{"name":"Brilliant Blue","hex":"#0075b3"},{"name":"Brilliant Impression","hex":"#efc600"},{"name":"Brilliant Lavender","hex":"#f4bbff"},{"name":"Brilliant Rose","hex":"#fe54a3"},{"name":"Brilliant Silver","hex":"#a9b0b4"},{"name":"Brilliant White","hex":"#edf1fe"},{"name":"Brimstone","hex":"#ffbd2b"},{"name":"Brindle","hex":"#82776b"},{"name":"Brink Pink","hex":"#fb607f"},{"name":"Briquette","hex":"#e15f65"},{"name":"Brisket","hex":"#6e4534"},{"name":"Bristol Blue","hex":"#558f91"},{"name":"British Khaki","hex":"#bcaf97"},{"name":"British Racing Green","hex":"#05480d"},{"name":"British Rose","hex":"#f4c8db"},{"name":"British Shorthair","hex":"#5f6672"},{"name":"Brittany Blue","hex":"#4c7e86"},{"name":"Brittany's Bow","hex":"#f3d8e0"},{"name":"Broadleaf Forest","hex":"#014421"},{"name":"Broadwater Blue","hex":"#034a71"},{"name":"Broccoli Green","hex":"#4b5338"},{"name":"Broken Tube","hex":"#060310"},{"name":"Broken White","hex":"#eeebe3"},{"name":"Bronco","hex":"#a79781"},{"name":"Bronze","hex":"#a87900"},{"name":"Bronze Brown","hex":"#825e2f"},{"name":"Bronze Fig","hex":"#6e6654"},{"name":"Bronze Flesh","hex":"#f7944a"},{"name":"Bronze Green","hex":"#8d8752"},{"name":"Bronze Icon","hex":"#585538"},{"name":"Bronze Medal","hex":"#6d6240"},{"name":"Bronze Mist","hex":"#9c7e41"},{"name":"Bronze Olive","hex":"#584c25"},{"name":"Bronze Sand","hex":"#e6be9c"},{"name":"Bronze Satin","hex":"#cc5533"},{"name":"Bronze Tone","hex":"#434c28"},{"name":"Bronze Treasure","hex":"#b08d57"},{"name":"Bronze Yellow","hex":"#737000"},{"name":"Bronzed","hex":"#dd6633"},{"name":"Bronzed Brass","hex":"#9b7e4e"},{"name":"Bronzed Flesh","hex":"#eb9552"},{"name":"Bronzed Orange","hex":"#d78a6c"},{"name":"Brood","hex":"#69605a"},{"name":"Brooding Storm","hex":"#5e6d6e"},{"name":"Brook Green","hex":"#afddcc"},{"name":"Broom","hex":"#eecc24"},{"name":"Broomstick","hex":"#74462d"},{"name":"Brother Blue","hex":"#b0b7c6"},{"name":"Brown","hex":"#653700"},{"name":"Brown 383","hex":"#443724"},{"name":"Brown Alpaca","hex":"#b86d29"},{"name":"Brown Bear","hex":"#4a3f37"},{"name":"Brown Beauty","hex":"#4a3832"},{"name":"Brown Beige","hex":"#cc8833"},{"name":"Brown Bramble","hex":"#53331e"},{"name":"Brown Butter","hex":"#ac7c00"},{"name":"Brown Chocolate","hex":"#5f1933"},{"name":"Brown Clay","hex":"#c37c59"},{"name":"Brown Coffee","hex":"#4a2c2a"},{"name":"Brown Derby","hex":"#594537"},{"name":"Brown Eyes","hex":"#9e6b4a"},{"name":"Brown Fox","hex":"#544a42"},{"name":"Brown Green","hex":"#706c11"},{"name":"Brown Grey","hex":"#8d8468"},{"name":"Brown Knapweed","hex":"#f485ac"},{"name":"Brown Mouse","hex":"#d8cbb5"},{"name":"Brown Mustard","hex":"#dfac59"},{"name":"Brown Orange","hex":"#b96902"},{"name":"Brown Patina","hex":"#834f3d"},{"name":"Brown Pepper","hex":"#4e403b"},{"name":"Brown Pod","hex":"#3c241b"},{"name":"Brown Red","hex":"#922b05"},{"name":"Brown Rice","hex":"#dabd84"},{"name":"Brown Rose","hex":"#8d736c"},{"name":"Brown Rum","hex":"#bc9b4e"},{"name":"Brown Rust","hex":"#af593e"},{"name":"Brown Sand","hex":"#f7945f"},{"name":"Brown Stone","hex":"#593c39"},{"name":"Brown Sugar","hex":"#a17249"},{"name":"Brown Tumbleweed","hex":"#37290e"},{"name":"Brown Wood","hex":"#b4674d"},{"name":"Brown Yellow","hex":"#dd9966"},{"name":"Brown-Bag-It","hex":"#ddbda3"},{"name":"Brownie","hex":"#964b00"},{"name":"Brownish","hex":"#9c6d57"},{"name":"Brownish Green","hex":"#6a6e09"},{"name":"Brownish Grey","hex":"#86775f"},{"name":"Brownish Orange","hex":"#cb7723"},{"name":"Brownish Pink","hex":"#c27e79"},{"name":"Brownish Purple","hex":"#76424e"},{"name":"Brownish Red","hex":"#9e3623"},{"name":"Brownish Yellow","hex":"#c9b003"},{"name":"Bruin Spice","hex":"#d3b99b"},{"name":"Bruise","hex":"#7e4071"},{"name":"Bruised Burgundy","hex":"#5b4148"},{"name":"Brume","hex":"#c6c6c2"},{"name":"Brunette","hex":"#664238"},{"name":"Brunnera Blue","hex":"#9ba9ca"},{"name":"Bruno Brown","hex":"#433430"},{"name":"Brunswick","hex":"#236649"},{"name":"Brunswick Green","hex":"#1b4d3e"},{"name":"Bruschetta","hex":"#a75949"},{"name":"Bruschetta Tomato","hex":"#ff6347"},{"name":"Brush","hex":"#b99984"},{"name":"Brushed Clay","hex":"#db9351"},{"name":"Brushed Nickel","hex":"#73706f"},{"name":"Brushwood","hex":"#8c5939"},{"name":"Brussels","hex":"#6c7c6d"},{"name":"Bryophyte","hex":"#a6bea6"},{"name":"Bryopsida Green","hex":"#9fe010"},{"name":"Bubble Bobble Green","hex":"#00b800"},{"name":"Bubble Bobble P2","hex":"#0084ff"},{"name":"Bubble Gum","hex":"#ff85ff"},{"name":"Bubbles","hex":"#e7feff"},{"name":"Bubonic Brown","hex":"#c68400"},{"name":"Buccaneer","hex":"#6e5150"},{"name":"Buccaneer Blue","hex":"#035b8d"},{"name":"Büchel Cherry","hex":"#aa1111"},{"name":"Buckingham Palace","hex":"#6b5140"},{"name":"Buckskin","hex":"#d4ba8c"},{"name":"Buckthorn Brown","hex":"#a76f1f"},{"name":"Buckwheat","hex":"#d4dcd6"},{"name":"Buckwheat Groats","hex":"#e0d8a7"},{"name":"Bud","hex":"#a5a88f"},{"name":"Bud Green","hex":"#79b465"},{"name":"Bud's Sails","hex":"#e9e3d3"},{"name":"Budder Skin","hex":"#fce2c4"},{"name":"Buddha Gold","hex":"#bc9b1b"},{"name":"Buddha Green","hex":"#37b575"},{"name":"Budding Bloom","hex":"#deeabd"},{"name":"Budding Fern","hex":"#edecd4"},{"name":"Budding Peach","hex":"#f3d4bf"},{"name":"Budgie Blue","hex":"#84c9e1"},{"name":"Budōnezumi Grape","hex":"#63424b"},{"name":"Buenos Aires","hex":"#f4dcc1"},{"name":"Buff","hex":"#f0dc82"},{"name":"Buff It","hex":"#d9cfbe"},{"name":"Buff Leather","hex":"#aa7733"},{"name":"Buff Orange","hex":"#ffbb7c"},{"name":"Buff Yellow","hex":"#f1bf70"},{"name":"Buffalo Bill","hex":"#ae9274"},{"name":"Buffalo Dance","hex":"#695645"},{"name":"Buffalo Herd","hex":"#705046"},{"name":"Buffalo Hide","hex":"#bb9f6a"},{"name":"Buffalo Soldier","hex":"#95786c"},{"name":"Buffalo Trail","hex":"#e2ac78"},{"name":"Buffed Copper","hex":"#dd9475"},{"name":"Buffhide","hex":"#a79c81"},{"name":"Bugman's Glow","hex":"#cd5b45"},{"name":"Bulbasaur","hex":"#73a263"},{"name":"Bulgarian Rose","hex":"#480607"},{"name":"Bull Kelp","hex":"#636153"},{"name":"Bull Ring","hex":"#6b605b"},{"name":"Bull Shot","hex":"#75442b"},{"name":"Bullfrog","hex":"#8a966a"},{"name":"Bulma Hair","hex":"#359e6b"},{"name":"Bulrush","hex":"#6d5837"},{"name":"Bumble Baby","hex":"#f5f1de"},{"name":"Bumblebee","hex":"#ffc82a"},{"name":"Bundaberg Sand","hex":"#ffc58a"},{"name":"Bungalow Brown","hex":"#ad947b"},{"name":"Bungalow Gold","hex":"#ad8047"},{"name":"Bungalow Maple","hex":"#e4c590"},{"name":"Bungalow Taupe","hex":"#cebe9f"},{"name":"Bungee Cord","hex":"#696156"},{"name":"Bunker","hex":"#292c2f"},{"name":"Bunni Brown","hex":"#6c4522"},{"name":"Bunny Cake","hex":"#f1b5cc"},{"name":"Bunny Hop","hex":"#f3ecea"},{"name":"Bunny Pink","hex":"#dec3c9"},{"name":"Bunny Soft","hex":"#d3bfc4"},{"name":"Bunny Tail","hex":"#ffe3f4"},{"name":"Bunny's Nose","hex":"#fad9dd"},{"name":"Bunting","hex":"#2b3449"},{"name":"Bunting Blue","hex":"#35537c"},{"name":"Buoyancy","hex":"#79b0b6"},{"name":"Buoyant","hex":"#65707e"},{"name":"Buoyant Blue","hex":"#84addb"},{"name":"Burdock","hex":"#717867"},{"name":"Bureaucracy","hex":"#746c8f"},{"name":"Burgundy","hex":"#900020"},{"name":"Burgundy Snail","hex":"#7e7150"},{"name":"Burgundy Wine","hex":"#6c403e"},{"name":"Burka Black","hex":"#353e4f"},{"name":"Burlap","hex":"#8b7753"},{"name":"Burled Redwood","hex":"#8f4c3a"},{"name":"Burlwood","hex":"#9b716b"},{"name":"Burmese Gold","hex":"#bc8143"},{"name":"Burned Brown","hex":"#6f4b3e"},{"name":"Burnham","hex":"#234537"},{"name":"Burning Brier","hex":"#884736"},{"name":"Burning Bush","hex":"#a0403e"},{"name":"Burning Flame","hex":"#ffb162"},{"name":"Burning Gold","hex":"#ccaa77"},{"name":"Burning Orange","hex":"#ff7124"},{"name":"Burning Sand","hex":"#d08363"},{"name":"Burning Tomato","hex":"#eb5030"},{"name":"Burnished Bark","hex":"#6a3d36"},{"name":"Burnished Brown","hex":"#a17a74"},{"name":"Burnished Copper","hex":"#bb8833"},{"name":"Burnished Cream","hex":"#fce5bf"},{"name":"Burnished Gold","hex":"#aa9855"},{"name":"Burnished Lilac","hex":"#c5aeb1"},{"name":"Burnished Russet","hex":"#794029"},{"name":"Burns Cave","hex":"#7b5847"},{"name":"Burnside","hex":"#d0a664"},{"name":"Burnt Almond","hex":"#b0724a"},{"name":"Burnt Bamboo","hex":"#4d3b3c"},{"name":"Burnt Brick","hex":"#a14d3a"},{"name":"Burnt Butter","hex":"#a47c53"},{"name":"Burnt Coral","hex":"#e9897e"},{"name":"Burnt Crimson","hex":"#582124"},{"name":"Burnt Earth","hex":"#9d4531"},{"name":"Burnt Grape","hex":"#75625e"},{"name":"Burnt Henna","hex":"#7e392f"},{"name":"Burnt Maroon","hex":"#420303"},{"name":"Burnt Ochre","hex":"#bb4f35"},{"name":"Burnt Olive","hex":"#646049"},{"name":"Burnt Orange","hex":"#cc5500"},{"name":"Burnt Red","hex":"#9f2305"},{"name":"Burnt Russet","hex":"#7e3940"},{"name":"Burnt Sienna","hex":"#b75203"},{"name":"Burnt Umber","hex":"#8a3324"},{"name":"Burnt Yellow","hex":"#d5ab09"},{"name":"Burple","hex":"#6832e3"},{"name":"Burro","hex":"#947764"},{"name":"Burst of Gold","hex":"#deb368"},{"name":"Bursting Lemon","hex":"#fce282"},{"name":"Burtuqali Orange","hex":"#ff6700"},{"name":"Bush","hex":"#0d2e1c"},{"name":"Bush Viper","hex":"#a0bcd0"},{"name":"Bushland Grey","hex":"#7f7b73"},{"name":"Bussell Lace","hex":"#e5a1a0"},{"name":"Buster","hex":"#3e4b69"},{"name":"Butter","hex":"#ffff81"},{"name":"Butter Base","hex":"#c28a35"},{"name":"Butter Cake","hex":"#fdff52"},{"name":"Butter Cookie","hex":"#f0e4b2"},{"name":"Butter Cupcake","hex":"#ffdd99"},{"name":"Butter Fingers","hex":"#fce9ad"},{"name":"Butter Fudge","hex":"#aa6600"},{"name":"Butter Icing","hex":"#f5e5da"},{"name":"Butter Lettuce","hex":"#cfe7cb"},{"name":"Butter Ridge","hex":"#f9e097"},{"name":"Butter Up","hex":"#f4e0bb"},{"name":"Butter Yellow","hex":"#fffd74"},{"name":"Butterblond","hex":"#f1c766"},{"name":"Butterbrot","hex":"#c5ae7c"},{"name":"Buttercream","hex":"#efe0cd"},{"name":"Buttercream Frosting","hex":"#f5edd7"},{"name":"Buttercup","hex":"#da9429"},{"name":"Buttered Popcorn","hex":"#fff0a4"},{"name":"Buttered Rum","hex":"#9d702e"},{"name":"Butterfly","hex":"#cadea5"},{"name":"Butterfly Blue","hex":"#2099bb"},{"name":"Butterfly Bush","hex":"#68578c"},{"name":"Butterfly Wing","hex":"#f8cfb4"},{"name":"Buttermilk","hex":"#fffee4"},{"name":"Butternut","hex":"#ffa177"},{"name":"Butternut Pizazz","hex":"#e59752"},{"name":"Butterscotch","hex":"#fdb147"},{"name":"Butterscotch Bliss","hex":"#d7ad62"},{"name":"Butterscotch Ripple","hex":"#b08843"},{"name":"Butterscotch Sundae","hex":"#dbb486"},{"name":"Butterscotch Syrup","hex":"#d9a05f"},{"name":"Butterum","hex":"#c68f65"},{"name":"Buttery Leather","hex":"#d4b185"},{"name":"Buttery White","hex":"#f1ebda"},{"name":"Button Blue","hex":"#24a0ed"},{"name":"Button Eyes","hex":"#4f3a32"},{"name":"Button Mushroom","hex":"#ece6c8"},{"name":"Buzz","hex":"#f0c641"},{"name":"Buzzard","hex":"#5f563f"},{"name":"Buzzards Bay","hex":"#017a79"},{"name":"By Gum","hex":"#816a38"},{"name":"By the Bayou","hex":"#007b90"},{"name":"By The Sea","hex":"#8d999e"},{"name":"Byakuroku Green","hex":"#a5ba93"},{"name":"Bygone","hex":"#918e8a"},{"name":"Bypass","hex":"#b6c4d2"},{"name":"Byron Place","hex":"#31667d"},{"name":"Byzantine","hex":"#bd33a4"},{"name":"Byzantine Night Blue","hex":"#6a79f7"},{"name":"Byzantium","hex":"#702963"},{"name":"C-3PO","hex":"#c33140"},{"name":"C64 Blue","hex":"#003aff"},{"name":"C64 NTSC","hex":"#4e7fff"},{"name":"C64 Purple","hex":"#6f6ed1"},{"name":"Cab Sav","hex":"#4a2e32"},{"name":"Cabal","hex":"#7f6473"},{"name":"Cabana Bay","hex":"#8ec1c0"},{"name":"Cabaret","hex":"#cd526c"},{"name":"Cabaret Charm","hex":"#7c8ea6"},{"name":"Cabbage","hex":"#87d7be"},{"name":"Cabbage Patch","hex":"#93c460"},{"name":"Cabbage Pont","hex":"#4c5544"},{"name":"Cabernet","hex":"#8e5b68"},{"name":"Cabernet Craving","hex":"#6d3445"},{"name":"Cabin Fever","hex":"#5e5349"},{"name":"Caboose","hex":"#a8a4a1"},{"name":"Cacodemon Red","hex":"#9f0000"},{"name":"Cactus","hex":"#5b6f55"},{"name":"Cactus Blossom","hex":"#d8e5dd"},{"name":"Cactus Flower","hex":"#a83e6c"},{"name":"Cactus Sand","hex":"#9c9369"},{"name":"Cactus Spike","hex":"#c1e0a3"},{"name":"Cadaverous","hex":"#009977"},{"name":"Caddies Silk","hex":"#3e354d"},{"name":"Cadet","hex":"#536872"},{"name":"Cadet Blue","hex":"#5f9ea0"},{"name":"Cadet Grey","hex":"#91a3b0"},{"name":"Cadian Fleshtone","hex":"#90766e"},{"name":"Cadillac","hex":"#984961"},{"name":"Cadillac Coupe","hex":"#c0362c"},{"name":"Cadmium Blue","hex":"#0a1195"},{"name":"Cadmium Green","hex":"#006b3c"},{"name":"Cadmium Orange","hex":"#ed872d"},{"name":"Cadmium Purple","hex":"#b60c26"},{"name":"Cadmium Red","hex":"#e30022"},{"name":"Cadmium Violet","hex":"#7f3e98"},{"name":"Cadmium Yellow","hex":"#fff600"},{"name":"Caduceus Gold","hex":"#ffee66"},{"name":"Café Au Lait","hex":"#a57c5b"},{"name":"Cafe Creme","hex":"#c79685"},{"name":"Café de Paris","hex":"#889944"},{"name":"Cafe Latte","hex":"#d6c6b4"},{"name":"Café Noir","hex":"#4b3621"},{"name":"Café Renversé","hex":"#ae8774"},{"name":"Cafe Royale","hex":"#6a4928"},{"name":"Cairns","hex":"#0a6b92"},{"name":"Cajun Brown","hex":"#5f3e41"},{"name":"Cajun Spice","hex":"#c3705f"},{"name":"Cake Batter","hex":"#f0eddb"},{"name":"Cake Dough","hex":"#fce0a8"},{"name":"Cal Poly Pomona Green","hex":"#1e4d2b"},{"name":"Calabash","hex":"#f8eb97"},{"name":"Calabash Clash","hex":"#728478"},{"name":"Calamansi","hex":"#fcffa4"},{"name":"Calamansi Green","hex":"#c4cc7a"},{"name":"Calcareous Sinter","hex":"#ddeeff"},{"name":"Calcium Rock","hex":"#eee9d9"},{"name":"Calculus","hex":"#a1ccb1"},{"name":"Caledor Sky","hex":"#31639c"},{"name":"Calf Skin","hex":"#b1aa9d"},{"name":"Calgar Blue","hex":"#0485d1"},{"name":"Caliban Green","hex":"#005726"},{"name":"Calico","hex":"#d5b185"},{"name":"Calico Cat","hex":"#c48e36"},{"name":"Calico Dress","hex":"#3d4e67"},{"name":"Calico Rock","hex":"#9c9584"},{"name":"Calico Rose","hex":"#e5c1b3"},{"name":"California","hex":"#e98c3a"},{"name":"California Chamois","hex":"#e6b76c"},{"name":"California Dreamin'","hex":"#93807f"},{"name":"California Girl","hex":"#fca716"},{"name":"California Gold Rush","hex":"#95743f"},{"name":"California Peach","hex":"#fcbe6a"},{"name":"California Roll","hex":"#a09574"},{"name":"California Sagebrush","hex":"#959988"},{"name":"California Wine","hex":"#ca4b65"},{"name":"Calla Green","hex":"#6a6f34"},{"name":"Calla Lily","hex":"#e4eaed"},{"name":"Calliste Green","hex":"#757a4e"},{"name":"Calm Balm","hex":"#5e9d47"},{"name":"Calm Breeze","hex":"#e9ece4"},{"name":"Calm Day","hex":"#7caacf"},{"name":"Calm Interlude","hex":"#a7b0d5"},{"name":"Calm Tint","hex":"#eae3e9"},{"name":"Calm Waters","hex":"#e7fafa"},{"name":"Calming Effect","hex":"#cfd3a2"},{"name":"Calthan Brown","hex":"#6d5044"},{"name":"Calypso","hex":"#3d7188"},{"name":"Calypso Berry","hex":"#c53a4b"},{"name":"Calypso Coral","hex":"#ee5c6c"},{"name":"Calypso Green","hex":"#2e5f60"},{"name":"Camaron Pink","hex":"#fe828c"},{"name":"Camarone","hex":"#206937"},{"name":"Cambridge Blue","hex":"#a3c1ad"},{"name":"Cambridge Leather","hex":"#8c633c"},{"name":"Camel","hex":"#c69f59"},{"name":"Camel Cord","hex":"#e0cb82"},{"name":"Camel Hair Coat","hex":"#f5b784"},{"name":"Camel Hide","hex":"#c1aa91"},{"name":"Camel Spider","hex":"#af8751"},{"name":"Camel Train","hex":"#baae9d"},{"name":"Camelback Mountain","hex":"#d3b587"},{"name":"Camellia","hex":"#f6745f"},{"name":"Camellia Rose","hex":"#eb6081"},{"name":"Camelot","hex":"#803a4b"},{"name":"Cameo","hex":"#f2debc"},{"name":"Cameo Appearance","hex":"#dfc1c3"},{"name":"Cameo Blue","hex":"#769da6"},{"name":"Cameo Brown","hex":"#c08a80"},{"name":"Cameo Green","hex":"#dce6e5"},{"name":"Cameo Peach","hex":"#ebcfc9"},{"name":"Cameo Pink","hex":"#efbbcc"},{"name":"Cameo Role","hex":"#ddcaaf"},{"name":"Cameo Rose","hex":"#f7dfd7"},{"name":"Camisole","hex":"#fcd9c7"},{"name":"Camo","hex":"#7f8f4e"},{"name":"Camo Green","hex":"#a5a542"},{"name":"Camouflage","hex":"#3c3910"},{"name":"Camouflage Green","hex":"#4b6113"},{"name":"Campánula","hex":"#3272af"},{"name":"Campfire","hex":"#ce5f38"},{"name":"Campfire Smoke","hex":"#d5d1cb"},{"name":"Camping Trip","hex":"#67786e"},{"name":"Can Can","hex":"#d08a9b"},{"name":"Canadian Lake","hex":"#8f9aa4"},{"name":"Canadian Maple","hex":"#cab266"},{"name":"Canadian Pancake","hex":"#edd8c3"},{"name":"Canadian Pine","hex":"#2e7b52"},{"name":"Canal Blue","hex":"#9cc2c5"},{"name":"Canaletto","hex":"#818c72"},{"name":"Canary","hex":"#fdff63"},{"name":"Canary Feather","hex":"#efde75"},{"name":"Canary Grass","hex":"#d0cca9"},{"name":"Canary Green","hex":"#d6dec9"},{"name":"Canary Island","hex":"#e9d4a9"},{"name":"Canary Wharf","hex":"#91a1b5"},{"name":"Canary Yellow","hex":"#ffdf01"},{"name":"Candela","hex":"#bac4d5"},{"name":"Candelabra","hex":"#e1c161"},{"name":"Candidate","hex":"#c3bc90"},{"name":"Candied Apple","hex":"#b95b6d"},{"name":"Candied Blueberry","hex":"#331166"},{"name":"Candied Ginger","hex":"#bfa387"},{"name":"Candied Yams","hex":"#f9a765"},{"name":"Candle Bark","hex":"#c3bdaa"},{"name":"Candle Flame","hex":"#fff4a1"},{"name":"Candle Glow","hex":"#ffe8c3"},{"name":"Candle in the Wind","hex":"#f9ebbf"},{"name":"Candle Wax","hex":"#f2eacf"},{"name":"Candlelight","hex":"#fcd917"},{"name":"Candlelight Peach","hex":"#f8a39d"},{"name":"Candlelit Beige","hex":"#f1ede0"},{"name":"Candlestick Point","hex":"#fff1d5"},{"name":"Candlewick","hex":"#f2ebd3"},{"name":"Candy","hex":"#ff9b87"},{"name":"Candy Apple Red","hex":"#ff0800"},{"name":"Candy Bar","hex":"#ffb7d5"},{"name":"Candy Cane","hex":"#f7bfc2"},{"name":"Candy Corn","hex":"#fcfc5d"},{"name":"Candy Floss","hex":"#e8a7e2"},{"name":"Candy Grass","hex":"#e2d6bd"},{"name":"Candy Green","hex":"#82dbcc"},{"name":"Candy Heart Pink","hex":"#f5a2a1"},{"name":"Candy Mix","hex":"#f3dfe3"},{"name":"Candy Pink","hex":"#ff63e9"},{"name":"Candyman","hex":"#ff9e76"},{"name":"Candytuft","hex":"#edc9d8"},{"name":"Cane Sugar","hex":"#e3b982"},{"name":"Cane Sugar Glaze","hex":"#ddbb99"},{"name":"Cane Toad","hex":"#977042"},{"name":"Caneel Bay","hex":"#00849f"},{"name":"Cannery Park","hex":"#bcb09e"},{"name":"Cannoli Cream","hex":"#f0efe2"},{"name":"Cannon Ball","hex":"#484335"},{"name":"Cannon barrel","hex":"#3c4142"},{"name":"Cannon Black","hex":"#251706"},{"name":"Cannon Pink","hex":"#8e5164"},{"name":"Canoe Blue","hex":"#1d5671"},{"name":"Canopy","hex":"#728f02"},{"name":"Cantaloupe","hex":"#ffd479"},{"name":"Cantankerous Coyote","hex":"#ac8d74"},{"name":"Canteen","hex":"#5e5347"},{"name":"Canterbury Cathedral","hex":"#b2ab94"},{"name":"Canton","hex":"#6da29e"},{"name":"Canvas","hex":"#bb8855"},{"name":"Canvas Cloth","hex":"#e6dfd2"},{"name":"Canvas Satchel","hex":"#ccb88d"},{"name":"Canyon Blue","hex":"#607b8e"},{"name":"Canyon Clay","hex":"#ce8477"},{"name":"Canyon Cloud","hex":"#aeafbb"},{"name":"Canyon Dusk","hex":"#ddc3b7"},{"name":"Canyon Echo","hex":"#e5e1cc"},{"name":"Canyon Falls","hex":"#97987f"},{"name":"Canyon Peach","hex":"#eedacb"},{"name":"Canyon Rose","hex":"#af6c67"},{"name":"Canyon Stone","hex":"#93625b"},{"name":"Canyon Sunset","hex":"#e1927a"},{"name":"Canyon Verde","hex":"#8a7e5c"},{"name":"Canyonville","hex":"#f5ded1"},{"name":"Cǎo Lǜ Grass","hex":"#1fa774"},{"name":"Cape Cod","hex":"#4e5552"},{"name":"Cape Cod Blue","hex":"#91a2a6"},{"name":"Cape Honey","hex":"#fee0a5"},{"name":"Cape Hope","hex":"#d8d6d7"},{"name":"Cape Jasmine","hex":"#ffb95a"},{"name":"Cape Lee","hex":"#50818b"},{"name":"Cape Palliser","hex":"#75482f"},{"name":"Cape Pond","hex":"#0092ad"},{"name":"Capella","hex":"#d9ced2"},{"name":"Caper","hex":"#afc182"},{"name":"Capers","hex":"#695e4b"},{"name":"Capital Blue","hex":"#1a4157"},{"name":"Capital Grains","hex":"#dbd0a8"},{"name":"Capital Yellow","hex":"#e6ba45"},{"name":"Cappuccino","hex":"#633f33"},{"name":"Cappuccino Bombe","hex":"#b4897d"},{"name":"Cappuccino Froth","hex":"#c8b089"},{"name":"Capri","hex":"#00bfff"},{"name":"Capri Breeze","hex":"#008799"},{"name":"Capri Cream","hex":"#f1f0d6"},{"name":"Capri Isle","hex":"#4f5855"},{"name":"Caps","hex":"#7e7a75"},{"name":"Capsella","hex":"#6d8a74"},{"name":"Capsicum Red","hex":"#76392e"},{"name":"Capstan","hex":"#007eb0"},{"name":"Captain Kirk Uniform","hex":"#9b870c"},{"name":"Captains Blue","hex":"#557088"},{"name":"Captivated","hex":"#947cae"},{"name":"Captive","hex":"#005b6a"},{"name":"Capture","hex":"#2cbaa3"},{"name":"Capulet Olive","hex":"#656344"},{"name":"Caput Mortuum","hex":"#592720"},{"name":"Carafe","hex":"#5d473a"},{"name":"Caramel","hex":"#af6f09"},{"name":"Caramel Apple","hex":"#b87a59"},{"name":"Caramel Bar","hex":"#cc8654"},{"name":"Caramel Cafe","hex":"#864c24"},{"name":"Caramel Cream","hex":"#f4ba94"},{"name":"Caramel Cupcake","hex":"#b98c5d"},{"name":"Caramel Finish","hex":"#ffd59a"},{"name":"Caramel Ice","hex":"#eec9aa"},{"name":"Caramel Infused","hex":"#cc7755"},{"name":"Caramel Kiss","hex":"#b08a61"},{"name":"Caramel Milk","hex":"#ddc283"},{"name":"Caramel Powder","hex":"#eebb99"},{"name":"Caramel Sundae","hex":"#a9876a"},{"name":"Caramelized","hex":"#ba947f"},{"name":"Caramelized Orange","hex":"#ef924a"},{"name":"Caramelized Pears","hex":"#e7d5ad"},{"name":"Caramelized Pecan","hex":"#a17b4d"},{"name":"Caramelized Walnut","hex":"#6e564a"},{"name":"Caravel Brown","hex":"#8c6e54"},{"name":"Carbon","hex":"#333333"},{"name":"Carbon Dating","hex":"#565b58"},{"name":"Carbon Footprint","hex":"#7b808b"},{"name":"Cardboard","hex":"#c19a6c"},{"name":"Cardin Green","hex":"#1b3427"},{"name":"Cardinal","hex":"#c41e3a"},{"name":"Cardinal Pink","hex":"#8c055e"},{"name":"Cardoon","hex":"#9aae8c"},{"name":"Cardueline Finch","hex":"#957b38"},{"name":"Careys Pink","hex":"#c99aa0"},{"name":"Cargo","hex":"#8f755b"},{"name":"Cargo Green","hex":"#c8c5a7"},{"name":"Cargo River","hex":"#cfcdbb"},{"name":"Caribbean Blue","hex":"#1ac1dd"},{"name":"Caribbean Cruise","hex":"#3f9da9"},{"name":"Caribbean Green","hex":"#00cc99"},{"name":"Caribbean Pleasure","hex":"#d5dcce"},{"name":"Caribbean Sea","hex":"#00819d"},{"name":"Caribbean Splash","hex":"#00697c"},{"name":"Caribbean Swim","hex":"#126366"},{"name":"Caribbean Turquoise","hex":"#009d94"},{"name":"Caribou","hex":"#816d5e"},{"name":"Caribou Herd","hex":"#cda563"},{"name":"Carissima","hex":"#e68095"},{"name":"Carla","hex":"#f5f9cb"},{"name":"Carlisle","hex":"#45867c"},{"name":"Carmel Mission","hex":"#927f76"},{"name":"Carmen","hex":"#7c383f"},{"name":"Carmen Miranda","hex":"#903e2f"},{"name":"Carmim","hex":"#a13905"},{"name":"Carmine","hex":"#9d0216"},{"name":"Carmine Carnation","hex":"#ad4b53"},{"name":"Carmine Pink","hex":"#eb4c42"},{"name":"Carmine Red","hex":"#ff0038"},{"name":"Carmine Rose","hex":"#e35b8f"},{"name":"Carmoisine","hex":"#b31c45"},{"name":"Carnaby Tan","hex":"#5b3a24"},{"name":"Carnage Red","hex":"#940008"},{"name":"Carnal Brown","hex":"#bb8866"},{"name":"Carnal Pink","hex":"#ef9cb5"},{"name":"Carnation","hex":"#fd798f"},{"name":"Carnation Pink","hex":"#ff7fa7"},{"name":"Carnelian","hex":"#b31b1b"},{"name":"Carnival Night","hex":"#006e7a"},{"name":"Caro","hex":"#ffcac3"},{"name":"Carob Brown","hex":"#855c4c"},{"name":"Carob Chip","hex":"#5a484b"},{"name":"Carol","hex":"#338dae"},{"name":"Carol's Purr","hex":"#77a135"},{"name":"Carolina","hex":"#cbefcb"},{"name":"Carolina Blue","hex":"#8ab8fe"},{"name":"Carolina Green","hex":"#008b6d"},{"name":"Carona","hex":"#fba52e"},{"name":"Carousel Pink","hex":"#f8dbe0"},{"name":"Carpaccio","hex":"#e34234"},{"name":"Carrara","hex":"#eeebe4"},{"name":"Carrara Marble","hex":"#ffddcc"},{"name":"Carriage","hex":"#6c6358"},{"name":"Carroburg Crimson","hex":"#a82a70"},{"name":"Carrot","hex":"#fd6f3b"},{"name":"Carrot Cake","hex":"#bf6f31"},{"name":"Carrot Curl","hex":"#fe8c18"},{"name":"Carrot Flower","hex":"#cbd3c1"},{"name":"Carrot Orange","hex":"#ed9121"},{"name":"Carter's Scroll","hex":"#405978"},{"name":"Cartwheel","hex":"#665537"},{"name":"Carved Wood","hex":"#937a62"},{"name":"Casa Talec","hex":"#c49ca5"},{"name":"Casa Verde","hex":"#abb790"},{"name":"Casablanca","hex":"#f0b253"},{"name":"Casal","hex":"#3f545a"},{"name":"Casandora Yellow","hex":"#fece5a"},{"name":"Cascade","hex":"#d4ede6"},{"name":"Cascade Tour","hex":"#697f8e"},{"name":"Cascading White","hex":"#f7f5f6"},{"name":"Cashew","hex":"#a47149"},{"name":"Cashew Cheese","hex":"#fcf9bd"},{"name":"Cashew Nut","hex":"#edccb3"},{"name":"Cashmere","hex":"#d1b399"},{"name":"Cashmere Blue","hex":"#a5b8d0"},{"name":"Cashmere Rose","hex":"#ce879f"},{"name":"Casket","hex":"#a49186"},{"name":"Casper","hex":"#aab5b8"},{"name":"Cassava Cake","hex":"#e7c084"},{"name":"Cassiopeia","hex":"#aed0c9"},{"name":"Castaway","hex":"#6dbac0"},{"name":"Castaway Cove","hex":"#7a9291"},{"name":"Castaway Lagoon","hex":"#607374"},{"name":"Castellan Green","hex":"#455440"},{"name":"Caster Sugar","hex":"#ffffe8"},{"name":"Casting Sea","hex":"#4586c7"},{"name":"Casting Shadow","hex":"#9da7a0"},{"name":"Castle In The Clouds","hex":"#efdcca"},{"name":"Castle Mist","hex":"#bdaeb7"},{"name":"Castle Moat","hex":"#8b6b47"},{"name":"Castle Stone","hex":"#525746"},{"name":"Castle Wall","hex":"#c8c1ab"},{"name":"Castlerock","hex":"#5f5e62"},{"name":"Castleton Green","hex":"#00564f"},{"name":"Castlevania Heart","hex":"#a80020"},{"name":"Castor Grey","hex":"#646762"},{"name":"Castro","hex":"#44232f"},{"name":"Casual Elegance","hex":"#dfd5c8"},{"name":"Cat's Purr","hex":"#0071a0"},{"name":"Catachan Green","hex":"#475742"},{"name":"Catalan","hex":"#429395"},{"name":"Catalina","hex":"#72a49f"},{"name":"Catalina Blue","hex":"#062a78"},{"name":"Catalina Green","hex":"#859475"},{"name":"Catalina Tile","hex":"#efac73"},{"name":"Catawba","hex":"#703642"},{"name":"Catawba Grape","hex":"#5d3c43"},{"name":"Catch The Wave","hex":"#b5dcd8"},{"name":"Caterpillar Green","hex":"#146b47"},{"name":"Cathay Spice","hex":"#99642c"},{"name":"Cathedral Glass","hex":"#7a999c"},{"name":"Cathedral Stone","hex":"#80796e"},{"name":"Cathode Green","hex":"#00ff55"},{"name":"Catmint","hex":"#c9a8ce"},{"name":"Catnap","hex":"#9fc3ac"},{"name":"Catnip","hex":"#80aa95"},{"name":"Catnip Wood","hex":"#6f6066"},{"name":"Catskill White","hex":"#e0e4dc"},{"name":"Cattail Red","hex":"#b64925"},{"name":"Caulerpa Lentillifera","hex":"#599c99"},{"name":"Cavalry","hex":"#3f4c5a"},{"name":"Cavalry Brown","hex":"#990003"},{"name":"Cave Lake","hex":"#52b7c6"},{"name":"Cave of the Winds","hex":"#86736e"},{"name":"Cave Painting","hex":"#aa1100"},{"name":"Cave Pearl","hex":"#d6e5e2"},{"name":"Caveman","hex":"#625c58"},{"name":"Cavern Moss","hex":"#92987d"},{"name":"Cavern Pink","hex":"#e0b8b1"},{"name":"Cavernous","hex":"#515252"},{"name":"Caviar","hex":"#292a2d"},{"name":"Caviar Couture","hex":"#772244"},{"name":"Cayenne","hex":"#941100"},{"name":"Cayman Green","hex":"#495a44"},{"name":"Ce Soir","hex":"#9271a7"},{"name":"Cedar","hex":"#463430"},{"name":"Cedar Chest","hex":"#c95a49"},{"name":"Cedar Green","hex":"#5e6737"},{"name":"Cedar Grove","hex":"#bf6955"},{"name":"Cedar Plank Salmon","hex":"#a96a50"},{"name":"Cedar Ridge","hex":"#9b6663"},{"name":"Cedar Staff","hex":"#91493e"},{"name":"Cedar Wood","hex":"#a1655b"},{"name":"Cedar Wood Finish","hex":"#711a00"},{"name":"Cedarville","hex":"#dda896"},{"name":"Ceil","hex":"#92a1cf"},{"name":"Celadon","hex":"#ace1af"},{"name":"Celadon Blue","hex":"#007ba7"},{"name":"Celadon Glaze","hex":"#ccd4cb"},{"name":"Celadon Green","hex":"#2f847c"},{"name":"Celadon Porcelain","hex":"#7ebea5"},{"name":"Celadon Sorbet","hex":"#b1dac6"},{"name":"Celadon Tint","hex":"#cbcebe"},{"name":"Celandine","hex":"#ebdf67"},{"name":"Celery","hex":"#b4c04c"},{"name":"Celery Green","hex":"#c5cc7b"},{"name":"Celery Mousse","hex":"#c1fd95"},{"name":"Celery Satin","hex":"#d0d8be"},{"name":"Celery Sprig","hex":"#9ed686"},{"name":"Celery Stick","hex":"#caedd0"},{"name":"Celery Victor","hex":"#cceec2"},{"name":"Celeste","hex":"#b2ffff"},{"name":"Celestial","hex":"#006380"},{"name":"Celestial Blue","hex":"#2c4d69"},{"name":"Celestial Coral","hex":"#dd4455"},{"name":"Celestial Green","hex":"#2ddfc1"},{"name":"Celestial Indigo","hex":"#091f92"},{"name":"Celestial Moon","hex":"#e3d4b9"},{"name":"Celestial Pink","hex":"#9c004a"},{"name":"Celestial Plum","hex":"#3c7ac2"},{"name":"Celestine","hex":"#85c1c4"},{"name":"Celestine Spring","hex":"#24a4c8"},{"name":"Celestra Grey","hex":"#99a7ab"},{"name":"Celestyn","hex":"#b5c7d2"},{"name":"Celine","hex":"#826167"},{"name":"Cellar Door","hex":"#75553f"},{"name":"Cello","hex":"#3a4e5f"},{"name":"Celluloid","hex":"#515153"},{"name":"Celosia Orange","hex":"#e8703a"},{"name":"Celtic","hex":"#2b3f36"},{"name":"Celtic Blue","hex":"#246bce"},{"name":"Celtic Clover","hex":"#006940"},{"name":"Celtic Green","hex":"#1f6954"},{"name":"Celtic Linen","hex":"#f5e5ce"},{"name":"Celtic Rush","hex":"#2e4c5b"},{"name":"Celuce","hex":"#8bab68"},{"name":"Cembra Blossom","hex":"#725671"},{"name":"Cement","hex":"#a5a391"},{"name":"Cendre Blue","hex":"#3e7fa5"},{"name":"Census","hex":"#327a68"},{"name":"Centaur","hex":"#90673f"},{"name":"Centaur Brown","hex":"#8b6a4f"},{"name":"Centennial Rose","hex":"#b3a7a6"},{"name":"Center Ridge","hex":"#817a69"},{"name":"Centipede Brown","hex":"#6d2400"},{"name":"Centra","hex":"#c08f45"},{"name":"Ceramic","hex":"#fcfff9"},{"name":"Ceramic Green","hex":"#3bb773"},{"name":"Ceramite White","hex":"#fefee0"},{"name":"Cereal Flake","hex":"#efd7ab"},{"name":"Cerebellum Grey","hex":"#cbcbcb"},{"name":"Cerebral Grey","hex":"#cccccc"},{"name":"Cerise","hex":"#a41247"},{"name":"Cerise Pink","hex":"#ec3b83"},{"name":"Cerise Red","hex":"#de3163"},{"name":"Cerulean Blue","hex":"#2a52be"},{"name":"Cerulean Frost","hex":"#6d9bc3"},{"name":"Cetacean Blue","hex":"#001440"},{"name":"Ceylon Yellow","hex":"#d4ae40"},{"name":"Ceylonese","hex":"#756858"},{"name":"CG Blue","hex":"#007aa5"},{"name":"CG Red","hex":"#e03c31"},{"name":"CGA Blue","hex":"#56ffff"},{"name":"CGA Pink","hex":"#fc0fc0"},{"name":"Chá Lǜ Green","hex":"#77926f"},{"name":"Chablis","hex":"#fde9e0"},{"name":"Chai Tea","hex":"#b1832f"},{"name":"Chai Tea Latte","hex":"#efd7b3"},{"name":"Chain Gang Grey","hex":"#708090"},{"name":"Chain Mail","hex":"#7b737b"},{"name":"Chainmail","hex":"#81777f"},{"name":"Chalcedony","hex":"#dddd99"},{"name":"Chalet","hex":"#c29867"},{"name":"Chalet Green","hex":"#5a6e41"},{"name":"Chalk Blue","hex":"#ccdad7"},{"name":"Chalk Pink","hex":"#e6c5ca"},{"name":"Chalk Violet","hex":"#8f7da5"},{"name":"Chalkware","hex":"#e0ceb7"},{"name":"Chalky","hex":"#dfc281"},{"name":"Challah Bread","hex":"#cd7a50"},{"name":"Chambray","hex":"#475877"},{"name":"Chambray Blue","hex":"#9eb4d3"},{"name":"Chameleon Tango","hex":"#c0c2a0"},{"name":"Chamois","hex":"#e8cd9a"},{"name":"Chamoisee","hex":"#a0785a"},{"name":"Chamomile","hex":"#e8d0a7"},{"name":"Chamomile Tea","hex":"#dac395"},{"name":"Champagne","hex":"#e9d2ac"},{"name":"Champagne Bliss","hex":"#f0e1c5"},{"name":"Champagne Bubbles","hex":"#ddcead"},{"name":"Champagne Burst","hex":"#f1e4cb"},{"name":"Champagne Ice","hex":"#f3e5dd"},{"name":"Champagne Pink","hex":"#f1ddcf"},{"name":"Champignon","hex":"#949089"},{"name":"Champion","hex":"#7b5986"},{"name":"Champion Blue","hex":"#606788"},{"name":"Chandra Cream","hex":"#ecba5d"},{"name":"Changeling Pink","hex":"#f4afcd"},{"name":"Channel","hex":"#f1c3c2"},{"name":"Channel Marker Green","hex":"#04d8b2"},{"name":"Chanterelle","hex":"#daa520"},{"name":"Chanterelle Sauce","hex":"#a28776"},{"name":"Chantilly","hex":"#edb8c7"},{"name":"Chantilly Lace","hex":"#f1e2de"},{"name":"Chaos Black","hex":"#0f0f0f"},{"name":"Chaotic Red","hex":"#740600"},{"name":"Chaparral","hex":"#e5d0b0"},{"name":"Chapel Wall","hex":"#ede2ac"},{"name":"Chaps","hex":"#644b41"},{"name":"Chapter","hex":"#9f9369"},{"name":"Charade","hex":"#394043"},{"name":"Charadon Granite","hex":"#504d4c"},{"name":"Charcoal","hex":"#343837"},{"name":"Charcoal Blue","hex":"#67778a"},{"name":"Charcoal Briquette","hex":"#5d625c"},{"name":"Charcoal Dust","hex":"#9497b3"},{"name":"Charcoal Light","hex":"#726e68"},{"name":"Charcoal Sketch","hex":"#5d5b56"},{"name":"Charcoal Smoke","hex":"#474f43"},{"name":"Charcoal Smudge","hex":"#60605e"},{"name":"Chardon","hex":"#f8eadf"},{"name":"Chardonnay","hex":"#efe8bc"},{"name":"Charisma","hex":"#632a60"},{"name":"Charleston Cherry","hex":"#9f414b"},{"name":"Charleston Chocolate","hex":"#c09278"},{"name":"Charleston Green","hex":"#232b2b"},{"name":"Charlie Brown","hex":"#995500"},{"name":"Charlie Horse","hex":"#948263"},{"name":"Charlock","hex":"#e5e790"},{"name":"Charlotte","hex":"#a4dce6"},{"name":"Charm","hex":"#d0748b"},{"name":"Charm Pink","hex":"#e68fac"},{"name":"Charmed Green","hex":"#007f3a"},{"name":"Charming","hex":"#d4e092"},{"name":"Charming Cherry","hex":"#ff90a2"},{"name":"Charolais Cattle","hex":"#f1ebea"},{"name":"Charred Brown","hex":"#3e0007"},{"name":"Charred Chocolate","hex":"#553b3d"},{"name":"Charred Clay","hex":"#885132"},{"name":"Charter","hex":"#69b2cf"},{"name":"Chartreuse","hex":"#c1f80a"},{"name":"Chartreuse Shot","hex":"#dad000"},{"name":"Chasm Green","hex":"#63b521"},{"name":"Chateau de Chillon","hex":"#a2aab3"},{"name":"Chateau Green","hex":"#419f59"},{"name":"Chateau Grey","hex":"#bbb1a8"},{"name":"Chateau Rose","hex":"#dba3ce"},{"name":"Chatelle","hex":"#b3abb6"},{"name":"Chathams Blue","hex":"#2c5971"},{"name":"Chatty Cricket","hex":"#89b386"},{"name":"Che Guevara Red","hex":"#ed214d"},{"name":"Cheater","hex":"#eeb15d"},{"name":"Cheddar Biscuit","hex":"#d2ad87"},{"name":"Cheddar Chunk","hex":"#f9c982"},{"name":"Cheerful Heart","hex":"#dcc7c0"},{"name":"Cheers!","hex":"#c09962"},{"name":"Cheese","hex":"#ffa600"},{"name":"Cheese Please","hex":"#ff9613"},{"name":"Cheesecake","hex":"#fffcda"},{"name":"Cheesy Grin","hex":"#fae195"},{"name":"Chelsea Cucumber","hex":"#88a95b"},{"name":"Chelsea Gem","hex":"#95532f"},{"name":"Chéng Hóng Sè Orange","hex":"#f94009"},{"name":"Chenille","hex":"#a6cd91"},{"name":"Chenin","hex":"#dec371"},{"name":"Cherokee","hex":"#f5cd82"},{"name":"Cherokee Red","hex":"#824e4a"},{"name":"Cherries Jubilee","hex":"#a22452"},{"name":"Cherry","hex":"#cf0234"},{"name":"Cherry Bark","hex":"#908279"},{"name":"Cherry Berry","hex":"#9f4d65"},{"name":"Cherry Blossom","hex":"#f7cee0"},{"name":"Cherry Blossom Pink","hex":"#ffb7c5"},{"name":"Cherry Blush","hex":"#ffc9dd"},{"name":"Cherry Bomb","hex":"#b73d3f"},{"name":"Cherry Brandy","hex":"#e26b81"},{"name":"Cherry Chip","hex":"#ffbbb4"},{"name":"Cherry Cocoa","hex":"#8e5e65"},{"name":"Cherry Cola","hex":"#894c3b"},{"name":"Cherry Cordial","hex":"#ebbed3"},{"name":"Cherry Flower","hex":"#fbdae8"},{"name":"Cherry Foam","hex":"#f392a0"},{"name":"Cherry Hill","hex":"#cc5160"},{"name":"Cherry Lolly","hex":"#c8385a"},{"name":"Cherry Mahogany","hex":"#66352b"},{"name":"Cherry On Top","hex":"#ac495c"},{"name":"Cherry Pearl","hex":"#f9e7f4"},{"name":"Cherry Pie","hex":"#372d52"},{"name":"Cherry Pink","hex":"#c7607b"},{"name":"Cherry Plum","hex":"#a10047"},{"name":"Cherry Race","hex":"#a64137"},{"name":"Cherry Red","hex":"#f7022a"},{"name":"Cherry Tomato","hex":"#f2013f"},{"name":"Cherry Tree","hex":"#dfb7b4"},{"name":"Cherrywood","hex":"#651a14"},{"name":"Chert","hex":"#848182"},{"name":"Cherub","hex":"#f5d7dc"},{"name":"Cherubic","hex":"#ffe6f1"},{"name":"Chess Ivory","hex":"#ffe9c5"},{"name":"Chester Brown","hex":"#876b4b"},{"name":"Chestnut","hex":"#742802"},{"name":"Chestnut Brown","hex":"#6d1008"},{"name":"Chestnut Gold","hex":"#ab8508"},{"name":"Chestnut Leather","hex":"#60281e"},{"name":"Chestnut Peel","hex":"#6d3c32"},{"name":"Chestnut Plum","hex":"#852e19"},{"name":"Chestnut Rose","hex":"#cd5252"},{"name":"Chestnut Shell","hex":"#adff2f"},{"name":"Chesty Bond","hex":"#516fa0"},{"name":"Chetwode Blue","hex":"#666fb4"},{"name":"Chewing Gum","hex":"#e6b0af"},{"name":"Chewy Caramel","hex":"#977043"},{"name":"Chi-Gong","hex":"#d52b2d"},{"name":"Chic Brick","hex":"#a4725a"},{"name":"Chic Green","hex":"#d8ebd6"},{"name":"Chic Peach","hex":"#f0d1c8"},{"name":"Chicago","hex":"#5b5d56"},{"name":"Chicha Morada","hex":"#7e6072"},{"name":"Chickadee","hex":"#ffcf65"},{"name":"Chicken Comb","hex":"#dd2222"},{"name":"Chickpea","hex":"#efe7df"},{"name":"Chickweed","hex":"#d9dfe3"},{"name":"Chicon","hex":"#d9eeb4"},{"name":"Chicory","hex":"#a78658"},{"name":"Chicory Coffee","hex":"#4a342e"},{"name":"Chicory Flower","hex":"#66789a"},{"name":"Chieftain","hex":"#6a5637"},{"name":"Chiffon","hex":"#f0f5bb"},{"name":"Chifle Yellow","hex":"#dbc963"},{"name":"Child of Heaven","hex":"#eae5c5"},{"name":"Chilean Fire","hex":"#d05e34"},{"name":"Chilean Heath","hex":"#f9f7de"},{"name":"Chili","hex":"#be5141"},{"name":"Chili Con Carne","hex":"#985e2b"},{"name":"Chili Oil","hex":"#8e3c36"},{"name":"Chili Pepper","hex":"#9b1b30"},{"name":"Chili Sauce","hex":"#bc4e40"},{"name":"Chili Soda","hex":"#ca7c74"},{"name":"Chill in the Air","hex":"#d1d5e7"},{"name":"Chilled Mint","hex":"#e4efde"},{"name":"Chilled Wine","hex":"#6d4052"},{"name":"Chilly Spice","hex":"#fd9989"},{"name":"Chimera","hex":"#74626d"},{"name":"Chimera Brown","hex":"#c89b75"},{"name":"Chimes","hex":"#c7ca86"},{"name":"Chimney Sweep","hex":"#272f38"},{"name":"China Blue","hex":"#546477"},{"name":"China Clay","hex":"#718b9a"},{"name":"China Doll","hex":"#f3e4d5"},{"name":"China Ivory","hex":"#fbf3d3"},{"name":"China Pink","hex":"#df6ea1"},{"name":"China Rose","hex":"#a8516e"},{"name":"China Seas","hex":"#034f7c"},{"name":"China Silk","hex":"#e3d1cc"},{"name":"China White","hex":"#eae6d9"},{"name":"Chinaberry","hex":"#464960"},{"name":"Chinchilla","hex":"#9c8e7b"},{"name":"Chinchilla Chenille","hex":"#d0bba7"},{"name":"Chinese Bellflower","hex":"#4d5aaf"},{"name":"Chinese Black","hex":"#111100"},{"name":"Chinese Blue","hex":"#365194"},{"name":"Chinese Bronze","hex":"#cd8032"},{"name":"Chinese Brown","hex":"#ab381f"},{"name":"Chinese Garden","hex":"#006967"},{"name":"Chinese Gold","hex":"#ddaa00"},{"name":"Chinese Goldfish","hex":"#f34723"},{"name":"Chinese Green","hex":"#d0db61"},{"name":"Chinese Hamster","hex":"#ebdbca"},{"name":"Chinese Ibis Brown","hex":"#e09e87"},{"name":"Chinese Ink","hex":"#3f312b"},{"name":"Chinese Lacquer","hex":"#60c7c2"},{"name":"Chinese Lantern","hex":"#f09056"},{"name":"Chinese Leaf","hex":"#ccd6b0"},{"name":"Chinese Night","hex":"#aa381e"},{"name":"Chinese Orange","hex":"#f37042"},{"name":"Chinese Pink","hex":"#de70a1"},{"name":"Chinese Porcelain","hex":"#3a5f7d"},{"name":"Chinese Purple","hex":"#720b98"},{"name":"Chinese Red","hex":"#cd071e"},{"name":"Chinese Safflower","hex":"#b94047"},{"name":"Chinese Silver","hex":"#dddcef"},{"name":"Chinese Tzu","hex":"#8fbfbd"},{"name":"Chinese Violet","hex":"#835e81"},{"name":"Chinese White","hex":"#e2e5de"},{"name":"Chinese Yellow","hex":"#ffb200"},{"name":"Chino","hex":"#b8ad8a"},{"name":"Chino Green","hex":"#d9caa5"},{"name":"Chinois Green","hex":"#7c8c87"},{"name":"Chinook","hex":"#9dd3a8"},{"name":"Chinook Salmon","hex":"#c8987e"},{"name":"Chinotto","hex":"#554747"},{"name":"Chintz","hex":"#d5c7b9"},{"name":"Chintz Rose","hex":"#eec4be"},{"name":"Chipmunk","hex":"#cfa14a"},{"name":"Chipolata","hex":"#aa4433"},{"name":"Chips Provencale","hex":"#ddd618"},{"name":"Chitin Green","hex":"#026b67"},{"name":"Chive","hex":"#4a5335"},{"name":"Chive Bloom","hex":"#4f3650"},{"name":"Chive Blossom","hex":"#7d5d99"},{"name":"Chive Flower","hex":"#a193bf"},{"name":"Chlorella Green","hex":"#56ae57"},{"name":"Chloride","hex":"#93d8c2"},{"name":"Chlorite","hex":"#5e8e82"},{"name":"Chlorophyll","hex":"#44891a"},{"name":"Chlorophyll Cream","hex":"#b3d6c3"},{"name":"Chlorophyll Green","hex":"#4aff00"},{"name":"Chlorosis","hex":"#75876e"},{"name":"Choco Biscuit","hex":"#b4835b"},{"name":"Choco Chic","hex":"#993311"},{"name":"Choco Death","hex":"#63493e"},{"name":"Choco Loco","hex":"#7d5f53"},{"name":"Chocobo Feather","hex":"#f9bc08"},{"name":"Chocoholic","hex":"#993300"},{"name":"Chocolate","hex":"#d2691e"},{"name":"Chocolate Brown","hex":"#411900"},{"name":"Chocolate Chip","hex":"#685a4e"},{"name":"Chocolate Chunk","hex":"#6b574a"},{"name":"Chocolate Cosmos","hex":"#58111a"},{"name":"Chocolate Eclair","hex":"#674848"},{"name":"Chocolate Fondant","hex":"#56352d"},{"name":"Chocolate Fondue","hex":"#9a3001"},{"name":"Chocolate Kiss","hex":"#3c1421"},{"name":"Chocolate Lab","hex":"#5c3e35"},{"name":"Chocolate Lust","hex":"#993322"},{"name":"Chocolate Melange","hex":"#331100"},{"name":"Chocolate Milk","hex":"#976f4c"},{"name":"Chocolate Moment","hex":"#998069"},{"name":"Chocolate Pancakes","hex":"#884400"},{"name":"Chocolate Plum","hex":"#3c2d2e"},{"name":"Chocolate Pretzel","hex":"#60504b"},{"name":"Chocolate Pudding","hex":"#6f6665"},{"name":"Chocolate Ripple","hex":"#76604e"},{"name":"Chocolate Sparkle","hex":"#8c6c6f"},{"name":"Chocolate Stain","hex":"#84563c"},{"name":"Chocolate Torte","hex":"#382e2d"},{"name":"Chocolate Truffle","hex":"#612e35"},{"name":"Chōjicha Brown","hex":"#8f583c"},{"name":"Chokecherry","hex":"#92000a"},{"name":"Choo Choo","hex":"#867578"},{"name":"Choral Singer","hex":"#b77795"},{"name":"Chorizo","hex":"#aa0011"},{"name":"Chōshun Red","hex":"#b95754"},{"name":"Chowder Bowl","hex":"#e5d2b2"},{"name":"Christalle","hex":"#382161"},{"name":"Christi","hex":"#71a91d"},{"name":"Christina Brown","hex":"#009094"},{"name":"Christmas Blue","hex":"#2a8fbd"},{"name":"Christmas Brown","hex":"#5d2b2c"},{"name":"Christmas Gold","hex":"#caa906"},{"name":"Christmas Green","hex":"#3c8d0d"},{"name":"Christmas Holly","hex":"#68846a"},{"name":"Christmas Ivy","hex":"#477266"},{"name":"Christmas Orange","hex":"#d56c2b"},{"name":"Christmas Pink","hex":"#e34285"},{"name":"Christmas Purple","hex":"#4d084b"},{"name":"Christmas Red","hex":"#b01b2e"},{"name":"Christmas Rose","hex":"#ffddbb"},{"name":"Christmas Silver","hex":"#e1dfe0"},{"name":"Christmas Yellow","hex":"#fef200"},{"name":"Christobel","hex":"#d4c5ba"},{"name":"Chrome Aluminum","hex":"#a8a9ad"},{"name":"Chrome Chalice","hex":"#cdc8d2"},{"name":"Chrome White","hex":"#cac7b7"},{"name":"Chrome Yellow","hex":"#ffa700"},{"name":"Chromis Damsel Blue","hex":"#82cafc"},{"name":"Chromophobia Green","hex":"#06b48b"},{"name":"Chronicle","hex":"#3e4265"},{"name":"Chronus Blue","hex":"#72a8d1"},{"name":"Chrysanthemum","hex":"#be454f"},{"name":"Chrysanthemum Leaf","hex":"#9db8ab"},{"name":"Chrysocolla Green","hex":"#378661"},{"name":"Chuff Blue","hex":"#91c1c6"},{"name":"Chun-Li Blue","hex":"#1559db"},{"name":"Church Mouse","hex":"#b3b5af"},{"name":"Churchill","hex":"#4d4d58"},{"name":"Chutney","hex":"#98594b"},{"name":"Chyornyi Black","hex":"#0f0809"},{"name":"Cider Mill","hex":"#938a43"},{"name":"Cider Toddy","hex":"#b98033"},{"name":"Cielo","hex":"#a5cee8"},{"name":"Cigar","hex":"#7d4e38"},{"name":"Cigar Box","hex":"#9c7351"},{"name":"Cigar Smoke","hex":"#78857a"},{"name":"Cigarette Glow","hex":"#ee5500"},{"name":"Cilantro","hex":"#43544b"},{"name":"Cinder","hex":"#242a2e"},{"name":"Cinderella","hex":"#fbd7cc"},{"name":"Cinderella Pink","hex":"#ffc6c4"},{"name":"Cinereous","hex":"#98817b"},{"name":"Cinnabar","hex":"#730113"},{"name":"Cinnamon","hex":"#d26911"},{"name":"Cinnamon Brandy","hex":"#cf8d6c"},{"name":"Cinnamon Bun","hex":"#ac4f06"},{"name":"Cinnamon Crunch","hex":"#a37d5a"},{"name":"Cinnamon Diamonds","hex":"#a97673"},{"name":"Cinnamon Frost","hex":"#d3b191"},{"name":"Cinnamon Ice","hex":"#dbbba7"},{"name":"Cinnamon Milk","hex":"#ebdab5"},{"name":"Cinnamon Roll","hex":"#c0737a"},{"name":"Cinnamon Sand","hex":"#b78153"},{"name":"Cinnamon Satin","hex":"#cd607e"},{"name":"Cinnamon Spice","hex":"#935f43"},{"name":"Cinnamon Stick","hex":"#9b4722"},{"name":"Cinnamon Stone","hex":"#c9543a"},{"name":"Cinnamon Toast","hex":"#8d7d77"},{"name":"Cinnamon Twist","hex":"#9f7250"},{"name":"Cioccolato","hex":"#5d3b2e"},{"name":"Cipher","hex":"#aa7691"},{"name":"Cipollino","hex":"#f0cfa0"},{"name":"Cippolino","hex":"#c8cec3"},{"name":"Circumorbital Ring","hex":"#6258c4"},{"name":"Circus","hex":"#fc5e30"},{"name":"Citadel","hex":"#748995"},{"name":"Citrine","hex":"#e4d00a"},{"name":"Citrine Brown","hex":"#933709"},{"name":"Citrine White","hex":"#faf7d6"},{"name":"Citrino","hex":"#e9e89b"},{"name":"Citron","hex":"#d5c757"},{"name":"Citron Goby","hex":"#deff00"},{"name":"Citronelle","hex":"#b8af23"},{"name":"Citrus","hex":"#9fb70a"},{"name":"Citrus Butter","hex":"#e4de8e"},{"name":"Citrus Delight","hex":"#d0d557"},{"name":"Citrus Honey","hex":"#f6b96b"},{"name":"Citrus Leaf","hex":"#b3d157"},{"name":"Citrus Lime","hex":"#c3dc68"},{"name":"Citrus Notes","hex":"#d26643"},{"name":"Citrus Punch","hex":"#fdea83"},{"name":"Citrus Sachet","hex":"#f2c6a7"},{"name":"Citrus Spice","hex":"#e2cd52"},{"name":"Citrus Sugar","hex":"#e6d943"},{"name":"Citrus Yellow","hex":"#d7c275"},{"name":"City Bench","hex":"#675c49"},{"name":"City Dweller","hex":"#c0b9ac"},{"name":"City Hunter Blue","hex":"#0022aa"},{"name":"City Lights","hex":"#dfe6ea"},{"name":"City Loft","hex":"#a79b8a"},{"name":"City of Pink Angels","hex":"#e6b4a6"},{"name":"City Street","hex":"#bab2ab"},{"name":"City Tower","hex":"#aeaba5"},{"name":"Cityscape","hex":"#dae3e7"},{"name":"Clair De Lune","hex":"#dbe9df"},{"name":"Clairvoyance","hex":"#838493"},{"name":"Clairvoyant","hex":"#480656"},{"name":"Clam","hex":"#dad1c0"},{"name":"Clam Shell","hex":"#d2b3a9"},{"name":"Clam Up","hex":"#ebdbc1"},{"name":"Clambake","hex":"#e0d1bb"},{"name":"Claret","hex":"#680018"},{"name":"Claret Red","hex":"#c84c61"},{"name":"Clarity","hex":"#eaf0e0"},{"name":"Clary","hex":"#684976"},{"name":"Clary Sage","hex":"#c7c0ce"},{"name":"Classic Blue","hex":"#0f4c81"},{"name":"Classic Calm","hex":"#6b8885"},{"name":"Classic Chalk","hex":"#f4f4f0"},{"name":"Classic Cloud","hex":"#9197a3"},{"name":"Classic Cool","hex":"#b7b2ac"},{"name":"Classic Green","hex":"#39a845"},{"name":"Classic Rose","hex":"#fbcce7"},{"name":"Clay","hex":"#b66a50"},{"name":"Clay Ash","hex":"#bdc8b3"},{"name":"Clay Bake","hex":"#e1c68f"},{"name":"Clay Bath","hex":"#8a7d69"},{"name":"Clay Brown","hex":"#b2713d"},{"name":"Clay Court","hex":"#a9765d"},{"name":"Clay Creek","hex":"#897e59"},{"name":"Clay Dust","hex":"#f8dca3"},{"name":"Clay Fire","hex":"#d8a686"},{"name":"Clay Pipe","hex":"#d9c8b7"},{"name":"Clay Play","hex":"#774433"},{"name":"Clay Pot","hex":"#c3663f"},{"name":"Clay Ridge","hex":"#956a66"},{"name":"Clay Terrace","hex":"#d4823c"},{"name":"Clayton","hex":"#83756c"},{"name":"Clean Green","hex":"#8fe0c6"},{"name":"Clean N Crisp","hex":"#d0e798"},{"name":"Clean Slate","hex":"#577396"},{"name":"Clear Blue","hex":"#247afd"},{"name":"Clear Brook","hex":"#60949b"},{"name":"Clear Chill","hex":"#1e90ff"},{"name":"Clear Concrete","hex":"#bab6b2"},{"name":"Clear Day","hex":"#dfefea"},{"name":"Clear Green","hex":"#12732b"},{"name":"Clear Lake Trail","hex":"#a3bbda"},{"name":"Clear Orange","hex":"#ee8800"},{"name":"Clear Plum","hex":"#64005e"},{"name":"Clear Purple","hex":"#412a7a"},{"name":"Clear Red","hex":"#ce261c"},{"name":"Clear Sand","hex":"#eae7da"},{"name":"Clear Skies","hex":"#e8f7fd"},{"name":"Clear Viridian","hex":"#367588"},{"name":"Clear Vision","hex":"#e7f0f7"},{"name":"Clear Water","hex":"#aad5db"},{"name":"Clear Yellow","hex":"#f1f1e6"},{"name":"Clearly Aqua","hex":"#cee1d4"},{"name":"Clearview","hex":"#fbfbe5"},{"name":"Clematis Blue","hex":"#363b7c"},{"name":"Clematis Magenta","hex":"#e05aec"},{"name":"Clementine","hex":"#e96e00"},{"name":"Cleo's Bath","hex":"#00507f"},{"name":"Cleopatra","hex":"#007590"},{"name":"Cleopatra's Gown","hex":"#795088"},{"name":"Cliff Brown","hex":"#d0ab8c"},{"name":"Cliff's View","hex":"#ddc5aa"},{"name":"Climate Control","hex":"#466082"},{"name":"Climbing Ivy","hex":"#58714a"},{"name":"Clinker","hex":"#463623"},{"name":"Clipped Grass","hex":"#a1b841"},{"name":"Clippership Twill","hex":"#a6937d"},{"name":"Cloak and Dagger","hex":"#550055"},{"name":"Clock Chimes Thirteen","hex":"#002211"},{"name":"Cloisonne","hex":"#0075af"},{"name":"Cloistered Garden","hex":"#99b090"},{"name":"Closed Shutter","hex":"#25252c"},{"name":"Clotted Cream","hex":"#f3efcd"},{"name":"Clotted Red","hex":"#991115"},{"name":"Cloud Abyss","hex":"#dfe7eb"},{"name":"Cloud Blue","hex":"#a2b6b9"},{"name":"Cloud Cream","hex":"#e6ddc5"},{"name":"Cloud Dancer","hex":"#f0eee9"},{"name":"Cloud Over London","hex":"#c2bcb1"},{"name":"Cloud Pink","hex":"#f5d1c8"},{"name":"Cloud White","hex":"#f2f2ed"},{"name":"Cloudberry","hex":"#ffa168"},{"name":"Cloudburst","hex":"#837f7f"},{"name":"Clouded Blue","hex":"#1f75fe"},{"name":"Clouded Sky","hex":"#7d93a2"},{"name":"Clouded Vision","hex":"#d1d0d1"},{"name":"Cloudless","hex":"#d6eafc"},{"name":"Cloudy","hex":"#d8d7d3"},{"name":"Cloudy Blue","hex":"#acc2d9"},{"name":"Cloudy Day","hex":"#dfe6da"},{"name":"Cloudy Desert","hex":"#b0a99f"},{"name":"Cloudy Grey","hex":"#ece3e1"},{"name":"Cloudy Plum","hex":"#9d7aac"},{"name":"Cloudy Sea","hex":"#6699aa"},{"name":"Cloudy Viridian","hex":"#4b5f56"},{"name":"Clove","hex":"#876155"},{"name":"Clove Dye","hex":"#a96232"},{"name":"Clovedust","hex":"#b0705d"},{"name":"Clover","hex":"#008f00"},{"name":"Clover Honey","hex":"#f0e2bc"},{"name":"Clover Mist","hex":"#6fc288"},{"name":"Clown Nose","hex":"#e94257"},{"name":"Club Cruise","hex":"#8bc3e1"},{"name":"Club Moss","hex":"#6b977a"},{"name":"Club-Mate","hex":"#f8de7e"},{"name":"Co Pilot","hex":"#4978a9"},{"name":"Coal Miner","hex":"#777872"},{"name":"Coalmine","hex":"#220033"},{"name":"Coarse Wool","hex":"#181b26"},{"name":"Coastal Breeze","hex":"#e0f6fb"},{"name":"Coastal Calm","hex":"#538f94"},{"name":"Coastal Crush","hex":"#b4c0af"},{"name":"Coastal Fjord","hex":"#505d7e"},{"name":"Coastal Foam","hex":"#b0e5c9"},{"name":"Coastal Fringe","hex":"#80b9c0"},{"name":"Coastal Surf","hex":"#2d4982"},{"name":"Coastal Trim","hex":"#bdffca"},{"name":"Coastline Trail","hex":"#6e6c5b"},{"name":"Cobalite","hex":"#9999ff"},{"name":"Cobalt","hex":"#030aa7"},{"name":"Cobalt Glaze","hex":"#0072b5"},{"name":"Cobalt Stone","hex":"#0264ae"},{"name":"Cobbler","hex":"#c4ab7d"},{"name":"Cobblestone","hex":"#a89a8e"},{"name":"Cobblestone Path","hex":"#9e8779"},{"name":"Cobblestone Street","hex":"#cfc7b9"},{"name":"Cobra Leather","hex":"#b08e08"},{"name":"Cobre","hex":"#996515"},{"name":"Coca Mocha","hex":"#bd9d95"},{"name":"Cochin Chicken","hex":"#f8b862"},{"name":"Cochineal Red/Rouge","hex":"#9d2933"},{"name":"Cochise","hex":"#ddcdb3"},{"name":"Cockatoo","hex":"#58c8b6"},{"name":"Cockatrice Brown","hex":"#a46422"},{"name":"Cocktail Olive","hex":"#9fa36c"},{"name":"Cocoa","hex":"#875f42"},{"name":"Cocoa Bean","hex":"#4f3835"},{"name":"Cocoa Brown","hex":"#35281e"},{"name":"Cocoa Butter","hex":"#f5f4c1"},{"name":"Cocoa Cream","hex":"#dbc8b6"},{"name":"Cocoa Cupcake","hex":"#967859"},{"name":"Cocoa Delight","hex":"#8d725a"},{"name":"Cocoa Milk","hex":"#7d675d"},{"name":"Cocoa Pecan","hex":"#967b5d"},{"name":"Cocoa Powder","hex":"#766a5f"},{"name":"Cocobolo","hex":"#784848"},{"name":"Cocoloco","hex":"#aa8f7a"},{"name":"Coconut","hex":"#965a3e"},{"name":"Coconut Aroma","hex":"#eeeedd"},{"name":"Coconut Butter","hex":"#f2efe1"},{"name":"Coconut Cream","hex":"#e1dabb"},{"name":"Coconut Husk","hex":"#7d6044"},{"name":"Coconut Milk","hex":"#f0ede5"},{"name":"Coconut Pulp","hex":"#fbf9e1"},{"name":"Coconut Shell","hex":"#917a56"},{"name":"Coconut White","hex":"#e9edf6"},{"name":"Cocoon","hex":"#dedbcc"},{"name":"Cod Grey","hex":"#2d3032"},{"name":"Codex Grey","hex":"#9c9c9c"},{"name":"Codium Fragile","hex":"#524b2a"},{"name":"Coelia Greenshade","hex":"#0e7f78"},{"name":"Coffee","hex":"#6f4e37"},{"name":"Coffee Addiction","hex":"#883300"},{"name":"Coffee Bar","hex":"#825c43"},{"name":"Coffee Bean","hex":"#362d26"},{"name":"Coffee Clay","hex":"#b7997c"},{"name":"Coffee Cream","hex":"#fff2d7"},{"name":"Coffee Custard","hex":"#ab9b9c"},{"name":"Coffee Diva","hex":"#bea88d"},{"name":"Coffee House","hex":"#6c5b4d"},{"name":"Coffee Kiss","hex":"#b19576"},{"name":"Coffee Liqueur","hex":"#6a513b"},{"name":"Coffee Rose","hex":"#a9898d"},{"name":"Coffee With Cream","hex":"#a68966"},{"name":"Cognac","hex":"#d48c46"},{"name":"Coin Purse","hex":"#e0d5e3"},{"name":"Coincidence","hex":"#c7de88"},{"name":"Cola","hex":"#3c2f23"},{"name":"Cola Bubble","hex":"#3c3024"},{"name":"Cold Brew Coffee","hex":"#726751"},{"name":"Cold Current","hex":"#234272"},{"name":"Cold Grey","hex":"#9f9f9f"},{"name":"Cold Light","hex":"#dde3e6"},{"name":"Cold Lips","hex":"#9ba0ef"},{"name":"Cold Morning","hex":"#e6e5e4"},{"name":"Cold Pilsner","hex":"#d09351"},{"name":"Cold Purple","hex":"#9d8abf"},{"name":"Cold Sea Currents","hex":"#32545e"},{"name":"Cold Steel","hex":"#262335"},{"name":"Cold Turkey","hex":"#cab5b2"},{"name":"Cold Water","hex":"#d9dfe0"},{"name":"Cold Wind","hex":"#e1e3e4"},{"name":"Collard Green","hex":"#536861"},{"name":"Cologne","hex":"#75bfd2"},{"name":"Colonel Mustard","hex":"#b68238"},{"name":"Colonial Aqua","hex":"#a1bdbf"},{"name":"Colonial Blue","hex":"#2d6471"},{"name":"Colonial White","hex":"#ffedbc"},{"name":"Colony","hex":"#67a195"},{"name":"Colony Blue","hex":"#65769a"},{"name":"Color Me Green","hex":"#7cb77b"},{"name":"Colorado Dawn","hex":"#e09cab"},{"name":"Colorado Peach","hex":"#e6994c"},{"name":"Colorado Peak","hex":"#9c9ba7"},{"name":"Colorado Trail","hex":"#b49375"},{"name":"Colossus","hex":"#625c91"},{"name":"Columbia","hex":"#009288"},{"name":"Columbia Blue","hex":"#9bddff"},{"name":"Columbus","hex":"#5f758f"},{"name":"Colusa Wetlands","hex":"#7f725c"},{"name":"Combed Cotton","hex":"#f4f0de"},{"name":"Comet","hex":"#636373"},{"name":"Comfort","hex":"#e3ceb8"},{"name":"Comfrey","hex":"#5b7961"},{"name":"Commandes","hex":"#0b597c"},{"name":"Commercial White","hex":"#edece6"},{"name":"Common Chestnut","hex":"#cd5c5c"},{"name":"Common Dandelion","hex":"#fed85d"},{"name":"Common Feldspar","hex":"#858f94"},{"name":"Common Teal","hex":"#009193"},{"name":"Community","hex":"#d0b997"},{"name":"Como","hex":"#4c785c"},{"name":"Compact Disc Grey","hex":"#cdcdcd"},{"name":"Concealment","hex":"#405852"},{"name":"Conceptual","hex":"#7ac34f"},{"name":"Conch","hex":"#a0b1ae"},{"name":"Conch Pink","hex":"#dba496"},{"name":"Conch Shell","hex":"#fc8f9b"},{"name":"Conclave","hex":"#abb9d7"},{"name":"Concord","hex":"#827f79"},{"name":"Concord Grape","hex":"#7c5379"},{"name":"Concord Jam","hex":"#695a82"},{"name":"Concrete","hex":"#d2d1cd"},{"name":"Concrete Jungle","hex":"#999988"},{"name":"Condiment","hex":"#b98142"},{"name":"Conditioner","hex":"#ffffcc"},{"name":"Confederate","hex":"#5c6272"},{"name":"Confetti","hex":"#ddcb46"},{"name":"Confidence","hex":"#a98a6b"},{"name":"Confident Yellow","hex":"#ffcc13"},{"name":"Cōng Lǜ Green","hex":"#01c08d"},{"name":"Congo","hex":"#e8c3be"},{"name":"Congo Brown","hex":"#654d49"},{"name":"Congo Capture","hex":"#776959"},{"name":"Congo Green","hex":"#00a483"},{"name":"Congo Pink","hex":"#f98379"},{"name":"Congress Blue","hex":"#02478e"},{"name":"Conifer","hex":"#b1dd52"},{"name":"Conifer Blossom","hex":"#ffdd49"},{"name":"Conker","hex":"#b94e41"},{"name":"Conker Brown","hex":"#552200"},{"name":"Conservation","hex":"#796e54"},{"name":"Conspiracy Velvet","hex":"#57465d"},{"name":"Constellation","hex":"#bccedb"},{"name":"Contessa","hex":"#c16f68"},{"name":"Continental Waters","hex":"#98c6cb"},{"name":"Contrail","hex":"#dedeff"},{"name":"Cook's Bay","hex":"#014e83"},{"name":"Cookie Crumb","hex":"#b19778"},{"name":"Cookie Dough","hex":"#ab7100"},{"name":"Cookies And Cream","hex":"#eee0b1"},{"name":"Cool","hex":"#96b3b3"},{"name":"Cool Black","hex":"#002e63"},{"name":"Cool Blue","hex":"#4984b8"},{"name":"Cool Camel","hex":"#ae996b"},{"name":"Cool Camo","hex":"#827566"},{"name":"Cool Cantaloupe","hex":"#f1d3ca"},{"name":"Cool Charcoal","hex":"#807b76"},{"name":"Cool Clay","hex":"#ba947b"},{"name":"Cool Concrete","hex":"#d9d0c1"},{"name":"Cool Copper","hex":"#ad8458"},{"name":"Cool Crayon","hex":"#b0e6e3"},{"name":"Cool Current","hex":"#283c44"},{"name":"Cool December","hex":"#fdfbf8"},{"name":"Cool Dive","hex":"#00606f"},{"name":"Cool Frost","hex":"#e7e6ed"},{"name":"Cool Green","hex":"#33b864"},{"name":"Cool Grey","hex":"#8c93ad"},{"name":"Cool Icicle","hex":"#e1eee6"},{"name":"Cool Lavender","hex":"#b3a6a5"},{"name":"Cool Melon","hex":"#ebd1cd"},{"name":"Cool Purple","hex":"#aa23ff"},{"name":"Cool Quiet","hex":"#cbb5c6"},{"name":"Cool Slate","hex":"#d0ccc5"},{"name":"Cool Touch","hex":"#7295c9"},{"name":"Cool Waters","hex":"#487678"},{"name":"Cool Yellow","hex":"#eaefce"},{"name":"Cooled Cream","hex":"#fadc97"},{"name":"Cooling Trend","hex":"#e6e2e4"},{"name":"Copacabana","hex":"#006c8d"},{"name":"Copacabana Sand","hex":"#e5d68e"},{"name":"Copen Blue","hex":"#516b84"},{"name":"Copenhagen","hex":"#adc8c0"},{"name":"Copper","hex":"#b87333"},{"name":"Copper Beech","hex":"#b1715a"},{"name":"Copper Blush","hex":"#e8c1ab"},{"name":"Copper Brown","hex":"#9a6051"},{"name":"Copper Canyon","hex":"#77422c"},{"name":"Copper Coin","hex":"#da8a67"},{"name":"Copper Cove","hex":"#d89166"},{"name":"Copper Creek","hex":"#a35d31"},{"name":"Copper Lake","hex":"#c09078"},{"name":"Copper Mining","hex":"#945c54"},{"name":"Copper Penny","hex":"#ad6f69"},{"name":"Copper Pipe","hex":"#da8f67"},{"name":"Copper Pot","hex":"#936647"},{"name":"Copper Red","hex":"#cb6d51"},{"name":"Copper River","hex":"#f7a270"},{"name":"Copper Rose","hex":"#996666"},{"name":"Copper Rust","hex":"#95524c"},{"name":"Copper Tan","hex":"#de8e65"},{"name":"Copper Trail","hex":"#c18978"},{"name":"Copper Turquoise","hex":"#38887f"},{"name":"Copper Wire","hex":"#db8b67"},{"name":"Copperfield","hex":"#da8a88"},{"name":"Coppersmith","hex":"#d98a3f"},{"name":"Coppery Orange","hex":"#7f4330"},{"name":"Copra","hex":"#654636"},{"name":"Coquelicot","hex":"#ff3800"},{"name":"Cor-de-pele","hex":"#f4c2c2"},{"name":"Coral","hex":"#ff7f50"},{"name":"Coral Almond","hex":"#e29d94"},{"name":"Coral Atoll","hex":"#dc938d"},{"name":"Coral Bisque","hex":"#f7c6b1"},{"name":"Coral Blossom","hex":"#f7bea2"},{"name":"Coral Blush","hex":"#e5a090"},{"name":"Coral Burst","hex":"#dd5544"},{"name":"Coral Candy","hex":"#f5d0c9"},{"name":"Coral Clay","hex":"#c2b1a1"},{"name":"Coral Cloud","hex":"#e2a9a1"},{"name":"Coral Coast","hex":"#068e9e"},{"name":"Coral Cornsnake","hex":"#e9adca"},{"name":"Coral Cove","hex":"#dda69f"},{"name":"Coral Cream","hex":"#ead6ce"},{"name":"Coral Dusk","hex":"#ffb48a"},{"name":"Coral Dust","hex":"#edaa86"},{"name":"Coral Garden","hex":"#cf8179"},{"name":"Coral Gold","hex":"#d27d56"},{"name":"Coral Haze","hex":"#e38e84"},{"name":"Coral Kiss","hex":"#ffddc7"},{"name":"Coral Pink","hex":"#f88379"},{"name":"Coral Quartz","hex":"#f77464"},{"name":"Coral Red","hex":"#ff4040"},{"name":"Coral Reef","hex":"#c7bca2"},{"name":"Coral Rose","hex":"#f3774d"},{"name":"Coral Sand","hex":"#ca884e"},{"name":"Coral Serenade","hex":"#f9a48e"},{"name":"Coral Silk","hex":"#f2a37d"},{"name":"Coral Tree","hex":"#ab6e67"},{"name":"Corally","hex":"#fea89f"},{"name":"Corbeau","hex":"#111122"},{"name":"Cordovan","hex":"#893f45"},{"name":"Corduroy","hex":"#404d49"},{"name":"Corfu Shallows","hex":"#008e8d"},{"name":"Corfu Sky","hex":"#8993c3"},{"name":"Corfu Waters","hex":"#008aad"},{"name":"Coriander","hex":"#bbb58d"},{"name":"Corinthian Column","hex":"#dedecf"},{"name":"Cork","hex":"#5a4c42"},{"name":"Cork Bark","hex":"#7e6b43"},{"name":"Cork Brown","hex":"#cc8855"},{"name":"Corkboard","hex":"#9d805d"},{"name":"Corkscrew Willow","hex":"#d1b9ab"},{"name":"Corn","hex":"#fbec5d"},{"name":"Corn Bread","hex":"#eec657"},{"name":"Corn Field","hex":"#f8f3c4"},{"name":"Corn Harvest","hex":"#8d702a"},{"name":"Corn Husk","hex":"#f2d6ae"},{"name":"Corn Kernel","hex":"#ffcba4"},{"name":"Corn Snake","hex":"#ab6134"},{"name":"Cornell Red","hex":"#b31b11"},{"name":"Cornerstone","hex":"#e3d7bb"},{"name":"Cornflake","hex":"#f0e68c"},{"name":"Cornflower","hex":"#5170d7"},{"name":"Cornflower Lilac","hex":"#ffb0ac"},{"name":"Cornsilk","hex":"#fff8dc"},{"name":"Cornsilk Yellow","hex":"#f4c96c"},{"name":"Cornstalk","hex":"#a9947a"},{"name":"Cornucopia","hex":"#ed9b44"},{"name":"Corona","hex":"#ffb437"},{"name":"Coronado Moss","hex":"#9ba591"},{"name":"Coronation","hex":"#edecec"},{"name":"Coronet Blue","hex":"#59728e"},{"name":"Corporate Green","hex":"#78a486"},{"name":"Corral","hex":"#61513d"},{"name":"Corsair","hex":"#18576c"},{"name":"Corsican","hex":"#85ac9d"},{"name":"Corsican Blue","hex":"#646093"},{"name":"Cortex","hex":"#a99592"},{"name":"Cortez Chocolate","hex":"#a4896a"},{"name":"Corvette","hex":"#e9ba81"},{"name":"Corydalis Blue","hex":"#a9cada"},{"name":"Cos","hex":"#a4c48e"},{"name":"Cosmic","hex":"#b8b9cb"},{"name":"Cosmic Aura","hex":"#cfb3a6"},{"name":"Cosmic Cobalt","hex":"#2e2d88"},{"name":"Cosmic Dust","hex":"#dce2e5"},{"name":"Cosmic Energy","hex":"#9392ab"},{"name":"Cosmic Latte","hex":"#fff8e7"},{"name":"Cosmic Ray","hex":"#cadada"},{"name":"Cosmic Sky","hex":"#aaaac4"},{"name":"Cosmo Purple","hex":"#a09bc6"},{"name":"Cosmopolitan","hex":"#528bab"},{"name":"Cosmos","hex":"#fcd5cf"},{"name":"Cossack Dancer","hex":"#4d8aa1"},{"name":"Costa Del Sol","hex":"#625d2a"},{"name":"Costa Rican Palm","hex":"#c44041"},{"name":"Cotswold Dill","hex":"#dbcdad"},{"name":"Cottage Green","hex":"#dcecdc"},{"name":"Cottage White","hex":"#f7efdd"},{"name":"Cotton Ball","hex":"#f2f7fd"},{"name":"Cotton Candy","hex":"#ffbcd9"},{"name":"Cotton Cardigan","hex":"#7596b8"},{"name":"Cotton Cloth","hex":"#faf4d4"},{"name":"Cotton Club","hex":"#f3e4d3"},{"name":"Cotton Field","hex":"#f2f0e8"},{"name":"Cotton Flannel","hex":"#9090a2"},{"name":"Cotton Puff","hex":"#ffffe7"},{"name":"Cotton Seed","hex":"#bfbaaf"},{"name":"Cotton Tail","hex":"#fff8d7"},{"name":"Cotton Wool Blue","hex":"#83abd2"},{"name":"Country Air","hex":"#9fb6c6"},{"name":"Country Blue","hex":"#717f9b"},{"name":"Country Charm","hex":"#c7c0a7"},{"name":"Country Club","hex":"#948675"},{"name":"Country Cottage","hex":"#d9c1b7"},{"name":"Country Rubble","hex":"#d0bca2"},{"name":"Country Sky","hex":"#49545a"},{"name":"Country Sleigh","hex":"#7e4337"},{"name":"Country Summer","hex":"#fffbd7"},{"name":"County Green","hex":"#1b4b35"},{"name":"Court Jester","hex":"#926d9d"},{"name":"Courtyard Green","hex":"#978d71"},{"name":"Couscous","hex":"#ffe29b"},{"name":"Cousteau","hex":"#55a9d6"},{"name":"Cover of Night","hex":"#494e4f"},{"name":"Covered in Platinum","hex":"#b9baba"},{"name":"Covered Wagon","hex":"#726449"},{"name":"Covert Green","hex":"#80765f"},{"name":"Cow's Milk","hex":"#f1ede5"},{"name":"Cowardly Custard","hex":"#fbf1c0"},{"name":"Cowboy","hex":"#443736"},{"name":"Cowboy Hat","hex":"#b27d50"},{"name":"Cowboy Trails","hex":"#8d6b4b"},{"name":"Cowgirl Boots","hex":"#9e7c60"},{"name":"Cowhide","hex":"#884344"},{"name":"Cowpeas","hex":"#661100"},{"name":"Coy","hex":"#fff4f3"},{"name":"Coyote","hex":"#dc9b68"},{"name":"Coyote Brown","hex":"#81613c"},{"name":"Coyote Tracks","hex":"#b08f7f"},{"name":"Cozy Cottage","hex":"#f2ddd8"},{"name":"Cozy Cover","hex":"#e4c38f"},{"name":"Cozy Cream","hex":"#e0dbc7"},{"name":"Cozy Wool","hex":"#d1b99b"},{"name":"Crab Bisque","hex":"#f0b599"},{"name":"Crabapple","hex":"#87382f"},{"name":"Cracked Earth","hex":"#c5b1a0"},{"name":"Cracked Slate","hex":"#69656a"},{"name":"Cracker Bitz","hex":"#d1b088"},{"name":"Cracker Crumbs","hex":"#d3b9b0"},{"name":"Crackled Leather","hex":"#a27c4f"},{"name":"Crackling Lake","hex":"#b3c5cc"},{"name":"Cradle Pillow","hex":"#f1d3d9"},{"name":"Cradle Pink","hex":"#edd0dd"},{"name":"Craft","hex":"#293b4a"},{"name":"Craftsman Gold","hex":"#d3b78b"},{"name":"Craggy Skin","hex":"#f7bd7b"},{"name":"Crail","hex":"#a65648"},{"name":"Cranapple","hex":"#db8079"},{"name":"Cranberry","hex":"#9e003a"},{"name":"Cranberry Pie","hex":"#c27277"},{"name":"Cranberry Sauce","hex":"#a53756"},{"name":"Cranberry Splash","hex":"#da5265"},{"name":"Crash Pink","hex":"#cc88ff"},{"name":"Crashing Waves","hex":"#3e6f87"},{"name":"Crater Brown","hex":"#4d3e3c"},{"name":"Cray","hex":"#bc763c"},{"name":"Crayola Green","hex":"#1dac78"},{"name":"Crayola Orange","hex":"#fe7438"},{"name":"Crazy","hex":"#e5cb3f"},{"name":"Crazy Eyes","hex":"#5eb68d"},{"name":"Crazy Horse Mountain","hex":"#e9dbd2"},{"name":"Cream","hex":"#ffffc2"},{"name":"Cream Blush","hex":"#f8c19a"},{"name":"Cream Cake","hex":"#e3d0ad"},{"name":"Cream Can","hex":"#eec051"},{"name":"Cream Cheese Frosting","hex":"#f4efe2"},{"name":"Cream Filling","hex":"#f5f1da"},{"name":"Cream Gold","hex":"#dec05f"},{"name":"Cream Pink","hex":"#f6e4d9"},{"name":"Cream Puff","hex":"#eee9dc"},{"name":"Cream Tan","hex":"#e4c7b8"},{"name":"Cream Washed","hex":"#f2e0c5"},{"name":"Cream Wave","hex":"#e8dbc5"},{"name":"Creamed Avocado","hex":"#70804d"},{"name":"Creamed Butter","hex":"#fffcd3"},{"name":"Creamed Caramel","hex":"#b79c94"},{"name":"Creamed Muscat","hex":"#8b6962"},{"name":"Creamed Raspberry","hex":"#bd6883"},{"name":"Creamy Apricot","hex":"#ffe8bd"},{"name":"Creamy Axolotl","hex":"#ffdae8"},{"name":"Creamy Cameo","hex":"#f9eedc"},{"name":"Creamy Cappuccino","hex":"#dbccb5"},{"name":"Creamy Caramel","hex":"#b3956c"},{"name":"Creamy Chenille","hex":"#e1cfaf"},{"name":"Creamy Coral","hex":"#dd7788"},{"name":"Creamy Corn","hex":"#fff2c2"},{"name":"Creamy Custard","hex":"#f9e7bf"},{"name":"Creamy Gelato","hex":"#f0e2c5"},{"name":"Creamy Ivory","hex":"#eeddaa"},{"name":"Creamy Mauve","hex":"#dccad8"},{"name":"Creamy Mint","hex":"#aaffaa"},{"name":"Creamy Peach","hex":"#f4a384"},{"name":"Creamy Strawberry","hex":"#fcd2df"},{"name":"Creamy White","hex":"#f0e9d6"},{"name":"Crease","hex":"#7a6d44"},{"name":"Credo","hex":"#dcba42"},{"name":"Creed","hex":"#c1a44a"},{"name":"Creek Bay","hex":"#ab9d89"},{"name":"Creeping Bellflower","hex":"#b48ac2"},{"name":"Crema","hex":"#c16104"},{"name":"Creme","hex":"#ffffb6"},{"name":"Creme Brulee","hex":"#ffe39b"},{"name":"Crème de la Crème","hex":"#f3e7b4"},{"name":"Crème de Menthe","hex":"#f1fde9"},{"name":"Creme De Peche","hex":"#f5d6c6"},{"name":"Crème fraîche","hex":"#f7f0e2"},{"name":"Cremini","hex":"#cfa33b"},{"name":"Creole","hex":"#393227"},{"name":"Creole Pink","hex":"#f7d5cc"},{"name":"Creole Sauce","hex":"#ee8833"},{"name":"Crepe","hex":"#d4bc94"},{"name":"Crepe Myrtle","hex":"#e399ca"},{"name":"Crêpe Papier","hex":"#dbd7c4"},{"name":"Crescendo","hex":"#e3df84"},{"name":"Crescent Moon","hex":"#f1e9cf"},{"name":"Cress Green","hex":"#bca949"},{"name":"Cress Vinaigrette","hex":"#bcb58a"},{"name":"Cressida","hex":"#8aae7c"},{"name":"Crestline","hex":"#b4bcbf"},{"name":"Cretan Green","hex":"#598784"},{"name":"Crete","hex":"#77712b"},{"name":"Cria Wool","hex":"#e4d5bc"},{"name":"Cricket Chirping","hex":"#c7c10c"},{"name":"Cricket Green","hex":"#6a7b6b"},{"name":"Cricket's Cross","hex":"#908a78"},{"name":"Crimson","hex":"#8c000f"},{"name":"Crimson Glory","hex":"#be0032"},{"name":"Crimson Red","hex":"#980001"},{"name":"Crimson Strawberry","hex":"#9f2d47"},{"name":"Crisis Red","hex":"#bb2222"},{"name":"Crisp","hex":"#eaebaf"},{"name":"Crisp Candlelight","hex":"#f4ebd0"},{"name":"Crisp Capsicum","hex":"#5d6e3b"},{"name":"Crisp Lettuce","hex":"#4f9785"},{"name":"Crisp Muslin","hex":"#e9e2d7"},{"name":"Crisp Wonton","hex":"#f3dcc6"},{"name":"Crispy Chicken Skin","hex":"#ddaa44"},{"name":"Crocker Grove","hex":"#b1a685"},{"name":"Crockery","hex":"#a49887"},{"name":"Crocodile","hex":"#706950"},{"name":"Crocodile Smile","hex":"#898e58"},{"name":"Crocodile Tears","hex":"#d6d69b"},{"name":"Crocodile Tooth","hex":"#d1ccc2"},{"name":"Crocus","hex":"#c67fae"},{"name":"Crocus Petal","hex":"#b99bc5"},{"name":"Croissant","hex":"#c4ab86"},{"name":"Crop Circle","hex":"#e9bf63"},{"name":"Croque Monsieur","hex":"#ac9877"},{"name":"Cross My Heart","hex":"#ad2a2d"},{"name":"Crossbow","hex":"#60543f"},{"name":"Crossed Fingers","hex":"#ddb596"},{"name":"Crossroads","hex":"#edd2a3"},{"name":"Crow Wing","hex":"#180614"},{"name":"Crowberry","hex":"#220055"},{"name":"Crown Blue","hex":"#464b65"},{"name":"Crown Gold","hex":"#b48c60"},{"name":"Crown Jewel","hex":"#482d54"},{"name":"Crown of Thorns","hex":"#763c33"},{"name":"Crown Point Cream","hex":"#fff0c1"},{"name":"Crowshead","hex":"#1c1208"},{"name":"Crude Banana","hex":"#21c40e"},{"name":"Cruel Ruby","hex":"#dd3344"},{"name":"Cruel Sea","hex":"#213638"},{"name":"Cruise","hex":"#b4e2d5"},{"name":"Crumble Topping","hex":"#efcea0"},{"name":"Crunch","hex":"#f2b95f"},{"name":"Crushed Almond","hex":"#d4cac5"},{"name":"Crushed Berries","hex":"#d15b9b"},{"name":"Crushed Berry","hex":"#804f5a"},{"name":"Crushed Cashew","hex":"#ffedd5"},{"name":"Crushed Cinnamon","hex":"#b7735e"},{"name":"Crushed Grape","hex":"#7a547f"},{"name":"Crushed Ice","hex":"#c4fff7"},{"name":"Crushed Limestone","hex":"#d6ddd3"},{"name":"Crushed Pineapple","hex":"#efcc44"},{"name":"Crushed Raspberry","hex":"#b06880"},{"name":"Crushed Silk","hex":"#d8cfbe"},{"name":"Crushed Stone","hex":"#bcaa9f"},{"name":"Crushed Velvet","hex":"#445397"},{"name":"Crushed Violets","hex":"#643a4c"},{"name":"Crusoe","hex":"#165b31"},{"name":"Crust","hex":"#898076"},{"name":"Crusta","hex":"#f38653"},{"name":"Crustose Lichen","hex":"#c04e01"},{"name":"Cry Baby Blue","hex":"#c3d4e7"},{"name":"Crypt","hex":"#373b40"},{"name":"Cryptic Light","hex":"#6d434e"},{"name":"Crystal","hex":"#a7d8de"},{"name":"Crystal Apple","hex":"#cee9a0"},{"name":"Crystal Ball","hex":"#365955"},{"name":"Crystal Bell","hex":"#efeeef"},{"name":"Crystal Blue","hex":"#68a0b0"},{"name":"Crystal Brooke","hex":"#e4e6dc"},{"name":"Crystal Clear","hex":"#f4e9ea"},{"name":"Crystal Falls","hex":"#e1e6f2"},{"name":"Crystal Gem","hex":"#79d0a7"},{"name":"Crystal Glass","hex":"#ddffee"},{"name":"Crystal Grey","hex":"#d7cbc4"},{"name":"Crystal Haze","hex":"#e7e2d6"},{"name":"Crystal Lake","hex":"#88b5c4"},{"name":"Crystal Oasis","hex":"#afc7bf"},{"name":"Crystal Palace","hex":"#d3cfab"},{"name":"Crystal Pink","hex":"#edd0ce"},{"name":"Crystal River","hex":"#b1e2ee"},{"name":"Crystal Rose","hex":"#fdc3c6"},{"name":"Crystal Seas","hex":"#5dafce"},{"name":"Crystal Teal","hex":"#00637c"},{"name":"Crystalsong Blue","hex":"#4fb3b3"},{"name":"Cub","hex":"#6e5c4b"},{"name":"Cub Scout","hex":"#4e6341"},{"name":"Cuba Brown","hex":"#623d3d"},{"name":"Cuba Libre","hex":"#73383c"},{"name":"Cuban Cigar","hex":"#927247"},{"name":"Cuban Rhythm","hex":"#9b555d"},{"name":"Cuban Sand","hex":"#c1a68d"},{"name":"Cucumber","hex":"#006400"},{"name":"Cucumber Cream","hex":"#e4ebb1"},{"name":"Cucumber Crush","hex":"#a2ac86"},{"name":"Cucumber Ice","hex":"#cdd79d"},{"name":"Cuddle","hex":"#bccae8"},{"name":"Cuddlepot","hex":"#ad8068"},{"name":"Cuddly Yarn","hex":"#fffce4"},{"name":"Culpeo","hex":"#e69b3a"},{"name":"Cultured","hex":"#f6f4f5"},{"name":"Cultured Rose","hex":"#e5867b"},{"name":"Cumberland Fog","hex":"#dadbdf"},{"name":"Cumin","hex":"#a58459"},{"name":"Cumquat Cream","hex":"#f19b7d"},{"name":"Cumulus","hex":"#f3f3e6"},{"name":"Cumulus Cloud","hex":"#b0c6df"},{"name":"Cupcake Rose","hex":"#e6c7b7"},{"name":"Cupid","hex":"#f5b2c5"},{"name":"Cupid's Arrow","hex":"#ee6b8b"},{"name":"Cupid's Revenge","hex":"#eedcdf"},{"name":"Cuppa Coffee","hex":"#b09f8f"},{"name":"Curd","hex":"#f8e1ba"},{"name":"Curds and Whey","hex":"#bca483"},{"name":"Cure All","hex":"#aa6988"},{"name":"Cured Eggplant","hex":"#380835"},{"name":"Curious","hex":"#d9e49e"},{"name":"Curious Blue","hex":"#3d85b8"},{"name":"Curious Chipmunk","hex":"#dabfa4"},{"name":"Curlew","hex":"#766859"},{"name":"Curly Maple","hex":"#d8c8be"},{"name":"Curry","hex":"#be9e6f"},{"name":"Curry Sauce","hex":"#d6a332"},{"name":"Currywurst","hex":"#ddaa33"},{"name":"Curtsy","hex":"#ffd6b8"},{"name":"Cushion Bush","hex":"#c1c8af"},{"name":"Custard","hex":"#fffd78"},{"name":"Custard Powder","hex":"#f8dcaa"},{"name":"Custard Puff","hex":"#fceeae"},{"name":"Cute Pixie","hex":"#8d8d40"},{"name":"Cuticle Pink","hex":"#e3a49a"},{"name":"Cutlery Polish","hex":"#f4dda5"},{"name":"Cuttlefish","hex":"#7fbbc2"},{"name":"Cutty Sark","hex":"#5c8173"},{"name":"Cyan","hex":"#0ff0fe"},{"name":"Cyan Azure","hex":"#4e82b4"},{"name":"Cyan Blue","hex":"#14a3c7"},{"name":"Cyan Cobalt Blue","hex":"#28589c"},{"name":"Cyan Cornflower Blue","hex":"#188bc2"},{"name":"Cyanara","hex":"#779080"},{"name":"Cyanite","hex":"#00b7eb"},{"name":"Cyber Grape","hex":"#58427c"},{"name":"Cyber Lavender","hex":"#e6e6fa"},{"name":"Cyber Yellow","hex":"#ffd400"},{"name":"Cyclamen","hex":"#d687ba"},{"name":"Cymophane Yellow","hex":"#f3e4a7"},{"name":"Cynical Black","hex":"#171717"},{"name":"Cypress","hex":"#545a3e"},{"name":"Cypress Bark Red","hex":"#6f3028"},{"name":"Cypress Garden","hex":"#667c71"},{"name":"Cyprus","hex":"#0f4645"},{"name":"Cyprus Spring","hex":"#acb7b0"},{"name":"Cyrus Grass","hex":"#cfc5a7"},{"name":"Czech Bakery","hex":"#dec9a9"},{"name":"D. Darx Blue","hex":"#030764"},{"name":"Da Blues","hex":"#516172"},{"name":"Dachshund","hex":"#704f37"},{"name":"Dad's Coupe","hex":"#2f484e"},{"name":"Daddy-O","hex":"#b0af8a"},{"name":"Daemonette Hide","hex":"#696684"},{"name":"Daffodil","hex":"#ffff31"},{"name":"Dagger Moth","hex":"#e8e1d5"},{"name":"Dahlia","hex":"#843e83"},{"name":"Dahlia Mauve","hex":"#a64f82"},{"name":"Dahlia Purple","hex":"#7e6eac"},{"name":"Daikon White","hex":"#d4d4c4"},{"name":"Daintree","hex":"#012731"},{"name":"Dainty Flower","hex":"#e9dfe5"},{"name":"Daiquiri Green","hex":"#c9d77e"},{"name":"Dairy Cream","hex":"#edd2a4"},{"name":"Dairy Made","hex":"#f0b33c"},{"name":"Daisy Bush","hex":"#5b3e90"},{"name":"Daisy Chain","hex":"#fff09b"},{"name":"Daisy Desi","hex":"#fcdf8a"},{"name":"Daisy Leaf","hex":"#55643b"},{"name":"Daisy White","hex":"#f8f3e3"},{"name":"Dallas","hex":"#664a2d"},{"name":"Dallas Dust","hex":"#ece0d6"},{"name":"Dalmatian Sage","hex":"#97a3da"},{"name":"Daly Waters","hex":"#afdadf"},{"name":"Damask","hex":"#fcf2df"},{"name":"Dame Dignity","hex":"#999ba8"},{"name":"Damson","hex":"#854c65"},{"name":"Damson Plum","hex":"#dda0dd"},{"name":"Dana","hex":"#576780"},{"name":"Dance Studio","hex":"#064d83"},{"name":"Dancer","hex":"#dc9399"},{"name":"Dancing Daisy","hex":"#efc857"},{"name":"Dancing Dogs","hex":"#6e493d"},{"name":"Dancing Dolphin","hex":"#c4baa1"},{"name":"Dancing Dragonfly","hex":"#006658"},{"name":"Dancing Kite","hex":"#c8cc9e"},{"name":"Dancing Wand","hex":"#c8a4bd"},{"name":"Dancing-Lady Orchid","hex":"#dfff00"},{"name":"Dandelion","hex":"#fedf08"},{"name":"Dandelion Floatie","hex":"#eae8ec"},{"name":"Dandelion Tincture","hex":"#f0e130"},{"name":"Dandelion Wine","hex":"#fcf2b9"},{"name":"Dandelion Yellow","hex":"#fcd93b"},{"name":"Danger Ridge","hex":"#595539"},{"name":"Dangerous Robot","hex":"#cbc5c6"},{"name":"Dangerously Red","hex":"#d84139"},{"name":"Daniel Boon","hex":"#5e4235"},{"name":"Dante Peak","hex":"#b4d5d5"},{"name":"Danube","hex":"#5b89c0"},{"name":"Daphne","hex":"#0f5f9a"},{"name":"Daphne Rose","hex":"#c37cb3"},{"name":"Dapper Dingo","hex":"#e2c299"},{"name":"Dapper Greyhound","hex":"#697078"},{"name":"Dapple Grey","hex":"#959486"},{"name":"Daring Indigo","hex":"#374874"},{"name":"Dark","hex":"#1b2431"},{"name":"Dark & Stormy","hex":"#353f51"},{"name":"Dark Al-Amira","hex":"#3a403b"},{"name":"Dark Angels Green","hex":"#005c2b"},{"name":"Dark Aqua","hex":"#05696b"},{"name":"Dark Aquamarine","hex":"#017371"},{"name":"Dark Ash","hex":"#8c8475"},{"name":"Dark Beetroot","hex":"#50314c"},{"name":"Dark Beige","hex":"#ac9362"},{"name":"Dark Blue","hex":"#00008b"},{"name":"Dark Blue Green","hex":"#005249"},{"name":"Dark Blue Grey","hex":"#1f3b4d"},{"name":"Dark Border","hex":"#1b4556"},{"name":"Dark Bronze","hex":"#804a00"},{"name":"Dark Bronze Coin","hex":"#514100"},{"name":"Dark Brown","hex":"#341c02"},{"name":"Dark Brown Sugar","hex":"#af7b57"},{"name":"Dark Brown Tangelo","hex":"#88654e"},{"name":"Dark Burgundy","hex":"#770f05"},{"name":"Dark Byzantium","hex":"#5d3954"},{"name":"Dark Camouflage Green","hex":"#4f4d32"},{"name":"Dark Candy Apple Red","hex":"#a40000"},{"name":"Dark Carmine","hex":"#64242e"},{"name":"Dark Carnation Pink","hex":"#ffa6c9"},{"name":"Dark Catalina","hex":"#273c5a"},{"name":"Dark Cavern","hex":"#838254"},{"name":"Dark Cerulean","hex":"#08457e"},{"name":"Dark Charcoal","hex":"#112222"},{"name":"Dark Cheddar","hex":"#e08119"},{"name":"Dark Chestnut","hex":"#986960"},{"name":"Dark Chlorophyll","hex":"#166461"},{"name":"Dark Chocolate","hex":"#490206"},{"name":"Dark Citron","hex":"#a0ac4f"},{"name":"Dark Compass Ghost Grey","hex":"#808c8c"},{"name":"Dark Coral","hex":"#cf524e"},{"name":"Dark Cornflower Blue","hex":"#26428b"},{"name":"Dark Cow","hex":"#882c17"},{"name":"Dark Cream","hex":"#fff39a"},{"name":"Dark Cyan","hex":"#008b8b"},{"name":"Dark Denim","hex":"#35465e"},{"name":"Dark Earth","hex":"#5c4939"},{"name":"Dark Ebony","hex":"#3c2005"},{"name":"Dark Electric Blue","hex":"#516678"},{"name":"Dark Elf Green","hex":"#006131"},{"name":"Dark Emerald","hex":"#00834e"},{"name":"Dark Energy","hex":"#503d4d"},{"name":"Dark Engine","hex":"#3e3f41"},{"name":"Dark Envy","hex":"#a4a582"},{"name":"Dark Fern","hex":"#0a480d"},{"name":"Dark Flesh","hex":"#f4a460"},{"name":"Dark Fleshtone","hex":"#771908"},{"name":"Dark Forest","hex":"#556962"},{"name":"Dark Forest Green","hex":"#002d04"},{"name":"Dark Fuchsia","hex":"#9d0759"},{"name":"Dark Galaxy","hex":"#0018a8"},{"name":"Dark Gold","hex":"#b59410"},{"name":"Dark Goldenrod","hex":"#b8860b"},{"name":"Dark Granite","hex":"#4f443f"},{"name":"Dark Grass Green","hex":"#388004"},{"name":"Dark Green","hex":"#033500"},{"name":"Dark Green Blue","hex":"#1f6357"},{"name":"Dark Green Copper","hex":"#4a766e"},{"name":"Dark Green Velvet","hex":"#4a5b51"},{"name":"Dark Grey","hex":"#363737"},{"name":"Dark Grey Blue","hex":"#29465b"},{"name":"Dark Gull Grey","hex":"#625d5d"},{"name":"Dark Gunmetal","hex":"#1f262a"},{"name":"Dark Gunship Grey","hex":"#3b3f42"},{"name":"Dark Highlight","hex":"#705446"},{"name":"Dark Horizon","hex":"#666699"},{"name":"Dark Hot Pink","hex":"#d90166"},{"name":"Dark Imperial Blue","hex":"#00416a"},{"name":"Dark Indigo","hex":"#1f0954"},{"name":"Dark Ivy","hex":"#5b7763"},{"name":"Dark Jonquil","hex":"#fada5e"},{"name":"Dark Jungle Green","hex":"#1a2421"},{"name":"Dark Khaki","hex":"#9b8f55"},{"name":"Dark Lagoon","hex":"#6a7f7d"},{"name":"Dark Lava","hex":"#483c32"},{"name":"Dark Lavender","hex":"#856798"},{"name":"Dark Lemon Lime","hex":"#8bbe1b"},{"name":"Dark Lilac","hex":"#9c6da5"},{"name":"Dark Lime","hex":"#84b701"},{"name":"Dark Lime Green","hex":"#7ebd01"},{"name":"Dark Limestone","hex":"#989a98"},{"name":"Dark Liver","hex":"#524b4c"},{"name":"Dark LUA Console","hex":"#5f574f"},{"name":"Dark Magenta","hex":"#8b008b"},{"name":"Dark Maroon","hex":"#3c0008"},{"name":"Dark Matter","hex":"#110101"},{"name":"Dark Mauve","hex":"#874c62"},{"name":"Dark Medium Grey","hex":"#a8a9a8"},{"name":"Dark Midnight Blue","hex":"#003377"},{"name":"Dark Mink","hex":"#87715f"},{"name":"Dark Mint","hex":"#48c072"},{"name":"Dark Mint Green","hex":"#20c073"},{"name":"Dark Mochaccino","hex":"#582f2b"},{"name":"Dark Moss Green","hex":"#4a5d23"},{"name":"Dark Mountain Meadow","hex":"#1ab385"},{"name":"Dark Mushroom","hex":"#6a4345"},{"name":"Dark Mustard","hex":"#a88905"},{"name":"Dark Nadeshiko","hex":"#eebbcb"},{"name":"Dark Navy","hex":"#000435"},{"name":"Dark Navy Blue","hex":"#00022e"},{"name":"Dark Olive","hex":"#373e02"},{"name":"Dark Olive Green","hex":"#3c4d03"},{"name":"Dark Olive Paste","hex":"#6e5160"},{"name":"Dark Orange","hex":"#c65102"},{"name":"Dark Orchid","hex":"#9932cc"},{"name":"Dark Pansy","hex":"#653d7c"},{"name":"Dark Pastel Blue","hex":"#779ecb"},{"name":"Dark Pastel Green","hex":"#03c03c"},{"name":"Dark Pastel Purple","hex":"#966fd6"},{"name":"Dark Pastel Red","hex":"#c23b22"},{"name":"Dark Peach","hex":"#de7e5d"},{"name":"Dark Periwinkle","hex":"#665fd1"},{"name":"Dark Pewter","hex":"#606865"},{"name":"Dark PHP Purple","hex":"#4f5b93"},{"name":"Dark Pink","hex":"#cb416b"},{"name":"Dark Plum","hex":"#3f012c"},{"name":"Dark Potion","hex":"#603e53"},{"name":"Dark Powder Blue","hex":"#012389"},{"name":"Dark Prussian Blue","hex":"#0b085f"},{"name":"Dark Puce","hex":"#4f3a3c"},{"name":"Dark Purple","hex":"#35063e"},{"name":"Dark Rainforest","hex":"#505838"},{"name":"Dark Raspberry","hex":"#872657"},{"name":"Dark Reaper","hex":"#3b5150"},{"name":"Dark Red","hex":"#840000"},{"name":"Dark Rose","hex":"#b5485d"},{"name":"Dark Rose Tan","hex":"#d19c97"},{"name":"Dark Royal Blue","hex":"#02066f"},{"name":"Dark Ruby","hex":"#734a45"},{"name":"Dark Rum","hex":"#45362b"},{"name":"Dark Rye","hex":"#905d36"},{"name":"Dark Sage","hex":"#6d765b"},{"name":"Dark Sakura","hex":"#a2646f"},{"name":"Dark Salmon","hex":"#c85a53"},{"name":"Dark Sand","hex":"#a88f59"},{"name":"Dark Sapphire","hex":"#082567"},{"name":"Dark Scarlet","hex":"#560319"},{"name":"Dark Sea Green","hex":"#11875d"},{"name":"Dark Seafoam","hex":"#1fb57a"},{"name":"Dark Seafoam Green","hex":"#3eaf76"},{"name":"Dark Seagreen","hex":"#666655"},{"name":"Dark Secret","hex":"#3e5361"},{"name":"Dark Sepia","hex":"#ac8760"},{"name":"Dark Shadow","hex":"#4a4b4d"},{"name":"Dark Shamrock","hex":"#33cc99"},{"name":"Dark Sienna","hex":"#3c1414"},{"name":"Dark Silver","hex":"#71706e"},{"name":"Dark Sky","hex":"#909989"},{"name":"Dark Sky Blue","hex":"#448ee4"},{"name":"Dark Slate","hex":"#465352"},{"name":"Dark Slate Blue","hex":"#214761"},{"name":"Dark Slate Grey","hex":"#2f4f4f"},{"name":"Dark Sorrel","hex":"#587a65"},{"name":"Dark Spell","hex":"#303b4c"},{"name":"Dark Spring Green","hex":"#177245"},{"name":"Dark Sting","hex":"#7e736d"},{"name":"Dark Strawberry","hex":"#80444c"},{"name":"Dark Tan","hex":"#918151"},{"name":"Dark Tangerine","hex":"#ffa812"},{"name":"Dark Taupe","hex":"#483c3c"},{"name":"Dark Tavern","hex":"#634e43"},{"name":"Dark Teal","hex":"#014d4e"},{"name":"Dark Terra Cotta","hex":"#cc4e5c"},{"name":"Dark Tone Ink","hex":"#121212"},{"name":"Dark Topaz","hex":"#817c87"},{"name":"Dark Turquoise","hex":"#045c5a"},{"name":"Dark Vanilla","hex":"#d1bea8"},{"name":"Dark Violet","hex":"#34013f"},{"name":"Dark Wood","hex":"#855e42"},{"name":"Dark Wood Grain","hex":"#4f301f"},{"name":"Dark Yellow","hex":"#d5b60a"},{"name":"Dark Yellow Green","hex":"#9acd32"},{"name":"Darkest Spruce","hex":"#303d3c"},{"name":"Darkish Blue","hex":"#014182"},{"name":"Darkish Green","hex":"#287c37"},{"name":"Darkish Pink","hex":"#da467d"},{"name":"Darkish Purple","hex":"#751973"},{"name":"Darkish Red","hex":"#a90308"},{"name":"Darkness","hex":"#16160e"},{"name":"Darlak","hex":"#4f4969"},{"name":"Darling Bud","hex":"#ff88ff"},{"name":"Darling Lilac","hex":"#c9acd6"},{"name":"Darth Vader","hex":"#0b0b0b"},{"name":"Dartmoor Mist","hex":"#cddce3"},{"name":"Dartmouth Green","hex":"#00703c"},{"name":"DaVanzo Beige","hex":"#ccac86"},{"name":"DaVanzo Green","hex":"#58936d"},{"name":"Davy's Grey","hex":"#555555"},{"name":"Dawn","hex":"#9f9d91"},{"name":"Dawn Blue","hex":"#cacccb"},{"name":"Dawn Departs","hex":"#ccffff"},{"name":"Dawn Pink","hex":"#e6d6cd"},{"name":"Dawnstone","hex":"#70756e"},{"name":"Day At The Zoo","hex":"#ffa373"},{"name":"Day Dreamer","hex":"#d9cdc4"},{"name":"Day Glow","hex":"#eadd82"},{"name":"Day Glow Orange","hex":"#eb5c34"},{"name":"Day Lily","hex":"#fff9ec"},{"name":"Day On Mercury","hex":"#d5d2d1"},{"name":"Daybreak","hex":"#8981a0"},{"name":"Daydream","hex":"#e3ebae"},{"name":"Daydreaming","hex":"#f4f0e1"},{"name":"Dayflower","hex":"#38a1db"},{"name":"Daystar","hex":"#fff8da"},{"name":"Dazzle Me","hex":"#edebea"},{"name":"Dazzling Blue","hex":"#3850a0"},{"name":"De York","hex":"#85ca87"},{"name":"Dead 99","hex":"#99dead"},{"name":"Dead Flesh","hex":"#849b63"},{"name":"Dead Forest","hex":"#434b4f"},{"name":"Dead Grass","hex":"#e4dc8a"},{"name":"Dead Pixel","hex":"#3b3a3a"},{"name":"Deadlock","hex":"#8f666a"},{"name":"Deadsy","hex":"#c2a84b"},{"name":"Death Cap","hex":"#e7d9db"},{"name":"Death Guard","hex":"#9eb37b"},{"name":"Death Valley Beige","hex":"#ddbb88"},{"name":"Deathclaw Brown","hex":"#b36853"},{"name":"Deathworld Forest","hex":"#5c6730"},{"name":"Deauville Mauve","hex":"#af9294"},{"name":"Debian Red","hex":"#d70a53"},{"name":"Debonaire","hex":"#cbd0dd"},{"name":"Decadence","hex":"#73667b"},{"name":"Decadent Chocolate","hex":"#513235"},{"name":"Decanter","hex":"#ada3bb"},{"name":"Decaying Leave","hex":"#d57835"},{"name":"December Forest","hex":"#e0e8db"},{"name":"December Rain","hex":"#d6dddc"},{"name":"December Sky","hex":"#d5d7d9"},{"name":"Decency","hex":"#bfb5ca"},{"name":"Dechala Lilac","hex":"#b69fcc"},{"name":"Deck Crew","hex":"#5e7cac"},{"name":"Deco","hex":"#cccf82"},{"name":"Deco Grey","hex":"#89978e"},{"name":"Deco Rose","hex":"#985f68"},{"name":"Deco-Rate","hex":"#8fcbc0"},{"name":"Deconstruction","hex":"#7b736b"},{"name":"Decoration Blue","hex":"#3f74a3"},{"name":"Decore Splash","hex":"#00829e"},{"name":"Decorum","hex":"#b39aa0"},{"name":"Dedication","hex":"#fee2c8"},{"name":"Deduction","hex":"#d4cb83"},{"name":"Deep Aloe Vera","hex":"#6e6a44"},{"name":"Deep Amethyst","hex":"#5b3082"},{"name":"Deep Aqua","hex":"#08787f"},{"name":"Deep Aquamarine","hex":"#78dbe2"},{"name":"Deep Arctic","hex":"#345c61"},{"name":"Deep Bamboo","hex":"#836e59"},{"name":"Deep Blue","hex":"#040273"},{"name":"Deep Blush","hex":"#e36f8a"},{"name":"Deep Bottlebrush","hex":"#5e675a"},{"name":"Deep Breath","hex":"#27275f"},{"name":"Deep Bronze","hex":"#51412d"},{"name":"Deep Brown","hex":"#410200"},{"name":"Deep Caribbean","hex":"#5f6171"},{"name":"Deep Carmine","hex":"#a9203e"},{"name":"Deep Carmine Pink","hex":"#ef3038"},{"name":"Deep Carnation","hex":"#c973a2"},{"name":"Deep Carrot Orange","hex":"#e9692c"},{"name":"Deep Cerise","hex":"#da3287"},{"name":"Deep Cerulean","hex":"#007bbb"},{"name":"Deep Champagne","hex":"#fad6c5"},{"name":"Deep Chestnut","hex":"#b94e48"},{"name":"Deep Claret","hex":"#973443"},{"name":"Deep Clay","hex":"#89776e"},{"name":"Deep Cobalt","hex":"#404466"},{"name":"Deep Coffee","hex":"#704241"},{"name":"Deep Coral","hex":"#da7c55"},{"name":"Deep Cove","hex":"#051040"},{"name":"Deep Crimson","hex":"#8f423d"},{"name":"Deep Current","hex":"#007381"},{"name":"Deep Depths","hex":"#46483c"},{"name":"Deep Dive","hex":"#29495c"},{"name":"Deep Diving","hex":"#5e97a9"},{"name":"Deep Dumpling","hex":"#9b351b"},{"name":"Deep Emerald","hex":"#2a545c"},{"name":"Deep Exquisite","hex":"#614454"},{"name":"Deep Fir","hex":"#193925"},{"name":"Deep Flamingo","hex":"#df01f0"},{"name":"Deep Forest","hex":"#37413a"},{"name":"Deep Forest Green","hex":"#014426"},{"name":"Deep Fuchsia","hex":"#c154c1"},{"name":"Deep Garnet","hex":"#773644"},{"name":"Deep Grass Green","hex":"#558367"},{"name":"Deep Green","hex":"#02590f"},{"name":"Deep Hibiscus","hex":"#cb5251"},{"name":"Deep Hydrangea","hex":"#83696e"},{"name":"Deep Ice","hex":"#73fdff"},{"name":"Deep in the Jungle","hex":"#53665a"},{"name":"Deep Jungle","hex":"#36716f"},{"name":"Deep Jungle Green","hex":"#004b49"},{"name":"Deep Koamaru","hex":"#343467"},{"name":"Deep Lagoon","hex":"#005265"},{"name":"Deep Lake","hex":"#00656b"},{"name":"Deep Lake Blue","hex":"#015482"},{"name":"Deep Lavender","hex":"#8d5eb7"},{"name":"Deep Leather","hex":"#41332f"},{"name":"Deep Lemon","hex":"#f5c71a"},{"name":"Deep Lichen Green","hex":"#6e6e5c"},{"name":"Deep Lilac","hex":"#9955bb"},{"name":"Deep Loch","hex":"#2e5767"},{"name":"Deep Magenta","hex":"#a0025c"},{"name":"Deep Mahogany","hex":"#553b39"},{"name":"Deep Marine","hex":"#2e6469"},{"name":"Deep Maroon","hex":"#820000"},{"name":"Deep Marsh","hex":"#938565"},{"name":"Deep Mauve","hex":"#d374d5"},{"name":"Deep Mint","hex":"#009e6d"},{"name":"Deep Mooring","hex":"#35524a"},{"name":"Deep Moss Green","hex":"#355e4b"},{"name":"Deep Mushroom","hex":"#96847a"},{"name":"Deep Mystery","hex":"#494c59"},{"name":"Deep Night","hex":"#494c55"},{"name":"Deep Oak","hex":"#412010"},{"name":"Deep Ocean","hex":"#2a4b5f"},{"name":"Deep Orange","hex":"#dc4d01"},{"name":"Deep Orchid","hex":"#903f75"},{"name":"Deep Pacific","hex":"#006e62"},{"name":"Deep Peach","hex":"#ffcba2"},{"name":"Deep Peacock Blue","hex":"#008381"},{"name":"Deep Periwinkle","hex":"#7c83bc"},{"name":"Deep Persian","hex":"#523839"},{"name":"Deep Pine","hex":"#254a47"},{"name":"Deep Pink","hex":"#cb0162"},{"name":"Deep Pond","hex":"#014420"},{"name":"Deep Prunus","hex":"#5a3d3f"},{"name":"Deep Puce","hex":"#a95c68"},{"name":"Deep Purple","hex":"#36013f"},{"name":"Deep Red","hex":"#9a0200"},{"name":"Deep Reed","hex":"#69673a"},{"name":"Deep Reservoir","hex":"#424f5f"},{"name":"Deep Rhubarb","hex":"#7f5153"},{"name":"Deep Rift","hex":"#4c6a68"},{"name":"Deep Rose","hex":"#c74767"},{"name":"Deep Ruby","hex":"#843f5b"},{"name":"Deep Saffron","hex":"#ff9932"},{"name":"Deep Sanction","hex":"#195155"},{"name":"Deep Sapphire","hex":"#082599"},{"name":"Deep Sea","hex":"#167e65"},{"name":"Deep Sea Blue","hex":"#002366"},{"name":"Deep Sea Coral","hex":"#d9615b"},{"name":"Deep Sea Diver","hex":"#255c61"},{"name":"Deep Sea Dolphin","hex":"#6a6873"},{"name":"Deep Sea Dream","hex":"#002d69"},{"name":"Deep Sea Exploration","hex":"#2000b1"},{"name":"Deep Sea Green","hex":"#095859"},{"name":"Deep Sea Shadow","hex":"#4f5a4c"},{"name":"Deep Sea Turtle","hex":"#5e5749"},{"name":"Deep Seagrass","hex":"#959889"},{"name":"Deep Seaweed","hex":"#37412a"},{"name":"Deep Serenity","hex":"#7f6968"},{"name":"Deep Sky Blue","hex":"#0d75f8"},{"name":"Deep South","hex":"#b4989f"},{"name":"Deep Space Sparkle","hex":"#4a646c"},{"name":"Deep Spring Bud","hex":"#556b2f"},{"name":"Deep Storm","hex":"#3f4551"},{"name":"Deep Sun","hex":"#bc914d"},{"name":"Deep Tan","hex":"#785736"},{"name":"Deep Taupe","hex":"#7b6660"},{"name":"Deep Teal","hex":"#00555a"},{"name":"Deep Turquoise","hex":"#005f7a"},{"name":"Deep Tuscan Red","hex":"#66424d"},{"name":"Deep Ultramarine","hex":"#384883"},{"name":"Deep Velvet","hex":"#313248"},{"name":"Deep Veridian","hex":"#116356"},{"name":"Deep Violet","hex":"#330066"},{"name":"Deep Walnut","hex":"#615d58"},{"name":"Deep Water","hex":"#266691"},{"name":"Deep Watercourse","hex":"#00844b"},{"name":"Deep Well","hex":"#2c2a33"},{"name":"Deep Wisteria","hex":"#443f6f"},{"name":"Deep Yellow","hex":"#ffff33"},{"name":"Deepest Sea","hex":"#444d56"},{"name":"Deepest Water","hex":"#466174"},{"name":"Deeply Embarrassed","hex":"#ecb2b3"},{"name":"Deepsea Kraken","hex":"#222211"},{"name":"Deer","hex":"#ba8759"},{"name":"Deer Leather","hex":"#ac7434"},{"name":"Deer Tracks","hex":"#a1614c"},{"name":"Del Rio","hex":"#b5998e"},{"name":"Del Sol Maize","hex":"#dabf92"},{"name":"Delft","hex":"#3d5e8c"},{"name":"Delhi Dance Pink","hex":"#fdc1c5"},{"name":"Delhi Spice","hex":"#a36a6d"},{"name":"Delicacy","hex":"#f5e3e2"},{"name":"Delicate Brown","hex":"#a78c8b"},{"name":"Delicate Daisy","hex":"#e9edc0"},{"name":"Delicate Girl Blue","hex":"#6ab2ca"},{"name":"Delicate Mauve","hex":"#c5b5ca"},{"name":"Delicate Mist","hex":"#e1ebe5"},{"name":"Delicate Seashell","hex":"#ffefdd"},{"name":"Delicate White","hex":"#f1f2ee"},{"name":"Delicioso","hex":"#3f352f"},{"name":"Delicious Dill","hex":"#77cc00"},{"name":"Delicious Mandarin","hex":"#ffaa11"},{"name":"Delightful Camouflage","hex":"#a5a943"},{"name":"Delightful Dandelion","hex":"#eeee33"},{"name":"Delightful Green","hex":"#00ee00"},{"name":"Delightful Peach","hex":"#ffebd1"},{"name":"Dell","hex":"#486531"},{"name":"Della Robbia Blue","hex":"#7a9dcb"},{"name":"Delltone","hex":"#8ec39e"},{"name":"Delos Blue","hex":"#169ec0"},{"name":"Delphinium Blue","hex":"#6198ae"},{"name":"Delta","hex":"#999b95"},{"name":"Delta Break","hex":"#979147"},{"name":"Delta Green","hex":"#2d4a4c"},{"name":"Delta Waters","hex":"#c4c2ab"},{"name":"Deluge","hex":"#8272a4"},{"name":"Deluxe Days","hex":"#8bc7e6"},{"name":"Demerara Sugar","hex":"#e1b270"},{"name":"Demeter","hex":"#ecda9e"},{"name":"Demeter Green","hex":"#00cc00"},{"name":"Demitasse","hex":"#40342b"},{"name":"Demon","hex":"#224376"},{"name":"Demonic Presence","hex":"#7c0a02"},{"name":"Demonic Purple","hex":"#d725de"},{"name":"Demonic Yellow","hex":"#ffe700"},{"name":"Denali Green","hex":"#7d775d"},{"name":"Denim","hex":"#2243b6"},{"name":"Denim Tradition","hex":"#7f97b5"},{"name":"Denver River","hex":"#7795c1"},{"name":"Depth Charge","hex":"#355859"},{"name":"Derby","hex":"#f9e4c6"},{"name":"Derby Brown","hex":"#8a7265"},{"name":"Derby Green","hex":"#599c89"},{"name":"Desaturated Cyan","hex":"#669999"},{"name":"Desert","hex":"#ccad60"},{"name":"Desert Bud","hex":"#c28996"},{"name":"Desert Camel","hex":"#c2ae88"},{"name":"Desert Chaparral","hex":"#727a60"},{"name":"Desert Cover","hex":"#d0c8a9"},{"name":"Desert Dawn","hex":"#eddbe8"},{"name":"Desert Dune","hex":"#b5ab9c"},{"name":"Desert Dust","hex":"#e3bc8e"},{"name":"Desert Field","hex":"#efcdb8"},{"name":"Desert Floor","hex":"#c6b183"},{"name":"Desert Flower","hex":"#ff9687"},{"name":"Desert Grey","hex":"#b8a487"},{"name":"Desert Iguana","hex":"#f3f2e1"},{"name":"Desert Khaki","hex":"#d6cdb7"},{"name":"Desert Lily","hex":"#fef5db"},{"name":"Desert Locust","hex":"#a9a450"},{"name":"Desert Mauve","hex":"#e8d2d6"},{"name":"Desert Mesa","hex":"#efcfbc"},{"name":"Desert Mirage","hex":"#b9e0cf"},{"name":"Desert Mist","hex":"#e0b589"},{"name":"Desert Morning","hex":"#d0bbb0"},{"name":"Desert Palm","hex":"#5a4632"},{"name":"Desert Panzer","hex":"#c0cabc"},{"name":"Desert Pear","hex":"#aaae9a"},{"name":"Desert Pebble","hex":"#cab698"},{"name":"Desert Riverbed","hex":"#d5a884"},{"name":"Desert Rock","hex":"#d5c6bd"},{"name":"Desert Rose","hex":"#cf6977"},{"name":"Desert Sage","hex":"#90926f"},{"name":"Desert Sand","hex":"#edc9af"},{"name":"Desert Shadow","hex":"#403c39"},{"name":"Desert Soil","hex":"#a15f3b"},{"name":"Desert Spice","hex":"#c66b30"},{"name":"Desert Star","hex":"#f9f0e1"},{"name":"Desert Storm","hex":"#ede7e0"},{"name":"Desert Suede","hex":"#d5c7b3"},{"name":"Desert Sun","hex":"#c87629"},{"name":"Desert Tan","hex":"#a38c6c"},{"name":"Desert Taupe","hex":"#8d7e71"},{"name":"Desert Willow","hex":"#89734b"},{"name":"Desert Wind","hex":"#e5d295"},{"name":"Desert Yellow","hex":"#a29259"},{"name":"Deserted Beach","hex":"#e7dbbf"},{"name":"Deserted Path","hex":"#e7bf7b"},{"name":"Design Delight","hex":"#a47bac"},{"name":"Desire","hex":"#ea3c53"},{"name":"Desolate Field","hex":"#d3cbc6"},{"name":"Destroying Angels","hex":"#e9e9e1"},{"name":"Detective Coat","hex":"#8b8685"},{"name":"Detroit","hex":"#bdd0d1"},{"name":"Deutzia White","hex":"#f7fcfe"},{"name":"Devil Blue","hex":"#277594"},{"name":"Devil's Flower Mantis","hex":"#8f9805"},{"name":"Devil's Lip","hex":"#662a2c"},{"name":"Devil's Plum","hex":"#423450"},{"name":"Devil’s Butterfly","hex":"#bb4422"},{"name":"Devilish Diva","hex":"#ce7790"},{"name":"Devlan Mud","hex":"#5a573f"},{"name":"Devlan Mud Wash","hex":"#3c3523"},{"name":"Devon Rex","hex":"#717e6f"},{"name":"Dew","hex":"#e7f2e9"},{"name":"Dew Not Disturb","hex":"#cee3dc"},{"name":"Dewberry","hex":"#8b5987"},{"name":"Dewdrop","hex":"#dde4e3"},{"name":"Dewkist","hex":"#c4d1c2"},{"name":"Dewmist Delight","hex":"#dceedb"},{"name":"Dewpoint","hex":"#b2ced2"},{"name":"Dexter","hex":"#6bb1b4"},{"name":"Dhalsim's Yoga Flame","hex":"#fae432"},{"name":"Dhūsar Grey","hex":"#aaaaaa"},{"name":"Di Sierra","hex":"#db995e"},{"name":"Diablo Red","hex":"#cd0d01"},{"name":"Diamond","hex":"#faf7e2"},{"name":"Diamond Blue","hex":"#cfe4ee"},{"name":"Diamond Dust","hex":"#f8f5e5"},{"name":"Diamonds In The Sky","hex":"#e5e2e1"},{"name":"Diarrhea","hex":"#9f8303"},{"name":"Dickie Bird","hex":"#60b8be"},{"name":"Diesel","hex":"#322c2b"},{"name":"Diffused Light","hex":"#ebe5d5"},{"name":"Diffused Orchid","hex":"#9879a2"},{"name":"Digger's Gold","hex":"#a37336"},{"name":"Digital Garage","hex":"#b7b3a4"},{"name":"Digital Violets","hex":"#aa00ff"},{"name":"Digital Yellow","hex":"#ffeb7e"},{"name":"Dignified","hex":"#3b695f"},{"name":"Diisha Green","hex":"#007044"},{"name":"Dijon","hex":"#97754c"},{"name":"Dijon Mustard","hex":"#e2ca73"},{"name":"Dill","hex":"#6f7755"},{"name":"Dill Grass","hex":"#a2a57b"},{"name":"Dill Pickle","hex":"#67744a"},{"name":"Dill Powder","hex":"#9da073"},{"name":"Dilly Blue","hex":"#35495a"},{"name":"Dilly Dally","hex":"#f6db5d"},{"name":"Diluno Red","hex":"#f46860"},{"name":"Dim","hex":"#c8c2be"},{"name":"Dim Grey","hex":"#696969"},{"name":"Dingley","hex":"#607c47"},{"name":"Dingy Dungeon","hex":"#c53151"},{"name":"Dingy Sticky Note","hex":"#e6f2a2"},{"name":"Dinosaur","hex":"#7f997d"},{"name":"Dinosaur Bone","hex":"#827563"},{"name":"Dinosaur Egg","hex":"#cabaa9"},{"name":"Diorite","hex":"#9dbfb1"},{"name":"Diplomatic","hex":"#3a445d"},{"name":"Dire Wolf","hex":"#282828"},{"name":"Directoire Blue","hex":"#0061a3"},{"name":"Diroset","hex":"#5acaa4"},{"name":"Dirt","hex":"#9b7653"},{"name":"Dirt Brown","hex":"#836539"},{"name":"Dirty Blonde","hex":"#dfc393"},{"name":"Dirty Blue","hex":"#3f829d"},{"name":"Dirty Brown","hex":"#b5651e"},{"name":"Dirty Green","hex":"#667e2c"},{"name":"Dirty Leather","hex":"#430005"},{"name":"Dirty Orange","hex":"#c87606"},{"name":"Dirty Pink","hex":"#ca7b80"},{"name":"Dirty Purple","hex":"#734a65"},{"name":"Dirty White","hex":"#e8e4c9"},{"name":"Dirty Yellow","hex":"#cdc50a"},{"name":"Disappearing Island","hex":"#bbdee5"},{"name":"Disappearing Memories","hex":"#eae3e0"},{"name":"Disappearing Purple","hex":"#3f313a"},{"name":"Disarm","hex":"#006e9d"},{"name":"Disc Jockey","hex":"#47c6ac"},{"name":"Disco","hex":"#892d4f"},{"name":"Discover","hex":"#bdb0a0"},{"name":"Discover Deco","hex":"#4a934e"},{"name":"Discovery Bay","hex":"#276878"},{"name":"Discreet Orange","hex":"#ffad98"},{"name":"Discrete Pink","hex":"#cd7584"},{"name":"Discretion","hex":"#9f6f62"},{"name":"Disembark","hex":"#5bb4d7"},{"name":"Disguise","hex":"#b7b698"},{"name":"Dissolved Denim","hex":"#e2ecf2"},{"name":"Distant Cloud","hex":"#e5eae6"},{"name":"Distant Haze","hex":"#dfe4da"},{"name":"Distant Horizon","hex":"#f1f8fa"},{"name":"Distant Landscape","hex":"#e1efdd"},{"name":"Distant Sky","hex":"#6f8daf"},{"name":"Distant Thunder","hex":"#7f8688"},{"name":"Distant Valley","hex":"#c2b79a"},{"name":"Distilled Moss","hex":"#ccffcc"},{"name":"Distilled Rose","hex":"#ffbbff"},{"name":"Distilled Venom","hex":"#c7fdb5"},{"name":"Distinct Purple","hex":"#a294c9"},{"name":"Dithered Amber","hex":"#feb308"},{"name":"Dithered Sky","hex":"#bcdfff"},{"name":"Diva Blue","hex":"#007bb2"},{"name":"Diva Girl","hex":"#e1cbda"},{"name":"Diva Rouge","hex":"#e8b9a5"},{"name":"Dive In","hex":"#3c4d85"},{"name":"Diver Lady","hex":"#27546e"},{"name":"Diver's Eden","hex":"#3a797e"},{"name":"Diversion","hex":"#a99a89"},{"name":"Divine","hex":"#9a7aa0"},{"name":"Divine Dove","hex":"#eeddee"},{"name":"Divine Purple","hex":"#69005f"},{"name":"Dixie","hex":"#cd8431"},{"name":"Dizzy Days","hex":"#d14e2f"},{"name":"Do Not Disturb","hex":"#99a456"},{"name":"Dobunezumi Brown","hex":"#4b3c39"},{"name":"Dockside","hex":"#95aed0"},{"name":"Dodger Blue","hex":"#3e82fc"},{"name":"DodgeRoll Gold","hex":"#f79a12"},{"name":"Dodie Yellow","hex":"#fef65b"},{"name":"Doe","hex":"#b98e68"},{"name":"Doeskin","hex":"#fff2e4"},{"name":"Dogwood","hex":"#faeae2"},{"name":"Dogwood Bloom","hex":"#c58f94"},{"name":"Dogwood Rose","hex":"#d71868"},{"name":"Doll House","hex":"#facfc1"},{"name":"Dollar","hex":"#7d8774"},{"name":"Dollar Bill","hex":"#85bb65"},{"name":"Dolly","hex":"#f5f171"},{"name":"Dolomite Crystal","hex":"#fee8f5"},{"name":"Dolphin","hex":"#86c4da"},{"name":"Dolphin Daze","hex":"#659fb5"},{"name":"Dolphin Grey","hex":"#828e74"},{"name":"Dolphin Tales","hex":"#c7c7c2"},{"name":"Domain","hex":"#9c9c6e"},{"name":"Domino","hex":"#6c5b4c"},{"name":"Don Juan","hex":"#5a4f51"},{"name":"Donkey Brown","hex":"#816e5c"},{"name":"Donkey Kong","hex":"#ab4210"},{"name":"Donnegal","hex":"#8caea3"},{"name":"Doodle","hex":"#fbdca8"},{"name":"Doombull Brown","hex":"#7c1e08"},{"name":"Dorado","hex":"#6e5f56"},{"name":"Doric White","hex":"#d5cfbd"},{"name":"Dormitory","hex":"#5d71a9"},{"name":"Dorn Yellow","hex":"#fff200"},{"name":"Dotted Dove","hex":"#6c6868"},{"name":"Dòu Lǜ Green","hex":"#009276"},{"name":"Dòu Shā Sè Red","hex":"#a52939"},{"name":"Double Colonial White","hex":"#e4cf99"},{"name":"Double Cream","hex":"#f3e0ac"},{"name":"Double Dragon Skin","hex":"#fca044"},{"name":"Double Duty","hex":"#686858"},{"name":"Double Jeopardy","hex":"#4d786c"},{"name":"Double Pearl Lusta","hex":"#e9dcbe"},{"name":"Double Spanish White","hex":"#d2c3a3"},{"name":"Douro","hex":"#555500"},{"name":"Dove","hex":"#b3ada7"},{"name":"Dove Feather","hex":"#755d5b"},{"name":"Dove Grey","hex":"#6d6c6c"},{"name":"Dove's Wing","hex":"#f4f2ea"},{"name":"Dover Grey","hex":"#848585"},{"name":"Dover Plains","hex":"#ccaf92"},{"name":"Dover Straits","hex":"#326ab1"},{"name":"Down Dog","hex":"#baafb9"},{"name":"Down Feathers","hex":"#fff9e7"},{"name":"Downing to Earth","hex":"#635a4f"},{"name":"Download Progress","hex":"#58d332"},{"name":"Downpour","hex":"#898a86"},{"name":"Downriver","hex":"#092256"},{"name":"Downtown Benny Brown","hex":"#7d6a58"},{"name":"Downy","hex":"#6fd2be"},{"name":"Dr Who","hex":"#78587d"},{"name":"Drab","hex":"#828344"},{"name":"Drab Green","hex":"#749551"},{"name":"Dracula Orchid","hex":"#2c3539"},{"name":"Dragon Bay","hex":"#5da99f"},{"name":"Dragon Fire","hex":"#fc642d"},{"name":"Dragon Red","hex":"#9e0200"},{"name":"Dragon Scale","hex":"#00a877"},{"name":"Dragon's Blood","hex":"#b84048"},{"name":"Dragon's Fire","hex":"#9c2d5d"},{"name":"Dragonfly","hex":"#314a76"},{"name":"Dragonfly Blue","hex":"#45abca"},{"name":"Dragonlord Purple","hex":"#6241c7"},{"name":"Drake Tooth","hex":"#bbb0a4"},{"name":"Drake’s Neck","hex":"#31668a"},{"name":"Drakenhof Nightshade","hex":"#1f5da0"},{"name":"Drama Queen","hex":"#a37298"},{"name":"Dramatical Red","hex":"#991100"},{"name":"Draw Your Sword","hex":"#6c7179"},{"name":"Dream Blue","hex":"#d7e6ee"},{"name":"Dream Dust","hex":"#ebe2e8"},{"name":"Dreamcatcher","hex":"#a5b2a9"},{"name":"Dreamland","hex":"#b5b1bf"},{"name":"Dreamless Sleep","hex":"#111111"},{"name":"Dreams of Peach","hex":"#ffd29d"},{"name":"Dreamsicle","hex":"#f5d5c2"},{"name":"Dreamweaver","hex":"#ccc6d7"},{"name":"Drenched Rain","hex":"#c1d1e2"},{"name":"Dresden Blue","hex":"#0086bb"},{"name":"Dresden Doll","hex":"#8ca8c6"},{"name":"Dresden Dream","hex":"#8ea7b9"},{"name":"Dress Blues","hex":"#2a3244"},{"name":"Dress Up","hex":"#fac7bf"},{"name":"Dreyfus","hex":"#b2aba1"},{"name":"Dried Blood","hex":"#4b0101"},{"name":"Dried Chive","hex":"#7b7d69"},{"name":"Dried Goldenrod","hex":"#e2a829"},{"name":"Dried Grass","hex":"#aca08d"},{"name":"Dried Herb","hex":"#847a59"},{"name":"Dried Lilac","hex":"#bbbbff"},{"name":"Dried Magenta","hex":"#ff40ff"},{"name":"Dried Moss","hex":"#ccb97e"},{"name":"Dried Plum","hex":"#683332"},{"name":"Dried Tobacco","hex":"#997b38"},{"name":"Dried Tomatoes","hex":"#ab6057"},{"name":"Drifting","hex":"#beb4a8"},{"name":"Drifting Downstream","hex":"#61736f"},{"name":"Driftwood","hex":"#a67a45"},{"name":"Drive-In Cherry","hex":"#a62e30"},{"name":"Drizzle","hex":"#a0af9d"},{"name":"Dromedary","hex":"#e3c295"},{"name":"Drop of Lemon","hex":"#fcf1bd"},{"name":"Droplet","hex":"#afc3bc"},{"name":"Drops of Honey","hex":"#d4ae76"},{"name":"Drover","hex":"#fbeb9b"},{"name":"Druchii Violet","hex":"#842994"},{"name":"Druid Green","hex":"#427131"},{"name":"Drunk-Tank Pink","hex":"#dd11dd"},{"name":"Dry Bone","hex":"#eadfce"},{"name":"Dry Catmint","hex":"#b9bdae"},{"name":"Dry Creek","hex":"#d8c7b6"},{"name":"Dry Dock","hex":"#817665"},{"name":"Dry Dune","hex":"#efdfcf"},{"name":"Dry Grass","hex":"#9ea26b"},{"name":"Dry Hemlock","hex":"#909373"},{"name":"Dry Highlighter Green","hex":"#2ba727"},{"name":"Dry Lichen","hex":"#c7d9cc"},{"name":"Dry Moss","hex":"#769958"},{"name":"Dry Mud","hex":"#777672"},{"name":"Dry Riverbed","hex":"#d2c5ae"},{"name":"Dry Rose","hex":"#c02e4c"},{"name":"Dry Sand","hex":"#eae4d6"},{"name":"Dry Seedlings","hex":"#c7dc68"},{"name":"Dry Starfish","hex":"#b09a77"},{"name":"Dryad Bark","hex":"#33312d"},{"name":"Drying Grass Green","hex":"#7bb369"},{"name":"Dubarry","hex":"#f25f66"},{"name":"Dubbin","hex":"#ae8b64"},{"name":"Dublin Jack","hex":"#6fab92"},{"name":"Ducal","hex":"#763d35"},{"name":"Ducal Pink","hex":"#ce9096"},{"name":"Ducati","hex":"#16a0a6"},{"name":"Duck Egg Blue","hex":"#c3fbf4"},{"name":"Duck Egg Cream","hex":"#c8e3d2"},{"name":"Duck Green","hex":"#53665c"},{"name":"Duck Hunt Green","hex":"#005800"},{"name":"Duck Sauce","hex":"#cc9922"},{"name":"Duck Tail","hex":"#e9d6b1"},{"name":"Duck Willow","hex":"#6a695a"},{"name":"Duck's Egg Blue","hex":"#ccdfe8"},{"name":"Duckie Yellow","hex":"#ffff11"},{"name":"Duckling","hex":"#fcb057"},{"name":"Duct Tape Grey","hex":"#aeacac"},{"name":"Duffel Bag","hex":"#394034"},{"name":"Duke Blue","hex":"#00009c"},{"name":"Dulcet","hex":"#9ad4d8"},{"name":"Dulcet Violet","hex":"#59394c"},{"name":"Dull","hex":"#727171"},{"name":"Dull Blue","hex":"#49759c"},{"name":"Dull Brown","hex":"#876e4b"},{"name":"Dull Gold","hex":"#8a6f48"},{"name":"Dull Green","hex":"#74a662"},{"name":"Dull Lavender","hex":"#a899e6"},{"name":"Dull Orange","hex":"#d8863b"},{"name":"Dull Pink","hex":"#d5869d"},{"name":"Dull Purple","hex":"#84597e"},{"name":"Dull Red","hex":"#bb3f3f"},{"name":"Dull Sage","hex":"#dbd4ab"},{"name":"Dull Teal","hex":"#5f9e8f"},{"name":"Dull Violet","hex":"#803790"},{"name":"Dull Yellow","hex":"#eedc5b"},{"name":"Dune","hex":"#514f4a"},{"name":"Dune Shadow","hex":"#867665"},{"name":"Dunes Manor","hex":"#d5c0a1"},{"name":"Duomo","hex":"#6e6064"},{"name":"Dupain","hex":"#58a0bc"},{"name":"Duqqa Brown","hex":"#442211"},{"name":"Durango Dust","hex":"#fbe3a1"},{"name":"Durban Sky","hex":"#5d8a9b"},{"name":"Durian","hex":"#b07939"},{"name":"Durian White","hex":"#e6d0ab"},{"name":"Durian Yellow","hex":"#e1bd27"},{"name":"Dusk","hex":"#4e5481"},{"name":"Dusk Blue","hex":"#7ba0c0"},{"name":"Dusk Orange","hex":"#fe4c40"},{"name":"Dusky","hex":"#c3aba8"},{"name":"Dusky Citron","hex":"#e3cc81"},{"name":"Dusky Cyclamen","hex":"#7d6d70"},{"name":"Dusky Damask","hex":"#b98478"},{"name":"Dusky Dawn","hex":"#e5e1de"},{"name":"Dusky Flesh","hex":"#774400"},{"name":"Dusky Grape","hex":"#877f95"},{"name":"Dusky Green","hex":"#746c57"},{"name":"Dusky Grouse","hex":"#8e969e"},{"name":"Dusky Haze","hex":"#a77572"},{"name":"Dusky Lilac","hex":"#d6cbda"},{"name":"Dusky Moon","hex":"#edecd7"},{"name":"Dusky Orchid","hex":"#9a7182"},{"name":"Dusky Pink","hex":"#cc7a8b"},{"name":"Dusky Purple","hex":"#895b7b"},{"name":"Dusky Rose","hex":"#ba6873"},{"name":"Dusky Taupe","hex":"#c9bdb7"},{"name":"Dusky Yellow","hex":"#ffff05"},{"name":"Dust","hex":"#b2996e"},{"name":"Dust Storm","hex":"#e7d3b7"},{"name":"Dust to Dust","hex":"#bbbcbc"},{"name":"Dusted Clay","hex":"#cc7357"},{"name":"Dusted Peri","hex":"#696ba0"},{"name":"Dusty Aqua","hex":"#c0dccd"},{"name":"Dusty Blue","hex":"#8c9dad"},{"name":"Dusty Cedar","hex":"#dd9592"},{"name":"Dusty Coral","hex":"#d29b83"},{"name":"Dusty Dream","hex":"#97a2a0"},{"name":"Dusty Green","hex":"#76a973"},{"name":"Dusty Grey","hex":"#cdccd0"},{"name":"Dusty Ivory","hex":"#f1ddbe"},{"name":"Dusty Jade Green","hex":"#7bb5a3"},{"name":"Dusty Lavender","hex":"#ac86a8"},{"name":"Dusty Olive","hex":"#646356"},{"name":"Dusty Orange","hex":"#e27a53"},{"name":"Dusty Pink","hex":"#d58a94"},{"name":"Dusty Plum","hex":"#d7d0e1"},{"name":"Dusty Purple","hex":"#825f87"},{"name":"Dusty Red","hex":"#b9484e"},{"name":"Dusty Rose","hex":"#ba797d"},{"name":"Dusty Sand","hex":"#bdbaae"},{"name":"Dusty Sky","hex":"#95a3a6"},{"name":"Dusty Teal","hex":"#4c9085"},{"name":"Dusty Trail","hex":"#c9bba3"},{"name":"Dusty Trail Rider","hex":"#c3b9a6"},{"name":"Dusty Turquoise","hex":"#649b9e"},{"name":"Dusty Warrior","hex":"#bab7b3"},{"name":"Dusty Yellow","hex":"#d4cc9a"},{"name":"Dutch Blue","hex":"#4a638d"},{"name":"Dutch Jug","hex":"#a5abb6"},{"name":"Dutch White","hex":"#f0dfbb"},{"name":"Duvall","hex":"#0f8b8e"},{"name":"Dwarf Rabbit","hex":"#c8ac89"},{"name":"Dwarf Spruce","hex":"#71847d"},{"name":"Dwarven Bronze","hex":"#bf652e"},{"name":"Dwarven Flesh","hex":"#ffa07a"},{"name":"Dying Light","hex":"#364141"},{"name":"Dying Moss","hex":"#669c7d"},{"name":"Dynamic","hex":"#6d5160"},{"name":"Dynamic Green","hex":"#a7e142"},{"name":"Dynamite Red","hex":"#dd3311"},{"name":"Dynasty Green","hex":"#008e80"},{"name":"E. Honda Beige","hex":"#f8d77f"},{"name":"Eagle","hex":"#b0ac94"},{"name":"Eagle Eye","hex":"#736665"},{"name":"Eagle's Meadow","hex":"#8d7d68"},{"name":"Eagle's View","hex":"#d4cbcc"},{"name":"Eagles Nest","hex":"#8a693f"},{"name":"Eames for Blue","hex":"#466b82"},{"name":"Earhart Emerald","hex":"#416659"},{"name":"Earl Grey","hex":"#a6978a"},{"name":"Earls Green","hex":"#b8a722"},{"name":"Early Blossom","hex":"#ffe5ed"},{"name":"Early Dawn","hex":"#797287"},{"name":"Early Evening","hex":"#cac7bf"},{"name":"Early Harvest","hex":"#b9be82"},{"name":"Early Snow","hex":"#fdf3e4"},{"name":"Early Spring","hex":"#96bc4a"},{"name":"Early Spring Night","hex":"#3c3fb1"},{"name":"Earth","hex":"#a2653e"},{"name":"Earth Brown","hex":"#4f1507"},{"name":"Earth Chi","hex":"#c7af88"},{"name":"Earth Crust","hex":"#8c4f42"},{"name":"Earth Eclipse","hex":"#71bab4"},{"name":"Earth Red","hex":"#95424e"},{"name":"Earth Rose","hex":"#b57770"},{"name":"Earth Warming","hex":"#bf9f91"},{"name":"Earth Yellow","hex":"#e1a95f"},{"name":"Earthbound","hex":"#a48a80"},{"name":"Earthly Delight","hex":"#ab8a68"},{"name":"Earthly Pleasures","hex":"#9f8863"},{"name":"Earthtone","hex":"#5d3a1a"},{"name":"Earthy Cane","hex":"#c5b28b"},{"name":"Earthy Khaki Green","hex":"#666600"},{"name":"Earthy Ocher","hex":"#b89e78"},{"name":"Easily Suede","hex":"#b29d8a"},{"name":"East Bay","hex":"#47526e"},{"name":"East Cape","hex":"#b0eee2"},{"name":"East Side","hex":"#aa8cbc"},{"name":"Easter Egg","hex":"#919bc9"},{"name":"Easter Green","hex":"#8cfd7e"},{"name":"Easter Purple","hex":"#c071fe"},{"name":"Easter Rabbit","hex":"#c7bfc3"},{"name":"Eastern Blue","hex":"#00879f"},{"name":"Eastern Gold","hex":"#b89b6c"},{"name":"Eastern Sky","hex":"#8fc1d2"},{"name":"Eastern Wolf","hex":"#dbd7d2"},{"name":"Eastlake Lavender","hex":"#887d79"},{"name":"Eastlake Olive","hex":"#a9a482"},{"name":"Easy","hex":"#beb394"},{"name":"Easy Breezy Blue","hex":"#9eb1ae"},{"name":"Easy Green","hex":"#9fb289"},{"name":"Easy On The Eyes","hex":"#f9ecb6"},{"name":"Eat Your Greens","hex":"#696845"},{"name":"Eat Your Peas","hex":"#80987a"},{"name":"Eaton Gold","hex":"#bb9f60"},{"name":"Eaves","hex":"#cecdad"},{"name":"Ebb","hex":"#e6d8d4"},{"name":"Ebbing Tide","hex":"#688d8a"},{"name":"Ebi Brown","hex":"#773c30"},{"name":"Ebicha Brown","hex":"#5e2824"},{"name":"Ebizome Purple","hex":"#6d2b50"},{"name":"Ebony","hex":"#313337"},{"name":"Ebony Clay","hex":"#323438"},{"name":"Ebony Lips","hex":"#b06a40"},{"name":"Ebony Wood","hex":"#2c3227"},{"name":"Eburnean","hex":"#ffffee"},{"name":"Eccentricity","hex":"#968a9f"},{"name":"Echo","hex":"#d7e7e0"},{"name":"Echo Blue","hex":"#a4afcd"},{"name":"Echo One","hex":"#629da6"},{"name":"Echoes of Love","hex":"#eededd"},{"name":"Eclectic","hex":"#aaafbd"},{"name":"Eclectic Plum","hex":"#8c6e67"},{"name":"Eclipse","hex":"#3f3939"},{"name":"Eclipse Blue","hex":"#456074"},{"name":"Ecological","hex":"#677f70"},{"name":"Ecru","hex":"#c2b280"},{"name":"Ecru Olive","hex":"#927b3c"},{"name":"Ecru Wealth","hex":"#d5cdb4"},{"name":"Ecru White","hex":"#d6d1c0"},{"name":"Ecstasy","hex":"#c96138"},{"name":"Ecstatic Red","hex":"#aa1122"},{"name":"Ecuadorian Banana","hex":"#ffff7e"},{"name":"Edamame","hex":"#9ca389"},{"name":"Edelweiss","hex":"#eee8d9"},{"name":"Eden","hex":"#266255"},{"name":"Eden Prairie","hex":"#95863c"},{"name":"Edge of Black","hex":"#54585e"},{"name":"Edgewater","hex":"#c1d8c5"},{"name":"Edocha","hex":"#a13d2d"},{"name":"Edward","hex":"#5e7e7d"},{"name":"Eerie Black","hex":"#1b1b1b"},{"name":"Effervescent Lime","hex":"#98da2c"},{"name":"EGA Green","hex":"#01ff07"},{"name":"Egg Liqueur","hex":"#dccaa8"},{"name":"Egg Sour","hex":"#f9e4c5"},{"name":"Egg White","hex":"#ffefc1"},{"name":"Egg Yolk Yellow","hex":"#ffce81"},{"name":"Eggnog","hex":"#fdea9f"},{"name":"Eggplant","hex":"#430541"},{"name":"Eggplant Ash","hex":"#656579"},{"name":"Eggplant Tint","hex":"#531b93"},{"name":"Eggshell","hex":"#f0ead6"},{"name":"Eggshell Blue","hex":"#a3ccc9"},{"name":"Eggshell Paper","hex":"#e2be9f"},{"name":"Eggshell Pink","hex":"#cdc4ba"},{"name":"Egret","hex":"#f3ece0"},{"name":"Egyptian Blue","hex":"#1034a6"},{"name":"Egyptian Enamel","hex":"#005c69"},{"name":"Egyptian Gold","hex":"#efa84c"},{"name":"Egyptian Red","hex":"#983f4a"},{"name":"Egyptian Sand","hex":"#beac90"},{"name":"Egyptian Teal","hex":"#008c8d"},{"name":"Egyptian Violet","hex":"#3d496d"},{"name":"Eiffel Tower","hex":"#998e83"},{"name":"Eigengrau","hex":"#16161d"},{"name":"Eiger Nordwand","hex":"#7799bb"},{"name":"El Capitan","hex":"#b7a696"},{"name":"El Paso","hex":"#39392c"},{"name":"El Salva","hex":"#8f4e45"},{"name":"Elastic Pink","hex":"#eca6ca"},{"name":"Eldar Flesh","hex":"#ecc083"},{"name":"Elder Creek","hex":"#afa892"},{"name":"Elderberry","hex":"#2e2249"},{"name":"Electra","hex":"#55b492"},{"name":"Electric Blue","hex":"#7df9ff"},{"name":"Electric Brown","hex":"#b56257"},{"name":"Electric Crimson","hex":"#ff003f"},{"name":"Electric Cyan","hex":"#0ff0fc"},{"name":"Electric Energy","hex":"#c9e423"},{"name":"Electric Flamingo","hex":"#fc74fd"},{"name":"Electric Glow","hex":"#ffd100"},{"name":"Electric Green","hex":"#21fc0d"},{"name":"Electric Indigo","hex":"#6600ff"},{"name":"Electric Lavender","hex":"#f4bfff"},{"name":"Electric Lime","hex":"#ccff00"},{"name":"Electric Orange","hex":"#ff3503"},{"name":"Electric Pink","hex":"#ff0490"},{"name":"Electric Purple","hex":"#bf00ff"},{"name":"Electric Red","hex":"#e60000"},{"name":"Electric Sheep","hex":"#55ffff"},{"name":"Electric Slide","hex":"#9db0b9"},{"name":"Electric Ultramarine","hex":"#3f00ff"},{"name":"Electric Violet","hex":"#8f00f1"},{"name":"Electric Yellow","hex":"#fffc00"},{"name":"Electromagnetic","hex":"#2e3840"},{"name":"Electron Blue","hex":"#0881d1"},{"name":"Electronic","hex":"#556d88"},{"name":"Electrum","hex":"#e7c697"},{"name":"Elegant Ice","hex":"#c4b9b7"},{"name":"Elegant Ivory","hex":"#f1e6d6"},{"name":"Elemental","hex":"#d0d3d3"},{"name":"Elemental Green","hex":"#969783"},{"name":"Elephant","hex":"#243640"},{"name":"Elephant Grey","hex":"#95918c"},{"name":"Elephant Skin","hex":"#8f8982"},{"name":"Elf Flesh","hex":"#f7c380"},{"name":"Elf Green","hex":"#1b8a6b"},{"name":"Elf Shoe","hex":"#68b082"},{"name":"Elf Skintone","hex":"#f7c985"},{"name":"Elf Slippers","hex":"#a6a865"},{"name":"Elfin Games","hex":"#9dd196"},{"name":"Elfin Herb","hex":"#cab4d4"},{"name":"Elfin Magic","hex":"#eddbe9"},{"name":"Elfin Yellow","hex":"#eeea97"},{"name":"Elite Pink","hex":"#bb8da8"},{"name":"Elizabeth Blue","hex":"#a1b8d2"},{"name":"Ellen","hex":"#e2c8b7"},{"name":"Ellis Mist","hex":"#778070"},{"name":"Elm","hex":"#297b76"},{"name":"Elm Green","hex":"#547053"},{"name":"Elmer's Echo","hex":"#264066"},{"name":"Elmwood","hex":"#8c7c61"},{"name":"Elusion","hex":"#d2cfcc"},{"name":"Elusive","hex":"#fed7cf"},{"name":"Elusive Blue","hex":"#dde4e8"},{"name":"Elusive Dream","hex":"#cdbfc6"},{"name":"Elusive Mauve","hex":"#dec4d2"},{"name":"Elusive Violet","hex":"#d4c0c5"},{"name":"Elven Flesh","hex":"#f7cf8a"},{"name":"Elysia Chlorotica","hex":"#9aae07"},{"name":"Elysian Green","hex":"#a5b145"},{"name":"Elysium Gold","hex":"#ce9500"},{"name":"Emanation","hex":"#b4a3bb"},{"name":"Embarrassed Frog","hex":"#996611"},{"name":"Embarrassment ","hex":"#ff7777"},{"name":"Embellishment","hex":"#cbdee2"},{"name":"Emberglow","hex":"#ea6759"},{"name":"Embracing","hex":"#246453"},{"name":"Embroidered Silk","hex":"#b8dca7"},{"name":"Emerald","hex":"#028f1e"},{"name":"Emerald City","hex":"#6a7e5f"},{"name":"Emerald Dream","hex":"#007a5e"},{"name":"Emerald Forest","hex":"#224347"},{"name":"Emerald Green","hex":"#046307"},{"name":"Emerald Pool","hex":"#155e60"},{"name":"Emerald Reflection","hex":"#50c878"},{"name":"Emerald Ring","hex":"#578758"},{"name":"Emerald Spring","hex":"#095155"},{"name":"Emerald Starling","hex":"#11bb11"},{"name":"Emerald Stone","hex":"#016360"},{"name":"Emerald Succulent","hex":"#55aaaa"},{"name":"Emerald Wave","hex":"#4fb3a9"},{"name":"Emerging Leaf","hex":"#e1e1cf"},{"name":"Emerson","hex":"#3e6058"},{"name":"Emilie's Dream","hex":"#eccee5"},{"name":"Emily Ann Tan","hex":"#d5c7b6"},{"name":"Eminence","hex":"#6e3974"},{"name":"Emoji Yellow","hex":"#ffde34"},{"name":"Emotive Ring","hex":"#856d70"},{"name":"Emperador","hex":"#684832"},{"name":"Emperor","hex":"#50494a"},{"name":"Emperor Jade","hex":"#007b75"},{"name":"Emperor Jewel","hex":"#715a8d"},{"name":"Emperor's Children","hex":"#f0a0b6"},{"name":"Emperor's Gold","hex":"#b0976d"},{"name":"Emperor's Robe","hex":"#99959d"},{"name":"Emperors Children","hex":"#b94278"},{"name":"Empire Ranch","hex":"#93826a"},{"name":"Empire Yellow","hex":"#f7d000"},{"name":"Empress","hex":"#7c7173"},{"name":"Empress Envy","hex":"#2a9ca0"},{"name":"Empress Teal","hex":"#10605a"},{"name":"Emptiness","hex":"#fcfdfc"},{"name":"Emu Egg","hex":"#3d8481"},{"name":"En Plein Air","hex":"#d0c5be"},{"name":"Enamel Blue","hex":"#007a8e"},{"name":"Enamelled Dragon","hex":"#54c589"},{"name":"Enamelled Jewel","hex":"#045c61"},{"name":"Encarnado","hex":"#fd0202"},{"name":"Enchanted","hex":"#c9e2cf"},{"name":"Enchanted Blue","hex":"#047495"},{"name":"Enchanted Eve","hex":"#79837f"},{"name":"Enchanted Evening","hex":"#d3e9ec"},{"name":"Enchanted Silver","hex":"#b5b5bd"},{"name":"Enchanted Wood","hex":"#94895f"},{"name":"Enchanting Ivy","hex":"#315955"},{"name":"Enchanting Sky","hex":"#7886aa"},{"name":"Enchantress","hex":"#5d3a47"},{"name":"Encore Teal","hex":"#30525b"},{"name":"Encounter","hex":"#ff9552"},{"name":"End of Summer","hex":"#cc8f15"},{"name":"Endeavour","hex":"#29598b"},{"name":"Ending Dawn","hex":"#fcc9b9"},{"name":"Ending Navy Blue","hex":"#1c305c"},{"name":"Endive","hex":"#cee1c8"},{"name":"Endless","hex":"#5b976a"},{"name":"Endless Galaxy Blue","hex":"#000044"},{"name":"Endless Silk","hex":"#ddddbb"},{"name":"Endless Slumber","hex":"#b1aab3"},{"name":"Endo","hex":"#5da464"},{"name":"Enduring Ice","hex":"#ebe8db"},{"name":"Energic Eggplant","hex":"#b300b3"},{"name":"Energise","hex":"#7cca6b"},{"name":"Energized","hex":"#d2d25a"},{"name":"Energos","hex":"#c0e740"},{"name":"Energy Orange","hex":"#ff9532"},{"name":"Energy Peak","hex":"#bb5f60"},{"name":"Energy Yellow","hex":"#f5d752"},{"name":"Enfield Brown","hex":"#a73211"},{"name":"English Forest","hex":"#606256"},{"name":"English Green","hex":"#1b4d3f"},{"name":"English Holly","hex":"#274234"},{"name":"English Ivy","hex":"#61845b"},{"name":"English Lavender","hex":"#9d7bb0"},{"name":"English Manor","hex":"#7181a4"},{"name":"English Meadow","hex":"#028a52"},{"name":"English Red","hex":"#ab4b52"},{"name":"English River","hex":"#3c768a"},{"name":"English Rose","hex":"#f4c6c3"},{"name":"English Rose Bud","hex":"#e9c9cb"},{"name":"English Scone","hex":"#e9cfbb"},{"name":"English Vermillion","hex":"#cc474b"},{"name":"English Violet","hex":"#563d5d"},{"name":"English Walnut","hex":"#3e2b23"},{"name":"Enhance","hex":"#d2a5be"},{"name":"Enigma","hex":"#bdbf35"},{"name":"Enjoy","hex":"#ead4c4"},{"name":"Enoki","hex":"#f8faee"},{"name":"Enokitake Mushroom","hex":"#ffeedd"},{"name":"Enough Is Enough","hex":"#898c4a"},{"name":"Enshūcha Red","hex":"#cb6649"},{"name":"Ensign Blue","hex":"#384c67"},{"name":"Entan Red","hex":"#ec6d51"},{"name":"Enterprise","hex":"#65788c"},{"name":"Enthusiasm","hex":"#00ffaa"},{"name":"Entrapment","hex":"#005961"},{"name":"Enviable","hex":"#53983c"},{"name":"Envious Pastel","hex":"#ddf3c2"},{"name":"Envisage","hex":"#96bfb7"},{"name":"Envy","hex":"#8ba58f"},{"name":"Ephemera","hex":"#6f5965"},{"name":"Ephren Blue","hex":"#1164b4"},{"name":"Epicurean Orange","hex":"#ea6a0a"},{"name":"Epsom","hex":"#849161"},{"name":"Equanimity","hex":"#83a9b3"},{"name":"Equator","hex":"#dab160"},{"name":"Equatorial Forest","hex":"#70855e"},{"name":"Equestrian","hex":"#bea781"},{"name":"Equilibrium","hex":"#a49f9f"},{"name":"Equinox","hex":"#62696b"},{"name":"Erebus Blue","hex":"#060030"},{"name":"Ermine","hex":"#836b4f"},{"name":"Erythrosine","hex":"#fc7ab0"},{"name":"Escargot","hex":"#fff1d8"},{"name":"Eshin Grey","hex":"#4a4f52"},{"name":"Eskimo Blue","hex":"#d8e4e7"},{"name":"Eskimo White","hex":"#c2bdc2"},{"name":"Esmeralda","hex":"#45be76"},{"name":"Esper's Fungus Green","hex":"#80f9ad"},{"name":"Esplanade","hex":"#d5bda4"},{"name":"Espresso","hex":"#4e312d"},{"name":"Espresso Macchiato","hex":"#4f4744"},{"name":"Esprit","hex":"#bebd99"},{"name":"Essence of Violet","hex":"#efedee"},{"name":"Essential Brown","hex":"#7d6848"},{"name":"Estate Blue","hex":"#233658"},{"name":"Estuary Blue","hex":"#70a5b7"},{"name":"Eternal Cherry","hex":"#dd0044"},{"name":"Eternal Flame","hex":"#a13f49"},{"name":"Eternal White","hex":"#faf3dc"},{"name":"Eternity","hex":"#2d2f28"},{"name":"Ether","hex":"#9eb6b8"},{"name":"Etherea","hex":"#a5958f"},{"name":"Ethereal","hex":"#e8dee3"},{"name":"Ethereal Blue","hex":"#5ca6ce"},{"name":"Ethereal Green","hex":"#f1ecca"},{"name":"Etherium Blue","hex":"#b9c4de"},{"name":"Ethiopian Wolf","hex":"#985629"},{"name":"Eton Blue","hex":"#96c8a2"},{"name":"Etruscan Red","hex":"#a2574b"},{"name":"Eucalipto","hex":"#4bc3a8"},{"name":"Eucalyptus","hex":"#329760"},{"name":"Eucalyptus Leaf","hex":"#bad2b8"},{"name":"Eunry","hex":"#cda59c"},{"name":"Euro Linen","hex":"#f2e8db"},{"name":"European Pine","hex":"#756556"},{"name":"Eva Green","hex":"#36ff9a"},{"name":"Even Evan","hex":"#998371"},{"name":"Even Growth","hex":"#b2aa7a"},{"name":"Evening Blue","hex":"#2a293e"},{"name":"Evening Blush","hex":"#c49087"},{"name":"Evening Cityscape","hex":"#4b535c"},{"name":"Evening Dove","hex":"#c2bead"},{"name":"Evening Dress","hex":"#d1a19b"},{"name":"Evening East","hex":"#585e6a"},{"name":"Evening Emerald","hex":"#56736f"},{"name":"Evening Fizz","hex":"#4d4970"},{"name":"Evening Glory","hex":"#3a4a62"},{"name":"Evening Glow","hex":"#fdd792"},{"name":"Evening Green","hex":"#7c7a3a"},{"name":"Evening Haze","hex":"#bdb8c7"},{"name":"Evening Hush","hex":"#7b8ca8"},{"name":"Evening Lagoon","hex":"#5868ae"},{"name":"Evening Lavender","hex":"#4d4469"},{"name":"Evening Mist","hex":"#e3e9e8"},{"name":"Evening Primrose","hex":"#ccdb1e"},{"name":"Evening Sand","hex":"#ddb6ab"},{"name":"Evening Sea","hex":"#26604f"},{"name":"Evening Shadow","hex":"#a1838b"},{"name":"Evening Sunset","hex":"#edb06d"},{"name":"Eventide","hex":"#656470"},{"name":"Everglade","hex":"#264334"},{"name":"Everglade Mist","hex":"#b7d7de"},{"name":"Evergreen","hex":"#11574a"},{"name":"Evergreen Boughs","hex":"#50594f"},{"name":"Evergreen Forest","hex":"#0e695f"},{"name":"Everlasting","hex":"#a1bed9"},{"name":"Everlasting Ice","hex":"#f6fdfa"},{"name":"Evil Sunz Scarlet","hex":"#c2191f"},{"name":"Evora","hex":"#538b89"},{"name":"Exaggerated Blush","hex":"#b55067"},{"name":"Excalibur","hex":"#676168"},{"name":"Excelsior","hex":"#908b85"},{"name":"Exclusive Ivory","hex":"#e2d8c3"},{"name":"Exclusively","hex":"#6b515f"},{"name":"Exclusively Yours","hex":"#f2aeb8"},{"name":"Executive Course","hex":"#8f8a70"},{"name":"Existential Angst","hex":"#0a0a0a"},{"name":"Exodus Fruit","hex":"#6264dc"},{"name":"Exotic Escape","hex":"#96d9df"},{"name":"Exotic Evening","hex":"#58516e"},{"name":"Exotic Flower","hex":"#ffa24c"},{"name":"Exotic Incense","hex":"#b86f73"},{"name":"Exotic Life","hex":"#ae7543"},{"name":"Exotic Lilac","hex":"#d198b5"},{"name":"Exotic Liras","hex":"#de0c62"},{"name":"Exotic Orange","hex":"#f96531"},{"name":"Exotic Violet","hex":"#e1a0cf"},{"name":"Exotica","hex":"#938586"},{"name":"Expanse","hex":"#777e65"},{"name":"Experience","hex":"#64acb5"},{"name":"Exploding Star","hex":"#fed83a"},{"name":"Exploration Green","hex":"#55a860"},{"name":"Exquisite","hex":"#c8a3bb"},{"name":"Exquisite Eggplant","hex":"#330033"},{"name":"Exquisite Turquoise","hex":"#11ccbb"},{"name":"Extinct","hex":"#9490b2"},{"name":"Extinct Volcano","hex":"#4a4f5a"},{"name":"Extra Life","hex":"#6ab417"},{"name":"Extra Mile","hex":"#91916d"},{"name":"Extraordinaire","hex":"#bda6c5"},{"name":"Extraviolet","hex":"#661188"},{"name":"Extreme Lavender","hex":"#dfc5d5"},{"name":"Exuberance","hex":"#e86800"},{"name":"Exuberant Orange","hex":"#f0622f"},{"name":"Eye Blue","hex":"#1e80c7"},{"name":"Eye Of Newt","hex":"#ae3d3b"},{"name":"Eye of the Storm","hex":"#d9e3d9"},{"name":"Eyeball","hex":"#fffbf8"},{"name":"Eyefull","hex":"#8db6b7"},{"name":"Eyelash Viper","hex":"#f4c54b"},{"name":"Eyelids","hex":"#440000"},{"name":"Eyre","hex":"#8f9482"},{"name":"Fabulous Fantasy","hex":"#ba90ad"},{"name":"Fabulous Find","hex":"#abe3c9"},{"name":"Fabulous Forties","hex":"#ddcdab"},{"name":"Facemark","hex":"#f7cf89"},{"name":"Fade to Black","hex":"#676965"},{"name":"Faded Blue","hex":"#658cbb"},{"name":"Faded Denim","hex":"#798ea4"},{"name":"Faded Green","hex":"#7bb274"},{"name":"Faded Grey","hex":"#eae8e4"},{"name":"Faded Jade","hex":"#427977"},{"name":"Faded Jeans","hex":"#5dbdcb"},{"name":"Faded Khaki","hex":"#a5975b"},{"name":"Faded Light","hex":"#f5e4de"},{"name":"Faded Orange","hex":"#f0944d"},{"name":"Faded Pink","hex":"#de9dac"},{"name":"Faded Poster","hex":"#80dbeb"},{"name":"Faded Purple","hex":"#916e99"},{"name":"Faded Red","hex":"#d3494e"},{"name":"Faded Rose","hex":"#bf6464"},{"name":"Faded Violet","hex":"#ddbedd"},{"name":"Faded Yellow","hex":"#feff7f"},{"name":"Fading Ember","hex":"#df691e"},{"name":"Faience","hex":"#2a6a8b"},{"name":"Faint Clover","hex":"#b2eed3"},{"name":"Faint Fawn","hex":"#e2c59c"},{"name":"Fair Aqua","hex":"#b8e2dc"},{"name":"Fair Green","hex":"#92af88"},{"name":"Fair Maiden","hex":"#f1e7dc"},{"name":"Fair Orchid","hex":"#c0aac0"},{"name":"Fair Pink","hex":"#f3e5dc"},{"name":"Fair Spring","hex":"#93977f"},{"name":"Fairbank Green","hex":"#9d9c7e"},{"name":"Fairest Jade","hex":"#d8e3d7"},{"name":"Fairstar","hex":"#6ba5a9"},{"name":"Fairway","hex":"#477050"},{"name":"Fairway Green","hex":"#26623f"},{"name":"Fairy Dust","hex":"#ffe8f4"},{"name":"Fairy Pink","hex":"#eed3cb"},{"name":"Fairy Princess","hex":"#f6dbdd"},{"name":"Fairy Sparkles","hex":"#b0e0f7"},{"name":"Fairy Tale","hex":"#f2c1d1"},{"name":"Fairy Wand","hex":"#aea4c1"},{"name":"Fairy Wings","hex":"#ffebf2"},{"name":"Fairy Wren","hex":"#9479af"},{"name":"Fairytale Dream","hex":"#facfcc"},{"name":"Faith","hex":"#d5ebac"},{"name":"Fake Jade","hex":"#13eac9"},{"name":"Falafel","hex":"#aa7711"},{"name":"Falcon","hex":"#6e5a5b"},{"name":"Falcon Turquoise","hex":"#007062"},{"name":"Fall Canyon","hex":"#c69896"},{"name":"Fall Chill","hex":"#e1dddb"},{"name":"Fall Foliage","hex":"#c28359"},{"name":"Fall Gold","hex":"#ffbc35"},{"name":"Fall Green","hex":"#ecfcbd"},{"name":"Fall Harvest","hex":"#a78a59"},{"name":"Fall Heliotrope","hex":"#a49491"},{"name":"Fall Leaf","hex":"#e5b7a5"},{"name":"Fallen Leaves","hex":"#917347"},{"name":"Fallen Rock","hex":"#807669"},{"name":"Falling Star","hex":"#cad5c8"},{"name":"Falling Tears","hex":"#c2d7df"},{"name":"Fallout Green","hex":"#b6c121"},{"name":"Fallow","hex":"#c19a51"},{"name":"Fallow Deer","hex":"#9f8d57"},{"name":"False Morel","hex":"#784d4c"},{"name":"False Puce","hex":"#a57e52"},{"name":"Falu Red","hex":"#801818"},{"name":"Family Tree","hex":"#a7b191"},{"name":"Fancy Flamingo","hex":"#ffb1b0"},{"name":"Fancy Flirt","hex":"#b4b780"},{"name":"Fancy Pants","hex":"#f3dae1"},{"name":"Fandangle","hex":"#e4de65"},{"name":"Fandango","hex":"#b53389"},{"name":"Fandango Pink","hex":"#e04f80"},{"name":"Fanfare","hex":"#006d70"},{"name":"Fangtooth Fish","hex":"#bbaa97"},{"name":"Fanlight","hex":"#f2eeaf"},{"name":"Fantan","hex":"#9f7e53"},{"name":"Fantasy","hex":"#f2e6dd"},{"name":"Fantasy Console Sky","hex":"#29adff"},{"name":"Far Away Grey","hex":"#2d383a"},{"name":"Faraway Sky","hex":"#8980c1"},{"name":"Farm Fresh","hex":"#8e9b88"},{"name":"Farmer's Market","hex":"#8f917c"},{"name":"Farmers Green","hex":"#96a69f"},{"name":"Farrago","hex":"#456f6e"},{"name":"Fashion Fuchsia","hex":"#f400a1"},{"name":"Fast Velvet","hex":"#8b94c7"},{"name":"Fat Tuesday","hex":"#352235"},{"name":"Fate","hex":"#6ba0bf"},{"name":"Favored One","hex":"#fae6cc"},{"name":"Favorite Fudge","hex":"#877252"},{"name":"Favorite Lavender","hex":"#d3a5d6"},{"name":"Favourite Lady","hex":"#e3c5d6"},{"name":"Fawn","hex":"#cfaf7b"},{"name":"Feather Boa","hex":"#f1c9cd"},{"name":"Feather Falls","hex":"#606972"},{"name":"Feather Grey","hex":"#b8ad9e"},{"name":"Feather White","hex":"#e7eae5"},{"name":"Featherbed","hex":"#afcbe5"},{"name":"Featherstone","hex":"#cdc7bb"},{"name":"February Frost","hex":"#e0dee3"},{"name":"Federal Blue","hex":"#43628b"},{"name":"Federal Fund","hex":"#30594b"},{"name":"Federation Brown","hex":"#634041"},{"name":"Fedora","hex":"#625665"},{"name":"Fēi Hóng Scarlet","hex":"#fe420f"},{"name":"Feijoa","hex":"#a5d785"},{"name":"Feijoa Flower","hex":"#edf2c3"},{"name":"Feldgrau","hex":"#4d5d53"},{"name":"Feldspar","hex":"#d19275"},{"name":"Felix","hex":"#00608f"},{"name":"Felt","hex":"#247345"},{"name":"Felt Green","hex":"#6fc391"},{"name":"Feminine Fancy","hex":"#c4a8cf"},{"name":"Femininity","hex":"#c7c2ce"},{"name":"Femme Fatale","hex":"#948593"},{"name":"Fěn Hóng Pink","hex":"#ff6cb5"},{"name":"Fennec Fox","hex":"#dad7c8"},{"name":"Fennel Flower","hex":"#77aaff"},{"name":"Fennel Seed","hex":"#998456"},{"name":"Fennel Stem","hex":"#b1b6a3"},{"name":"Fennel Tea","hex":"#d2f4dd"},{"name":"Fennelly","hex":"#9a9e80"},{"name":"Fenrisian Grey","hex":"#cedee7"},{"name":"Fenugreek","hex":"#c0916c"},{"name":"Fern","hex":"#548d44"},{"name":"Fern Flower","hex":"#576a7d"},{"name":"Fern Frond","hex":"#657220"},{"name":"Fern Gully","hex":"#595646"},{"name":"Fern Shade","hex":"#797447"},{"name":"Ferocious Fuchsia","hex":"#aa00cc"},{"name":"Ferra","hex":"#876a68"},{"name":"Ferrari Red","hex":"#ff2800"},{"name":"Ferris Wheel","hex":"#ad7d76"},{"name":"Ferry","hex":"#383e44"},{"name":"Fertility Green","hex":"#66fc00"},{"name":"Fervent Green","hex":"#469f4e"},{"name":"Festering Brown","hex":"#cb8e00"},{"name":"Festival","hex":"#eacc4a"},{"name":"Festival Fuchsia","hex":"#9e2c6a"},{"name":"Feta","hex":"#dbe0d0"},{"name":"Fibre Moss","hex":"#bec0af"},{"name":"Ficus","hex":"#3b593a"},{"name":"Fiddlehead Fern","hex":"#c8c387"},{"name":"Fiddler","hex":"#5a9589"},{"name":"Fiddlesticks","hex":"#bb9fb1"},{"name":"Field Blue","hex":"#4477aa"},{"name":"Field Day","hex":"#c5e6a4"},{"name":"Field Drab","hex":"#6c541e"},{"name":"Field Green","hex":"#60b922"},{"name":"Field Maple","hex":"#80884e"},{"name":"Field of Wheat","hex":"#deb699"},{"name":"Field Poppy","hex":"#d86f3c"},{"name":"Fierce Mantis","hex":"#7fc15c"},{"name":"Fiery Coral","hex":"#e26058"},{"name":"Fiery Flamingo","hex":"#f96d7b"},{"name":"Fiery Fuchsia","hex":"#b7386e"},{"name":"Fiery Glow","hex":"#f0531c"},{"name":"Fiery Orange","hex":"#b1592f"},{"name":"Fiery Red","hex":"#d01c1f"},{"name":"Fiery Rose","hex":"#ff5470"},{"name":"Fiesta","hex":"#edd8d2"},{"name":"Fiesta Blue","hex":"#6fc0b1"},{"name":"Fiesta Rojo","hex":"#b67c80"},{"name":"Fife","hex":"#a9a5c2"},{"name":"Fig","hex":"#532d3b"},{"name":"Fig Balsamic","hex":"#550022"},{"name":"Fig Branches","hex":"#7a634d"},{"name":"Figue","hex":"#9469a2"},{"name":"Figue Pulp","hex":"#962c54"},{"name":"Figurine","hex":"#e4d5c0"},{"name":"Fiji Coral","hex":"#6b5f68"},{"name":"Fiji Green","hex":"#636f22"},{"name":"Fiji Palm","hex":"#528d3c"},{"name":"Fiji Sands","hex":"#d8caa9"},{"name":"Filigree","hex":"#dfe7e8"},{"name":"Filtered Light","hex":"#b1b2c4"},{"name":"Filtered Rays","hex":"#d0b064"},{"name":"Filthy Brown","hex":"#e8aa08"},{"name":"Finch","hex":"#75785a"},{"name":"Fine Grain","hex":"#d8cfc1"},{"name":"Fine Linen","hex":"#faf5c3"},{"name":"Fine Sand","hex":"#f1d5ae"},{"name":"Finest Silk","hex":"#f1e5d7"},{"name":"Finger Banana","hex":"#e1c12f"},{"name":"Fingerpaint","hex":"#8a7e61"},{"name":"Fingerprint","hex":"#555356"},{"name":"Finishing Touch","hex":"#cbbfb3"},{"name":"Finlandia","hex":"#61755b"},{"name":"Finn","hex":"#694554"},{"name":"Finnish Fiord","hex":"#5db0be"},{"name":"Fioletowy Purple","hex":"#fc44a3"},{"name":"Fioletowyi Purple","hex":"#fffce3"},{"name":"Fiord","hex":"#4b5a62"},{"name":"Fir","hex":"#3a725f"},{"name":"Fir Green","hex":"#67592a"},{"name":"Fire","hex":"#8f3f2a"},{"name":"Fire Ant","hex":"#be6400"},{"name":"Fire Axe Red","hex":"#ce1620"},{"name":"Fire Bush","hex":"#e09842"},{"name":"Fire Chalk","hex":"#d2806c"},{"name":"Fire Chi","hex":"#92353a"},{"name":"Fire Coral","hex":"#e3b46f"},{"name":"Fire Dragon Bright","hex":"#f97306"},{"name":"Fire Dust","hex":"#b98d68"},{"name":"Fire Engine Red","hex":"#fe0002"},{"name":"Fire Flower","hex":"#f68f37"},{"name":"Fire Opal","hex":"#fd3c06"},{"name":"Fire Orange","hex":"#ff8e57"},{"name":"Fireball","hex":"#ce2029"},{"name":"Firebrick","hex":"#b22222"},{"name":"Firebug","hex":"#cd5c51"},{"name":"Firecracker","hex":"#f36944"},{"name":"Fired Brick","hex":"#6a2e2a"},{"name":"Fired Clay","hex":"#884444"},{"name":"Firefly","hex":"#314643"},{"name":"Firefly Glow","hex":"#fff3a1"},{"name":"Firelight","hex":"#f9d97b"},{"name":"Fireplace Kitten","hex":"#c5c9c7"},{"name":"Fireweed","hex":"#b38491"},{"name":"Fireworks","hex":"#44363d"},{"name":"First Crush","hex":"#f6e2ea"},{"name":"First Date","hex":"#f5b1a2"},{"name":"First Frost","hex":"#dae3e9"},{"name":"First Impression","hex":"#f4e5e7"},{"name":"First Landing","hex":"#59a6cf"},{"name":"First Light","hex":"#d9e6ee"},{"name":"First Lilac","hex":"#e7d6ed"},{"name":"First Love","hex":"#cf758a"},{"name":"First Plum","hex":"#b87592"},{"name":"First Post","hex":"#2fbda1"},{"name":"First Snow","hex":"#e8eff8"},{"name":"First Timer Green","hex":"#00e8d8"},{"name":"First Tulip","hex":"#ffe79c"},{"name":"Fish Bone","hex":"#e4d9c5"},{"name":"Fish Camp Woods","hex":"#7a9682"},{"name":"Fish Ceviche","hex":"#e1e1d5"},{"name":"Fish Finger","hex":"#eecc55"},{"name":"Fish Net Blue","hex":"#1e446e"},{"name":"Fish Pond","hex":"#86c8ed"},{"name":"Fisher King","hex":"#5182b9"},{"name":"Fistfull of Green","hex":"#a2a415"},{"name":"Fitzgerald Smoke","hex":"#b3b6b0"},{"name":"Five Star","hex":"#ffaa4a"},{"name":"Fizz","hex":"#b1dbaa"},{"name":"Fizzle","hex":"#d8e4de"},{"name":"Fjord Blue","hex":"#007290"},{"name":"Flagstone","hex":"#acadad"},{"name":"Flagstone Quartzite","hex":"#9a9e88"},{"name":"Flamboyant","hex":"#129c8b"},{"name":"Flamboyant Plum","hex":"#694e52"},{"name":"Flame","hex":"#e25822"},{"name":"Flame Hawkfish","hex":"#960018"},{"name":"Flame Orange","hex":"#fb8b23"},{"name":"Flame Pea","hex":"#be5c48"},{"name":"Flame Red","hex":"#86282e"},{"name":"Flame Scarlet","hex":"#cd212a"},{"name":"Flamenco","hex":"#ea8645"},{"name":"Flamingo","hex":"#e1634f"},{"name":"Flamingo Feather","hex":"#f8bdd9"},{"name":"Flamingo Peach","hex":"#f6e2d8"},{"name":"Flamingo Pink","hex":"#fc8eac"},{"name":"Flan","hex":"#f6e3b4"},{"name":"Flannel Pajamas","hex":"#8b8d98"},{"name":"Flash Gitz Yellow","hex":"#fffb05"},{"name":"Flash of Orange","hex":"#ffaa00"},{"name":"Flashman","hex":"#7cbd85"},{"name":"Flat Aluminum","hex":"#c3c6cd"},{"name":"Flat Blue","hex":"#3c73a8"},{"name":"Flat Brown","hex":"#754600"},{"name":"Flat Earth","hex":"#aa5533"},{"name":"Flat Flesh","hex":"#f7d48f"},{"name":"Flat Green","hex":"#699d4c"},{"name":"Flat Yellow","hex":"#fff005"},{"name":"Flattery","hex":"#6b4424"},{"name":"Flavescent","hex":"#f7e98e"},{"name":"Flavoparmelia Caperata","hex":"#8fb67b"},{"name":"Flax","hex":"#eedc82"},{"name":"Flax Bloom","hex":"#d2d8f4"},{"name":"Flax Fiber","hex":"#e0d68e"},{"name":"Flax Flower","hex":"#5577aa"},{"name":"Flax Flower Blue","hex":"#4499dd"},{"name":"Flax Smoke","hex":"#7b8265"},{"name":"Flaxen","hex":"#fbecc9"},{"name":"Flaxen Fair","hex":"#e3ddbd"},{"name":"Flaxseed","hex":"#f7e6c6"},{"name":"Flayed One Flesh","hex":"#fcfcde"},{"name":"Fleck","hex":"#97bbe1"},{"name":"Flemish Blue","hex":"#add0e0"},{"name":"Flesh","hex":"#ffcbc4"},{"name":"Flesh Wash","hex":"#ce8c42"},{"name":"Fleshtone Shade Wash","hex":"#cf9346"},{"name":"Fleur-De-Lis","hex":"#b090c7"},{"name":"Flickering Firefly","hex":"#f8f6e6"},{"name":"Flickering Gold","hex":"#c6a668"},{"name":"Flickering Light","hex":"#fff1dc"},{"name":"Flickery C64","hex":"#4f81ff"},{"name":"Flickery CRT Green","hex":"#90f215"},{"name":"Flickr Blue","hex":"#216bd6"},{"name":"Flickr Pink","hex":"#fb0081"},{"name":"Flier Lie","hex":"#cdb891"},{"name":"Flight Time","hex":"#a3b8ce"},{"name":"Flinders Green","hex":"#6d7058"},{"name":"Fling Green","hex":"#8ecfd0"},{"name":"Flint","hex":"#716e61"},{"name":"Flint Corn Red","hex":"#d9623b"},{"name":"Flint Grey","hex":"#a09c98"},{"name":"Flint Purple","hex":"#42424d"},{"name":"Flint Rock","hex":"#989493"},{"name":"Flintstone","hex":"#677283"},{"name":"Flip","hex":"#45747e"},{"name":"Flip-Flop","hex":"#f2c4a7"},{"name":"Flipper","hex":"#7f726b"},{"name":"Flirt","hex":"#7a2e4d"},{"name":"Flirtatious","hex":"#ffd637"},{"name":"Flirtatious Indigo Tea","hex":"#473f2d"},{"name":"Floating Feather","hex":"#e9d8c2"},{"name":"Floating Lily Pad","hex":"#ccc7a1"},{"name":"Flood Mud","hex":"#877966"},{"name":"Flood Out","hex":"#579dab"},{"name":"Flora","hex":"#73fa79"},{"name":"Floral Bouquet","hex":"#bacb7c"},{"name":"Floral Leaf","hex":"#ffb94e"},{"name":"Floral Linen","hex":"#f5e2de"},{"name":"Floral Tapestry","hex":"#c39191"},{"name":"Floral White","hex":"#fffaf0"},{"name":"Florence","hex":"#96b576"},{"name":"Florentine Lapis","hex":"#1c5798"},{"name":"Florida Keys","hex":"#56beab"},{"name":"Floriography","hex":"#a54049"},{"name":"Floss","hex":"#d7b3b9"},{"name":"Flotation","hex":"#7bb0ba"},{"name":"Flounce","hex":"#4a8791"},{"name":"Flour Sack","hex":"#b9b297"},{"name":"Flower Bulb","hex":"#d9e8c9"},{"name":"Flower Centre","hex":"#fde6c6"},{"name":"Flower Girl","hex":"#f498ad"},{"name":"Flower Girl Dress","hex":"#ede7e6"},{"name":"Flower Hat Jellyfish","hex":"#f9d593"},{"name":"Flower Spell","hex":"#ffc9d7"},{"name":"Flower Stem","hex":"#b5d5b0"},{"name":"Flowering Cactus","hex":"#a2d4bd"},{"name":"Flowering Raspberry","hex":"#a16c94"},{"name":"Flowering Reed","hex":"#e1d8b8"},{"name":"Fluffy Duckling","hex":"#fcdf39"},{"name":"Fluffy Pink","hex":"#f7d6cb"},{"name":"Fluorescence","hex":"#89d178"},{"name":"Fluorescent Fire","hex":"#984427"},{"name":"Fluorescent Green","hex":"#08ff08"},{"name":"Fluorescent Lime","hex":"#bdc233"},{"name":"Fluorescent Orange","hex":"#ffcf00"},{"name":"Fluorescent Pink","hex":"#fe1493"},{"name":"Fluorescent Red","hex":"#ff5555"},{"name":"Fluorescent Red Orange","hex":"#fc8427"},{"name":"Fluorescent Turquoise","hex":"#00fdff"},{"name":"Fluorescent Yellow","hex":"#ccff02"},{"name":"Fluorite Green","hex":"#699158"},{"name":"Fluoro Green","hex":"#74af54"},{"name":"Fluro Green","hex":"#0aff02"},{"name":"Flush Mahogany","hex":"#ca2425"},{"name":"Flush Orange","hex":"#ff6f01"},{"name":"Flushed","hex":"#dd5555"},{"name":"Fly a Kite","hex":"#c8daf5"},{"name":"Fly Agaric","hex":"#ff2052"},{"name":"Flying Carpet","hex":"#787489"},{"name":"Flying Fish Blue","hex":"#024aca"},{"name":"Foam","hex":"#d0eae8"},{"name":"Foam Green","hex":"#90fda9"},{"name":"Foaming Surf","hex":"#90d1dd"},{"name":"Focus","hex":"#e5e0d2"},{"name":"Focus on Light","hex":"#fef9d3"},{"name":"Focus Point","hex":"#91c3bd"},{"name":"Fog","hex":"#d6d7d2"},{"name":"Fog Beacon","hex":"#d8d6d1"},{"name":"Fog Green","hex":"#c2cbb4"},{"name":"Fog of War","hex":"#112233"},{"name":"Foggy Day","hex":"#e7e3db"},{"name":"Foggy Dew","hex":"#d1d5d0"},{"name":"Foggy Grey","hex":"#a7a69d"},{"name":"Foggy Heath","hex":"#e2c9ff"},{"name":"Foggy London","hex":"#5c5658"},{"name":"Foggy Love","hex":"#d5c7e8"},{"name":"Foggy Night","hex":"#a79c8e"},{"name":"Foggy Quartz","hex":"#bfa2a1"},{"name":"Fogtown","hex":"#eef0e7"},{"name":"Foil","hex":"#c0c3c4"},{"name":"Foille","hex":"#b0b99c"},{"name":"Foliage","hex":"#95b388"},{"name":"Foliage Green","hex":"#3e6f58"},{"name":"Folk Tales","hex":"#a5c1b6"},{"name":"Folklore","hex":"#684141"},{"name":"Folkstone Grey","hex":"#626879"},{"name":"Follow the Leader","hex":"#f7e5d0"},{"name":"Folly","hex":"#fd004d"},{"name":"Fond de Teint","hex":"#ffaaaa"},{"name":"Fond Memory","hex":"#c8bcb7"},{"name":"Fondue Fudge","hex":"#5d4236"},{"name":"Fool's Gold","hex":"#cad175"},{"name":"Football","hex":"#825736"},{"name":"Foothill Drive","hex":"#cab48e"},{"name":"Foothills","hex":"#e1cfa5"},{"name":"Footie Pajamas","hex":"#e6cee6"},{"name":"For the Love of Hue","hex":"#457e87"},{"name":"Forbidden Forest","hex":"#215354"},{"name":"Forbidden Fruit","hex":"#fe7b7c"},{"name":"Force of Nature","hex":"#d5ce69"},{"name":"Foresight","hex":"#94a8d3"},{"name":"Forest","hex":"#0b5509"},{"name":"Forest Biome","hex":"#184a45"},{"name":"Forest Blues","hex":"#0d4462"},{"name":"Forest Bound","hex":"#738f50"},{"name":"Forest Canopy","hex":"#969582"},{"name":"Forest Fern","hex":"#63b76c"},{"name":"Forest Floor","hex":"#555142"},{"name":"Forest Frolic","hex":"#88bb95"},{"name":"Forest Fruit Pink","hex":"#68393b"},{"name":"Forest Green","hex":"#154406"},{"name":"Forest Lichen","hex":"#9aa22b"},{"name":"Forest Maid","hex":"#52b963"},{"name":"Forest Night","hex":"#434237"},{"name":"Forest Path","hex":"#708d6c"},{"name":"Forest Ride","hex":"#006800"},{"name":"Forest Shade","hex":"#91ac80"},{"name":"Forest Spirit","hex":"#667028"},{"name":"Forest Splendor","hex":"#016e61"},{"name":"Forest Tapestry","hex":"#a4ba8a"},{"name":"Forest Tent","hex":"#bba748"},{"name":"Forester","hex":"#9aa77c"},{"name":"Forever Blue","hex":"#899bb8"},{"name":"Forever Fairytale","hex":"#d2bbb2"},{"name":"Forever Faithful","hex":"#efe6e1"},{"name":"Forged Iron","hex":"#48464a"},{"name":"Forget-Me-Not","hex":"#0087bd"},{"name":"Forgive Quickly","hex":"#e1e1be"},{"name":"Forgotten Gold","hex":"#c7b89f"},{"name":"Forgotten Pink","hex":"#ffd9d6"},{"name":"Forgotten Purple","hex":"#9878f8"},{"name":"Formal Grey","hex":"#97969a"},{"name":"Forsythia Blossom","hex":"#f6d76e"},{"name":"Fortress Grey","hex":"#b8b8b8"},{"name":"Fortune Cookie","hex":"#e0c5a1"},{"name":"Fossil","hex":"#806f63"},{"name":"Fossil Green","hex":"#6c6a43"},{"name":"Fossil Sand","hex":"#d2c8bb"},{"name":"Fossil Stone","hex":"#e3ddcc"},{"name":"Fossilized Leaf","hex":"#756a43"},{"name":"Foul Green","hex":"#85c7a1"},{"name":"Foundation","hex":"#f8e8c5"},{"name":"Foundation White","hex":"#eeeeff"},{"name":"Fountain Blue","hex":"#65adb2"},{"name":"Fountain City","hex":"#9cd4cf"},{"name":"Fountain Frolic","hex":"#e4e4c5"},{"name":"Four Leaf Clover","hex":"#738f5d"},{"name":"Fox","hex":"#c38743"},{"name":"Fox Tails","hex":"#dd8800"},{"name":"Foxfire Brown","hex":"#9f6949"},{"name":"Foxglove","hex":"#b98391"},{"name":"Foxtail","hex":"#bc896e"},{"name":"Foxy Fuchsia","hex":"#9f00c5"},{"name":"Foxy Lady","hex":"#d5a6ad"},{"name":"Fozzie Bear","hex":"#70625c"},{"name":"Fragile","hex":"#bbb8d0"},{"name":"Fragile Fern","hex":"#eff2db"},{"name":"Fragrant Cloves","hex":"#ac5e3a"},{"name":"Fragrant Lilac","hex":"#ceadbe"},{"name":"Fragrant Satchel","hex":"#a99fba"},{"name":"Fragrant Wand","hex":"#adb1c1"},{"name":"Framboise","hex":"#e40058"},{"name":"Frangipani","hex":"#ffd7a0"},{"name":"Frank Lloyd White","hex":"#efebdb"},{"name":"Frankenstein","hex":"#7ba05b"},{"name":"Frankly Earnest","hex":"#e2dbca"},{"name":"Frappe","hex":"#d1b7a0"},{"name":"Freckles","hex":"#d78775"},{"name":"Free Reign","hex":"#d1cdca"},{"name":"Free Speech Aquamarine","hex":"#029d74"},{"name":"Free Speech Blue","hex":"#4156c5"},{"name":"Free Speech Green","hex":"#09f911"},{"name":"Free Speech Magenta","hex":"#e35bd8"},{"name":"Free Speech Red","hex":"#c00000"},{"name":"Free Spirit","hex":"#deeeed"},{"name":"Freedom","hex":"#3b5e68"},{"name":"Freedom Found","hex":"#657682"},{"name":"Freefall","hex":"#565266"},{"name":"Freesia","hex":"#f3c12c"},{"name":"Freinacht Black","hex":"#232f36"},{"name":"French Beige","hex":"#a67b50"},{"name":"French Bistre","hex":"#856d4d"},{"name":"French Blue","hex":"#0072bb"},{"name":"French Bustle","hex":"#f2d5d4"},{"name":"French Diamond","hex":"#597191"},{"name":"French Fuchsia","hex":"#fd3f92"},{"name":"French Grey","hex":"#bfbdc1"},{"name":"French Grey Linen","hex":"#cac8b6"},{"name":"French Lilac","hex":"#deb7d9"},{"name":"French Lilac Blue","hex":"#adbae3"},{"name":"French Lime","hex":"#c0ff00"},{"name":"French Limestone","hex":"#c9d6c2"},{"name":"French Manicure","hex":"#fee6dc"},{"name":"French Market","hex":"#a2c7a3"},{"name":"French Mauve","hex":"#d473d4"},{"name":"French Mirage Blue","hex":"#446688"},{"name":"French Oak","hex":"#bb9e7c"},{"name":"French Pass","hex":"#a4d2e0"},{"name":"French Pink","hex":"#fd6c9e"},{"name":"French Plum","hex":"#811453"},{"name":"French Porcelain","hex":"#f6f4f6"},{"name":"French Puce","hex":"#4e1609"},{"name":"French Raspberry","hex":"#c72c48"},{"name":"French Roast","hex":"#58423f"},{"name":"French Rose","hex":"#f64a8a"},{"name":"French Sky Blue","hex":"#77b5fe"},{"name":"French Vanilla","hex":"#efe1a7"},{"name":"French Violet","hex":"#8806ce"},{"name":"French White","hex":"#f1e7db"},{"name":"French Wine","hex":"#ac1e44"},{"name":"Fresco","hex":"#f4dbd9"},{"name":"Fresco Blue","hex":"#034c67"},{"name":"Fresco Green","hex":"#7bd9ad"},{"name":"Fresh Acorn","hex":"#d2693e"},{"name":"Fresh Air","hex":"#a6e7ff"},{"name":"Fresh Apricot","hex":"#ffd7a5"},{"name":"Fresh Artichoke","hex":"#7c8447"},{"name":"Fresh Auburn","hex":"#a52a24"},{"name":"Fresh Baked Bread","hex":"#f8d7be"},{"name":"Fresh Basil","hex":"#5c5f4b"},{"name":"Fresh Blue of Bel Air","hex":"#069af3"},{"name":"Fresh Breeze","hex":"#beeddc"},{"name":"Fresh Cantaloupe","hex":"#ff9c68"},{"name":"Fresh Clay","hex":"#be8035"},{"name":"Fresh Cut","hex":"#f2003c"},{"name":"Fresh Cut Grass","hex":"#91cb7d"},{"name":"Fresh Dough","hex":"#f2ebe6"},{"name":"Fresh Eggplant","hex":"#4f467e"},{"name":"Fresh Frappe","hex":"#dbe69d"},{"name":"Fresh Gingerbread","hex":"#d3691f"},{"name":"Fresh Granny Smith","hex":"#7ff217"},{"name":"Fresh Green","hex":"#69d84f"},{"name":"Fresh Grown","hex":"#f0f7c4"},{"name":"Fresh Herb","hex":"#77913b"},{"name":"Fresh Honeydew","hex":"#f6efc5"},{"name":"Fresh Lavender","hex":"#8e90b4"},{"name":"Fresh Leaf","hex":"#93ef10"},{"name":"Fresh Lemonade","hex":"#ece678"},{"name":"Fresh Lettuce","hex":"#b2d58c"},{"name":"Fresh Lime","hex":"#d8f1cb"},{"name":"Fresh Linen","hex":"#ebe8da"},{"name":"Fresh Mint","hex":"#2a5443"},{"name":"Fresh Neon Pink","hex":"#ff11ff"},{"name":"Fresh Onion","hex":"#5b8930"},{"name":"Fresh Oregano","hex":"#4faa6c"},{"name":"Fresh Piglet","hex":"#fddde6"},{"name":"Fresh Pineapple","hex":"#f3d64f"},{"name":"Fresh Pink Lemonade","hex":"#d2adb5"},{"name":"Fresh Salmon","hex":"#ff7f6a"},{"name":"Fresh Snow","hex":"#f6efe1"},{"name":"Fresh Sod","hex":"#91a085"},{"name":"Fresh Squeezed","hex":"#ffad00"},{"name":"Fresh Straw","hex":"#eecc66"},{"name":"Fresh Thyme","hex":"#aebda8"},{"name":"Fresh Turquoise","hex":"#40e0d0"},{"name":"Fresh Up","hex":"#dfebb1"},{"name":"Fresh Water","hex":"#c6e3f7"},{"name":"Freshman","hex":"#e6f2c4"},{"name":"Friar Brown","hex":"#6e493a"},{"name":"Friar Grey","hex":"#807e79"},{"name":"Friar Tuck","hex":"#ddb994"},{"name":"Friar's Brown","hex":"#5e5241"},{"name":"Friend Flesh","hex":"#f1a4b7"},{"name":"Friendly Homestead","hex":"#c8a992"},{"name":"Friends","hex":"#e8c5c1"},{"name":"Fright Night","hex":"#004499"},{"name":"Frilled Shark","hex":"#939fa9"},{"name":"Frills","hex":"#8fa6c1"},{"name":"Fringy Flower","hex":"#b4e1bb"},{"name":"Frisky","hex":"#ccdda1"},{"name":"Frivolous Folly","hex":"#cfd2c7"},{"name":"Frog Green","hex":"#58bc08"},{"name":"Frog Hollow","hex":"#7da270"},{"name":"Frog Prince","hex":"#bbd75a"},{"name":"Frog's Legs","hex":"#8c8449"},{"name":"Frogger","hex":"#8cd612"},{"name":"Froly","hex":"#e56d75"},{"name":"Frond","hex":"#7b7f56"},{"name":"Frontier","hex":"#314a49"},{"name":"Frontier Fort","hex":"#c3b19f"},{"name":"Frontier Land","hex":"#bca59a"},{"name":"Frontier Shingle","hex":"#7b5f46"},{"name":"Frost","hex":"#e1e4c5"},{"name":"Frost Grey","hex":"#848283"},{"name":"Frost Gum","hex":"#8ecb9e"},{"name":"Frostbite","hex":"#acfffc"},{"name":"Frosted Almond","hex":"#d2c2ac"},{"name":"Frosted Garden","hex":"#e2f7d9"},{"name":"Frosted Glass","hex":"#eaf0f0"},{"name":"Frosted Grape","hex":"#d4c4d2"},{"name":"Frosted Iris","hex":"#b1b9d9"},{"name":"Frosted Lilac","hex":"#d3d1dc"},{"name":"Frosted Mint","hex":"#e2f2e4"},{"name":"Frosted Sugar","hex":"#d5bcc2"},{"name":"Frosted Tulip","hex":"#f6d8d7"},{"name":"Frostee","hex":"#dbe5d2"},{"name":"Frosting Cream","hex":"#fffbee"},{"name":"Frostproof","hex":"#d1f0f6"},{"name":"Frosty Dawn","hex":"#cbe9c9"},{"name":"Frosty Day","hex":"#ccebf5"},{"name":"Frosty Fog","hex":"#dee1e9"},{"name":"Frosty Glade","hex":"#a0c0bf"},{"name":"Frosty Green","hex":"#a3b5a6"},{"name":"Frosty Mint","hex":"#e2f7f1"},{"name":"Frosty Pine","hex":"#c7cfbe"},{"name":"Frosty Spruce","hex":"#578270"},{"name":"Froth","hex":"#c6b8ae"},{"name":"Frozen Blue","hex":"#a5c5d9"},{"name":"Frozen Custard","hex":"#fbeabd"},{"name":"Frozen Dew","hex":"#d8cfb2"},{"name":"Frozen Edamame","hex":"#9ca48a"},{"name":"Frozen Forest","hex":"#cfe8b6"},{"name":"Frozen Frappe","hex":"#ddc5d2"},{"name":"Frozen Grass","hex":"#deeadc"},{"name":"Frozen Lake","hex":"#7b9cb3"},{"name":"Frozen Mint","hex":"#d8e8e6"},{"name":"Frozen Moss Green","hex":"#addfad"},{"name":"Frozen Pea","hex":"#c4ead5"},{"name":"Frozen Statues","hex":"#e1dee5"},{"name":"Frozen Tundra","hex":"#a3bfcb"},{"name":"Frozen Wave","hex":"#56acca"},{"name":"Frugal","hex":"#a5d7b2"},{"name":"Fruit Dove","hex":"#ce5b78"},{"name":"Fruit Of Passion","hex":"#946985"},{"name":"Fruit Salad","hex":"#4ba351"},{"name":"Fruit Yard","hex":"#604241"},{"name":"Fruity Licious","hex":"#f69092"},{"name":"Fuchsia","hex":"#ed0dd9"},{"name":"Fuchsia Berries","hex":"#333322"},{"name":"Fuchsia Blue","hex":"#7a58c1"},{"name":"Fuchsia Blush","hex":"#e47cb8"},{"name":"Fuchsia Fever","hex":"#ff5599"},{"name":"Fuchsia Flash","hex":"#dd55cc"},{"name":"Fuchsia Flock","hex":"#ab446b"},{"name":"Fuchsia Fluorish","hex":"#bb2299"},{"name":"Fúchsia Intenso","hex":"#d800cc"},{"name":"Fuchsia Pink","hex":"#ff77ff"},{"name":"Fuchsia Purple","hex":"#d33479"},{"name":"Fuchsia Red","hex":"#ab3475"},{"name":"Fuchsia Rose","hex":"#c74375"},{"name":"Fuchsia Tint","hex":"#c255c1"},{"name":"Fuchsite","hex":"#c3d9ce"},{"name":"Fudge","hex":"#493338"},{"name":"Fudge Truffle","hex":"#604a3f"},{"name":"Fudgesicle","hex":"#d46bac"},{"name":"Fuegan Orange","hex":"#c77e4d"},{"name":"Fuego","hex":"#c2d62e"},{"name":"Fuel Town","hex":"#596472"},{"name":"Fuel Yellow","hex":"#d19033"},{"name":"Fuji Peak","hex":"#f6eee2"},{"name":"Fuji Purple","hex":"#89729e"},{"name":"Fujinezumi","hex":"#766980"},{"name":"Fulgrim Pink","hex":"#f5b3ce"},{"name":"Fulgurite Copper","hex":"#e6b77e"},{"name":"Full Moon","hex":"#f4f3e0"},{"name":"Full Of Life","hex":"#de5f2f"},{"name":"Fulvous","hex":"#e48400"},{"name":"Fun and Games","hex":"#33789c"},{"name":"Fun Blue","hex":"#335083"},{"name":"Fun Green","hex":"#15633d"},{"name":"Fundy Bay","hex":"#cdd2c9"},{"name":"Fungi","hex":"#8f8177"},{"name":"Funk","hex":"#3ea380"},{"name":"Funkie Friday","hex":"#4a3c4a"},{"name":"Funky Frog","hex":"#98bd3c"},{"name":"Furious Red","hex":"#ff1100"},{"name":"Furnace","hex":"#dd4124"},{"name":"Fuscous Grey","hex":"#54534d"},{"name":"Fusion Coral","hex":"#ff8576"},{"name":"Fusion Red","hex":"#ff6163"},{"name":"Futaai Indigo","hex":"#614e6e"},{"name":"Future","hex":"#15abbe"},{"name":"Future Hair","hex":"#20b562"},{"name":"Futuristic","hex":"#998da8"},{"name":"Fuzzy Duckling","hex":"#ffea70"},{"name":"Fuzzy Navel","hex":"#ffd69f"},{"name":"Fuzzy Peach","hex":"#ffbb8f"},{"name":"Fuzzy Sheep","hex":"#f0e9d1"},{"name":"Fuzzy Unicorn","hex":"#eae3db"},{"name":"Fuzzy Wuzzy","hex":"#cc6666"},{"name":"Fuzzy Wuzzy Brown","hex":"#c45655"},{"name":"G. Cam.Beige","hex":"#9e915c"},{"name":"Gable Green","hex":"#2c4641"},{"name":"Gaboon Viper","hex":"#8c6450"},{"name":"Gabriel's Torch","hex":"#f8e6c6"},{"name":"Gadabout","hex":"#ffc4ae"},{"name":"Gaharā Lāl","hex":"#ac0c20"},{"name":"Gaia","hex":"#d3bc9e"},{"name":"Gaiety","hex":"#f4e4e5"},{"name":"Gainsboro","hex":"#dcdcdc"},{"name":"Galactica","hex":"#c4dde2"},{"name":"Galago","hex":"#95a69f"},{"name":"Galah","hex":"#d28083"},{"name":"Galapagos Green","hex":"#29685f"},{"name":"Galaxy Blue","hex":"#2a4b7c"},{"name":"Galaxy Green","hex":"#79afad"},{"name":"Gale of the Wind","hex":"#007844"},{"name":"Galleon Blue","hex":"#3f95bf"},{"name":"Gallery","hex":"#dcd7d1"},{"name":"Gallery Blue","hex":"#9bbce4"},{"name":"Gallery Grey","hex":"#c5c2be"},{"name":"Galliano","hex":"#d8a723"},{"name":"Galveston Tan","hex":"#e8c8b8"},{"name":"Galway Bay","hex":"#95a7a4"},{"name":"Gamboge","hex":"#e49b0f"},{"name":"Gamboge Brown","hex":"#996600"},{"name":"Gameboy Contrast","hex":"#0f380f"},{"name":"Gameboy Light","hex":"#9bbc0f"},{"name":"Gameboy Screen","hex":"#8bac0f"},{"name":"Gameboy Shade","hex":"#306230"},{"name":"Gamin","hex":"#bfd1af"},{"name":"Gǎn Lǎn Huáng Olive","hex":"#c9ff27"},{"name":"Gǎn Lǎn Lǜ Green","hex":"#658b38"},{"name":"Ganache","hex":"#34292a"},{"name":"Ganadian Voodoo Grey","hex":"#b8b7a3"},{"name":"Gangsters Gold","hex":"#ffdd22"},{"name":"Ganon Blue","hex":"#a4e4fc"},{"name":"Ganymede","hex":"#8b7d82"},{"name":"Garden Aroma","hex":"#9c6989"},{"name":"Garden Dawn","hex":"#f1f8ec"},{"name":"Garden Gate","hex":"#dadcc1"},{"name":"Garden Gazebo","hex":"#abc0bb"},{"name":"Garden Glade","hex":"#dcd8a8"},{"name":"Garden Gnome Red","hex":"#9b2002"},{"name":"Garden Green","hex":"#495e35"},{"name":"Garden Hedge","hex":"#6f7d6d"},{"name":"Garden Lattice","hex":"#e1d4b4"},{"name":"Garden of Eden","hex":"#7fa771"},{"name":"Garden Party","hex":"#e3a4b8"},{"name":"Garden Pebble","hex":"#e4e4d5"},{"name":"Garden Picket","hex":"#e4d195"},{"name":"Garden Pond","hex":"#afc09e"},{"name":"Garden Shed","hex":"#d6efda"},{"name":"Garden Snail","hex":"#cdb1ab"},{"name":"Garden Statue","hex":"#bfd4c4"},{"name":"Garden Topiary","hex":"#3e524b"},{"name":"Garden Weed","hex":"#786e38"},{"name":"Gardenia","hex":"#f1e8df"},{"name":"Gardening","hex":"#acba8d"},{"name":"Garfield","hex":"#a75429"},{"name":"Gargoyle","hex":"#abb39e"},{"name":"Gargoyle Gas","hex":"#ffdf46"},{"name":"Garlic Clove","hex":"#e2d7c1"},{"name":"Garlic Suede","hex":"#cdd2bc"},{"name":"Garlic Toast","hex":"#dddd88"},{"name":"Garnet","hex":"#733635"},{"name":"Garnet Evening","hex":"#763b42"},{"name":"Garnet Rose","hex":"#ac4b55"},{"name":"Garnet Sand","hex":"#cc7446"},{"name":"Garnish","hex":"#1e9752"},{"name":"Garrison Grey","hex":"#7b8588"},{"name":"Garuda Gold","hex":"#ffbb31"},{"name":"Gas Giant","hex":"#98dcff"},{"name":"Gaslight","hex":"#feffea"},{"name":"Gathering Field","hex":"#ab8f55"},{"name":"Gathering Place","hex":"#ad9466"},{"name":"Gatsby Brick","hex":"#8e3b2f"},{"name":"Gatsby Glitter","hex":"#eed683"},{"name":"Gauss Blaster Green","hex":"#84c3aa"},{"name":"Gazelle","hex":"#947e68"},{"name":"Gecko","hex":"#9d913c"},{"name":"Gédéon Brown","hex":"#7f5f00"},{"name":"Geebung","hex":"#c5832e"},{"name":"Gehenna's Gold","hex":"#dba674"},{"name":"Gellibrand","hex":"#b5acb2"},{"name":"Generic Viridian","hex":"#007f66"},{"name":"Genestealer Purple","hex":"#7761ab"},{"name":"Genetic Code","hex":"#18515d"},{"name":"Geneva Green","hex":"#1f7f76"},{"name":"Gengiana","hex":"#5f4871"},{"name":"Genie","hex":"#3e4364"},{"name":"Genoa","hex":"#31796d"},{"name":"Genoa Lemon","hex":"#fde910"},{"name":"Genteel Blue","hex":"#698eb3"},{"name":"Gentian","hex":"#9079ad"},{"name":"Gentian Flower","hex":"#3366ff"},{"name":"Gentian Violet","hex":"#544275"},{"name":"Gentle Calm","hex":"#c4cebf"},{"name":"Gentle Caress","hex":"#fcd7ba"},{"name":"Gentle Doe","hex":"#e8b793"},{"name":"Gentle Giant","hex":"#b3ebe0"},{"name":"Gentle Glow","hex":"#f6e5b9"},{"name":"Gentle Touch","hex":"#e3d5b8"},{"name":"Gentle Yellow","hex":"#fff5be"},{"name":"Gentleman's Suit","hex":"#c1becd"},{"name":"Geode","hex":"#4b3f69"},{"name":"Georgia Clay","hex":"#b06144"},{"name":"Georgia On My Mind","hex":"#fdd4c5"},{"name":"Georgia Peach","hex":"#f97272"},{"name":"Georgian Leather","hex":"#cf875e"},{"name":"Geraldine","hex":"#e77b75"},{"name":"Geranium","hex":"#da3d58"},{"name":"Geranium Pink","hex":"#f6909d"},{"name":"Geranium Red","hex":"#d76968"},{"name":"German Cam. Beige WWII","hex":"#9b8c7b"},{"name":"German Grey","hex":"#53504e"},{"name":"German Hop","hex":"#89ac27"},{"name":"German Liquorice","hex":"#2e3749"},{"name":"German Mustard","hex":"#cd7a00"},{"name":"Germania","hex":"#ddc47e"},{"name":"Get Up and Go","hex":"#1a9d49"},{"name":"Gettysburg Grey","hex":"#c7c1b7"},{"name":"Geyser","hex":"#c4d7cf"},{"name":"Geyser Basin","hex":"#e3cab5"},{"name":"Geyser Steam","hex":"#cbd0cf"},{"name":"Ghost","hex":"#c0bfc7"},{"name":"Ghost Grey","hex":"#9c9b98"},{"name":"Ghost Ship","hex":"#887b6e"},{"name":"Ghost Town","hex":"#beb6a8"},{"name":"Ghost Whisperer","hex":"#cbd1d0"},{"name":"Ghost White","hex":"#f8f8ff"},{"name":"Ghost Writer","hex":"#bcb7ad"},{"name":"Ghosting","hex":"#cac6ba"},{"name":"Ghostly","hex":"#a7a09f"},{"name":"Ghostly Green","hex":"#d9d7b8"},{"name":"Ghostly Grey","hex":"#ccccd3"},{"name":"Ghoul Skin","hex":"#667744"},{"name":"Giant Onion","hex":"#665d9e"},{"name":"Giant's Club","hex":"#b05c52"},{"name":"Giants Orange","hex":"#fe5a1d"},{"name":"Gibraltar Grey","hex":"#6f6a68"},{"name":"Gibraltar Sea","hex":"#123850"},{"name":"Gigas","hex":"#564786"},{"name":"Giggle","hex":"#eff0d3"},{"name":"Gilded","hex":"#f4db4f"},{"name":"Gilded Beige","hex":"#b39f8d"},{"name":"Gilded Pear","hex":"#c09e6c"},{"name":"Gimblet","hex":"#b9ad61"},{"name":"Gin","hex":"#d9dfcd"},{"name":"Gin Fizz","hex":"#f8eaca"},{"name":"Gin Tonic","hex":"#ecebe5"},{"name":"Ginger","hex":"#b06500"},{"name":"Ginger Ale","hex":"#c9a86a"},{"name":"Ginger Ale Fizz","hex":"#f5dfbc"},{"name":"Ginger Beer","hex":"#c27f38"},{"name":"Ginger Cream","hex":"#efe0d7"},{"name":"Ginger Crunch","hex":"#ceaa64"},{"name":"Ginger Dy","hex":"#97653c"},{"name":"Ginger Lemon Tea","hex":"#ffffaa"},{"name":"Ginger Milk","hex":"#f7a454"},{"name":"Ginger Peach","hex":"#f9d09f"},{"name":"Ginger Pie","hex":"#9a7d61"},{"name":"Ginger Root","hex":"#c17444"},{"name":"Ginger Shortbread","hex":"#e3cec6"},{"name":"Ginger Snap","hex":"#977d70"},{"name":"Ginger Spice","hex":"#b65d48"},{"name":"Gingerbread","hex":"#8c4a2f"},{"name":"Gingerbread Crumble","hex":"#9c5e33"},{"name":"Gingerbread House","hex":"#ca994e"},{"name":"Gingerline","hex":"#ffdd11"},{"name":"Ginnezumi","hex":"#97867c"},{"name":"Ginninderra","hex":"#b3d5c0"},{"name":"Ginseng Root","hex":"#e6cdb5"},{"name":"Ginshu","hex":"#bc2d29"},{"name":"Giraffe","hex":"#fefe33"},{"name":"Girl Talk","hex":"#e4c7c8"},{"name":"Girlie","hex":"#ffd3cf"},{"name":"Girls Night Out","hex":"#ff69b4"},{"name":"Givry","hex":"#ebd4ae"},{"name":"Gizmo","hex":"#d4a1b5"},{"name":"Glacial Ice","hex":"#eae9e7"},{"name":"Glacier","hex":"#78b1bf"},{"name":"Glacier Blue","hex":"#a9c1c0"},{"name":"Glacier Green","hex":"#3e9eac"},{"name":"Glacier Grey","hex":"#c5c6c7"},{"name":"Glacier Ivy","hex":"#eaf3e6"},{"name":"Glacier Lake","hex":"#62b4c0"},{"name":"Glacier Pearl","hex":"#d1d2dc"},{"name":"Glacier Point","hex":"#b3d8e5"},{"name":"Glade","hex":"#9ca687"},{"name":"Glade Green","hex":"#5f8151"},{"name":"Gladeye","hex":"#7a8ca6"},{"name":"Gladiator Leather","hex":"#a95c3e"},{"name":"Glamour Pink","hex":"#ff1dcd"},{"name":"Glamour White","hex":"#fffcec"},{"name":"Glass Bead","hex":"#c7bec4"},{"name":"Glass Bull","hex":"#880000"},{"name":"Glass Green","hex":"#dcdfb0"},{"name":"Glass Jar Blue","hex":"#20b2aa"},{"name":"Glass Sand","hex":"#cdb69b"},{"name":"Glass Sea","hex":"#095d75"},{"name":"Glass Tile","hex":"#cdd0c0"},{"name":"Glassine","hex":"#d7e2e5"},{"name":"Glaucous","hex":"#6082b6"},{"name":"Glazed Chestnut","hex":"#967217"},{"name":"Glazed Ginger","hex":"#91552b"},{"name":"Glazed Granite","hex":"#5b5e61"},{"name":"Glazed Pears","hex":"#efe3d2"},{"name":"Glazed Persimmon","hex":"#d34e36"},{"name":"Glazed Ringlet","hex":"#89626d"},{"name":"Glazed Sugar","hex":"#ffdccc"},{"name":"Gleam","hex":"#bfd1ad"},{"name":"Gleaming Shells","hex":"#f8ded1"},{"name":"Glen","hex":"#4aac72"},{"name":"Glen Falls","hex":"#acb8c1"},{"name":"Glenwood Green","hex":"#a7d3b7"},{"name":"Glide Time","hex":"#5d6f80"},{"name":"Glimpse","hex":"#4fb9ce"},{"name":"Glimpse of Pink","hex":"#fff3f4"},{"name":"Glimpse of Void","hex":"#335588"},{"name":"Glisten Green","hex":"#f2efdc"},{"name":"Glistening Grey","hex":"#b1b3be"},{"name":"Glitch","hex":"#2c5463"},{"name":"Glitchy Shader Blue","hex":"#99ffff"},{"name":"Glitter","hex":"#e6e8fa"},{"name":"Glitter Shower","hex":"#88ffff"},{"name":"Glittery Glow","hex":"#eeeddb"},{"name":"Glitzy Red","hex":"#af413b"},{"name":"Globe Artichoke","hex":"#5f6c3c"},{"name":"Globe Thistle","hex":"#2e0329"},{"name":"Gloomy Purple","hex":"#8756e4"},{"name":"Gloomy Sea","hex":"#4a657a"},{"name":"Glorious Gold","hex":"#cba956"},{"name":"Glossy Black","hex":"#110011"},{"name":"Glossy Grape","hex":"#ab92b3"},{"name":"Glossy Olive","hex":"#636340"},{"name":"Glow in the Dark","hex":"#befdb7"},{"name":"Glow Worm","hex":"#bed565"},{"name":"Glowing Coals","hex":"#bc4d39"},{"name":"Glowing Firelight","hex":"#af5941"},{"name":"Glowing Meteor","hex":"#ee4400"},{"name":"Glowlight","hex":"#fff6b9"},{"name":"Gloxinia","hex":"#622e5a"},{"name":"Gluon Grey","hex":"#1a1b1c"},{"name":"Gluten","hex":"#ddcc66"},{"name":"Gnarls Green","hex":"#00754b"},{"name":"Gnocchi Beige","hex":"#ffeebb"},{"name":"Gnome","hex":"#81a19b"},{"name":"Gnu Tan","hex":"#b09f84"},{"name":"Go Alpha","hex":"#007f87"},{"name":"Go Bananas","hex":"#f7ca50"},{"name":"Go Ben","hex":"#786e4c"},{"name":"Go Go Glow","hex":"#fcecd5"},{"name":"Go Go Green","hex":"#008a7d"},{"name":"Go Go Mango","hex":"#feb87e"},{"name":"Go Green!","hex":"#00ab66"},{"name":"Go To Grey","hex":"#dcd8d7"},{"name":"Goat","hex":"#a89a91"},{"name":"Goblin","hex":"#34533d"},{"name":"Goblin Blue","hex":"#5f7278"},{"name":"Goblin Eyes","hex":"#eb8931"},{"name":"Goblin Green","hex":"#76ff7a"},{"name":"Gobo Brown","hex":"#635147"},{"name":"Gochujang Red","hex":"#770000"},{"name":"Goddess","hex":"#d0e1e8"},{"name":"Goddess of Dawn","hex":"#a8d4b0"},{"name":"Gogo Blue","hex":"#0087a1"},{"name":"Goji Berry","hex":"#b91228"},{"name":"Goku Orange","hex":"#f0833a"},{"name":"Gold","hex":"#ffd700"},{"name":"Gold Black","hex":"#2a2424"},{"name":"Gold Buff","hex":"#ecc481"},{"name":"Gold Canyon","hex":"#ae9769"},{"name":"Gold Deposit","hex":"#e0ce57"},{"name":"Gold Drop","hex":"#d56c30"},{"name":"Gold Dust","hex":"#a4803f"},{"name":"Gold Earth","hex":"#dd9c6b"},{"name":"Gold Flame","hex":"#b45422"},{"name":"Gold Foil","hex":"#d99f4d"},{"name":"Gold Fusion","hex":"#ffb000"},{"name":"Gold Gleam","hex":"#cfb352"},{"name":"Gold Pheasant","hex":"#c6795f"},{"name":"Gold Plate","hex":"#e6bd8f"},{"name":"Gold Red","hex":"#eb5406"},{"name":"Gold Rush","hex":"#c4a777"},{"name":"Gold Sand","hex":"#f7e5a9"},{"name":"Gold Spell","hex":"#c19d61"},{"name":"Gold Spike","hex":"#907047"},{"name":"Gold Taffeta","hex":"#bb9a39"},{"name":"Gold Tips","hex":"#e2b227"},{"name":"Gold Tooth","hex":"#dbb40c"},{"name":"Gold Wash","hex":"#d4c19e"},{"name":"Goldbrown","hex":"#9c8a53"},{"name":"Golden","hex":"#f5bf03"},{"name":"Golden Age","hex":"#ceab77"},{"name":"Golden Appeal","hex":"#e6be59"},{"name":"Golden Apricot","hex":"#dda758"},{"name":"Golden Banner","hex":"#fcc62a"},{"name":"Golden Bell","hex":"#ca8136"},{"name":"Golden Blond","hex":"#ccaa55"},{"name":"Golden Brown","hex":"#b27a01"},{"name":"Golden Buff","hex":"#f8e6c8"},{"name":"Golden Cartridge","hex":"#bdb76b"},{"name":"Golden Chandelier","hex":"#dddd11"},{"name":"Golden Coin","hex":"#fcd975"},{"name":"Golden Cream","hex":"#f7b768"},{"name":"Golden Crest","hex":"#f6ca69"},{"name":"Golden Crested Wren","hex":"#ccddbb"},{"name":"Golden Delicious","hex":"#d2d88f"},{"name":"Golden Dream","hex":"#f1cc2b"},{"name":"Golden Ecru","hex":"#d8c39f"},{"name":"Golden Egg","hex":"#b29155"},{"name":"Golden Elm","hex":"#bdd5b1"},{"name":"Golden Field","hex":"#c39e44"},{"name":"Golden Fizz","hex":"#ebde31"},{"name":"Golden Fleece","hex":"#edd9aa"},{"name":"Golden Fog","hex":"#f0ead2"},{"name":"Golden Foil","hex":"#cccc00"},{"name":"Golden Fragrance","hex":"#eeee99"},{"name":"Golden Gate","hex":"#d9c09c"},{"name":"Golden Gate Bridge","hex":"#c0362d"},{"name":"Golden Glam","hex":"#eebb44"},{"name":"Golden Glitter","hex":"#fbe573"},{"name":"Golden Glow","hex":"#f9d77e"},{"name":"Golden Grain","hex":"#c59137"},{"name":"Golden Granola","hex":"#b8996b"},{"name":"Golden Grass","hex":"#daa631"},{"name":"Golden Green","hex":"#bdb369"},{"name":"Golden Griffon","hex":"#a99058"},{"name":"Golden Gun","hex":"#dddd00"},{"name":"Golden Hamster","hex":"#da9e38"},{"name":"Golden Harmony","hex":"#9f8046"},{"name":"Golden Haze","hex":"#fbd897"},{"name":"Golden Hermes","hex":"#ffffbb"},{"name":"Golden Hind","hex":"#a37111"},{"name":"Golden History","hex":"#bb993a"},{"name":"Golden Hominy","hex":"#edc283"},{"name":"Golden Hop","hex":"#cfdd7b"},{"name":"Golden Impression","hex":"#ffefcb"},{"name":"Golden Kiwi","hex":"#f3dd3e"},{"name":"Golden Koi","hex":"#eaa34b"},{"name":"Golden Lime","hex":"#9a9738"},{"name":"Golden Lock","hex":"#f5bc1d"},{"name":"Golden Lotus","hex":"#e9dbc4"},{"name":"Golden Marguerite","hex":"#fdcc37"},{"name":"Golden Mary","hex":"#f0be3a"},{"name":"Golden Mist","hex":"#d5cd94"},{"name":"Golden Moray Eel","hex":"#ffcf60"},{"name":"Golden Mushroom","hex":"#f4e8d1"},{"name":"Golden Nectar","hex":"#ffda68"},{"name":"Golden Nugget","hex":"#db9b59"},{"name":"Golden Oak","hex":"#be752d"},{"name":"Golden Ochre","hex":"#c77943"},{"name":"Golden Olive","hex":"#af9841"},{"name":"Golden Opportunity","hex":"#f7c070"},{"name":"Golden Orange","hex":"#d7942d"},{"name":"Golden Palm","hex":"#aa8805"},{"name":"Golden Passionfruit","hex":"#b4bb31"},{"name":"Golden Pheasant","hex":"#cf9632"},{"name":"Golden Pilsner","hex":"#956f3f"},{"name":"Golden Poppy","hex":"#fcc200"},{"name":"Golden Raspberry","hex":"#f8d878"},{"name":"Golden Rays","hex":"#f6da74"},{"name":"Golden Retriever","hex":"#eedec7"},{"name":"Golden Rice","hex":"#e3d474"},{"name":"Golden Rule","hex":"#daae49"},{"name":"Golden Sand","hex":"#eace6a"},{"name":"Golden Schnitzel","hex":"#ddbb11"},{"name":"Golden Slumber","hex":"#b98841"},{"name":"Golden Snitch","hex":"#f1e346"},{"name":"Golden Spice","hex":"#c6973f"},{"name":"Golden Straw","hex":"#f5edae"},{"name":"Golden Tainoi","hex":"#ffc152"},{"name":"Golden Wash","hex":"#fffec6"},{"name":"Golden West","hex":"#e9ca94"},{"name":"Golden Yarrow","hex":"#e2c74f"},{"name":"Golden Yellow","hex":"#ffdf00"},{"name":"Goldenrod","hex":"#fdcb18"},{"name":"Goldfinch","hex":"#f8dc6c"},{"name":"Goldfinger","hex":"#eebb11"},{"name":"Goldfish","hex":"#f2ad62"},{"name":"Goldie","hex":"#c89d3f"},{"name":"Goldvreneli 1882","hex":"#e7de54"},{"name":"Golf Blazer","hex":"#53a391"},{"name":"Golf Course","hex":"#5a9e4b"},{"name":"Golf Green","hex":"#008763"},{"name":"Golfer Green","hex":"#5e6841"},{"name":"Golgfag Brown","hex":"#d77e70"},{"name":"Goluboy Blue","hex":"#8bb9dd"},{"name":"Gomashio Yellow","hex":"#cc9933"},{"name":"Gondola","hex":"#373332"},{"name":"Gondolier","hex":"#5db1c5"},{"name":"Gone Giddy","hex":"#d9c737"},{"name":"Gonzo Violet","hex":"#5d06e9"},{"name":"Good Graces","hex":"#f3f0d6"},{"name":"Good Karma","hex":"#333c76"},{"name":"Good Life","hex":"#c49e69"},{"name":"Good Luck Charm","hex":"#9d865c"},{"name":"Good Night!","hex":"#46565f"},{"name":"Good Samaritan","hex":"#3f6782"},{"name":"Goodbye Kiss","hex":"#d9cac3"},{"name":"Goody Gumdrop","hex":"#ccd87a"},{"name":"Goody Two Shoes","hex":"#c2ba8e"},{"name":"Goose Bill","hex":"#7b6c7c"},{"name":"Goose Wing Grey","hex":"#a89dac"},{"name":"Gooseberry Fool","hex":"#acb75f"},{"name":"Gorā White","hex":"#f0f0e0"},{"name":"Gordons Green","hex":"#29332b"},{"name":"Gorgonzola Blue","hex":"#4455cc"},{"name":"Gorse","hex":"#fde336"},{"name":"Gorthor Brown","hex":"#654741"},{"name":"Gory Red","hex":"#a30800"},{"name":"Goshawk Grey","hex":"#444444"},{"name":"Gossamer","hex":"#399f86"},{"name":"Gossamer Green","hex":"#b2cfbe"},{"name":"Gossamer Pink","hex":"#fac8c3"},{"name":"Gossamer Wings","hex":"#e8eee9"},{"name":"Gossip","hex":"#9fd385"},{"name":"Gothic","hex":"#698890"},{"name":"Gothic Amethyst","hex":"#a38b93"},{"name":"Gothic Gold","hex":"#bb852f"},{"name":"Gothic Grape","hex":"#473951"},{"name":"Gothic Olive","hex":"#7c6e4f"},{"name":"Gothic Revival Green","hex":"#a0a160"},{"name":"Gothic Spire","hex":"#7c6b6f"},{"name":"Gotta Have It","hex":"#d0c2b4"},{"name":"Goulash","hex":"#8d6449"},{"name":"Gould Blue","hex":"#7d9ea2"},{"name":"Gould Gold","hex":"#bc9d70"},{"name":"Gourmet Honey","hex":"#e3cba8"},{"name":"Government Green","hex":"#32493e"},{"name":"Governor Bay","hex":"#51559b"},{"name":"Graceful","hex":"#a8c0ce"},{"name":"Graceful Gazelle","hex":"#a78a50"},{"name":"Graceful Green","hex":"#acb7a8"},{"name":"Graceland Grass","hex":"#546c46"},{"name":"Gracilis","hex":"#c4d5cb"},{"name":"Gracious","hex":"#f8edd7"},{"name":"Gracious Glow","hex":"#bab078"},{"name":"Graham Cracker","hex":"#c0a480"},{"name":"Grain Brown","hex":"#cab8a2"},{"name":"Grain Mill","hex":"#d8c095"},{"name":"Grainfield","hex":"#b79e66"},{"name":"Gran Torino Red","hex":"#ee3300"},{"name":"Granada Sky","hex":"#5d81bb"},{"name":"Grand Avenue","hex":"#665a48"},{"name":"Grand Gusto","hex":"#86bb9d"},{"name":"Grand Piano","hex":"#d8d0bd"},{"name":"Grand Poobah","hex":"#864764"},{"name":"Grand Purple","hex":"#534778"},{"name":"Grandiflora Rose","hex":"#e0ebaf"},{"name":"Grandiose","hex":"#caa84c"},{"name":"Grandis","hex":"#ffcd73"},{"name":"Grandma's Cameo","hex":"#f7e7dd"},{"name":"Grange Hall","hex":"#857767"},{"name":"Granita","hex":"#a52350"},{"name":"Granite","hex":"#746a5e"},{"name":"Granite Boulder","hex":"#816f6b"},{"name":"Granite Canyon","hex":"#6c6f78"},{"name":"Granite Falls","hex":"#638496"},{"name":"Granite Green","hex":"#8b8265"},{"name":"Granite Grey","hex":"#615e5f"},{"name":"Granny Apple","hex":"#c5e7cd"},{"name":"Granny Smith","hex":"#7b948c"},{"name":"Granny Smith Apple","hex":"#9de093"},{"name":"Granola","hex":"#f5ce9f"},{"name":"Grant Drab","hex":"#8f8461"},{"name":"Grant Village","hex":"#6c90b2"},{"name":"Grant Wood Ivy","hex":"#a8b989"},{"name":"Granulated Sugar","hex":"#fffdf2"},{"name":"Grape","hex":"#6c3461"},{"name":"Grape Arbor","hex":"#a598c7"},{"name":"Grape Candy","hex":"#905284"},{"name":"Grape Cassata","hex":"#dfe384"},{"name":"Grape Compote","hex":"#6b5876"},{"name":"Grape Expectations","hex":"#6a587e"},{"name":"Grape Gatsby","hex":"#a19abd"},{"name":"Grape Glimmer","hex":"#dccae0"},{"name":"Grape Green","hex":"#a8e4a0"},{"name":"Grape Grey","hex":"#6d6166"},{"name":"Grape Harvest","hex":"#807697"},{"name":"Grape Haze","hex":"#606a88"},{"name":"Grape Hyacinth","hex":"#5533cc"},{"name":"Grape Jam","hex":"#7f779a"},{"name":"Grape Jelly","hex":"#7e667f"},{"name":"Grape Juice","hex":"#682961"},{"name":"Grape Kiss","hex":"#7b4368"},{"name":"Grape Leaf","hex":"#545144"},{"name":"Grape Leaves","hex":"#576049"},{"name":"Grape Nectar","hex":"#8d5c74"},{"name":"Grape Popsicle","hex":"#60406d"},{"name":"Grape Purple","hex":"#5d1451"},{"name":"Grape Royale","hex":"#4f2d54"},{"name":"Grape Shake","hex":"#886971"},{"name":"Grape Soda","hex":"#ae94a6"},{"name":"Grape Taffy","hex":"#f4daf1"},{"name":"Grape Wine","hex":"#5a2f43"},{"name":"Grapeade","hex":"#aa9fb2"},{"name":"Grapefruit","hex":"#fd5956"},{"name":"Grapefruit Juice","hex":"#ee6d8a"},{"name":"Grapefruit Pulp","hex":"#fe6f5e"},{"name":"Grapemist","hex":"#8398ca"},{"name":"Grapes of Wrath","hex":"#58424c"},{"name":"Grapeshot","hex":"#71384b"},{"name":"Grapevine","hex":"#b194a6"},{"name":"Grapevine Canyon","hex":"#62534f"},{"name":"Graphical 80's Sky","hex":"#0000fc"},{"name":"Graphite","hex":"#383428"},{"name":"Grapple","hex":"#92786a"},{"name":"Grasping Grass","hex":"#92b300"},{"name":"Grass","hex":"#5cac2d"},{"name":"Grass Blade","hex":"#636f46"},{"name":"Grass Court","hex":"#088d46"},{"name":"Grass Daisy","hex":"#ceb02a"},{"name":"Grass Green","hex":"#3f9b0b"},{"name":"Grass Root","hex":"#c3c175"},{"name":"Grass Sands","hex":"#a1afa0"},{"name":"Grass Skirt","hex":"#e2dac2"},{"name":"Grass Stain Green","hex":"#c0fb2d"},{"name":"Grass Valley","hex":"#f4f7ee"},{"name":"Grasshopper","hex":"#77824a"},{"name":"Grassroots","hex":"#d8c475"},{"name":"Grassy Green","hex":"#419c03"},{"name":"Grassy Meadow","hex":"#76a55b"},{"name":"Grated Beet","hex":"#a60e46"},{"name":"Gratefully Grass","hex":"#71714e"},{"name":"Gratitude","hex":"#e0ead7"},{"name":"Grauzone","hex":"#85a3b2"},{"name":"Gravel","hex":"#4a4b46"},{"name":"Gravel Dust","hex":"#bab9a9"},{"name":"Gravel Fint","hex":"#bbbbbb"},{"name":"Graveyard Earth","hex":"#68553a"},{"name":"Great Coat Grey","hex":"#7f8488"},{"name":"Great Dane","hex":"#d1a369"},{"name":"Great Grape","hex":"#6b6d85"},{"name":"Great Joy","hex":"#d8e6cb"},{"name":"Great Serpent","hex":"#4a72a3"},{"name":"Great Void","hex":"#3b5760"},{"name":"Great White","hex":"#bdbdc6"},{"name":"Grecian Gold","hex":"#9e7e54"},{"name":"Grecian Isle","hex":"#00a49b"},{"name":"Greedo Green","hex":"#00aa66"},{"name":"Greedy Gold","hex":"#c4ce3b"},{"name":"Greek Aubergine","hex":"#3d0734"},{"name":"Greek Flag Blue","hex":"#0d5eaf"},{"name":"Greek Lavender","hex":"#9b8fb0"},{"name":"Greek Sea","hex":"#72a7e1"},{"name":"Green","hex":"#00ff00"},{"name":"Green 383","hex":"#3e3d29"},{"name":"Green Alabaster","hex":"#c8ccba"},{"name":"Green Apple","hex":"#5edc1f"},{"name":"Green Ash","hex":"#a0daa9"},{"name":"Green Balloon","hex":"#80c4a9"},{"name":"Green Banana","hex":"#a8b453"},{"name":"Green Bark","hex":"#a9c4a6"},{"name":"Green Bay","hex":"#7e9285"},{"name":"Green Bayou","hex":"#566e57"},{"name":"Green Belt","hex":"#2d7f6c"},{"name":"Green Beret","hex":"#516a62"},{"name":"Green Blue","hex":"#42b395"},{"name":"Green Blue Slate","hex":"#358082"},{"name":"Green Brocade","hex":"#daf1e0"},{"name":"Green Brown","hex":"#696006"},{"name":"Green Buoy","hex":"#32a7b5"},{"name":"Green Bush","hex":"#7f8866"},{"name":"Green Caterpillar","hex":"#98be3c"},{"name":"Green Chalk","hex":"#bcdf8a"},{"name":"Green Coconut","hex":"#868e65"},{"name":"Green Crush","hex":"#62ae9e"},{"name":"Green Cyan","hex":"#009966"},{"name":"Green Darner Tail","hex":"#75bbfd"},{"name":"Green Daze","hex":"#8bd3c6"},{"name":"Green Dragon","hex":"#006c67"},{"name":"Green Dragon Spring","hex":"#c1cab0"},{"name":"Green Eggs","hex":"#e3ecc5"},{"name":"Green Elliott","hex":"#00bb66"},{"name":"Green Essence","hex":"#e9eac8"},{"name":"Green Eyes","hex":"#7d956d"},{"name":"Green Fingers","hex":"#297e6b"},{"name":"Green Flash","hex":"#79c753"},{"name":"Green Flavor","hex":"#bbaa22"},{"name":"Green Fluorite","hex":"#55bbaa"},{"name":"Green Fog","hex":"#989a87"},{"name":"Green Frost","hex":"#d0d6bf"},{"name":"Green Gables","hex":"#324241"},{"name":"Green Gamora","hex":"#11bb00"},{"name":"Green Gardens","hex":"#009911"},{"name":"Green Garter","hex":"#61ba85"},{"name":"Green Gas","hex":"#00ff99"},{"name":"Green Gate","hex":"#676957"},{"name":"Green Gecko","hex":"#cdd47f"},{"name":"Green Glacier","hex":"#e7f0c2"},{"name":"Green Glimmer","hex":"#00bb00"},{"name":"Green Glint","hex":"#dcf1c7"},{"name":"Green Glitter","hex":"#dde26a"},{"name":"Green Globe","hex":"#79aa87"},{"name":"Green Gloss","hex":"#00955e"},{"name":"Green Glow","hex":"#b0c965"},{"name":"Green Goanna","hex":"#505a39"},{"name":"Green Goblin","hex":"#11bb33"},{"name":"Green Gooseberry","hex":"#b0dfa4"},{"name":"Green Granite","hex":"#7c9793"},{"name":"Green Grapple","hex":"#3db9b2"},{"name":"Green Grey","hex":"#7ea07a"},{"name":"Green Grey Mist","hex":"#afa984"},{"name":"Green Gum","hex":"#95e3c0"},{"name":"Green Haze","hex":"#01a368"},{"name":"Green Hills","hex":"#007800"},{"name":"Green Hour","hex":"#587d79"},{"name":"Green Iced Tea","hex":"#e8e8d4"},{"name":"Green Illude","hex":"#6e6f56"},{"name":"Green Ink","hex":"#11887b"},{"name":"Green Jelly","hex":"#349b82"},{"name":"Green Juice","hex":"#3bde39"},{"name":"Green Kelp","hex":"#393d2a"},{"name":"Green Lacewing","hex":"#8ad370"},{"name":"Green Lane","hex":"#cad6c4"},{"name":"Green Lantern","hex":"#9cd03b"},{"name":"Green Lapis","hex":"#008684"},{"name":"Green Leaf","hex":"#526b2d"},{"name":"Green Lentils","hex":"#9c9463"},{"name":"Green Lily","hex":"#c1cec1"},{"name":"Green Lizard","hex":"#a7f432"},{"name":"Green Me","hex":"#b2b55f"},{"name":"Green Mesh","hex":"#d7d7ad"},{"name":"Green Milieu","hex":"#8a9992"},{"name":"Green Mirror","hex":"#d7e2d5"},{"name":"Green Mist","hex":"#bfc298"},{"name":"Green Moblin","hex":"#008888"},{"name":"Green Moonstone","hex":"#33565e"},{"name":"Green Moray","hex":"#3a7968"},{"name":"Green Moss","hex":"#857946"},{"name":"Green Oasis","hex":"#b0b454"},{"name":"Green Ochre","hex":"#9f8f55"},{"name":"Green Olive","hex":"#8d8b55"},{"name":"Green Olive Pit","hex":"#bdaa89"},{"name":"Green Onion","hex":"#c1e089"},{"name":"Green Parlor","hex":"#cfddb9"},{"name":"Green Patina","hex":"#66d0c0"},{"name":"Green Paw Paw","hex":"#0d6349"},{"name":"Green Pea","hex":"#266242"},{"name":"Green Pear","hex":"#79be58"},{"name":"Green Pepper","hex":"#97bc62"},{"name":"Green Pigment","hex":"#00a550"},{"name":"Green Room","hex":"#80aea4"},{"name":"Green Savage","hex":"#888866"},{"name":"Green Scene","hex":"#858365"},{"name":"Green Shade Wash","hex":"#45523a"},{"name":"Green Sheen","hex":"#d9ce52"},{"name":"Green Silk","hex":"#a2c2b0"},{"name":"Green Sky","hex":"#859d66"},{"name":"Green Smoke","hex":"#9ca664"},{"name":"Green Snow","hex":"#9eb788"},{"name":"Green Spool","hex":"#006474"},{"name":"Green Spring","hex":"#a9af99"},{"name":"Green Spruce","hex":"#589f7e"},{"name":"Green Stain","hex":"#2b553e"},{"name":"Green Sulphur","hex":"#ae8e2c"},{"name":"Green Tea","hex":"#b5b68f"},{"name":"Green Tea Candy","hex":"#65ab7c"},{"name":"Green Tea Leaf","hex":"#939a89"},{"name":"Green Tea Mochi","hex":"#90a96e"},{"name":"Green Teal","hex":"#0cb577"},{"name":"Green Tease","hex":"#e3ede0"},{"name":"Green Tint","hex":"#c5ccc0"},{"name":"Green Tone Ink","hex":"#47553c"},{"name":"Green Tourmaline","hex":"#5eab81"},{"name":"Green Turquoise","hex":"#679591"},{"name":"Green Valley","hex":"#3f4948"},{"name":"Green Veil","hex":"#e0f1c4"},{"name":"Green Velvet","hex":"#127453"},{"name":"Green Venom","hex":"#b8f818"},{"name":"Green Vogue","hex":"#23414e"},{"name":"Green Wash","hex":"#c6ddcd"},{"name":"Green Waterloo","hex":"#2c2d24"},{"name":"Green Wave","hex":"#c3dcd5"},{"name":"Green Weed","hex":"#548f6f"},{"name":"Green Whisper","hex":"#e3eee3"},{"name":"Green White","hex":"#deddcb"},{"name":"Green Yellow","hex":"#c6f808"},{"name":"Greenalicious","hex":"#00dd00"},{"name":"Greenbrier","hex":"#4b9b69"},{"name":"Greenday","hex":"#99ff00"},{"name":"Greene & Greene","hex":"#445544"},{"name":"Greenella","hex":"#60857a"},{"name":"Greener Grass","hex":"#2f8351"},{"name":"Greener Pastures","hex":"#495a4c"},{"name":"Greenery","hex":"#88b04b"},{"name":"Greenette","hex":"#daecc5"},{"name":"Greenfinch","hex":"#bda928"},{"name":"Greengage","hex":"#8bc28c"},{"name":"Greengrass","hex":"#72a355"},{"name":"Greenhouse","hex":"#3e6334"},{"name":"Greenhouse Glass","hex":"#d7e7cd"},{"name":"Greenish","hex":"#40a368"},{"name":"Greenish Beige","hex":"#c9d179"},{"name":"Greenish Blue","hex":"#0b8b87"},{"name":"Greenish Brown","hex":"#696112"},{"name":"Greenish Cyan","hex":"#2afeb7"},{"name":"Greenish Grey","hex":"#96ae8d"},{"name":"Greenish Grey Bark","hex":"#66675a"},{"name":"Greenish Tan","hex":"#bccb7a"},{"name":"Greenish Teal","hex":"#32bf84"},{"name":"Greenish Turquoise","hex":"#00fbb0"},{"name":"Greenish Yellow","hex":"#cdfd02"},{"name":"Greenlake","hex":"#007d69"},{"name":"Greenland","hex":"#737d6a"},{"name":"Greenland Green","hex":"#22acae"},{"name":"Greenland Ice","hex":"#b9d7d6"},{"name":"Greenway","hex":"#419a7d"},{"name":"Greenwood","hex":"#bcbaab"},{"name":"Greeny Glaze","hex":"#067376"},{"name":"Gregorio Garden","hex":"#cbc8dd"},{"name":"Greige","hex":"#b0a999"},{"name":"Gremlin","hex":"#a79954"},{"name":"Gremolata","hex":"#527e6d"},{"name":"Grenache","hex":"#8e6268"},{"name":"Grenade","hex":"#c32149"},{"name":"Grenadier","hex":"#c14d36"},{"name":"Grenadine","hex":"#ac545e"},{"name":"Gretchin Green","hex":"#5d6732"},{"name":"Gretna Green","hex":"#596442"},{"name":"Grey","hex":"#808080"},{"name":"Grey Aqua","hex":"#88b69f"},{"name":"Grey Area","hex":"#dddddd"},{"name":"Grey Asparagus","hex":"#465945"},{"name":"Grey Blue","hex":"#77a1b5"},{"name":"Grey Blueberry","hex":"#6c8096"},{"name":"Grey Brown","hex":"#7f7053"},{"name":"Grey By Me","hex":"#a1988b"},{"name":"Grey Chateau","hex":"#9fa3a7"},{"name":"Grey Cloud","hex":"#747880"},{"name":"Grey Dawn","hex":"#bbc1cc"},{"name":"Grey Dolphin","hex":"#c8c7c5"},{"name":"Grey Dusk","hex":"#897f98"},{"name":"Grey Flannel","hex":"#8d9a9e"},{"name":"Grey Frost","hex":"#b8bfc2"},{"name":"Grey Ghost","hex":"#dddcda"},{"name":"Grey Glimpse","hex":"#e0e4e2"},{"name":"Grey Grain","hex":"#a9bdbf"},{"name":"Grey Green","hex":"#86a17d"},{"name":"Grey Heron","hex":"#89928a"},{"name":"Grey Jade","hex":"#b9bbad"},{"name":"Grey Lilac","hex":"#d4cacd"},{"name":"Grey Marble","hex":"#b9b4b1"},{"name":"Grey Matter","hex":"#c87f89"},{"name":"Grey Mauve","hex":"#cab8ab"},{"name":"Grey Mist","hex":"#99aeae"},{"name":"Grey Monument","hex":"#707c78"},{"name":"Grey Morn","hex":"#cabeb5"},{"name":"Grey Nickel","hex":"#c3c3bd"},{"name":"Grey Nurse","hex":"#d1d3cc"},{"name":"Grey Of Darkness","hex":"#a2a2a2"},{"name":"Grey Olive","hex":"#a19a7f"},{"name":"Grey Pearl","hex":"#c3c0bb"},{"name":"Grey Pebble","hex":"#cfcac1"},{"name":"Grey Pink","hex":"#c3909b"},{"name":"Grey Pinstripe","hex":"#49494d"},{"name":"Grey Porcelain","hex":"#86837a"},{"name":"Grey Purple","hex":"#826d8c"},{"name":"Grey Ridge","hex":"#847986"},{"name":"Grey Rose","hex":"#c6b6b2"},{"name":"Grey Russian","hex":"#8e9598"},{"name":"Grey Sand","hex":"#e5ccaf"},{"name":"Grey Scape","hex":"#b8b0af"},{"name":"Grey Shadows","hex":"#c2bdba"},{"name":"Grey Spell","hex":"#c8c7c2"},{"name":"Grey Suit","hex":"#9391a0"},{"name":"Grey Teal","hex":"#5e9b8a"},{"name":"Grey Violet","hex":"#9b8e8e"},{"name":"Grey Whisper","hex":"#e6e4e4"},{"name":"Grey Wolf","hex":"#9ca0a6"},{"name":"Grey Wonder","hex":"#e5e8e6"},{"name":"Greybeard","hex":"#d4d0c5"},{"name":"Greyed Jade","hex":"#9bbea9"},{"name":"Greyhound","hex":"#b2aca2"},{"name":"Greyish","hex":"#a8a495"},{"name":"Greyish Blue","hex":"#5e819d"},{"name":"Greyish Brown","hex":"#7a6a4f"},{"name":"Greyish Green","hex":"#82a67d"},{"name":"Greyish Pink","hex":"#c88d94"},{"name":"Greyish Purple","hex":"#887191"},{"name":"Greyish Teal","hex":"#719f91"},{"name":"Greystone","hex":"#b7b9b5"},{"name":"Greywacke","hex":"#aaccbb"},{"name":"Griffin","hex":"#8d8f8f"},{"name":"Griffon Brown","hex":"#70393f"},{"name":"Grill Master","hex":"#863b2c"},{"name":"Grilled","hex":"#633f2e"},{"name":"Grim White","hex":"#f6f1f4"},{"name":"Grisaille","hex":"#585e6f"},{"name":"Gristmill","hex":"#a29371"},{"name":"Grizzly","hex":"#885818"},{"name":"Gross Green","hex":"#a0bf16"},{"name":"Grouchy Badger","hex":"#6f675c"},{"name":"Ground Bean","hex":"#604e42"},{"name":"Ground Coffee","hex":"#63554b"},{"name":"Ground Cover","hex":"#a8bf8b"},{"name":"Ground Cumin","hex":"#8a6c42"},{"name":"Groundwater","hex":"#1100aa"},{"name":"Growth","hex":"#6ca178"},{"name":"Grullo","hex":"#a99a86"},{"name":"Grunervetliner","hex":"#c0cf3f"},{"name":"Gruyère Cheese","hex":"#f5deb3"},{"name":"Gryphonne Sepia Wash","hex":"#883f11"},{"name":"Gǔ Tóng Hēi Copper","hex":"#634950"},{"name":"Guacamole","hex":"#95986b"},{"name":"Guardian Angel","hex":"#e4e1ea"},{"name":"Guardsman Red","hex":"#952e31"},{"name":"Guerrilla Forest","hex":"#142d25"},{"name":"Guiding Star","hex":"#fee9da"},{"name":"Guilliman Blue","hex":"#6495ed"},{"name":"Guinea Pig Brown","hex":"#987654"},{"name":"Guinea Pig White","hex":"#e8e4d6"},{"name":"Guitar","hex":"#6b4c37"},{"name":"Gulābī Pink","hex":"#c772c0"},{"name":"Gulf Blue","hex":"#343f5c"},{"name":"Gulf Harbour","hex":"#225e64"},{"name":"Gulf Stream","hex":"#74b2a8"},{"name":"Gulf Weed","hex":"#686e43"},{"name":"Gulf Wind","hex":"#bcc9cd"},{"name":"Gull","hex":"#918c8f"},{"name":"Gull Grey","hex":"#a4adb0"},{"name":"Gully","hex":"#777661"},{"name":"Gully Green","hex":"#4b6e3b"},{"name":"Gum Leaf","hex":"#acc9b2"},{"name":"Gumbo","hex":"#718f8a"},{"name":"Gumdrop","hex":"#de96c1"},{"name":"Gumdrop Green","hex":"#2ea785"},{"name":"Gun Barrel","hex":"#979d9a"},{"name":"Gun Corps Brown","hex":"#6b593c"},{"name":"Gun Powder","hex":"#484753"},{"name":"Gundaroo Green","hex":"#959984"},{"name":"Gunjō Blue","hex":"#5d8cae"},{"name":"Gunmetal","hex":"#536267"},{"name":"Gunmetal Beige","hex":"#908982"},{"name":"Gunmetal Green","hex":"#777648"},{"name":"Gunmetal Grey","hex":"#646c64"},{"name":"Gunny Sack","hex":"#dcd3bc"},{"name":"Gunsmoke","hex":"#7a7c76"},{"name":"Guppie Green","hex":"#00ff7f"},{"name":"Guppy Violet","hex":"#ae5883"},{"name":"Gurkha","hex":"#989171"},{"name":"Gustav","hex":"#a49691"},{"name":"Guy","hex":"#897a68"},{"name":"Gypsum","hex":"#eeede4"},{"name":"Gypsum Rose","hex":"#e2c4af"},{"name":"Gypsum Sand","hex":"#d6cfbf"},{"name":"Gypsy","hex":"#e59368"},{"name":"Gypsy Canvas","hex":"#b7a467"},{"name":"Gypsy Dancer","hex":"#c07c7b"},{"name":"Gypsy Jewels","hex":"#613a57"},{"name":"Habanero Gold","hex":"#fed450"},{"name":"Hacienda","hex":"#9e8022"},{"name":"Hadopelagic Water","hex":"#000022"},{"name":"Hailstorm","hex":"#d0d1e1"},{"name":"Hair Ribbon","hex":"#939cc9"},{"name":"Hairy Brown","hex":"#734a12"},{"name":"Hairy Heath","hex":"#633528"},{"name":"Haiti","hex":"#2c2a35"},{"name":"Hakusai Green","hex":"#88b378"},{"name":"Halakā Pīlā","hex":"#f0e483"},{"name":"Halayà Úbe","hex":"#663854"},{"name":"Half Baked","hex":"#558f93"},{"name":"Half Colonial White","hex":"#f2e5bf"},{"name":"Half Dutch White","hex":"#fbf0d6"},{"name":"Half Moon Bay Blush","hex":"#cda894"},{"name":"Half Orc Highlight","hex":"#976f3c"},{"name":"Half Pearl Lusta","hex":"#f1ead7"},{"name":"Half Spanish White","hex":"#e6dbc7"},{"name":"Hallowed Hush","hex":"#e2ebe5"},{"name":"Halloween Orange","hex":"#eb6123"},{"name":"Halo","hex":"#e2c392"},{"name":"Halogen Blue","hex":"#bdc6dc"},{"name":"Halt Red","hex":"#ff004f"},{"name":"Hamilton Blue","hex":"#8a99a4"},{"name":"Hammam Blue","hex":"#65dcd6"},{"name":"Hammered Copper","hex":"#834831"},{"name":"Hammered Pewter","hex":"#7e7567"},{"name":"Hammerhead Shark","hex":"#4e7496"},{"name":"Hammock","hex":"#6d8687"},{"name":"Hampton","hex":"#e8d4a2"},{"name":"Hamster Fur","hex":"#a6814c"},{"name":"Hamster Habitat","hex":"#c4d6af"},{"name":"Hamtaro Brown","hex":"#b07426"},{"name":"Han Blue","hex":"#446ccf"},{"name":"Han Purple","hex":"#5218fa"},{"name":"Hanaasagi Blue","hex":"#1d697c"},{"name":"Hanada Blue","hex":"#044f67"},{"name":"Hancock","hex":"#4d6968"},{"name":"Handmade Linen","hex":"#ddd6b7"},{"name":"Handmade Red","hex":"#a87678"},{"name":"Handwoven","hex":"#bfa984"},{"name":"Hanover","hex":"#dac5b1"},{"name":"Hanover Pewter","hex":"#848472"},{"name":"Hansa Yellow","hex":"#e9d66c"},{"name":"Hanuman Green","hex":"#55ffaa"},{"name":"Happy","hex":"#f8d664"},{"name":"Happy Days","hex":"#506e82"},{"name":"Happy Daze","hex":"#f7cf1b"},{"name":"Happy Piglets","hex":"#f6cbca"},{"name":"Happy Prawn","hex":"#ffbe98"},{"name":"Happy Trails","hex":"#b67a63"},{"name":"Happy Tune","hex":"#96b957"},{"name":"Happy Yipee","hex":"#ffc217"},{"name":"Hapsburg Court","hex":"#e2d4d6"},{"name":"Harā Green","hex":"#55aa55"},{"name":"Harbor Mist","hex":"#88aaaa"},{"name":"Harbour Afternoon","hex":"#e0e9f3"},{"name":"Harbour Blue","hex":"#417491"},{"name":"Harbour Fog","hex":"#afb1b4"},{"name":"Harbour Grey","hex":"#a8c0bb"},{"name":"Harbour Light","hex":"#d7e0e7"},{"name":"Harbour Mist","hex":"#dae1e3"},{"name":"Harbour Mist Grey","hex":"#778071"},{"name":"Harbour Rat","hex":"#757d75"},{"name":"Harbour Sky","hex":"#7eb6d0"},{"name":"Harbourmaster","hex":"#4e536b"},{"name":"Hard Candy","hex":"#ffbbbb"},{"name":"Harem Silk","hex":"#006383"},{"name":"Harissa Red","hex":"#a52a2a"},{"name":"Harlequin","hex":"#3fff00"},{"name":"Harlequin Green","hex":"#46cb18"},{"name":"Harley Davidson Orange","hex":"#c93413"},{"name":"Harlock's Cape","hex":"#bb0000"},{"name":"Harmonious","hex":"#afc195"},{"name":"Harmonious Rose","hex":"#f29cb7"},{"name":"Harold","hex":"#6d6353"},{"name":"Harp","hex":"#cbcec0"},{"name":"Harpoon","hex":"#283b4c"},{"name":"Harpy Brown","hex":"#493c2b"},{"name":"Harrison Grey","hex":"#989b9e"},{"name":"Harrison Rust","hex":"#9a5f3f"},{"name":"Harrow's Gate","hex":"#7e8e90"},{"name":"Harvard Crimson","hex":"#c90016"},{"name":"Harvest Blessing","hex":"#ba8e4e"},{"name":"Harvest Dance","hex":"#a5997c"},{"name":"Harvest Eve Gold","hex":"#da9100"},{"name":"Harvest Gold","hex":"#eab76a"},{"name":"Harvest Pumpkin","hex":"#d56231"},{"name":"Harvest Time","hex":"#cf875f"},{"name":"Hashibami Brown","hex":"#bfa46f"},{"name":"Hashita Purple","hex":"#8d608c"},{"name":"Hashut Copper","hex":"#c9643b"},{"name":"Hat Box Brown","hex":"#8f775d"},{"name":"Hatoba Pigeon","hex":"#95859c"},{"name":"Hatoba-Nezumi Grey","hex":"#9e8b8e"},{"name":"Haunting Hue","hex":"#d3e0ec"},{"name":"Haute Couture","hex":"#a0252a"},{"name":"Haute Red","hex":"#a11729"},{"name":"Havana","hex":"#3b2b2c"},{"name":"Havana Cigar","hex":"#af884a"},{"name":"Havelock Blue","hex":"#5784c1"},{"name":"Hawaii Morning","hex":"#00bbff"},{"name":"Hawaiian Breeze","hex":"#75c7e0"},{"name":"Hawaiian Coconut","hex":"#99522c"},{"name":"Hawaiian Ocean","hex":"#008db9"},{"name":"Hawaiian Shell","hex":"#f3dbd9"},{"name":"Hawaiian Sunset","hex":"#bb5c14"},{"name":"Hawaiian Surf","hex":"#0078a7"},{"name":"Hawaiian Vacation","hex":"#77cabd"},{"name":"Hawk Turquoise","hex":"#00756a"},{"name":"Hawk’s Eye","hex":"#34363a"},{"name":"Hawkbit","hex":"#fddb6d"},{"name":"Hawker's Gold","hex":"#f4c26c"},{"name":"Hawkes Blue","hex":"#d2daed"},{"name":"Hawkesbury","hex":"#729183"},{"name":"Hawthorn Berry","hex":"#cc1111"},{"name":"Hawthorn Blossom","hex":"#eeffaa"},{"name":"Hawthorn Rose","hex":"#884c5e"},{"name":"Hay","hex":"#d3cca3"},{"name":"Hay Day","hex":"#dacd81"},{"name":"Hay Wain","hex":"#cdad59"},{"name":"Hayden Valley","hex":"#5f5d50"},{"name":"Hayride","hex":"#d4ac99"},{"name":"Haystacks","hex":"#cfac47"},{"name":"Haze","hex":"#c8c2c6"},{"name":"Haze Blue","hex":"#b7c0be"},{"name":"Hazel","hex":"#ae7250"},{"name":"Hazelnut","hex":"#a8715a"},{"name":"Hazelnut Chocolate","hex":"#7b3f00"},{"name":"Hazelnut Turkish Delight","hex":"#fce974"},{"name":"Hazelwood","hex":"#fff3d5"},{"name":"Hazy Daze","hex":"#a5b8c5"},{"name":"Hazy Grove","hex":"#f2f1dc"},{"name":"Hazy Moon","hex":"#f1dca1"},{"name":"Hazy Rose","hex":"#b39897"},{"name":"Hazy Sky","hex":"#b7bdd6"},{"name":"Hè Sè Brown","hex":"#7f5e00"},{"name":"Healing Retreat","hex":"#bac2aa"},{"name":"Heart Gold","hex":"#808000"},{"name":"Heart of Gold","hex":"#9d7f4c"},{"name":"Heart Stone","hex":"#ede3df"},{"name":"Heart Throb","hex":"#cb3d3c"},{"name":"Heart Wood","hex":"#6f4232"},{"name":"Heart's Content","hex":"#e2b5bd"},{"name":"Heart's Desire","hex":"#ac3e5f"},{"name":"Heartbeat","hex":"#aa0000"},{"name":"Heartfelt","hex":"#ffadc9"},{"name":"Hearth","hex":"#e1cca6"},{"name":"Hearth Gold","hex":"#a17135"},{"name":"Hearty Hosta","hex":"#96bf83"},{"name":"Heat Wave","hex":"#ff7a00"},{"name":"Heath","hex":"#4f2a2c"},{"name":"Heath Green","hex":"#9acda9"},{"name":"Heath Spotted Orchid","hex":"#9f5f9f"},{"name":"Heather","hex":"#a484ac"},{"name":"Heather Berry","hex":"#e75480"},{"name":"Heather Rose","hex":"#ad6d7f"},{"name":"Heathered Grey","hex":"#b6b095"},{"name":"Heaven Sent","hex":"#eee1eb"},{"name":"Heavenly","hex":"#7eb2c5"},{"name":"Heavenly Blue","hex":"#a3bbcd"},{"name":"Heavenly Haze","hex":"#d8d5e3"},{"name":"Heavenly Pink","hex":"#f4dede"},{"name":"Heavy Black Green","hex":"#3a514d"},{"name":"Heavy Blue Grey","hex":"#9fabaf"},{"name":"Heavy Brown","hex":"#73624a"},{"name":"Heavy Charcoal","hex":"#565350"},{"name":"Heavy Cream","hex":"#e8ddc6"},{"name":"Heavy Gluten","hex":"#ddccaa"},{"name":"Heavy Goldbrown","hex":"#baab74"},{"name":"Heavy Green","hex":"#49583e"},{"name":"Heavy Grey","hex":"#82868a"},{"name":"Heavy Hammock","hex":"#beb9a2"},{"name":"Heavy Khaki","hex":"#5e6a34"},{"name":"Heavy Metal","hex":"#46473e"},{"name":"Heavy Ochre","hex":"#9b753d"},{"name":"Heavy Orange","hex":"#ee4328"},{"name":"Heavy Red","hex":"#9e1212"},{"name":"Heavy Siena","hex":"#735848"},{"name":"Heavy Skintone","hex":"#927a71"},{"name":"Heavy Violet","hex":"#4f566c"},{"name":"Heavy Warm Grey","hex":"#bdb3a7"},{"name":"Hedge Green","hex":"#768a75"},{"name":"Hēi Sè Black","hex":"#142030"},{"name":"Heidelberg Red[2]","hex":"#960117"},{"name":"Heifer","hex":"#c3bdb1"},{"name":"Heirloom Lilac","hex":"#9d96b2"},{"name":"Heirloom Rose","hex":"#d182a0"},{"name":"Heirloom Shade","hex":"#dcd8d4"},{"name":"Heirloom Tomato","hex":"#833633"},{"name":"Heisenberg Blue","hex":"#70d4fb"},{"name":"Helena Rose","hex":"#d28b72"},{"name":"Heliotrope","hex":"#d94ff5"},{"name":"Heliotrope Grey","hex":"#ab98a9"},{"name":"Heliotrope Magenta","hex":"#aa00bb"},{"name":"Hellebore","hex":"#646944"},{"name":"Hellion Green","hex":"#87c5ae"},{"name":"Hello Yellow","hex":"#ffe59d"},{"name":"Helvetia Red","hex":"#f00000"},{"name":"Hematitic Sand","hex":"#dc8c59"},{"name":"Hemlock","hex":"#69684b"},{"name":"Hemoglobin Red","hex":"#c61a1b"},{"name":"Hemp","hex":"#987d73"},{"name":"Hemp Fabric","hex":"#b5ad88"},{"name":"Hemp Rope","hex":"#b9a379"},{"name":"Hemp Tea","hex":"#b5b35c"},{"name":"Hen of the Woods","hex":"#eed9c4"},{"name":"Henna","hex":"#7c423c"},{"name":"Henna Red","hex":"#6e3530"},{"name":"Hephaestus Gold","hex":"#ff9911"},{"name":"Hera Blue","hex":"#7777ee"},{"name":"Herald's Trumpet","hex":"#ce9f2f"},{"name":"Herb Garden","hex":"#e9f3e1"},{"name":"Herbal","hex":"#29ab87"},{"name":"Herbal Garden","hex":"#9cad60"},{"name":"Herbal Mist","hex":"#d2e6d3"},{"name":"Herbal Tea","hex":"#f9fee9"},{"name":"Herbalist","hex":"#969e86"},{"name":"Herbery Honey","hex":"#eeee22"},{"name":"Here Comes the Sun","hex":"#fcdf63"},{"name":"Hereford Bull","hex":"#5f3b36"},{"name":"Hereford Cow Brown","hex":"#6c2e1f"},{"name":"Heritage Blue","hex":"#5d96bc"},{"name":"Heritage Taffeta","hex":"#956f7b"},{"name":"Hero","hex":"#005d6a"},{"name":"Heroic Blue","hex":"#1166ff"},{"name":"Heron","hex":"#62617e"},{"name":"Herring Silver","hex":"#c6c8cf"},{"name":"Hesperide Apple Gold","hex":"#ffe296"},{"name":"Hestia Red","hex":"#ee2200"},{"name":"Hexed Lichen","hex":"#6e0060"},{"name":"Hexos Palesun","hex":"#fbff0a"},{"name":"Hey Blue!","hex":"#16f8ff"},{"name":"Hi Def Lime","hex":"#bbb465"},{"name":"Hibiscus","hex":"#b6316c"},{"name":"Hibiscus Delight","hex":"#fe9773"},{"name":"Hibiscus Leaf","hex":"#6e826e"},{"name":"Hibiscus Pop","hex":"#dd77dd"},{"name":"Hickory","hex":"#b7a28e"},{"name":"Hickory Branch","hex":"#ab8274"},{"name":"Hickory Cliff","hex":"#7c6e6d"},{"name":"Hidcote","hex":"#9c949b"},{"name":"Hidden Cottage","hex":"#8d7f64"},{"name":"Hidden Depths","hex":"#305451"},{"name":"Hidden Diary","hex":"#ede4cc"},{"name":"Hidden Forest","hex":"#4f5a51"},{"name":"Hidden Hills","hex":"#c5d2b1"},{"name":"Hidden Mask","hex":"#96748a"},{"name":"Hidden Paradise","hex":"#5e8b3d"},{"name":"Hidden Waters","hex":"#225258"},{"name":"Hideaway","hex":"#c8c0aa"},{"name":"Hideout","hex":"#5386b7"},{"name":"High Altar","hex":"#334f7b"},{"name":"High Blue","hex":"#4ca8e0"},{"name":"High Chaparral","hex":"#75603d"},{"name":"High Dive","hex":"#59b9cc"},{"name":"High Elf Blue","hex":"#8cbed6"},{"name":"High Hopes","hex":"#deeaaa"},{"name":"High Noon","hex":"#cfb999"},{"name":"High Point","hex":"#bcd8d2"},{"name":"High Priest","hex":"#643949"},{"name":"High Profile","hex":"#005a85"},{"name":"High Rank","hex":"#645453"},{"name":"High Rise","hex":"#aeb2b5"},{"name":"High Risk Red","hex":"#c71f2d"},{"name":"High Salute","hex":"#445056"},{"name":"High Sierra","hex":"#cedee2"},{"name":"High Society","hex":"#cab7c0"},{"name":"High Tea Green","hex":"#567063"},{"name":"Highball","hex":"#928c3c"},{"name":"Highland","hex":"#7a9461"},{"name":"Highland Green","hex":"#305144"},{"name":"Highlander","hex":"#3a533d"},{"name":"Highlands Moss","hex":"#445500"},{"name":"Highlight Gold","hex":"#dfc16d"},{"name":"Highlighter","hex":"#ffe536"},{"name":"Highlighter Blue","hex":"#3aafdc"},{"name":"Highlighter Green","hex":"#1bfc06"},{"name":"Highlighter Lavender","hex":"#85569c"},{"name":"Highlighter Lilac","hex":"#d72e83"},{"name":"Highlighter Orange","hex":"#f39539"},{"name":"Highlighter Pink","hex":"#ea5a79"},{"name":"Highlighter Red","hex":"#e94f58"},{"name":"Highlighter Turquoise","hex":"#009e6c"},{"name":"Highlighter Yellow","hex":"#f1e740"},{"name":"Hihada Brown","hex":"#752e23"},{"name":"Hiker's Delight","hex":"#d2b395"},{"name":"Hiking Boots","hex":"#5e5440"},{"name":"Hillary","hex":"#a7a07e"},{"name":"Himalaya","hex":"#736330"},{"name":"Himalaya Peaks","hex":"#e2eaf0"},{"name":"Himalayan Salt","hex":"#c07765"},{"name":"Himawari Yellow","hex":"#fcc800"},{"name":"Hindsight","hex":"#bdc9e3"},{"name":"Hindu Lotus","hex":"#8e8062"},{"name":"Hinomaru Red","hex":"#bc002d"},{"name":"Hint of Ace","hex":"#dfe2f0"},{"name":"Hint of Adobe","hex":"#d1b791"},{"name":"Hint of Airborne","hex":"#c6dde4"},{"name":"Hint of Alley","hex":"#d6dee9"},{"name":"Hint of Amethyst Ice","hex":"#e5e1dd"},{"name":"Hint of Amourette","hex":"#e0dfe8"},{"name":"Hint of Angel Kiss","hex":"#e3dfea"},{"name":"Hint of Angel's Face","hex":"#f6e8df"},{"name":"Hint of Angelic Blue","hex":"#d8dee7"},{"name":"Hint of Angora Blue","hex":"#d6dfe8"},{"name":"Hint of Anon","hex":"#d9dbdf"},{"name":"Hint of Antarctica Lake","hex":"#dbe7e3"},{"name":"Hint of Antique Lace","hex":"#e3dcda"},{"name":"Hint of Apple Cucumber","hex":"#ebebd7"},{"name":"Hint of Aqua Clear","hex":"#bce4eb"},{"name":"Hint of Aqua Frost","hex":"#cce5e8"},{"name":"Hint of Aqua Mist","hex":"#c6e0e1"},{"name":"Hint of Arctic Daisy","hex":"#f3f0d9"},{"name":"Hint of Aroma","hex":"#e7dbdd"},{"name":"Hint of Baby Motive","hex":"#bce1eb"},{"name":"Hint of Baby Tone","hex":"#ecdbe0"},{"name":"Hint of Ballet Blue","hex":"#d0dde9"},{"name":"Hint of Bassinet","hex":"#e7dbe1"},{"name":"Hint of Bathing","hex":"#bfe0e4"},{"name":"Hint of Bay Fog","hex":"#e1dadd"},{"name":"Hint of Beige Royal","hex":"#e4e0d4"},{"name":"Hint of Beru","hex":"#daf0e6"},{"name":"Hint of Bethany","hex":"#e1ebd8"},{"name":"Hint of Bleached Bare","hex":"#e5dfdc"},{"name":"Hint of Bleached Coral","hex":"#fbe8e4"},{"name":"Hint of Bleaches","hex":"#e0dfdb"},{"name":"Hint of Blissful","hex":"#ecdde5"},{"name":"Hint of Blossom Time","hex":"#f2e6e1"},{"name":"Hint of Blue Ballerina","hex":"#d3dfea"},{"name":"Hint of Blue Bayou","hex":"#d9dde5"},{"name":"Hint of Blue Booties","hex":"#afe0ef"},{"name":"Hint of Blue Charm","hex":"#b3dbea"},{"name":"Hint of Blue Cloud","hex":"#dddfe8"},{"name":"Hint of Blue Dam","hex":"#c7dfe6"},{"name":"Hint of Blue Glint","hex":"#bcdfe8"},{"name":"Hint of Blue Ice","hex":"#c8ddea"},{"name":"Hint of Blue Limewash","hex":"#b2e1ee"},{"name":"Hint of Blue Mist","hex":"#cee1f2"},{"name":"Hint of Blue Moon","hex":"#d6d9dd"},{"name":"Hint of Blue Rinse","hex":"#d5d9dd"},{"name":"Hint of Blue Stream","hex":"#c1e3e9"},{"name":"Hint of Blue To You","hex":"#d7dadd"},{"name":"Hint of Blue Veil","hex":"#cfe1ef"},{"name":"Hint of Bluish Water","hex":"#bae3eb"},{"name":"Hint of Blunt","hex":"#d3d8de"},{"name":"Hint of Bobby Blue","hex":"#c1deea"},{"name":"Hint of Bread Crumb","hex":"#f2e8d7"},{"name":"Hint of Breakaway","hex":"#e3eadb"},{"name":"Hint of Breezy","hex":"#cfe0f2"},{"name":"Hint of Bright Spark","hex":"#acdcee"},{"name":"Hint of Brume","hex":"#e0e0dc"},{"name":"Hint of Budding Bloom","hex":"#ecf3d8"},{"name":"Hint of Budgie Blue","hex":"#b4dfed"},{"name":"Hint of Buff It","hex":"#eae4d8"},{"name":"Hint of Bunny Pink","hex":"#ebdbdd"},{"name":"Hint of Bunny Soft","hex":"#e8dbdd"},{"name":"Hint of Bypass","hex":"#d3dde4"},{"name":"Hint of Cameo Blue","hex":"#d4dee8"},{"name":"Hint of Camisole","hex":"#fbe9de"},{"name":"Hint of Candela","hex":"#d6dde6"},{"name":"Hint of Cargo River","hex":"#e4e2d6"},{"name":"Hint of Carolina","hex":"#e2f5e1"},{"name":"Hint of Carrot Flower","hex":"#e3e6da"},{"name":"Hint of Celery Satin","hex":"#e5ead8"},{"name":"Hint of Celery Stick","hex":"#e2f4e4"},{"name":"Hint of Chalk Blue","hex":"#d3f2ed"},{"name":"Hint of China Doll","hex":"#ede2d4"},{"name":"Hint of Chintz","hex":"#e8e0d5"},{"name":"Hint of Christobel","hex":"#e7ded7"},{"name":"Hint of Cipollino","hex":"#e0e4db"},{"name":"Hint of Clay Pipe","hex":"#ebe1d4"},{"name":"Hint of Clouds","hex":"#e8e7d7"},{"name":"Hint of Club Cruise","hex":"#b8dced"},{"name":"Hint of Continental Waters","hex":"#c2dfe2"},{"name":"Hint of Cool Crayon","hex":"#d3f1ee"},{"name":"Hint of Cowardly Custard","hex":"#f9f5da"},{"name":"Hint of Cream Cake","hex":"#faf1d7"},{"name":"Hint of Crushed Almond","hex":"#e7e1dd"},{"name":"Hint of Cuddle","hex":"#d8e1f1"},{"name":"Hint of Curd","hex":"#f9eed6"},{"name":"Hint of Daly Waters","hex":"#d1eaec"},{"name":"Hint of Dante Peak","hex":"#d4e7e7"},{"name":"Hint of Day Dreamer","hex":"#eae2dc"},{"name":"Hint of Dedication","hex":"#faeede"},{"name":"Hint of Delphin","hex":"#b5dcea"},{"name":"Hint of Deluxe Days","hex":"#b9def0"},{"name":"Hint of Detroit","hex":"#d9e5e4"},{"name":"Hint of Dew Point","hex":"#d3e3e5"},{"name":"Hint of Dreamweaver","hex":"#e1dee7"},{"name":"Hint of Dry Lichen","hex":"#dfeae1"},{"name":"Hint of Duck Egg Cream","hex":"#e0f0e5"},{"name":"Hint of Easter Rabbit","hex":"#ded9db"},{"name":"Hint of Ecru","hex":"#ede7d7"},{"name":"Hint of Eggshell Pink","hex":"#e3dcd6"},{"name":"Hint of Ellen","hex":"#f0e0d4"},{"name":"Hint of Elusive","hex":"#fce8e3"},{"name":"Hint of Elusive Blue","hex":"#d3dae1"},{"name":"Hint of Elusive Dream","hex":"#e2d9dd"},{"name":"Hint of Elusive Mauve","hex":"#eddde4"},{"name":"Hint of Enchanted","hex":"#e0efe3"},{"name":"Hint of Eskimo White","hex":"#dcd9db"},{"name":"Hint of Fairy Pink","hex":"#f6e7e1"},{"name":"Hint of Fairy Wings","hex":"#fae6e5"},{"name":"Hint of Favourite Lady","hex":"#f0dee7"},{"name":"Hint of Feather Boa","hex":"#f7e0e1"},{"name":"Hint of Featherbed","hex":"#cfe2ef"},{"name":"Hint of Feijoa Flower","hex":"#f3f5dc"},{"name":"Hint of Femininity","hex":"#dedce2"},{"name":"Hint of Figurine","hex":"#f0e8da"},{"name":"Hint of First Love","hex":"#faede3"},{"name":"Hint of Fish Pond","hex":"#b7dff3"},{"name":"Hint of Flaxen Fair","hex":"#efedd8"},{"name":"Hint of Flower Centre","hex":"#f9f1dd"},{"name":"Hint of Foundation","hex":"#f8f2de"},{"name":"Hint of French Limestone","hex":"#e1e9db"},{"name":"Hint of French Vanilla","hex":"#faeed9"},{"name":"Hint of Fresh Lime","hex":"#e9f6e0"},{"name":"Hint of Freshman","hex":"#f0f6dd"},{"name":"Hint of Frosted Sugar","hex":"#e8d8da"},{"name":"Hint of Frosty Dawn","hex":"#e1f2df"},{"name":"Hint of Frozen Frappe","hex":"#ecdee5"},{"name":"Hint of Garlic","hex":"#ddccbb"},{"name":"Hint of Garlic Suede","hex":"#e3e6d6"},{"name":"Hint of Gentle Calm","hex":"#dde2d9"},{"name":"Hint of Gentle Giant","hex":"#d5f3ec"},{"name":"Hint of Gentle Touch","hex":"#f0e8d5"},{"name":"Hint of Ghost Town","hex":"#dfdbd8"},{"name":"Hint of Ghosting","hex":"#e2ded6"},{"name":"Hint of Ghostly Green","hex":"#e9e9d5"},{"name":"Hint of Glass Bead","hex":"#dfd9dc"},{"name":"Hint of Gracilis","hex":"#dde8e0"},{"name":"Hint of Grand Piano","hex":"#eae5d8"},{"name":"Hint of Green","hex":"#dff1d6"},{"name":"Hint of Green Alabaster","hex":"#e1e2d6"},{"name":"Hint of Green Ash","hex":"#e2e6d7"},{"name":"Hint of Green Frost","hex":"#e5e8d9"},{"name":"Hint of Green Glacier","hex":"#f1f5db"},{"name":"Hint of Green Glint","hex":"#ebf5de"},{"name":"Hint of Green Veil","hex":"#edf5dd"},{"name":"Hint of Green Wash","hex":"#deece1"},{"name":"Hint of Greenette","hex":"#e9f3dd"},{"name":"Hint of Greenland Ice","hex":"#d7e9e8"},{"name":"Hint of Gregorio Garden","hex":"#e1e0eb"},{"name":"Hint of Grey Pebble","hex":"#e3e0da"},{"name":"Hint of Handmade Linen","hex":"#eee9d3"},{"name":"Hint of Hazy Daze","hex":"#c8d5dd"},{"name":"Hint of Heaven Sent","hex":"#cad6de"},{"name":"Hint of High Point","hex":"#d9e9e5"},{"name":"Hint of Hindsight","hex":"#d9e0ee"},{"name":"Hint of Hint Of Lavender","hex":"#e5dbda"},{"name":"Hint of Hog Bristle","hex":"#ece6d7"},{"name":"Hint of Horizon Sky","hex":"#dcdde5"},{"name":"Hint of Hugo","hex":"#f1e4e1"},{"name":"Hint of Ice Cap Green","hex":"#d8f1eb"},{"name":"Hint of Ice Pack","hex":"#cbeaee"},{"name":"Hint of Iced Aniseed","hex":"#e2e6db"},{"name":"Hint of Iced Lavender","hex":"#dce0ea"},{"name":"Hint of Image Tone","hex":"#d9dce4"},{"name":"Hint of Imagine","hex":"#c0dfe2"},{"name":"Hint of In The Slip","hex":"#f0dce3"},{"name":"Hint of Instant","hex":"#ebe3de"},{"name":"Hint of Island Light","hex":"#cbe1f2"},{"name":"Hint of Issey-San","hex":"#e4ebdc"},{"name":"Hint of Jade","hex":"#e2e6d1"},{"name":"Hint of Jellyfish Blue","hex":"#c0e1e4"},{"name":"Hint of Jodhpurs","hex":"#f4ebd4"},{"name":"Hint of July","hex":"#bce6ef"},{"name":"Hint of June","hex":"#c2dde6"},{"name":"Hint of Karma","hex":"#cdeced"},{"name":"Hint of Katsura","hex":"#e0efe1"},{"name":"Hint of Kinder","hex":"#d5dae0"},{"name":"Hint of Kiri Mist","hex":"#dedee5"},{"name":"Hint of Korila","hex":"#e7f2de"},{"name":"Hint of Lace Wisteria","hex":"#dbd7d9"},{"name":"Hint of Lady Fingers","hex":"#e2d7da"},{"name":"Hint of Lamb's Ears","hex":"#e1e3d7"},{"name":"Hint of Laughing Jack","hex":"#e0dce4"},{"name":"Hint Of Lavender","hex":"#d1c2c2"},{"name":"Hint of Lavender Blush","hex":"#ebdedb"},{"name":"Hint of Lavender Oil","hex":"#dadbe0"},{"name":"Hint of Lavender Water","hex":"#e5e0ec"},{"name":"Hint of Ligado","hex":"#e3e8db"},{"name":"Hint of Light Blush","hex":"#f2dde1"},{"name":"Hint of Light Lichen","hex":"#deede4"},{"name":"Hint of Light Rice","hex":"#ede6d9"},{"name":"Hint of Lilac Crystal","hex":"#e1dee8"},{"name":"Hint of Lily Legs","hex":"#f5dfe7"},{"name":"Hint of Lilylock","hex":"#edeeda"},{"name":"Hint of Lime Sherbet","hex":"#e1ecd9"},{"name":"Hint of Limed White","hex":"#e4e0da"},{"name":"Hint of Limpid Light","hex":"#e3dce0"},{"name":"Hint of Lip Gloss","hex":"#eee3de"},{"name":"Hint of Livingstone","hex":"#e2e1d6"},{"name":"Hint of Lost Lace","hex":"#ddf3e5"},{"name":"Hint of Lunette","hex":"#e5e0dd"},{"name":"Hint of Maiden's Blush","hex":"#f8e6d9"},{"name":"Hint of Male","hex":"#eae4da"},{"name":"Hint of Marsh Fog","hex":"#dfeade"},{"name":"Hint of Marshmallow Magic","hex":"#f6e6e4"},{"name":"Hint of Martian Moon","hex":"#ddf3e6"},{"name":"Hint of Mauve Organdie","hex":"#eadee4"},{"name":"Hint of Mauve Pansy","hex":"#d9d7d9"},{"name":"Hint of Meadow Lane","hex":"#dae8e1"},{"name":"Hint of Medlar","hex":"#e7e9d8"},{"name":"Hint of Melt Ice","hex":"#d3e2ee"},{"name":"Hint of Mint","hex":"#e3efe1"},{"name":"Hint of Mistral","hex":"#d5dae1"},{"name":"Hint of Mizu","hex":"#a7dbed"},{"name":"Hint of Modesty","hex":"#e6dfe8"},{"name":"Hint of Moo","hex":"#f8f0d8"},{"name":"Hint of Morality","hex":"#d2e2ef"},{"name":"Hint of Mornington","hex":"#ecdfd5"},{"name":"Hint of Mosque","hex":"#e2d9db"},{"name":"Hint of Mountain Spring","hex":"#eaeeda"},{"name":"Hint of Mr Frosty","hex":"#c8deea"},{"name":"Hint of Mud Berry","hex":"#e4e0dc"},{"name":"Hint of Mystified","hex":"#e1ebde"},{"name":"Hint of Naked Pink","hex":"#eadfe8"},{"name":"Hint of Nantucket Mist","hex":"#e1dad9"},{"name":"Hint of New Hope","hex":"#eef5db"},{"name":"Hint of Newman's Eye","hex":"#d2dfed"},{"name":"Hint of Nursery","hex":"#f6e6e5"},{"name":"Hint of Nut Milk","hex":"#eae2df"},{"name":"Hint of Objectivity","hex":"#d7deeb"},{"name":"Hint of Oil Of Lavender","hex":"#dfdad9"},{"name":"Hint of Olive Creed","hex":"#f1f3da"},{"name":"Hint of Opale","hex":"#d1edee"},{"name":"Hint of Opus","hex":"#e3e1ed"},{"name":"Hint of Orchid Haze","hex":"#e0d9da"},{"name":"Hint of Oriental Blush","hex":"#e8dfed"},{"name":"Hint of Otto Ice","hex":"#daeee6"},{"name":"Hint of Oxford","hex":"#d1d8dd"},{"name":"Hint of Pale Celadon","hex":"#e0e1d8"},{"name":"Hint of Pale Icelandish","hex":"#d9e7e3"},{"name":"Hint of Pale Lady","hex":"#dfd9da"},{"name":"Hint of Pale Lilac","hex":"#dadfea"},{"name":"Hint of Pale Pearl","hex":"#ded7da"},{"name":"Hint of Pale Tendril","hex":"#e3e2d7"},{"name":"Hint of Parchment Paper","hex":"#ece6dc"},{"name":"Hint of Passion Flower","hex":"#fae9e1"},{"name":"Hint of Pastel Mint","hex":"#e4f5e1"},{"name":"Hint of Pastry","hex":"#faedd5"},{"name":"Hint of Pax","hex":"#dfdfea"},{"name":"Hint of Pearl Ash","hex":"#e5e0db"},{"name":"Hint of Pelican Bill","hex":"#e9dbdf"},{"name":"Hint of Penna","hex":"#d6dfec"},{"name":"Hint of Pensive","hex":"#dddce1"},{"name":"Hint of Peppermint","hex":"#90cbaa"},{"name":"Hint of Perk Up","hex":"#e8dfd8"},{"name":"Hint of Petite Pink","hex":"#f4e2e1"},{"name":"Hint of Pianissimo","hex":"#f2e5e0"},{"name":"Hint of Piccolo","hex":"#bae5ee"},{"name":"Hint of Pickford","hex":"#e1f5e5"},{"name":"Hint of Picnic Bay","hex":"#d9ece6"},{"name":"Hint of Pink","hex":"#f2d8cd"},{"name":"Hint of Pink Clay","hex":"#fce7e4"},{"name":"Hint of Pink Linen","hex":"#e5d9dc"},{"name":"Hint of Pink Marble","hex":"#f1e5e0"},{"name":"Hint of Pink Pandora","hex":"#efdedf"},{"name":"Hint of Pink Polar","hex":"#e2d6d8"},{"name":"Hint of Pink Tone","hex":"#fae3e3"},{"name":"Hint of Pink Tutu","hex":"#fbe7e6"},{"name":"Hint of Pinnacle","hex":"#daece7"},{"name":"Hint of Pipe Clay","hex":"#e2e0d8"},{"name":"Hint of Pistachio Tang","hex":"#e9e6d4"},{"name":"Hint of Placid Blue","hex":"#d5e2ee"},{"name":"Hint of Pollinate","hex":"#f0ead7"},{"name":"Hint of Pool Side","hex":"#cce7e8"},{"name":"Hint of Porcelain","hex":"#eee2e0"},{"name":"Hint of Porcelain Pink","hex":"#f4ead5"},{"name":"Hint of Powder Blue","hex":"#d2e2f2"},{"name":"Hint of Powdered Granite","hex":"#dcdfef"},{"name":"Hint of Pre School","hex":"#d3dbe2"},{"name":"Hint of Precious Pink","hex":"#f6e4e4"},{"name":"Hint of Pretty Pale","hex":"#efdfe7"},{"name":"Hint of Prudence","hex":"#e6deea"},{"name":"Hint of Puffball","hex":"#e2dadf"},{"name":"Hint of Pure Blue","hex":"#d1dde1"},{"name":"Hint of Purity","hex":"#e7e0ee"},{"name":"Hint of Quaver","hex":"#d9e6e0"},{"name":"Hint of Quilt","hex":"#fce9df"},{"name":"Hint of Radar","hex":"#d4e0ef"},{"name":"Hint of Raspberry Ice","hex":"#eae2de"},{"name":"Hint of Raw Cotton","hex":"#f1e8d6"},{"name":"Hint of Recuperate","hex":"#ede2ee"},{"name":"Hint of Red","hex":"#f5efeb"},{"name":"Hint of Registra","hex":"#dbd6d8"},{"name":"Hint of Relax","hex":"#d6e6e6"},{"name":"Hint of Ridge Light","hex":"#d1dfeb"},{"name":"Hint of Ringlet","hex":"#f9f4d9"},{"name":"Hint of Rose Aspect","hex":"#f6dfe0"},{"name":"Hint of Rose Romantic","hex":"#f5e5e1"},{"name":"Hint of Sago","hex":"#e9e2db"},{"name":"Hint of Salome","hex":"#d9f4ea"},{"name":"Hint of Salt Spray","hex":"#cbdee3"},{"name":"Hint of Sand Diamond","hex":"#f9f1d7"},{"name":"Hint of Sandbank","hex":"#e6e5d3"},{"name":"Hint of Sandy Day","hex":"#e9e3da"},{"name":"Hint of Scallywag","hex":"#f0e8d7"},{"name":"Hint of Sea Breeze","hex":"#c8dae3"},{"name":"Hint of Sea Cliff","hex":"#cadfec"},{"name":"Hint of Sea Foam","hex":"#d3eeec"},{"name":"Hint of Sea Spray","hex":"#bfe1e6"},{"name":"Hint of Searchlight","hex":"#f5f5d9"},{"name":"Hint of Security","hex":"#e8efdb"},{"name":"Hint of Seduction","hex":"#f8f6da"},{"name":"Hint of Serena","hex":"#e3e4d9"},{"name":"Hint of Shell Haven","hex":"#f4eeda"},{"name":"Hint of Shell Tint","hex":"#fbe8e0"},{"name":"Hint of Shetland Lace","hex":"#eee5da"},{"name":"Hint of Shimmer","hex":"#b8def2"},{"name":"Hint of Short Phase","hex":"#d8eee7"},{"name":"Hint of Shutterbug","hex":"#daf4ea"},{"name":"Hint of Shy Girl","hex":"#fbe8e2"},{"name":"Hint of Silver Dollar","hex":"#e0e7dd"},{"name":"Hint of Silver Grass","hex":"#dfe4dc"},{"name":"Hint of Silver Sweetpea","hex":"#dee1ed"},{"name":"Hint of Silverton","hex":"#daeae2"},{"name":"Hint of Sky Babe","hex":"#b6dbe9"},{"name":"Hint of Sky Bus","hex":"#c1dbe7"},{"name":"Hint of Sky Chase","hex":"#cbe1e4"},{"name":"Hint of Sky Cloud","hex":"#d1edef"},{"name":"Hint of Skyway","hex":"#d1eaed"},{"name":"Hint of Slight Mushroom","hex":"#e4e0dd"},{"name":"Hint of Slightly Rose","hex":"#f2e4e2"},{"name":"Hint of Slipper Satin","hex":"#dadbe1"},{"name":"Hint of Snow Goose","hex":"#ddeae0"},{"name":"Hint of Snow Green","hex":"#dfeadb"},{"name":"Hint of Soft Celadon","hex":"#dae4de"},{"name":"Hint of Soft Fresco","hex":"#dbe8df"},{"name":"Hint of Soft Kind","hex":"#e6e6d8"},{"name":"Hint of Soft Satin","hex":"#f5dee2"},{"name":"Hint of Solar","hex":"#f9f2d4"},{"name":"Hint of Soya","hex":"#f8efd8"},{"name":"Hint of Spanish Cream","hex":"#faf0da"},{"name":"Hint of Spatial Spirit","hex":"#dcf4e6"},{"name":"Hint of Spearmint Ice","hex":"#dbe7e1"},{"name":"Hint of Spirit","hex":"#d2d8de"},{"name":"Hint of Sprig Muslin","hex":"#e9dbde"},{"name":"Hint of Spring Burst","hex":"#e0eedf"},{"name":"Hint of Spring Fever","hex":"#f0f0d9"},{"name":"Hint of Spring Shoot","hex":"#eef4db"},{"name":"Hint of Spritzig","hex":"#abddf1"},{"name":"Hint of Stargate","hex":"#d5dde5"},{"name":"Hint of Starlight","hex":"#d8dbe1"},{"name":"Hint of Starlight Blue","hex":"#d7edea"},{"name":"Hint of Stately Frills","hex":"#ded8dc"},{"name":"Hint of Steel Blue","hex":"#5a7d9a"},{"name":"Hint of Subdue","hex":"#e0dcd8"},{"name":"Hint of Subpoena","hex":"#eae2dd"},{"name":"Hint of Supernova","hex":"#d9ece9"},{"name":"Hint of Tactile","hex":"#e6f1de"},{"name":"Hint of Taupe White","hex":"#e0dcd7"},{"name":"Hint of Tea Party","hex":"#fde7e3"},{"name":"Hint of Template","hex":"#cbe1ee"},{"name":"Hint of Tender Touch","hex":"#e9dfe8"},{"name":"Hint of Tenzing","hex":"#c6e4e9"},{"name":"Hint of Thought","hex":"#ebe2de"},{"name":"Hint of Tidal Foam","hex":"#cce1ee"},{"name":"Hint of Time Travel","hex":"#d3dde7"},{"name":"Hint of Timeless","hex":"#d2eaea"},{"name":"Hint of Tinge Of Mauve","hex":"#e8dde2"},{"name":"Hint of Tinker Light","hex":"#f9f3d5"},{"name":"Hint of Tip Toes","hex":"#eadce2"},{"name":"Hint of Unbleached Calico","hex":"#f9e9d7"},{"name":"Hint of Vandamint","hex":"#cfecee"},{"name":"Hint of Vanilla Frost","hex":"#faf3dd"},{"name":"Hint of Vanilla Ice","hex":"#c9dae2"},{"name":"Hint of Vanilla Quake","hex":"#e2e0db"},{"name":"Hint of Vision","hex":"#e5e3ef"},{"name":"Hint of Wallis","hex":"#dfd8d9"},{"name":"Hint of Warm Ash","hex":"#e4e1de"},{"name":"Hint of Washed Blue","hex":"#c0e5ec"},{"name":"Hint of Water Wash","hex":"#cfdfef"},{"name":"Hint of Water Wings","hex":"#d2f3eb"},{"name":"Hint of Watermark","hex":"#c9e3e5"},{"name":"Hint of Watermelon Milk","hex":"#ede3e0"},{"name":"Hint of Wave","hex":"#cbe4e7"},{"name":"Hint of Wavecrest","hex":"#c6dce7"},{"name":"Hint of Weathered Hide","hex":"#e8dedb"},{"name":"Hint of Wheaten White","hex":"#f8f2d8"},{"name":"Hint of Whimsy","hex":"#b0dced"},{"name":"Hint of White Box","hex":"#dae5e0"},{"name":"Hint of White Duck","hex":"#e4e1d6"},{"name":"Hint of White Flag","hex":"#e0dcda"},{"name":"Hint of Yellow","hex":"#f6f5d7"},{"name":"Hint of Youth","hex":"#f0e1df"},{"name":"Hint of Zen","hex":"#dce4dd"},{"name":"Hint of Zenith Heights","hex":"#cae0df"},{"name":"Hinterland","hex":"#616c51"},{"name":"Hip Hop","hex":"#e4e8a7"},{"name":"Hip Waders","hex":"#746a51"},{"name":"Hippie Blue","hex":"#49889a"},{"name":"Hippie Green","hex":"#608a5a"},{"name":"Hippie Pink","hex":"#ab495c"},{"name":"Hippie Trail","hex":"#c6aa2b"},{"name":"Hippogriff Brown","hex":"#5c3c0d"},{"name":"Hippy","hex":"#eae583"},{"name":"Hipster","hex":"#f2f1d9"},{"name":"Hipster Salmon","hex":"#fd7c6e"},{"name":"Hiroshima Aquamarine","hex":"#7fffd4"},{"name":"His Eyes","hex":"#9bb9e1"},{"name":"Hisoku Blue","hex":"#abced8"},{"name":"Historic White","hex":"#ebe6d7"},{"name":"Hisui Kingfisher","hex":"#38b48b"},{"name":"Hit Grey","hex":"#a1adb5"},{"name":"Hit Pink","hex":"#fda470"},{"name":"Hitchcock Milk","hex":"#eeffa9"},{"name":"Hitching Post","hex":"#c48d69"},{"name":"Hive","hex":"#ffff77"},{"name":"Hobgoblin","hex":"#01ad8f"},{"name":"Hockham Green","hex":"#59685f"},{"name":"Hoeth Blue","hex":"#57a9d4"},{"name":"Hog Bristle","hex":"#dcd1bb"},{"name":"Hokey Pokey","hex":"#bb8e34"},{"name":"Hoki","hex":"#647d86"},{"name":"Hole In One","hex":"#4aae97"},{"name":"Holenso","hex":"#598069"},{"name":"Holiday","hex":"#81c3b4"},{"name":"Holiday Camp","hex":"#6d9e7a"},{"name":"Holland Tile","hex":"#dd9789"},{"name":"Holland Tulip","hex":"#f89851"},{"name":"Hollandaise Yellow","hex":"#ffee44"},{"name":"Holly","hex":"#25342b"},{"name":"Holly Berry","hex":"#b44e5d"},{"name":"Holly Bush","hex":"#355d51"},{"name":"Holly Fern","hex":"#8cb299"},{"name":"Holly Glen","hex":"#a2b7b5"},{"name":"Holly Green","hex":"#0f9d76"},{"name":"Holly Leaf","hex":"#2e5a50"},{"name":"Hollyhock","hex":"#823270"},{"name":"Hollyhock Bloom","hex":"#b7737d"},{"name":"Hollywood Cerise","hex":"#f400a0"},{"name":"Hollywood Golden Age","hex":"#ecd8b1"},{"name":"Hollywood Starlet","hex":"#f2d082"},{"name":"Holy Grail","hex":"#e8d720"},{"name":"Holy White","hex":"#f5f5dc"},{"name":"Home Body","hex":"#f3d2b2"},{"name":"Home Brew","hex":"#897b66"},{"name":"Home Plate","hex":"#f7eedb"},{"name":"Homebush","hex":"#726e69"},{"name":"Homeopathic","hex":"#5f7c47"},{"name":"Homestead","hex":"#ac8674"},{"name":"Homestead Red","hex":"#986e6e"},{"name":"Honed Steel","hex":"#867c83"},{"name":"Honesty","hex":"#dfebe9"},{"name":"Honey","hex":"#ba9238"},{"name":"Honey and Thyme","hex":"#aaaa00"},{"name":"Honey Bee","hex":"#fcdfa4"},{"name":"Honey Beehive","hex":"#d39f5f"},{"name":"Honey Beige","hex":"#f3e2c6"},{"name":"Honey Bunny","hex":"#dbb881"},{"name":"Honey Do","hex":"#ededc7"},{"name":"Honey Flower","hex":"#5c3c6d"},{"name":"Honey Fungus","hex":"#d18e54"},{"name":"Honey Ginger","hex":"#a86217"},{"name":"Honey Glow","hex":"#e8b447"},{"name":"Honey Gold","hex":"#d1a054"},{"name":"Honey Graham","hex":"#bc886a"},{"name":"Honey Grove","hex":"#dcb149"},{"name":"Honey Haven","hex":"#bc9263"},{"name":"Honey Mustard","hex":"#b68f52"},{"name":"Honey N Cream","hex":"#f1dcb7"},{"name":"Honey Nectar","hex":"#f1dda2"},{"name":"Honey Peach","hex":"#dcbd9e"},{"name":"Honey Pink","hex":"#cc99aa"},{"name":"Honey Pot","hex":"#ffc863"},{"name":"Honey Robber","hex":"#dfbb86"},{"name":"Honey Yellow","hex":"#ca9456"},{"name":"Honeydew","hex":"#f0fff0"},{"name":"Honeydew Melon","hex":"#e6eccc"},{"name":"Honeydew Peel","hex":"#d4fb79"},{"name":"Honeysuckle","hex":"#e8ed69"},{"name":"Honeysuckle Vine","hex":"#fbf1c8"},{"name":"Honeysweet","hex":"#e9cfc8"},{"name":"Hóng Bǎo Shū Red","hex":"#e02006"},{"name":"Hong Kong Skyline","hex":"#676e7a"},{"name":"Hong Kong Taxi","hex":"#a8102a"},{"name":"Hóng Lóu Mèng Red","hex":"#cf3f4f"},{"name":"Hóng Sè Red","hex":"#ff0809"},{"name":"Hóng Zōng Brown","hex":"#564a33"},{"name":"Honolulu Blue","hex":"#007fbf"},{"name":"Hooked Mimosa","hex":"#ffc9c4"},{"name":"Hooker's Green","hex":"#49796b"},{"name":"Hooloovoo Blue","hex":"#4455ff"},{"name":"Hopbush","hex":"#cd6d93"},{"name":"Hope","hex":"#e581a0"},{"name":"Hope Chest","hex":"#875942"},{"name":"Hopi Moccasin","hex":"#ffe4b5"},{"name":"Hopscotch","hex":"#afbb42"},{"name":"Horenso Green","hex":"#789b73"},{"name":"Horizon","hex":"#648894"},{"name":"Horizon Blue","hex":"#289dbe"},{"name":"Horizon Glow","hex":"#ad7171"},{"name":"Horizon Grey","hex":"#9ca9aa"},{"name":"Horizon Haze","hex":"#80c1e2"},{"name":"Horizon Island","hex":"#cdd4c6"},{"name":"Horizon Sky","hex":"#c2c3d3"},{"name":"Hormagaunt Purple","hex":"#51576f"},{"name":"Hornblende","hex":"#332222"},{"name":"Horned Frog","hex":"#c2ae87"},{"name":"Horned Lizard","hex":"#e8ead5"},{"name":"Hornet Sting","hex":"#ff0033"},{"name":"Hornet Yellow","hex":"#a67c08"},{"name":"Horse Liver","hex":"#543d37"},{"name":"Horseradish","hex":"#e6dfc4"},{"name":"Horseradish Cream","hex":"#eeeadd"},{"name":"Horses Neck","hex":"#6d562c"},{"name":"Horsetail","hex":"#3d5d42"},{"name":"Hortensia","hex":"#553b50"},{"name":"Hospital Green","hex":"#9be5aa"},{"name":"Hot Cacao","hex":"#a5694f"},{"name":"Hot Calypso","hex":"#fa8d7c"},{"name":"Hot Chilli","hex":"#b7513a"},{"name":"Hot Chocolate","hex":"#683b39"},{"name":"Hot Cinnamon","hex":"#d1691c"},{"name":"Hot Coral","hex":"#f35b53"},{"name":"Hot Curry","hex":"#815b28"},{"name":"Hot Embers","hex":"#f55931"},{"name":"Hot Flamingo","hex":"#b35966"},{"name":"Hot Ginger","hex":"#a36736"},{"name":"Hot Green","hex":"#25ff29"},{"name":"Hot Jazz","hex":"#bc3033"},{"name":"Hot Lava","hex":"#aa0033"},{"name":"Hot Lips","hex":"#c9312b"},{"name":"Hot Magenta","hex":"#ff00cc"},{"name":"Hot Mustard","hex":"#735c12"},{"name":"Hot Orange","hex":"#f4893d"},{"name":"Hot Pink","hex":"#ff028d"},{"name":"Hot Purple","hex":"#cb00f5"},{"name":"Hot Sand","hex":"#ccaa00"},{"name":"Hot Sauce","hex":"#ab4f41"},{"name":"Hot Stone","hex":"#aba89e"},{"name":"Hot Sun","hex":"#f9b82b"},{"name":"Hot Toddy","hex":"#a7752c"},{"name":"Hothouse Orchid","hex":"#755468"},{"name":"Hourglass","hex":"#e5e0d5"},{"name":"House Stark Grey","hex":"#4d495b"},{"name":"How Handsome","hex":"#a0aeb8"},{"name":"How Now","hex":"#886150"},{"name":"Howdy Neighbor","hex":"#f9e4c8"},{"name":"Howdy Partner","hex":"#c6a698"},{"name":"Howling Coyote","hex":"#9c7f5a"},{"name":"Hú Lán Blue","hex":"#1dacd1"},{"name":"Huáng Dì Yellow","hex":"#f8ff73"},{"name":"Huáng Jīn Zhōu Gold","hex":"#fada6a"},{"name":"Huáng Sè Yellow","hex":"#f0f20c"},{"name":"Hubert's Truck Green","hex":"#559933"},{"name":"Huckleberry","hex":"#5b4349"},{"name":"Hudson Bee","hex":"#fdef02"},{"name":"Hugh's Hue","hex":"#9fa09f"},{"name":"Hugo","hex":"#e6cfcc"},{"name":"Hūi Sè Grey","hex":"#c1c6d3"},{"name":"Hula Girl","hex":"#929264"},{"name":"Hulk Green","hex":"#008000"},{"name":"Hull Red","hex":"#4d140b"},{"name":"Hummingbird","hex":"#ceefe4"},{"name":"Humpback Whale","hex":"#473b3b"},{"name":"Humus","hex":"#b7a793"},{"name":"Hunter Green","hex":"#0b4008"},{"name":"Hunter's Orange","hex":"#db472c"},{"name":"Huntington Garden","hex":"#96a782"},{"name":"Huntington Woods","hex":"#46554c"},{"name":"Hurricane","hex":"#8b7e77"},{"name":"Hurricane Haze","hex":"#bdbbad"},{"name":"Hurricane Mist","hex":"#ebeee8"},{"name":"Hush","hex":"#c4bdba"},{"name":"Hush Grey","hex":"#e1ded8"},{"name":"Hush Puppy","hex":"#e4b095"},{"name":"Hush-A-Bye","hex":"#5397b7"},{"name":"Hushed Green","hex":"#d8e9e5"},{"name":"Hushed Violet","hex":"#d1c0bf"},{"name":"Husk","hex":"#b2994b"},{"name":"Husky","hex":"#e0ebfa"},{"name":"Hutchins Plaza","hex":"#ae957c"},{"name":"Hyacinth","hex":"#936ca7"},{"name":"Hyacinth Dream","hex":"#807388"},{"name":"Hyacinth Violet","hex":"#8d4687"},{"name":"Hydra Blue","hex":"#006995"},{"name":"Hydra Turquoise","hex":"#007a73"},{"name":"Hydrangea","hex":"#849bcc"},{"name":"Hydrangea Floret","hex":"#e6eae0"},{"name":"Hydrangea Pink","hex":"#e7b6c8"},{"name":"Hydrangea Purple","hex":"#caa0ff"},{"name":"Hydro","hex":"#426972"},{"name":"Hydroport","hex":"#5e9ca1"},{"name":"Hyper Green","hex":"#55ff00"},{"name":"Hypnotic Sea","hex":"#00787f"},{"name":"Hypnotism","hex":"#32584c"},{"name":"Hypothalamus Grey","hex":"#415d66"},{"name":"Hyssop","hex":"#6d4976"},{"name":"I Miss You","hex":"#dddbc5"},{"name":"I R Dark Green","hex":"#404034"},{"name":"Ibex Brown","hex":"#482400"},{"name":"Ibis","hex":"#f4b3c2"},{"name":"Ibis Mouse","hex":"#e4d2d8"},{"name":"Ibis Rose","hex":"#ca628f"},{"name":"Ibis Wing","hex":"#f58f84"},{"name":"Ibiza Blue","hex":"#007cb7"},{"name":"Ice","hex":"#d6fffa"},{"name":"Ice Blue","hex":"#739bd0"},{"name":"Ice Cap Green","hex":"#b9e7dd"},{"name":"Ice Castle","hex":"#d5edfb"},{"name":"Ice Cave","hex":"#a0beda"},{"name":"Ice Climber","hex":"#25e2cd"},{"name":"Ice Cold","hex":"#d2eaf1"},{"name":"Ice Cold Stare","hex":"#b1d1fc"},{"name":"Ice Cream Cone","hex":"#e3d0bf"},{"name":"Ice Cube","hex":"#afe3d6"},{"name":"Ice Fishing","hex":"#dcecf5"},{"name":"Ice Floe","hex":"#d8e7e1"},{"name":"Ice Flow","hex":"#c6d2d2"},{"name":"Ice Glow","hex":"#ffffe9"},{"name":"Ice Green","hex":"#87d8c3"},{"name":"Ice Grey","hex":"#cac7c4"},{"name":"Ice Lemon","hex":"#fffbc1"},{"name":"Ice Mist","hex":"#b6dbbf"},{"name":"Ice Pack","hex":"#a5dbe3"},{"name":"Ice Palace","hex":"#e2e4d7"},{"name":"Ice Rink","hex":"#bbddee"},{"name":"Ice Yellow","hex":"#fefecd"},{"name":"Ice-Cold White","hex":"#dff0e2"},{"name":"Iceberg","hex":"#dae4ee"},{"name":"Iceberg Green","hex":"#8c9c92"},{"name":"Iced Aniseed","hex":"#cbd3c3"},{"name":"Iced Aqua","hex":"#abd3db"},{"name":"Iced Avocado","hex":"#c8e4b9"},{"name":"Iced Cappuccino","hex":"#9c8866"},{"name":"Iced Celery","hex":"#e5e9b7"},{"name":"Iced Coffee","hex":"#b18f6a"},{"name":"Iced Lavender","hex":"#c2c7db"},{"name":"Iced Tulip","hex":"#afa9af"},{"name":"Iced Vovo","hex":"#e1a4b2"},{"name":"Iced Watermelon","hex":"#d1afb7"},{"name":"Iceland Poppy","hex":"#f4963a"},{"name":"Icelandic Blue","hex":"#a9adc2"},{"name":"Icepick","hex":"#dadcd0"},{"name":"Icewind Dale","hex":"#e8ecee"},{"name":"Icicle","hex":"#dde7df"},{"name":"Icing Flower","hex":"#d5b7cb"},{"name":"Icky Green","hex":"#8fae22"},{"name":"Icterine","hex":"#fcf75e"},{"name":"Icy Bay","hex":"#e0e5e2"},{"name":"Icy Lavender","hex":"#e2e2ed"},{"name":"Icy Lilac","hex":"#e6e9f9"},{"name":"Icy Morn","hex":"#b0d3d1"},{"name":"Icy Water","hex":"#bce2e8"},{"name":"Icy Waterfall","hex":"#c0d2d0"},{"name":"Identity","hex":"#7890ac"},{"name":"Idol","hex":"#645a8b"},{"name":"Idyllic Isle","hex":"#94c8d2"},{"name":"Igloo","hex":"#fdfcfa"},{"name":"Iguana","hex":"#818455"},{"name":"Iguana Green","hex":"#71bc77"},{"name":"Ikkonzome Pink","hex":"#f08f90"},{"name":"Illuminating Emerald","hex":"#319177"},{"name":"Illusion","hex":"#ef95ae"},{"name":"Illusion Blue","hex":"#c9d3dc"},{"name":"Ilvaite Black","hex":"#330011"},{"name":"Image Tone","hex":"#bec1cf"},{"name":"Imagery","hex":"#7a6e70"},{"name":"Imaginary Mauve","hex":"#89687d"},{"name":"Imagine","hex":"#af9468"},{"name":"Imayou Pink","hex":"#d0576b"},{"name":"Immersed","hex":"#204f54"},{"name":"Immortal","hex":"#c0a9cc"},{"name":"Impala","hex":"#f8ce97"},{"name":"Impatiens Pink","hex":"#ffc4bc"},{"name":"Imperial","hex":"#602f6b"},{"name":"Imperial Blue","hex":"#002395"},{"name":"Imperial Dynasty","hex":"#33746b"},{"name":"Imperial Ivory","hex":"#f1e8d2"},{"name":"Imperial Palace","hex":"#604e7a"},{"name":"Imperial Primer","hex":"#21303e"},{"name":"Imperial Purple","hex":"#542c5d"},{"name":"Imperial Red","hex":"#ec2938"},{"name":"Impression of Obscurity","hex":"#1a2578"},{"name":"Impressionist Blue","hex":"#a7cac9"},{"name":"Improbable","hex":"#6e7376"},{"name":"Impromptu","hex":"#705f63"},{"name":"Impulse","hex":"#005b87"},{"name":"Impure White","hex":"#f5e7e3"},{"name":"Imrik Blue","hex":"#67aed0"},{"name":"In A Pickle","hex":"#978c59"},{"name":"In Good Taste","hex":"#b6d4a0"},{"name":"In the Buff","hex":"#d6cbbf"},{"name":"In the Pink","hex":"#f4c4d0"},{"name":"In the Shadows","hex":"#cbc4c0"},{"name":"In The Slip","hex":"#e2c3cf"},{"name":"In the Tropics","hex":"#a3bc3a"},{"name":"Inca Gold","hex":"#bb7a2c"},{"name":"Inca Temple","hex":"#8c7b6c"},{"name":"Inca Yellow","hex":"#ffd301"},{"name":"Incarnadine","hex":"#aa0022"},{"name":"Incense","hex":"#af9a7e"},{"name":"Inchworm","hex":"#b2ec5d"},{"name":"Incision","hex":"#ff0022"},{"name":"Incremental Blue","hex":"#123456"},{"name":"Incubi Darkness","hex":"#0b474a"},{"name":"Independence","hex":"#4c516d"},{"name":"India Green","hex":"#138808"},{"name":"Indian Brass","hex":"#a5823d"},{"name":"Indian Clay","hex":"#f2d0c0"},{"name":"Indian Ink","hex":"#3c3f4a"},{"name":"Indian Khaki","hex":"#d3b09c"},{"name":"Indian Maize","hex":"#e4c14d"},{"name":"Indian Mesa","hex":"#d5a193"},{"name":"Indian Muslin","hex":"#eae3d8"},{"name":"Indian Pale Ale","hex":"#d5bc26"},{"name":"Indian Princess","hex":"#da846d"},{"name":"Indian Red","hex":"#850e04"},{"name":"Indian Reed","hex":"#9f7060"},{"name":"Indian Silk","hex":"#8a5773"},{"name":"Indian Summer","hex":"#a85143"},{"name":"Indian Teal","hex":"#3c586b"},{"name":"Indian Yellow","hex":"#e3a857"},{"name":"Indiana Clay","hex":"#e88a5b"},{"name":"Indica","hex":"#588c3a"},{"name":"Indifferent","hex":"#9892b8"},{"name":"Indigo","hex":"#4b0082"},{"name":"Indigo Blue","hex":"#3a18b1"},{"name":"Indigo Bunting","hex":"#006ca9"},{"name":"Indigo Carmine","hex":"#006ec7"},{"name":"Indigo Child","hex":"#a09fcc"},{"name":"Indigo Dye","hex":"#00416c"},{"name":"Indigo Hamlet","hex":"#1f4788"},{"name":"Indigo Ink","hex":"#474a4d"},{"name":"Indigo Ink Brown","hex":"#393432"},{"name":"Indigo Iron","hex":"#393f4c"},{"name":"Indigo Light","hex":"#5d76cb"},{"name":"Indigo Mouse","hex":"#6c848d"},{"name":"Indigo Night","hex":"#324680"},{"name":"Indigo Purple","hex":"#660099"},{"name":"Indigo White","hex":"#ebf6f7"},{"name":"Indochine","hex":"#9c5b34"},{"name":"Indocile Indochine","hex":"#b96b00"},{"name":"Indolence","hex":"#a29dad"},{"name":"Indonesian Jungle","hex":"#008c69"},{"name":"Indonesian Rattan","hex":"#d1b272"},{"name":"Indulgence","hex":"#533d47"},{"name":"Industrial Age","hex":"#aeadad"},{"name":"Infatuation","hex":"#f0d5ea"},{"name":"Infinity","hex":"#6e7e99"},{"name":"Infra Red","hex":"#fe486c"},{"name":"Infra-White","hex":"#ffccee"},{"name":"Infrared Burn","hex":"#dd3333"},{"name":"Infrared Flush","hex":"#cc3344"},{"name":"Infrared Gloze ","hex":"#cc3355"},{"name":"Infrared Tang","hex":"#dd2244"},{"name":"Infusion","hex":"#c8d0ca"},{"name":"Inglenook Olive","hex":"#aaa380"},{"name":"Ink Blotch","hex":"#00608b"},{"name":"Ink Blue","hex":"#0b5369"},{"name":"Inkjet","hex":"#44556b"},{"name":"Inky Storm","hex":"#535266"},{"name":"Inner Cervela","hex":"#bbaa7e"},{"name":"Inner Journey","hex":"#6d69a1"},{"name":"Inner Space","hex":"#285b5f"},{"name":"Inner Touch","hex":"#bbafba"},{"name":"Inness Sage","hex":"#959272"},{"name":"Innuendo","hex":"#a4b0c4"},{"name":"Inoffensive Blue","hex":"#114477"},{"name":"Inside Passage","hex":"#e0cfb5"},{"name":"Insignia Blue","hex":"#2f3e55"},{"name":"Insignia White","hex":"#ecf3f9"},{"name":"Inspiration Peak","hex":"#4fa183"},{"name":"Instant","hex":"#d9cec7"},{"name":"Instant Classic","hex":"#e3dac6"},{"name":"Instant Orange","hex":"#ff8d28"},{"name":"Instant Relief","hex":"#ede7d2"},{"name":"Instigate","hex":"#ada7c8"},{"name":"Integra","hex":"#405e95"},{"name":"Integrity","hex":"#233e57"},{"name":"Intellectual","hex":"#3f414c"},{"name":"Intense Brown","hex":"#7f5400"},{"name":"Intense Passion","hex":"#df3163"},{"name":"Intense Purple","hex":"#4d4a6f"},{"name":"Interdimensional Blue","hex":"#360ccc"},{"name":"Intergalactic","hex":"#4d516c"},{"name":"Intergalactic Ray","hex":"#573935"},{"name":"Interior Green","hex":"#536437"},{"name":"Intermediate Blue","hex":"#56626e"},{"name":"Intermediate Green","hex":"#137730"},{"name":"International","hex":"#3762a5"},{"name":"International Blue","hex":"#002fa7"},{"name":"International Klein Blue","hex":"#002fa6"},{"name":"International Orange","hex":"#ba160c"},{"name":"Interstellar Blue","hex":"#001155"},{"name":"Intimate Journal","hex":"#ccbb99"},{"name":"Intrigue","hex":"#635951"},{"name":"Introspective","hex":"#6d6053"},{"name":"Intuitive","hex":"#cfc6bc"},{"name":"Inverness Grey","hex":"#dce3e2"},{"name":"Inviting Veranda","hex":"#b9c4bc"},{"name":"Iolite","hex":"#707bb4"},{"name":"Iridescent","hex":"#3a5b52"},{"name":"Iridescent Peacock","hex":"#00707d"},{"name":"Iris","hex":"#5a4fcf"},{"name":"Iris Bloom","hex":"#5b609e"},{"name":"Iris Blue","hex":"#03b4c8"},{"name":"Iris Eyes","hex":"#767694"},{"name":"Iris Ice","hex":"#e0e3ef"},{"name":"Iris Isle","hex":"#e8e5ec"},{"name":"Iris Mauve","hex":"#b39b94"},{"name":"Iris Orchid","hex":"#a767a2"},{"name":"Irish Beauty","hex":"#007f59"},{"name":"Irish Charm","hex":"#69905b"},{"name":"Irish Clover","hex":"#53734c"},{"name":"Irish Coffee","hex":"#62422b"},{"name":"Irish Cream","hex":"#e9dbbe"},{"name":"Irish Green","hex":"#019529"},{"name":"Irish Hedge","hex":"#7cb386"},{"name":"Irish Moor","hex":"#b5c0b3"},{"name":"Irogon Blue","hex":"#9dacb5"},{"name":"Iroko","hex":"#433120"},{"name":"Iron","hex":"#5e5e5e"},{"name":"Iron Creek","hex":"#50676b"},{"name":"Iron Fixture","hex":"#5d5b5b"},{"name":"Iron Gate","hex":"#4e5055"},{"name":"Iron Head","hex":"#344d56"},{"name":"Iron Ore","hex":"#af5b46"},{"name":"Iron River","hex":"#4d504b"},{"name":"Iron-ic","hex":"#6a6b67"},{"name":"Ironbreaker","hex":"#887f85"},{"name":"Ironbreaker Metal","hex":"#a1a6a9"},{"name":"Ironside Grey","hex":"#706e66"},{"name":"Ironstone","hex":"#865040"},{"name":"Ironwood","hex":"#a19583"},{"name":"Irradiant Iris","hex":"#dadee6"},{"name":"Irradiated Green","hex":"#aaff55"},{"name":"Irresistible","hex":"#b3446c"},{"name":"Irresistible Beige","hex":"#e6ddc6"},{"name":"Irrigation","hex":"#786c57"},{"name":"Irrigo Purple","hex":"#9955ff"},{"name":"Isabelline","hex":"#f4f0ec"},{"name":"Ishtar","hex":"#484450"},{"name":"Islamic Green","hex":"#009900"},{"name":"Island Coral","hex":"#d8877a"},{"name":"Island Girl","hex":"#ffb59a"},{"name":"Island Green","hex":"#2bae66"},{"name":"Island Light","hex":"#a7c9eb"},{"name":"Island Lush","hex":"#008292"},{"name":"Island Monkey","hex":"#ad4e1a"},{"name":"Island Oasis","hex":"#88d9d8"},{"name":"Island Paradise","hex":"#95dee3"},{"name":"Island Sea","hex":"#81d7d0"},{"name":"Island Spice","hex":"#f8eddb"},{"name":"Island View","hex":"#c3ddee"},{"name":"Isle Royale","hex":"#80d7cf"},{"name":"Isolation","hex":"#494d55"},{"name":"Issey-San","hex":"#cfdac3"},{"name":"It Works","hex":"#af8a5b"},{"name":"It's Your Mauve","hex":"#bc989e"},{"name":"Italian Basil","hex":"#5f6957"},{"name":"Italian Buckthorn","hex":"#6b8c23"},{"name":"Italian Clay","hex":"#d79979"},{"name":"Italian Fitch","hex":"#d0c8e6"},{"name":"Italian Grape","hex":"#413d4b"},{"name":"Italian Lace","hex":"#ede9d4"},{"name":"Italian Plum","hex":"#533146"},{"name":"Italian Sky Blue","hex":"#b2fcff"},{"name":"Italian Straw","hex":"#e7d1a1"},{"name":"Italian Villa","hex":"#ad5d5d"},{"name":"Ivory","hex":"#fffff0"},{"name":"Ivory Charm","hex":"#fff6da"},{"name":"Ivory Cream","hex":"#dac0a7"},{"name":"Ivory Keys","hex":"#f8f7e6"},{"name":"Ivory Mist","hex":"#efeade"},{"name":"Ivory Oats","hex":"#f9e4c1"},{"name":"Ivory Steam","hex":"#f0eada"},{"name":"Ivory Tower","hex":"#fbf3f1"},{"name":"Ivy","hex":"#226c63"},{"name":"Ivy Enchantment","hex":"#93a272"},{"name":"Ivy Garden","hex":"#818068"},{"name":"Ivy Green","hex":"#585442"},{"name":"Ivy League","hex":"#007958"},{"name":"Iwai Brown","hex":"#6b6f59"},{"name":"Iwaicha Brown","hex":"#5e5545"},{"name":"Iyanden Darksun","hex":"#a59a59"},{"name":"J's Big Heart","hex":"#a06856"},{"name":"Jacaranda","hex":"#f9d7ee"},{"name":"Jacaranda Jazz","hex":"#6c70a9"},{"name":"Jacaranda Light","hex":"#a8acb7"},{"name":"Jacaranda Pink","hex":"#c760ff"},{"name":"Jacarta","hex":"#440044"},{"name":"Jacey's Favorite","hex":"#bcaccd"},{"name":"Jack Bone","hex":"#869f69"},{"name":"Jack Frost","hex":"#dae6e3"},{"name":"Jack Rabbit","hex":"#c0b2b1"},{"name":"Jack-o","hex":"#fb9902"},{"name":"Jacko Bean","hex":"#413628"},{"name":"Jackpot","hex":"#d19431"},{"name":"Jacksons Purple","hex":"#3d3f7d"},{"name":"Jacobean Lace","hex":"#e4ccb0"},{"name":"Jacqueline","hex":"#5d4e50"},{"name":"Jacuzzi","hex":"#007cac"},{"name":"Jade","hex":"#00a86b"},{"name":"Jade Bracelet","hex":"#c2d7ad"},{"name":"Jade Cream","hex":"#60b892"},{"name":"Jade Dust","hex":"#00ced1"},{"name":"Jade Gravel","hex":"#0abab5"},{"name":"Jade Jewel","hex":"#247e81"},{"name":"Jade Lime","hex":"#a1ca7b"},{"name":"Jade Mountain","hex":"#34c2a7"},{"name":"Jade Orchid","hex":"#00aaaa"},{"name":"Jade Powder","hex":"#2baf6a"},{"name":"Jade Shard","hex":"#017b92"},{"name":"Jade Spell","hex":"#c1e5d5"},{"name":"Jaded","hex":"#0092a1"},{"name":"Jaded Clouds","hex":"#aeddd3"},{"name":"Jadeite","hex":"#38c6a1"},{"name":"Jadesheen","hex":"#77a276"},{"name":"Jaffa","hex":"#e27945"},{"name":"Jaffa Orange","hex":"#d86d39"},{"name":"Jagged Ice","hex":"#cae7e2"},{"name":"Jagger","hex":"#3f2e4c"},{"name":"Jaguar","hex":"#29292f"},{"name":"Jaguar Rose","hex":"#f1b3b6"},{"name":"Jaipur Pink","hex":"#d0417e"},{"name":"Jakarta","hex":"#efddc3"},{"name":"Jakarta Skyline","hex":"#3d325d"},{"name":"Jalapeno","hex":"#9a8d3f"},{"name":"Jalapeno Poppers","hex":"#576648"},{"name":"Jalapeno Red","hex":"#b2103c"},{"name":"Jam Session","hex":"#d4cfd6"},{"name":"Jamaican Dream","hex":"#04627a"},{"name":"Jamaican Jade","hex":"#64d1be"},{"name":"Jamaican Sea","hex":"#26a5ba"},{"name":"Jambalaya","hex":"#674834"},{"name":"Janemba Red","hex":"#ff2211"},{"name":"Janey's Party","hex":"#ceb5c8"},{"name":"Janna","hex":"#f4ebd3"},{"name":"January Dawn","hex":"#dfe2e5"},{"name":"January Frost","hex":"#99c1dc"},{"name":"Japanese Bonsai","hex":"#829f96"},{"name":"Japanese Carmine","hex":"#9f2832"},{"name":"Japanese Cypress","hex":"#965036"},{"name":"Japanese Horseradish","hex":"#a8bf93"},{"name":"Japanese Indigo","hex":"#264348"},{"name":"Japanese Iris","hex":"#7f5d3b"},{"name":"Japanese Laurel","hex":"#2f7532"},{"name":"Japanese Maple","hex":"#780109"},{"name":"Japanese Poet","hex":"#c4bab7"},{"name":"Japanese Sable","hex":"#313739"},{"name":"Japanese Violet","hex":"#5b3256"},{"name":"Japanese Wax Tree","hex":"#b77b57"},{"name":"Japanese Wineberry","hex":"#522c35"},{"name":"Japanese Yew","hex":"#d8a373"},{"name":"Japonica","hex":"#ce7259"},{"name":"Jarrah","hex":"#827058"},{"name":"Jasmine","hex":"#fff4bb"},{"name":"Jasmine Flower","hex":"#f4e8e1"},{"name":"Jasmine Green","hex":"#7ec845"},{"name":"Jasmine Hollow","hex":"#7e7468"},{"name":"Jasper","hex":"#d73b3e"},{"name":"Jasper Orange","hex":"#de8f4e"},{"name":"Jasper Park","hex":"#4a6558"},{"name":"Java","hex":"#259797"},{"name":"Jazz","hex":"#5f2c2f"},{"name":"Jazz Age Blues","hex":"#3b4a6c"},{"name":"Jazz Tune","hex":"#9892a8"},{"name":"Jazzberry Jam","hex":"#674247"},{"name":"Jazzercise","hex":"#b6e12a"},{"name":"Jazzy","hex":"#b61c50"},{"name":"Jealousy","hex":"#7fab60"},{"name":"Jeans Indigo","hex":"#6d8994"},{"name":"Jedi Night","hex":"#041108"},{"name":"Jefferson Cream","hex":"#f1e4c8"},{"name":"Jelly Bean","hex":"#44798e"},{"name":"Jellybean Pink","hex":"#9b6575"},{"name":"Jellyfish Blue","hex":"#95cad0"},{"name":"Jemima","hex":"#f6d67f"},{"name":"Jerboa","hex":"#deb887"},{"name":"Jericho Jade","hex":"#4d8681"},{"name":"Jess","hex":"#25b387"},{"name":"Jester Red","hex":"#9e1030"},{"name":"Jet","hex":"#343434"},{"name":"Jet Black","hex":"#2d2c2f"},{"name":"Jet Fuel","hex":"#575654"},{"name":"Jet Set","hex":"#262c2a"},{"name":"Jet Stream","hex":"#bbd0c9"},{"name":"Jetski Race","hex":"#005d96"},{"name":"Jewel","hex":"#136843"},{"name":"Jewel Cave","hex":"#3c4173"},{"name":"Jewel Weed","hex":"#46a795"},{"name":"Jigglypuff","hex":"#ffaaff"},{"name":"Jimbaran Bay","hex":"#3d5d64"},{"name":"Jīn Huáng Gold","hex":"#f5d565"},{"name":"Jīn Sè Gold","hex":"#a5a502"},{"name":"Jīn Zōng Gold","hex":"#8e7618"},{"name":"Jinza Safflower","hex":"#ee827c"},{"name":"Jinzamomi Pink","hex":"#f7665a"},{"name":"Jitterbug","hex":"#bac08a"},{"name":"Jitterbug Lure","hex":"#8db0ad"},{"name":"Jodhpurs","hex":"#ebdcb6"},{"name":"Jojoba","hex":"#dabe81"},{"name":"Jokaero Orange","hex":"#ea5505"},{"name":"Jolly Green","hex":"#5e774a"},{"name":"Jonquil","hex":"#eef293"},{"name":"Jordy Blue","hex":"#7aaae0"},{"name":"Joshua Tree","hex":"#7fb377"},{"name":"Joust Blue","hex":"#55aaff"},{"name":"Joyful","hex":"#f6eec0"},{"name":"Joyful Poppy","hex":"#ebada5"},{"name":"Jú Huáng Tangerine","hex":"#f9900f"},{"name":"Jube","hex":"#4b373c"},{"name":"Jube Green","hex":"#78cf86"},{"name":"Jubilation","hex":"#fbdd24"},{"name":"Jubilee","hex":"#7e6099"},{"name":"Judah Silk","hex":"#473739"},{"name":"Judge Grey","hex":"#5d5346"},{"name":"Juggernaut","hex":"#255367"},{"name":"Juicy Jackfruit","hex":"#eedd33"},{"name":"Juicy Lime","hex":"#b1cf5d"},{"name":"Julep Green","hex":"#c7dbd9"},{"name":"Jules","hex":"#a73940"},{"name":"July","hex":"#8bd2e3"},{"name":"Jumbo","hex":"#878785"},{"name":"June","hex":"#9bc4d4"},{"name":"June Bud","hex":"#bdda57"},{"name":"June Bug","hex":"#264a48"},{"name":"Juneberry","hex":"#775496"},{"name":"Jungle","hex":"#00a466"},{"name":"Jungle Adventure","hex":"#446d46"},{"name":"Jungle Book Green","hex":"#366c4e"},{"name":"Jungle Cloak","hex":"#686959"},{"name":"Jungle Cover","hex":"#565042"},{"name":"Jungle Green","hex":"#048243"},{"name":"Jungle Juice","hex":"#a4c161"},{"name":"Jungle Mist","hex":"#b0c4c4"},{"name":"Jungle Moss","hex":"#bdc3ac"},{"name":"Juniper","hex":"#74918e"},{"name":"Juniper Berry","hex":"#b9b3c2"},{"name":"Juniper Oil","hex":"#6b8b75"},{"name":"Jupiter","hex":"#e1e1e2"},{"name":"Jupiter Brown","hex":"#ac8181"},{"name":"Jurassic Gold","hex":"#e7aa56"},{"name":"Jurassic Park","hex":"#3c663e"},{"name":"Just A Tease","hex":"#fbd6d2"},{"name":"Just Gorgeous","hex":"#d6c4c1"},{"name":"Just Peachy","hex":"#f8c275"},{"name":"Just Perfect","hex":"#eaecd3"},{"name":"Just Pink Enough","hex":"#ffebee"},{"name":"Just Right","hex":"#dcbfac"},{"name":"Just Rosey","hex":"#c4a295"},{"name":"Justice","hex":"#606b8e"},{"name":"Jute","hex":"#ad9773"},{"name":"Kā Fēi Sè Brown","hex":"#736354"},{"name":"Kabacha Brown","hex":"#b14a30"},{"name":"Kabalite Green","hex":"#038c67"},{"name":"Kabocha Green","hex":"#044a05"},{"name":"Kabul","hex":"#6c5e53"},{"name":"Kachi Indigo","hex":"#393e4f"},{"name":"Kahili","hex":"#b7bfb0"},{"name":"Kahlua Milk","hex":"#bab099"},{"name":"Kahu Blue","hex":"#0093d6"},{"name":"Kaitoke Green","hex":"#245336"},{"name":"Kakadu Trail","hex":"#7d806e"},{"name":"Kakitsubata Blue","hex":"#3e62ad"},{"name":"Kālā Black","hex":"#201819"},{"name":"Kala Namak","hex":"#46444c"},{"name":"Kalamata","hex":"#5f5b4c"},{"name":"Kale","hex":"#5a7247"},{"name":"Kaleidoscope","hex":"#8da8be"},{"name":"Kalish Violet","hex":"#552288"},{"name":"Kalliene Yellow","hex":"#b59808"},{"name":"Kaltes Klares Wasser","hex":"#0ffef9"},{"name":"Kamenozoki Grey","hex":"#c6c2b6"},{"name":"Kamut","hex":"#cca483"},{"name":"Kangaroo","hex":"#c5c3b0"},{"name":"Kangaroo Fur","hex":"#c4ad92"},{"name":"Kangaroo Paw","hex":"#decac5"},{"name":"Kangaroo Pouch","hex":"#bda289"},{"name":"Kantor Blue","hex":"#001146"},{"name":"Kanzō Orange","hex":"#ff8936"},{"name":"Kaolin","hex":"#ad7d40"},{"name":"Kara Cha Brown","hex":"#783c1d"},{"name":"Karacha Red","hex":"#b35c44"},{"name":"Karak Stone","hex":"#bb9662"},{"name":"Karaka","hex":"#2d2d24"},{"name":"Karakurenai Red","hex":"#c91f37"},{"name":"Kariyasu Green","hex":"#6e7955"},{"name":"Karma","hex":"#b2a484"},{"name":"Karma Chameleon","hex":"#9f78a9"},{"name":"Karry","hex":"#fedcc1"},{"name":"Kashmir","hex":"#6f8d6a"},{"name":"Kashmir Blue","hex":"#576d8e"},{"name":"Katmandu","hex":"#ad9a5d"},{"name":"Katsura","hex":"#c9e3cc"},{"name":"Katydid","hex":"#66bc91"},{"name":"Kazakhstan Flag Yellow","hex":"#fec50c"},{"name":"Keel Joy","hex":"#d49595"},{"name":"Keepsake","hex":"#c0ced6"},{"name":"Keepsake Lilac","hex":"#c0a5ae"},{"name":"Keepsake Rose","hex":"#b08693"},{"name":"Keese Blue","hex":"#0000bc"},{"name":"Kefir","hex":"#d5d5ce"},{"name":"Kelley Green","hex":"#02ab2e"},{"name":"Kellie Belle","hex":"#dec7cf"},{"name":"Kelly's Flower","hex":"#babd6c"},{"name":"Kelp","hex":"#4d503c"},{"name":"Kelp Brown","hex":"#716246"},{"name":"Kelp Forest","hex":"#448811"},{"name":"Kemp Kelly","hex":"#437b48"},{"name":"Ken Masters Red","hex":"#ec2c25"},{"name":"Kendall Rose","hex":"#f7cccd"},{"name":"Kenny's Kiss","hex":"#d45871"},{"name":"Kenpō Brown","hex":"#543f32"},{"name":"Kenpōzome Black","hex":"#2e211b"},{"name":"Kentucky","hex":"#6395bf"},{"name":"Kentucky Blue","hex":"#a5b3cc"},{"name":"Kenyan Copper","hex":"#6c322e"},{"name":"Kenyan Sand","hex":"#bb8800"},{"name":"Keppel","hex":"#5fb69c"},{"name":"Kermit Green","hex":"#5cb200"},{"name":"Kerr's Pink Potato","hex":"#b57281"},{"name":"Keshizumi Cinder","hex":"#524e4d"},{"name":"Ketchup","hex":"#9a382d"},{"name":"Kettle Black","hex":"#131313"},{"name":"Kettle Drum","hex":"#9bcb96"},{"name":"Kettleman","hex":"#606061"},{"name":"Key Keeper","hex":"#ecd1a5"},{"name":"Key Largo","hex":"#7fb6a4"},{"name":"Key Lime","hex":"#aeff6e"},{"name":"Key Lime Pie","hex":"#bfc921"},{"name":"Key Lime Water","hex":"#e8f48c"},{"name":"Khaki","hex":"#c3b091"},{"name":"Khaki Brown","hex":"#954e2a"},{"name":"Khaki Core","hex":"#fbe4af"},{"name":"Khaki Green","hex":"#728639"},{"name":"Khardic Flesh","hex":"#b16840"},{"name":"Khemri Brown","hex":"#76664c"},{"name":"Khorne Red","hex":"#6a0001"},{"name":"Kickstart Purple","hex":"#7777cc"},{"name":"Kid Gloves","hex":"#b6aeae"},{"name":"Kid Icarus","hex":"#a81000"},{"name":"Kidnapper","hex":"#bfc0ab"},{"name":"Kihada Yellow","hex":"#fef263"},{"name":"Kikuchiba Gold","hex":"#e29c45"},{"name":"Kikyō Purple","hex":"#5d3f6a"},{"name":"Kilauea Lava","hex":"#843d38"},{"name":"Kilimanjaro","hex":"#3a3532"},{"name":"Killarney","hex":"#49764f"},{"name":"Killer Fog","hex":"#c9d2d1"},{"name":"Kiln Dried","hex":"#a89887"},{"name":"Kimberley Sea","hex":"#386b7d"},{"name":"Kimberley Tree","hex":"#b8c1b1"},{"name":"Kimberlite","hex":"#696fa5"},{"name":"Kimberly","hex":"#695d87"},{"name":"Kimchi","hex":"#ed4b00"},{"name":"Kimirucha Brown","hex":"#896c39"},{"name":"Kimono","hex":"#6d86b6"},{"name":"Kimono Grey","hex":"#3d4c51"},{"name":"Kin Gold","hex":"#f39800"},{"name":"Kincha Brown","hex":"#c66b27"},{"name":"Kind Magenta","hex":"#ff1dce"},{"name":"Kinder","hex":"#b8bfca"},{"name":"Kindleflame","hex":"#e9967a"},{"name":"Kindness","hex":"#d4b2c0"},{"name":"King Creek Falls","hex":"#5f686f"},{"name":"King Kong","hex":"#161410"},{"name":"King Neptune","hex":"#7794c0"},{"name":"King Tide","hex":"#2a7279"},{"name":"King Triton","hex":"#3c85be"},{"name":"King's Court","hex":"#706d5e"},{"name":"King's Ransom","hex":"#b59d77"},{"name":"King's Robe","hex":"#6274ab"},{"name":"Kingfisher Bright","hex":"#096872"},{"name":"Kingfisher Daisy","hex":"#583580"},{"name":"Kingfisher Sheen","hex":"#007fa2"},{"name":"Kingston Aqua","hex":"#8fbcc4"},{"name":"Kinlock","hex":"#7f7793"},{"name":"Kinsusutake Brown","hex":"#7d4e2d"},{"name":"Kirby Pink","hex":"#d74894"},{"name":"Kiri Mist","hex":"#c5c5d3"},{"name":"Kiriume Red","hex":"#8b352d"},{"name":"Kislev Flesh","hex":"#efcdcb"},{"name":"Kiss","hex":"#d28ca7"},{"name":"Kiss A Frog","hex":"#bec187"},{"name":"Kiss Candy","hex":"#aa854a"},{"name":"Kiss Me Kate","hex":"#e7eeec"},{"name":"Kissable","hex":"#fd8f79"},{"name":"Kite Brown","hex":"#95483f"},{"name":"Kitsilano Cookie","hex":"#d0c8b0"},{"name":"Kitsurubami Brown","hex":"#bb8141"},{"name":"Kittiwake Gull","hex":"#ccccbb"},{"name":"Kiwi","hex":"#7aab55"},{"name":"Kiwi Fruit","hex":"#9daa4d"},{"name":"Kiwi Green","hex":"#8ee53f"},{"name":"Kiwi Kiss","hex":"#eef9c1"},{"name":"Kiwi Pulp","hex":"#9cef43"},{"name":"Knapsack","hex":"#95896c"},{"name":"Knarloc Green","hex":"#4b5b40"},{"name":"Knight Elf","hex":"#926cac"},{"name":"Knight Rider","hex":"#0f0707"},{"name":"Knight's Armor","hex":"#5c5d5d"},{"name":"Knight's Tale","hex":"#aa91ae"},{"name":"Knighthood","hex":"#3c3f52"},{"name":"Knit Cardigan","hex":"#6d6c5f"},{"name":"Knock On Wood","hex":"#9f9b84"},{"name":"Knot","hex":"#988266"},{"name":"Kōbai Red","hex":"#db5a6b"},{"name":"Kobe","hex":"#882d17"},{"name":"Kobi","hex":"#e093ab"},{"name":"Kobicha","hex":"#6b4423"},{"name":"Kobold Skin","hex":"#f0d2cf"},{"name":"Kobra Khan","hex":"#00aa22"},{"name":"Kodama White","hex":"#e8f5fc"},{"name":"Kogane Gold","hex":"#e5b321"},{"name":"Kohaku Amber","hex":"#ca6924"},{"name":"Koi","hex":"#d15837"},{"name":"Koi Pond","hex":"#797f63"},{"name":"Koji Orange","hex":"#f6ad49"},{"name":"Koke Moss","hex":"#8b7d3a"},{"name":"Kokiake Brown","hex":"#7b3b3a"},{"name":"Kokimurasaki Purple","hex":"#3a243b"},{"name":"Kokoda","hex":"#7b785a"},{"name":"Kokushoku Black","hex":"#171412"},{"name":"Komatsuna Green","hex":"#7b8d42"},{"name":"Kombu","hex":"#7e726d"},{"name":"Kombu Green","hex":"#3a4032"},{"name":"Kombucha","hex":"#d89f66"},{"name":"Kommando Khaki","hex":"#9d907e"},{"name":"Kon","hex":"#192236"},{"name":"Kona","hex":"#574b50"},{"name":"Konjō Blue","hex":"#003171"},{"name":"Konkikyō Blue","hex":"#191f45"},{"name":"Koopa Green Shell","hex":"#58d854"},{"name":"Kopi Luwak","hex":"#833d3e"},{"name":"Kōrainando Green","hex":"#203838"},{"name":"Korichnewyi Brown","hex":"#8d4512"},{"name":"Korila","hex":"#d7e9c8"},{"name":"Korma","hex":"#804e2c"},{"name":"Koromiko","hex":"#feb552"},{"name":"Kōrozen","hex":"#592b1f"},{"name":"Kournikova","hex":"#f9d054"},{"name":"Kowloon","hex":"#e1d956"},{"name":"Kraft Paper","hex":"#d5b59c"},{"name":"Krasnyi Red","hex":"#eb2e28"},{"name":"Krieg Khaki","hex":"#c0bd81"},{"name":"Krishna Blue","hex":"#01abfd"},{"name":"KSU Purple","hex":"#512888"},{"name":"KU Crimson","hex":"#e8000d"},{"name":"Kuchinashi Yellow","hex":"#ffdb4f"},{"name":"Kumera","hex":"#886221"},{"name":"Kumquat","hex":"#fbaa4c"},{"name":"Kundalini Bliss","hex":"#d2ccda"},{"name":"Kurenai Red","hex":"#d7003a"},{"name":"Kuretake Black Manga","hex":"#001122"},{"name":"Kuri Black","hex":"#554738"},{"name":"Kuro Brown","hex":"#583822"},{"name":"Kuro Green","hex":"#1b2b1b"},{"name":"Kurobeni","hex":"#23191e"},{"name":"Kuroi Black","hex":"#14151d"},{"name":"Kurumizome Brown","hex":"#9f7462"},{"name":"Kuta Surf","hex":"#5789a5"},{"name":"Kuwanomi Purple","hex":"#55295b"},{"name":"Kuwazome Red","hex":"#59292c"},{"name":"Kvass","hex":"#c7610f"},{"name":"Kyo Purple","hex":"#9d5b8b"},{"name":"Kyoto House","hex":"#503000"},{"name":"Kyuri Green","hex":"#4b5d16"},{"name":"La Grange","hex":"#7a7a60"},{"name":"Là Jiāo Hóng Red","hex":"#fc2647"},{"name":"La Luna","hex":"#ffffe5"},{"name":"La Minute","hex":"#f5e5dc"},{"name":"La Palma","hex":"#428929"},{"name":"La Paz Siesta","hex":"#c1e5ea"},{"name":"La Pineta","hex":"#577e88"},{"name":"La Rioja","hex":"#bac00e"},{"name":"La Salle Green","hex":"#087830"},{"name":"La Terra","hex":"#ea936e"},{"name":"La Vie en Rose","hex":"#d2a5a3"},{"name":"La-De-Dah","hex":"#c3b1be"},{"name":"Labrador","hex":"#f2ecd9"},{"name":"Labyrinth Walk","hex":"#c9a487"},{"name":"Lace Veil","hex":"#ecebea"},{"name":"Lace Wisteria","hex":"#c2bbc0"},{"name":"Lacey","hex":"#caaeab"},{"name":"Lacrosse","hex":"#2e5c58"},{"name":"Lacustral","hex":"#19504c"},{"name":"Lacy Mist","hex":"#a78490"},{"name":"Lady Fern","hex":"#8fa174"},{"name":"Lady Fingers","hex":"#ccbbc0"},{"name":"Lady in Red","hex":"#b34b47"},{"name":"Lady Luck","hex":"#47613c"},{"name":"Lady of the Sea","hex":"#0000cc"},{"name":"Lady Pink","hex":"#f3d2cf"},{"name":"Ladylike","hex":"#ffc3bf"},{"name":"Lager","hex":"#f6f513"},{"name":"Lagoon","hex":"#4d9e9a"},{"name":"Lagoon Blue","hex":"#80a4b1"},{"name":"Lagoona Teal","hex":"#76c6d3"},{"name":"Laguna Beach","hex":"#e9d7c0"},{"name":"Lahar","hex":"#5f5855"},{"name":"Lahmian Medium","hex":"#e2dad1"},{"name":"Lahn Yellow","hex":"#fff80a"},{"name":"Laird","hex":"#79853c"},{"name":"Lake Blue","hex":"#008c96"},{"name":"Lake Green","hex":"#2e8b57"},{"name":"Lake Lucerne","hex":"#689db7"},{"name":"Lake Placid","hex":"#aeb9bc"},{"name":"Lake Reflection","hex":"#9dd8db"},{"name":"Lake Water","hex":"#86aba5"},{"name":"Lake Winnipeg","hex":"#80a1b0"},{"name":"Lakelike","hex":"#306f73"},{"name":"Lakeville","hex":"#6c849b"},{"name":"Lāl Red","hex":"#d85525"},{"name":"Lama","hex":"#e0bb95"},{"name":"Lamb's Ears","hex":"#c8ccbc"},{"name":"Lamb's Wool","hex":"#ffffe3"},{"name":"Lambent Lagoon","hex":"#3b5b92"},{"name":"Lamenters Yellow","hex":"#fffeb6"},{"name":"Lamina","hex":"#bbd9bc"},{"name":"Laminated Wood","hex":"#948c7e"},{"name":"Lamp Post","hex":"#4a4f55"},{"name":"Lampoon","hex":"#805557"},{"name":"Lán Sè Blue","hex":"#4d4dff"},{"name":"Land Before Time","hex":"#bfbead"},{"name":"Land Light","hex":"#dfcaaa"},{"name":"Land Rush Bone","hex":"#c9bba1"},{"name":"Langoustino","hex":"#ca6c56"},{"name":"Languid Lavender","hex":"#d6cadd"},{"name":"Lannister Red","hex":"#cd0101"},{"name":"Lantana","hex":"#da7e7a"},{"name":"Lantana Lime","hex":"#d7eccd"},{"name":"Lap Dog","hex":"#a6927f"},{"name":"Lapis Blue","hex":"#004b8d"},{"name":"Lapis Jewel","hex":"#165d95"},{"name":"Lapis Lazuli","hex":"#26619c"},{"name":"Larb Gai","hex":"#dfc6aa"},{"name":"Laredo Road","hex":"#c7994f"},{"name":"Larimar Blue","hex":"#1d78ab"},{"name":"Lark","hex":"#b89b72"},{"name":"Larkspur","hex":"#3c7d90"},{"name":"Larkspur Bud","hex":"#b7c0ea"},{"name":"Las Palmas","hex":"#c6da36"},{"name":"Laser","hex":"#c6a95e"},{"name":"Laser Lemon","hex":"#ffff66"},{"name":"Last Light Blue","hex":"#475f94"},{"name":"Lasting Impression","hex":"#b36663"},{"name":"Lasting Thoughts","hex":"#d4e6b1"},{"name":"Later Gator","hex":"#008a51"},{"name":"Latigo Bay","hex":"#379190"},{"name":"Latin Charm","hex":"#292e44"},{"name":"Latte","hex":"#c5a582"},{"name":"Latte Froth","hex":"#f3f0e8"},{"name":"Lattice Work","hex":"#b9e1c2"},{"name":"Laughing Jack","hex":"#c9c3d2"},{"name":"Laura","hex":"#a6979a"},{"name":"Laura Potato","hex":"#800008"},{"name":"Laurel","hex":"#6e8d71"},{"name":"Laurel Green","hex":"#a9ba9d"},{"name":"Laurel Oak","hex":"#918c7e"},{"name":"Laurel Wreath","hex":"#52a786"},{"name":"Lauren's Lace","hex":"#efeae7"},{"name":"Lava","hex":"#cf1020"},{"name":"Lava Core","hex":"#764031"},{"name":"Lava Geyser","hex":"#dbd0ce"},{"name":"Lava Grey","hex":"#5e686d"},{"name":"Lava Pit","hex":"#e46f34"},{"name":"Lava Stone","hex":"#3c4151"},{"name":"Lavenbrun","hex":"#af9894"},{"name":"Lavendaire","hex":"#8f818b"},{"name":"Lavender","hex":"#b56edc"},{"name":"Lavender Ash","hex":"#9998a7"},{"name":"Lavender Aura","hex":"#9f99aa"},{"name":"Lavender Blossom","hex":"#b57edc"},{"name":"Lavender Blue","hex":"#ccccff"},{"name":"Lavender Blue Shadow","hex":"#8b88f8"},{"name":"Lavender Blush","hex":"#fff0f5"},{"name":"Lavender Bonnet","hex":"#9994c0"},{"name":"Lavender Breeze","hex":"#e4e1e3"},{"name":"Lavender Candy","hex":"#fcb4d5"},{"name":"Lavender Cloud","hex":"#b8abb1"},{"name":"Lavender Cream","hex":"#c79fef"},{"name":"Lavender Crystal","hex":"#936a98"},{"name":"Lavender Dream","hex":"#b4aecc"},{"name":"Lavender Dust","hex":"#c4c3d0"},{"name":"Lavender Earl","hex":"#af92bd"},{"name":"Lavender Elan","hex":"#9d9399"},{"name":"Lavender Elegance","hex":"#786c75"},{"name":"Lavender Fog","hex":"#d2c4d6"},{"name":"Lavender Fragrance","hex":"#ddbbff"},{"name":"Lavender Frost","hex":"#bdabbe"},{"name":"Lavender Grey","hex":"#bdbbd7"},{"name":"Lavender Haze","hex":"#d3d0dd"},{"name":"Lavender Herb","hex":"#b18eaa"},{"name":"Lavender Illusion","hex":"#a99ba7"},{"name":"Lavender Indigo","hex":"#9457eb"},{"name":"Lavender Lake","hex":"#a198a2"},{"name":"Lavender Lily","hex":"#a5969c"},{"name":"Lavender Lustre","hex":"#8c9cc1"},{"name":"Lavender Magenta","hex":"#ee82ed"},{"name":"Lavender Mist","hex":"#e5e5fa"},{"name":"Lavender Mosaic","hex":"#857e86"},{"name":"Lavender Oil","hex":"#c0c0ca"},{"name":"Lavender Pearl","hex":"#ede5e8"},{"name":"Lavender Phlox","hex":"#a6badf"},{"name":"Lavender Pillow","hex":"#c5b9d3"},{"name":"Lavender Pink","hex":"#dd85d7"},{"name":"Lavender Princess","hex":"#e9d2ef"},{"name":"Lavender Purple","hex":"#967bb6"},{"name":"Lavender Rose","hex":"#fba0e3"},{"name":"Lavender Savor","hex":"#eeddff"},{"name":"Lavender Scent","hex":"#bfacb1"},{"name":"Lavender Sky","hex":"#dbd7f2"},{"name":"Lavender Soap","hex":"#f1bfe2"},{"name":"Lavender Sweater","hex":"#bd83be"},{"name":"Lavender Syrup","hex":"#e6e6f1"},{"name":"Lavender Tea","hex":"#d783ff"},{"name":"Lavender Tonic","hex":"#ccbbff"},{"name":"Lavender Twilight","hex":"#e7dfe3"},{"name":"Lavender Violet","hex":"#767ba5"},{"name":"Lavender Vista","hex":"#e3d7e5"},{"name":"Lavender Water","hex":"#d2c9df"},{"name":"Lavendula","hex":"#bca4cb"},{"name":"Lavish Lavender","hex":"#c2aec3"},{"name":"Lawn Green","hex":"#4da409"},{"name":"Laylock","hex":"#ab9ba5"},{"name":"Lazy Afternoon","hex":"#97928b"},{"name":"Lazy Caterpillar","hex":"#e2e5c7"},{"name":"Lazy Daisy","hex":"#f6eba1"},{"name":"Lazy Lavender","hex":"#a3a0b3"},{"name":"Lazy Lizard","hex":"#9c9c4b"},{"name":"Lazy Shell Red","hex":"#cc0011"},{"name":"Lazy Summer Day","hex":"#fef3c3"},{"name":"Le Corbusier Crush","hex":"#bf4e46"},{"name":"Le Max","hex":"#85b2a1"},{"name":"Lead","hex":"#212121"},{"name":"Lead Glass","hex":"#fffae5"},{"name":"Lead Grey","hex":"#8a7963"},{"name":"Lead Ore","hex":"#99aabb"},{"name":"Leadbelcher","hex":"#cacacb"},{"name":"Leadbelcher Metal","hex":"#888d8f"},{"name":"Leaf","hex":"#71aa34"},{"name":"Leaf Bud","hex":"#eff19d"},{"name":"Leaf Green","hex":"#5ca904"},{"name":"Leaf Print","hex":"#e1d38e"},{"name":"Leaf Tea","hex":"#697d4c"},{"name":"Leafy","hex":"#679b6a"},{"name":"Leafy Seadragon","hex":"#b6c406"},{"name":"Leamington Spa","hex":"#a0b7a8"},{"name":"Leap of Faith","hex":"#c4d3e3"},{"name":"Leapfrog","hex":"#41a94f"},{"name":"Leather","hex":"#906a54"},{"name":"Leather Bound","hex":"#916e52"},{"name":"Leather Brown","hex":"#97572b"},{"name":"Leather Chair","hex":"#a3754c"},{"name":"Leather Loafers","hex":"#867354"},{"name":"Leather Satchel","hex":"#7c4f3a"},{"name":"Leather Tan","hex":"#a48454"},{"name":"Lebanon Cedar","hex":"#3c341f"},{"name":"LeChuck's Beard","hex":"#3c351f"},{"name":"Leek","hex":"#98d98e"},{"name":"Leek Powder","hex":"#b7b17a"},{"name":"Leek Soup","hex":"#7a9c58"},{"name":"Legal Eagle","hex":"#6d758f"},{"name":"Legal Ribbon","hex":"#6f434a"},{"name":"Legendary","hex":"#c6baaf"},{"name":"Legendary Grey","hex":"#787976"},{"name":"Legendary Lilac","hex":"#ad969d"},{"name":"Legendary Purple","hex":"#4e4e63"},{"name":"Legion Blue","hex":"#1f495b"},{"name":"Lemon","hex":"#fff700"},{"name":"Lemon Blast","hex":"#fcecad"},{"name":"Lemon Caipirinha","hex":"#f7de9d"},{"name":"Lemon Candy","hex":"#fae8ab"},{"name":"Lemon Chiffon","hex":"#fffacd"},{"name":"Lemon Chiffon Pie","hex":"#fff7c4"},{"name":"Lemon Chrome","hex":"#ffc300"},{"name":"Lemon Curry","hex":"#cda323"},{"name":"Lemon Delicious","hex":"#fce699"},{"name":"Lemon Drop","hex":"#fdd878"},{"name":"Lemon Flesh","hex":"#f0e891"},{"name":"Lemon Gelato","hex":"#f8ec9e"},{"name":"Lemon Ginger","hex":"#968428"},{"name":"Lemon Glacier","hex":"#fdff00"},{"name":"Lemon Grass","hex":"#999a86"},{"name":"Lemon Green","hex":"#adf802"},{"name":"Lemon Ice","hex":"#fffee6"},{"name":"Lemon Icing","hex":"#f6ebc8"},{"name":"Lemon Juice","hex":"#ffffec"},{"name":"Lemon Lime","hex":"#bffe28"},{"name":"Lemon Lime Mojito","hex":"#cbba61"},{"name":"Lemon Meringue","hex":"#f6e199"},{"name":"Lemon Pepper","hex":"#ebeca7"},{"name":"Lemon Pie","hex":"#f1ff62"},{"name":"Lemon Popsicle","hex":"#faf2d1"},{"name":"Lemon Punch","hex":"#fecf24"},{"name":"Lemon Rose","hex":"#fbe9ac"},{"name":"Lemon Sachet","hex":"#faf0cf"},{"name":"Lemon Sherbet","hex":"#f1ffa8"},{"name":"Lemon Slice","hex":"#fffba8"},{"name":"Lemon Soap","hex":"#fffcc4"},{"name":"Lemon Sorbet","hex":"#fffac0"},{"name":"Lemon Splash","hex":"#f9f6de"},{"name":"Lemon Sponge Cake","hex":"#f7f0e1"},{"name":"Lemon Verbena","hex":"#f3e779"},{"name":"Lemon Zest","hex":"#f9d857"},{"name":"Lemonade","hex":"#f0e79d"},{"name":"Lemonade Stand","hex":"#f2ca3b"},{"name":"Lemonwood Place","hex":"#f9f3d7"},{"name":"Lemur","hex":"#695f4f"},{"name":"Lemures","hex":"#bfb9d4"},{"name":"Lens Flare Blue","hex":"#cee2e2"},{"name":"Lens Flare Green","hex":"#b0ff9d"},{"name":"Lens Flare Pink","hex":"#e4cbff"},{"name":"Lentil Sprout","hex":"#aba44d"},{"name":"Lenurple","hex":"#ba93d8"},{"name":"Leopard","hex":"#d09800"},{"name":"Lepidolite Purple","hex":"#947e94"},{"name":"Leprechaun","hex":"#29906d"},{"name":"Leprechaun Green","hex":"#395549"},{"name":"Leprous Brown","hex":"#d99631"},{"name":"Lepton Gold","hex":"#d0a000"},{"name":"Leroy","hex":"#71635a"},{"name":"Les Cavaliers Beach","hex":"#0f63b3"},{"name":"Lester","hex":"#afd1c4"},{"name":"Let It Ring","hex":"#cfae74"},{"name":"Let it Snow","hex":"#d8f1f4"},{"name":"Leticiaz","hex":"#95be76"},{"name":"Lettuce Alone","hex":"#cedda2"},{"name":"Lettuce Green","hex":"#bed38e"},{"name":"Lettuce Mound","hex":"#92a772"},{"name":"Leukocyte White","hex":"#f2f1ed"},{"name":"Leviathan Purple Wash","hex":"#8b2a98"},{"name":"Lexaloffle Green","hex":"#00e436"},{"name":"Lián Hóng Lotus Pink","hex":"#f075e6"},{"name":"Liberace","hex":"#ccb8d2"},{"name":"Liberated Lime","hex":"#d8ddcc"},{"name":"Liberator Gold","hex":"#e8c447"},{"name":"Liberty","hex":"#4d448a"},{"name":"Library Red","hex":"#5b3530"},{"name":"Lich Grey","hex":"#a9a694"},{"name":"Liche Purple","hex":"#730061"},{"name":"Lichen","hex":"#9bc2b1"},{"name":"Lichen Blue","hex":"#5d89b3"},{"name":"Lichen Green","hex":"#9da693"},{"name":"Lichtenstein Yellow","hex":"#fdff38"},{"name":"Lickedy Lick","hex":"#b4496c"},{"name":"Lickety Split","hex":"#c3d997"},{"name":"Licorice","hex":"#1a1110"},{"name":"Liddell","hex":"#c99c59"},{"name":"Life Aquatic","hex":"#a2b0a8"},{"name":"Life Lesson","hex":"#c5cabe"},{"name":"Lifeboat Blue","hex":"#81b6bc"},{"name":"Lifeguard Red","hex":"#e50000"},{"name":"Ligado","hex":"#cdd6c2"},{"name":"Light Ace","hex":"#d4d8ed"},{"name":"Light Airborne","hex":"#b5d1db"},{"name":"Light Alley","hex":"#c8d2e2"},{"name":"Light Amethyst Ice","hex":"#dcd6d3"},{"name":"Light Amourette","hex":"#d4d3e0"},{"name":"Light and Low","hex":"#f9e3b4"},{"name":"Light Angel Kiss","hex":"#dad4e4"},{"name":"Light Angel's Face","hex":"#f3dfd5"},{"name":"Light Angelic Blue","hex":"#cbd4df"},{"name":"Light Angora Blue","hex":"#c9d4e1"},{"name":"Light Anon","hex":"#cdced5"},{"name":"Light Antarctica Lake","hex":"#ceddda"},{"name":"Light Antique Lace","hex":"#dad1ce"},{"name":"Light Apple Cucumber","hex":"#e4e4cb"},{"name":"Light Apple Slice","hex":"#f4f3cd"},{"name":"Light Apricot","hex":"#fdd5b1"},{"name":"Light Aqua","hex":"#8cffdb"},{"name":"Light Aqua Clear","hex":"#a5dbe5"},{"name":"Light Aqua Frost","hex":"#bddde1"},{"name":"Light Aqua Mist","hex":"#b5d5d7"},{"name":"Light Aquamarine","hex":"#7bfdc7"},{"name":"Light Arctic Daisy","hex":"#f1ebcd"},{"name":"Light Aroma","hex":"#decfd2"},{"name":"Light Aspiration","hex":"#dacba7"},{"name":"Light Azure","hex":"#92cbf1"},{"name":"Light Baby Motive","hex":"#a7d8e4"},{"name":"Light Baby Tone","hex":"#e4cfd7"},{"name":"Light Ballet Blue","hex":"#c2d1e2"},{"name":"Light Bassinet","hex":"#ded0d8"},{"name":"Light Bathing","hex":"#abd5dc"},{"name":"Light Bay Fog","hex":"#d6ced3"},{"name":"Light Beige","hex":"#f5efe8"},{"name":"Light Beige Royal","hex":"#dad5c7"},{"name":"Light Beru","hex":"#cfebde"},{"name":"Light Bethany","hex":"#d7e4cc"},{"name":"Light Bleached Bare","hex":"#dcd5d2"},{"name":"Light Bleached Coral","hex":"#fde0dc"},{"name":"Light Bleaches","hex":"#d5d4d0"},{"name":"Light Blissful","hex":"#e5d2dd"},{"name":"Light Blossom Time","hex":"#ecddd6"},{"name":"Light Blue","hex":"#add8e6"},{"name":"Light Blue Ballerina","hex":"#c6d5e4"},{"name":"Light Blue Bayou","hex":"#cdd2de"},{"name":"Light Blue Booties","hex":"#97d5ea"},{"name":"Light Blue Charm","hex":"#9cd0e4"},{"name":"Light Blue Cloud","hex":"#d2d3e1"},{"name":"Light Blue Dam","hex":"#b6d5de"},{"name":"Light Blue Glint","hex":"#a8d3e1"},{"name":"Light Blue Green","hex":"#7efbb3"},{"name":"Light Blue Grey","hex":"#b7c9e2"},{"name":"Light Blue Ice","hex":"#b7d2e3"},{"name":"Light Blue Lavender","hex":"#dfc5fe"},{"name":"Light Blue Limewash","hex":"#9bd7e9"},{"name":"Light Blue Mist","hex":"#bed7f0"},{"name":"Light Blue Moon","hex":"#c9ccd2"},{"name":"Light Blue Rinse","hex":"#c7cdd3"},{"name":"Light Blue Stream","hex":"#add8e1"},{"name":"Light Blue To You","hex":"#caced2"},{"name":"Light Blue Veil","hex":"#c0d8eb"},{"name":"Light Bluish Green","hex":"#76fda8"},{"name":"Light Bluish Water","hex":"#a4dbe4"},{"name":"Light Blunt","hex":"#c6ccd4"},{"name":"Light Blush","hex":"#e9c4cc"},{"name":"Light Bobby Blue","hex":"#add2e3"},{"name":"Light Bread Crumb","hex":"#ebdfcd"},{"name":"Light Breakaway","hex":"#dae3d0"},{"name":"Light Breezy","hex":"#c0d5ef"},{"name":"Light Bright Green","hex":"#53fe5c"},{"name":"Light Bright Spark","hex":"#94d0e9"},{"name":"Light Brown","hex":"#b5651d"},{"name":"Light Brown Sugar","hex":"#c8ae96"},{"name":"Light Brume","hex":"#d6d5d2"},{"name":"Light Budding Bloom","hex":"#e6efcc"},{"name":"Light Budgie Blue","hex":"#9ed6e8"},{"name":"Light Buff It","hex":"#e3dbcd"},{"name":"Light Bunny Pink","hex":"#e4cfd3"},{"name":"Light Bunny Soft","hex":"#deced1"},{"name":"Light Burgundy","hex":"#a8415b"},{"name":"Light Bypass","hex":"#c6d2de"},{"name":"Light Cameo Blue","hex":"#c6d4e1"},{"name":"Light Camisole","hex":"#fce2d4"},{"name":"Light Campers Ghost Grey","hex":"#9598a1"},{"name":"Light Candela","hex":"#c9d2df"},{"name":"Light Cargo River","hex":"#dbd9c9"},{"name":"Light Carmine Pink","hex":"#e66771"},{"name":"Light Carob","hex":"#f9dbcf"},{"name":"Light Carolina","hex":"#d8f3d7"},{"name":"Light Carrot Flower","hex":"#d8decf"},{"name":"Light Celery Satin","hex":"#dbe2cc"},{"name":"Light Celery Stick","hex":"#d8f2dc"},{"name":"Light Ceramic","hex":"#bbc5b2"},{"name":"Light Chalk Blue","hex":"#c4eee8"},{"name":"Light China Doll","hex":"#e7d8c7"},{"name":"Light Chintz","hex":"#e0d5c9"},{"name":"Light Chocolate Cosmos","hex":"#551f2f"},{"name":"Light Christobel","hex":"#dfd3ca"},{"name":"Light Cipollino","hex":"#d5dad1"},{"name":"Light Clay Pipe","hex":"#e3d6c7"},{"name":"Light Club Cruise","hex":"#a3d1e8"},{"name":"Light Cobalt Blue","hex":"#88ace0"},{"name":"Light Compass Ghost Grey","hex":"#9698a3"},{"name":"Light Continental Waters","hex":"#afd5d8"},{"name":"Light Cool Crayon","hex":"#c3ece9"},{"name":"Light Coral","hex":"#f08080"},{"name":"Light Cornflower Blue","hex":"#93ccea"},{"name":"Light Cowardly Custard","hex":"#faf3cf"},{"name":"Light Cream Cake","hex":"#f9eecb"},{"name":"Light Crimson","hex":"#f56991"},{"name":"Light Crushed Almond","hex":"#ddd7d1"},{"name":"Light Cuddle","hex":"#cbd7ed"},{"name":"Light Curd","hex":"#f9e9c9"},{"name":"Light Cyan","hex":"#e0ffff"},{"name":"Light Daly Waters","hex":"#c2e4e7"},{"name":"Light Dante Peak","hex":"#c6dedf"},{"name":"Light Daydreamer","hex":"#e2d9d2"},{"name":"Light Dedication","hex":"#fce9d5"},{"name":"Light Deep Pink","hex":"#ff5ccd"},{"name":"Light Delphin","hex":"#9ed1e3"},{"name":"Light Deluxe Days","hex":"#a4d4ec"},{"name":"Light Detroit","hex":"#cddbdc"},{"name":"Light Dewpoint","hex":"#c4dadd"},{"name":"Light Dreamweaver","hex":"#d7d3e0"},{"name":"Light Drizzle","hex":"#a7aea5"},{"name":"Light Dry Lichen","hex":"#d4e3d7"},{"name":"Light Duck Egg Cream","hex":"#d5ebdd"},{"name":"Light Easter Rabbit","hex":"#d4ced1"},{"name":"Light Ebony","hex":"#555d50"},{"name":"Light Ecru","hex":"#e5deca"},{"name":"Light Eggplant","hex":"#894585"},{"name":"Light Eggshell Pink","hex":"#d9d2c9"},{"name":"Light Ellen","hex":"#ead5c7"},{"name":"Light Elusive","hex":"#fddfda"},{"name":"Light Elusive Blue","hex":"#c5ced8"},{"name":"Light Elusive Dream","hex":"#d8cdd3"},{"name":"Light Elusive Mauve","hex":"#e6d1dc"},{"name":"Light Enchanted","hex":"#d6eadb"},{"name":"Light Eskimo White","hex":"#d1cdd0"},{"name":"Light Fairy Pink","hex":"#f3ded7"},{"name":"Light Fairy Wings","hex":"#fbdcdc"},{"name":"Light Favourite Lady","hex":"#ead3e0"},{"name":"Light Feather Boa","hex":"#f5d6d8"},{"name":"Light Featherbed","hex":"#c1d8eb"},{"name":"Light Feijoa Flower","hex":"#f1f4d1"},{"name":"Light Femininity","hex":"#d4d1d9"},{"name":"Light Figurine","hex":"#ebe0cf"},{"name":"Light First Love","hex":"#fce6db"},{"name":"Light Fish Pond","hex":"#a1d5f1"},{"name":"Light Flaxen Fair","hex":"#eae6cc"},{"name":"Light Flesh","hex":"#f1d7d3"},{"name":"Light Flower Centre","hex":"#fbecd3"},{"name":"Light Forest Green","hex":"#4f9153"},{"name":"Light Foundation","hex":"#f8eed3"},{"name":"Light French Beige","hex":"#c8ad7f"},{"name":"Light French Limestone","hex":"#d5e0d0"},{"name":"Light French Vanilla","hex":"#fbe8ce"},{"name":"Light Fresh Lime","hex":"#e2f4d7"},{"name":"Light Freshman","hex":"#ecf4d2"},{"name":"Light Frost","hex":"#ede8d7"},{"name":"Light Frosted Sugar","hex":"#dfcbcf"},{"name":"Light Frosty Dawn","hex":"#d7efd5"},{"name":"Light Frozen Frappe","hex":"#e6d2dc"},{"name":"Light Fuchsia Pink","hex":"#f984ef"},{"name":"Light Garlic Suede","hex":"#d9ddcb"},{"name":"Light Gentle Calm","hex":"#d2d9cd"},{"name":"Light Gentle Giant","hex":"#c6f0e7"},{"name":"Light Gentle Touch","hex":"#ebe0c8"},{"name":"Light Ghost Town","hex":"#d4cfcc"},{"name":"Light Ghosting","hex":"#d7d3ca"},{"name":"Light Ghostly Green","hex":"#e2e1c8"},{"name":"Light Glass Bead","hex":"#d4cdd2"},{"name":"Light Glaze","hex":"#c0b5aa"},{"name":"Light Gold","hex":"#fddc5c"},{"name":"Light Goldenrod","hex":"#eedd82"},{"name":"Light Goldenrod Yellow","hex":"#fafad2"},{"name":"Light Gracilis","hex":"#d2e0d6"},{"name":"Light Grand Piano","hex":"#e2dccc"},{"name":"Light Grass Green","hex":"#7cb68e"},{"name":"Light Green","hex":"#76ff7b"},{"name":"Light Green Alabaster","hex":"#d5d8c9"},{"name":"Light Green Ash","hex":"#d7ddcd"},{"name":"Light Green Blue","hex":"#56fca2"},{"name":"Light Green Frost","hex":"#dce0cd"},{"name":"Light Green Glacier","hex":"#eef3d0"},{"name":"Light Green Glint","hex":"#e5f4d5"},{"name":"Light Green Veil","hex":"#e8f4d2"},{"name":"Light Green Wash","hex":"#d4e6d9"},{"name":"Light Greenette","hex":"#e2f0d2"},{"name":"Light Greenish Blue","hex":"#63f7b4"},{"name":"Light Greenland Ice","hex":"#c9e1e0"},{"name":"Light Gregorio Garden","hex":"#d7d4e4"},{"name":"Light Grey","hex":"#d8dcd6"},{"name":"Light Grey Blue","hex":"#9dbcd4"},{"name":"Light Grey Green","hex":"#b7e1a1"},{"name":"Light Grey Pebble","hex":"#dbd7d0"},{"name":"Light Greyish Magenta","hex":"#cc99cc"},{"name":"Light Half And","hex":"#ede7c8"},{"name":"Light Handmade Linen","hex":"#e6e1c7"},{"name":"Light Hazy Daze","hex":"#b8c8d3"},{"name":"Light Heaven Sent","hex":"#bacad4"},{"name":"Light High Point","hex":"#cce2dd"},{"name":"Light Hindsight","hex":"#cdd6ea"},{"name":"Light Hint Of Lavender","hex":"#dccfce"},{"name":"Light Hog Bristle","hex":"#e5ddcb"},{"name":"Light Horizon Sky","hex":"#d0d2de"},{"name":"Light Hot Pink","hex":"#ffb3de"},{"name":"Light Hugo","hex":"#eddbd7"},{"name":"Light Ice Cap Green","hex":"#caede4"},{"name":"Light Ice Pack","hex":"#bbe4ea"},{"name":"Light Iced Aniseed","hex":"#d8ded0"},{"name":"Light Iced Lavender","hex":"#d0d4e3"},{"name":"Light Image Tone","hex":"#ccd0da"},{"name":"Light Imagine","hex":"#aed4d8"},{"name":"Light In The Slip","hex":"#ead1da"},{"name":"Light Indigo","hex":"#6d5acf"},{"name":"Light Instant","hex":"#e2d9d4"},{"name":"Light Island Light","hex":"#bbd5ef"},{"name":"Light Issey-San","hex":"#dbe4d1"},{"name":"Light Jellyfish Blue","hex":"#acd6db"},{"name":"Light Jodhpurs","hex":"#f0e4c6"},{"name":"Light July","hex":"#a5ddea"},{"name":"Light June","hex":"#b1d2df"},{"name":"Light Karma","hex":"#bce6e8"},{"name":"Light Katsura","hex":"#d6ead8"},{"name":"Light Khaki","hex":"#f0e681"},{"name":"Light Kinder","hex":"#c8ced6"},{"name":"Light Kiri Mist","hex":"#d3d2dd"},{"name":"Light Korila","hex":"#e0eed4"},{"name":"Light Lace Wisteria","hex":"#d0cbce"},{"name":"Light Lady Fingers","hex":"#d8cbcf"},{"name":"Light Lamb's Ears","hex":"#d6d9cb"},{"name":"Light Laughing Jack","hex":"#d6d1dc"},{"name":"Light Lavender","hex":"#efc0fe"},{"name":"Light Lavender Blush","hex":"#e3d2cf"},{"name":"Light Lavender Oil","hex":"#cecfd6"},{"name":"Light Lavender Water","hex":"#ddd6e7"},{"name":"Light Leaf","hex":"#9ab38d"},{"name":"Light Leather","hex":"#938673"},{"name":"Light Lichen","hex":"#c5ded1"},{"name":"Light Ligado","hex":"#d9e0d0"},{"name":"Light Light Blue","hex":"#cafffb"},{"name":"Light Light Blush","hex":"#eed2d7"},{"name":"Light Light Green","hex":"#c8ffb0"},{"name":"Light Light Lichen","hex":"#d3e7dc"},{"name":"Light Light Rice","hex":"#e6ddcd"},{"name":"Light Lilac","hex":"#edc8ff"},{"name":"Light Lilac Crystal","hex":"#d7d2e2"},{"name":"Light Lily","hex":"#e1c3bb"},{"name":"Light Lily Legs","hex":"#f2d4df"},{"name":"Light Lilylock","hex":"#e8e9cf"},{"name":"Light Lime","hex":"#aefd6c"},{"name":"Light Lime Green","hex":"#b9ff66"},{"name":"Light Lime Sherbet","hex":"#d8e6ce"},{"name":"Light Limed White","hex":"#dbd5ce"},{"name":"Light Limpid Light","hex":"#dad1d7"},{"name":"Light Lip Gloss","hex":"#e7d9d4"},{"name":"Light Livingstone","hex":"#d8d7ca"},{"name":"Light Lost Lace","hex":"#d1f0dd"},{"name":"Light Lunette","hex":"#dcd5d3"},{"name":"Light Magenta","hex":"#ff80ff"},{"name":"Light Mahogany","hex":"#ad6d68"},{"name":"Light Maiden's Blush","hex":"#f6ddce"},{"name":"Light Male","hex":"#e3dbd0"},{"name":"Light Maroon","hex":"#a24857"},{"name":"Light Marsh Fog","hex":"#d3e1d3"},{"name":"Light Marshmallow Magic","hex":"#f4dddb"},{"name":"Light Martian Moon","hex":"#d1efdd"},{"name":"Light Mauve","hex":"#c292a1"},{"name":"Light Mauve Organdie","hex":"#e3d2db"},{"name":"Light Mauve Pansy","hex":"#cdcace"},{"name":"Light Meadow Lane","hex":"#cee1d9"},{"name":"Light Medium Orchid","hex":"#d39bcb"},{"name":"Light Medlar","hex":"#dfe1cc"},{"name":"Light Melt Ice","hex":"#c5d8e9"},{"name":"Light Mint","hex":"#b6ffbb"},{"name":"Light Mint Green","hex":"#a6fbb2"},{"name":"Light Missed","hex":"#f2f3cf"},{"name":"Light Mist","hex":"#fcf7db"},{"name":"Light Mistral","hex":"#c8cdd8"},{"name":"Light Mizu","hex":"#8ecfe8"},{"name":"Light Modesty","hex":"#ded5e2"},{"name":"Light Moo","hex":"#f9ebcc"},{"name":"Light Morality","hex":"#c4d9eb"},{"name":"Light Mornington","hex":"#e5d4c9"},{"name":"Light Mosque","hex":"#d8cdd0"},{"name":"Light Moss Green","hex":"#a6c875"},{"name":"Light Mountain Spring","hex":"#e3e9cf"},{"name":"Light Mr Frosty","hex":"#b8d3e4"},{"name":"Light Mud Berry","hex":"#dcd6d2"},{"name":"Light Mulberry","hex":"#d8b7cf"},{"name":"Light Mustard","hex":"#f7d560"},{"name":"Light Mystified","hex":"#d6e4d4"},{"name":"Light Naked Pink","hex":"#e2d4e1"},{"name":"Light Nantucket Mist","hex":"#d7cecd"},{"name":"Light Navy","hex":"#155084"},{"name":"Light Navy Blue","hex":"#2e5a88"},{"name":"Light Neon Green","hex":"#4efd54"},{"name":"Light New Hope","hex":"#eaf3d0"},{"name":"Light Newman's Eye","hex":"#c3d5e8"},{"name":"Light Nursery","hex":"#f4dcdc"},{"name":"Light Nut Milk","hex":"#e3d8d4"},{"name":"Light Objectivity","hex":"#cbd3e6"},{"name":"Light of the Moon","hex":"#fdf5d7"},{"name":"Light Oil Of Lavender","hex":"#d4cecd"},{"name":"Light Olive","hex":"#acbf69"},{"name":"Light Olive Creed","hex":"#eef0ce"},{"name":"Light Olive Green","hex":"#a4be5c"},{"name":"Light Opale","hex":"#c1e8ea"},{"name":"Light Opus","hex":"#dad7e8"},{"name":"Light Orange","hex":"#fed8b1"},{"name":"Light Orchid","hex":"#e6a8d7"},{"name":"Light Orchid Haze","hex":"#d6cdd0"},{"name":"Light Oriental Blush","hex":"#e1d4e8"},{"name":"Light Otto Ice","hex":"#cde7dd"},{"name":"Light Oxford","hex":"#c2cbd2"},{"name":"Light Pale Celadon","hex":"#d6d8cd"},{"name":"Light Pale Icelandish","hex":"#ccdfdc"},{"name":"Light Pale Lady","hex":"#d3cccd"},{"name":"Light Pale Lilac","hex":"#ced5e4"},{"name":"Light Pale Pearl","hex":"#d4cbce"},{"name":"Light Pale Tendril","hex":"#dbdacb"},{"name":"Light Parchment Paper","hex":"#e6ddd2"},{"name":"Light Passion Flower","hex":"#fce2d7"},{"name":"Light Pastel Green","hex":"#b2fba5"},{"name":"Light Pastel Mint","hex":"#dbf4d8"},{"name":"Light Pastel Purple","hex":"#b19cd9"},{"name":"Light Pastry","hex":"#f9e7c8"},{"name":"Light Pax","hex":"#d5d3e3"},{"name":"Light Payne's Grey","hex":"#536871"},{"name":"Light Pea Green","hex":"#c4fe82"},{"name":"Light Peach","hex":"#ffd8b1"},{"name":"Light Pearl Ash","hex":"#dcd6d1"},{"name":"Light Pelican Bill","hex":"#e1ced4"},{"name":"Light Penna","hex":"#c8d4e7"},{"name":"Light Pensive","hex":"#d0d0d7"},{"name":"Light Periwinkle","hex":"#c1c6fc"},{"name":"Light Perk Up","hex":"#e0d5cd"},{"name":"Light Petite Pink","hex":"#f0d7d7"},{"name":"Light Pianissimo","hex":"#ecdbd6"},{"name":"Light Piccolo","hex":"#a4dde9"},{"name":"Light Pickford","hex":"#d7f3dd"},{"name":"Light Picnic Bay","hex":"#cde5de"},{"name":"Light Pine","hex":"#bcc09e"},{"name":"Light Pink","hex":"#ffd1df"},{"name":"Light Pink Clay","hex":"#fedfdc"},{"name":"Light Pink Linen","hex":"#ddced1"},{"name":"Light Pink Marble","hex":"#ebdcd7"},{"name":"Light Pink Pandora","hex":"#e9d3d5"},{"name":"Light Pink Polar","hex":"#d8c9cc"},{"name":"Light Pink Tone","hex":"#fad9da"},{"name":"Light Pink Tutu","hex":"#fedddd"},{"name":"Light Pinnacle","hex":"#cee5df"},{"name":"Light Pipe Clay","hex":"#d8d6cc"},{"name":"Light Pistachio Tang","hex":"#e2dec8"},{"name":"Light Placid Blue","hex":"#c8d8e8"},{"name":"Light Plum","hex":"#9d5783"},{"name":"Light Pollinate","hex":"#ebe1cb"},{"name":"Light Poolside","hex":"#bee0e2"},{"name":"Light Porcelain","hex":"#e7dad7"},{"name":"Light Porcelain Pink","hex":"#f1e2c9"},{"name":"Light Powder Blue","hex":"#c4d9ef"},{"name":"Light Powdered Granite","hex":"#d1d6eb"},{"name":"Light Pre School","hex":"#c5d0d9"},{"name":"Light Precious Pink","hex":"#f4dbdc"},{"name":"Light Pretty Pale","hex":"#ead4e0"},{"name":"Light Prudence","hex":"#dfd3e3"},{"name":"Light Puffball","hex":"#d9ced5"},{"name":"Light Pure Blue","hex":"#c2d2d8"},{"name":"Light Purity","hex":"#e0d5e9"},{"name":"Light Purple","hex":"#bf77f6"},{"name":"Light Quaver","hex":"#cdded7"},{"name":"Light Quilt","hex":"#fde1d4"},{"name":"Light Radar","hex":"#c6d5ea"},{"name":"Light Raspberry Ice","hex":"#e2d8d3"},{"name":"Light Raw Cotton","hex":"#ecdfca"},{"name":"Light Recuperate","hex":"#e7d8ea"},{"name":"Light Red","hex":"#ffcccb"},{"name":"Light Red Ochre","hex":"#e97551"},{"name":"Light Registra","hex":"#d0cacd"},{"name":"Light Relax","hex":"#caddde"},{"name":"Light Rice","hex":"#ddd1bf"},{"name":"Light Ridge Light","hex":"#c3d5e5"},{"name":"Light Ringlet","hex":"#faf1cd"},{"name":"Light Roast","hex":"#615544"},{"name":"Light Rose","hex":"#ffc5cb"},{"name":"Light Rose Aspect","hex":"#f4d4d6"},{"name":"Light Rose Romantic","hex":"#f3dcd8"},{"name":"Light Royal Blue","hex":"#3a2efe"},{"name":"Light Sage","hex":"#bcecac"},{"name":"Light Salmon","hex":"#fea993"},{"name":"Light Salmon Pink","hex":"#ff9999"},{"name":"Light Salome","hex":"#ccf1e3"},{"name":"Light Salt Spray","hex":"#bbd3da"},{"name":"Light Sand Diamond","hex":"#faeecb"},{"name":"Light Sandbank","hex":"#dedcc6"},{"name":"Light Sandy Day","hex":"#e1dacf"},{"name":"Light Sappanwood","hex":"#a25768"},{"name":"Light Scallywag","hex":"#ebe0ca"},{"name":"Light Sea Breeze","hex":"#b7cdd9"},{"name":"Light Sea Cliff","hex":"#b9d4e7"},{"name":"Light Sea Green","hex":"#98f6b0"},{"name":"Light Sea Spray","hex":"#abd6de"},{"name":"Light Sea-Foam","hex":"#a0febf"},{"name":"Light Seafoam Green","hex":"#a7ffb5"},{"name":"Light Searchlight","hex":"#f2f3ce"},{"name":"Light Security","hex":"#e0e9d0"},{"name":"Light Seduction","hex":"#faf4ce"},{"name":"Light Serena","hex":"#dcdccf"},{"name":"Light Shell Haven","hex":"#f1e8ce"},{"name":"Light Shell Tint","hex":"#fce0d6"},{"name":"Light Shetland Lace","hex":"#e7dccf"},{"name":"Light Shimmer","hex":"#a3d4ef"},{"name":"Light Short Phase","hex":"#cbe8df"},{"name":"Light Shutterbug","hex":"#cef2e4"},{"name":"Light Shy Girl","hex":"#fde0da"},{"name":"Light Silver Dollar","hex":"#d5dfd3"},{"name":"Light Silver Grass","hex":"#d4dbd1"},{"name":"Light Silver Sweetpea","hex":"#d3d6e9"},{"name":"Light Silverton","hex":"#cee3d9"},{"name":"Light Sky Babe","hex":"#a1d0e2"},{"name":"Light Sky Blue","hex":"#87cefa"},{"name":"Light Sky Bus","hex":"#afcfe0"},{"name":"Light Sky Chase","hex":"#bad7dc"},{"name":"Light Sky Cloud","hex":"#c0e7eb"},{"name":"Light Skyway","hex":"#c2e3e8"},{"name":"Light Slate Blue","hex":"#8470ff"},{"name":"Light Slate Grey","hex":"#778899"},{"name":"Light Slight Mushroom","hex":"#dbd6d2"},{"name":"Light Slightly Rose","hex":"#eddbda"},{"name":"Light Slipper Satin","hex":"#cfd1d8"},{"name":"Light Snow Goose","hex":"#d1e2d8"},{"name":"Light Snow Green","hex":"#d5e3d0"},{"name":"Light Soft Celadon","hex":"#cedcd4"},{"name":"Light Soft Fresco","hex":"#cfe0d7"},{"name":"Light Soft Kind","hex":"#dcddcc"},{"name":"Light Soft Satin","hex":"#f3d3d9"},{"name":"Light Solar","hex":"#faf0c9"},{"name":"Light Soya","hex":"#f9eacc"},{"name":"Light Spanish Cream","hex":"#fbebcf"},{"name":"Light Spatial Spirit","hex":"#d1f1de"},{"name":"Light Spearmint Ice","hex":"#cfded7"},{"name":"Light Spirit","hex":"#c3cad3"},{"name":"Light Sprig Muslin","hex":"#e0cfd2"},{"name":"Light Spring Burst","hex":"#d6e8d5"},{"name":"Light Spring Fever","hex":"#ecebce"},{"name":"Light Spring Shoot","hex":"#e9f1d0"},{"name":"Light Sprinkle","hex":"#e3e3d7"},{"name":"Light Spritzig","hex":"#92d2ed"},{"name":"Light Stargate","hex":"#c7d2dd"},{"name":"Light Starlight","hex":"#cbd0d7"},{"name":"Light Starlight Blue","hex":"#c9e7e3"},{"name":"Light Stately Frills","hex":"#d2ccd1"},{"name":"Light Steel Blue?","hex":"#b0c4de"},{"name":"Light Subdue","hex":"#d5d1cc"},{"name":"Light Subpoena","hex":"#e4dad3"},{"name":"Light Supernova","hex":"#cde5e2"},{"name":"Light Tactile","hex":"#deedd4"},{"name":"Light Tan","hex":"#fbeeac"},{"name":"Light Taupe","hex":"#b38b6d"},{"name":"Light Taupe White","hex":"#d5d0cb"},{"name":"Light Tea Party","hex":"#fee0da"},{"name":"Light Teal","hex":"#90e4c1"},{"name":"Light Template","hex":"#bbd6ea"},{"name":"Light Tender Touch","hex":"#e0d4e0"},{"name":"Light Tenzing","hex":"#b3dae2"},{"name":"Light Thought","hex":"#e2d8d4"},{"name":"Light Thulian Pink","hex":"#e38fac"},{"name":"Light Tidal Foam","hex":"#bcd6e9"},{"name":"Light Time Travel","hex":"#c5d2df"},{"name":"Light Timeless","hex":"#c2e2e3"},{"name":"Light Tinge Of Mauve","hex":"#dfd2d9"},{"name":"Light Tinker Light","hex":"#faf1c8"},{"name":"Light Tip Toes","hex":"#e1d0d8"},{"name":"Light Truffle","hex":"#aa9c8b"},{"name":"Light Turquoise","hex":"#7ef4cc"},{"name":"Light Unbleached Calico","hex":"#f8e2ca"},{"name":"Light Urple","hex":"#b36ff6"},{"name":"Light Vandamint","hex":"#bfe7ea"},{"name":"Light Vanilla Frost","hex":"#faedd2"},{"name":"Light Vanilla Ice","hex":"#b8ced9"},{"name":"Light Vanilla Quake","hex":"#d8d5d0"},{"name":"Light Violet","hex":"#d6b4fc"},{"name":"Light Vision","hex":"#dcd9eb"},{"name":"Light Wallis","hex":"#d4ccce"},{"name":"Light Warm Ash","hex":"#dbd6d3"},{"name":"Light Washed Blue","hex":"#acdce7"},{"name":"Light Water Wash","hex":"#bfd5eb"},{"name":"Light Water Wings","hex":"#c2f0e6"},{"name":"Light Watermark","hex":"#b7dadd"},{"name":"Light Watermelon Milk","hex":"#e6dad6"},{"name":"Light Wave","hex":"#badbdf"},{"name":"Light Wavecrest","hex":"#b5d1df"},{"name":"Light Weathered Hide","hex":"#e0d4d0"},{"name":"Light Wheaten White","hex":"#faf0cb"},{"name":"Light Whimsy","hex":"#99d0e7"},{"name":"Light White Box","hex":"#cedcd6"},{"name":"Light White Duck","hex":"#dcd8cb"},{"name":"Light White Flag","hex":"#d6d0cf"},{"name":"Light Wisteria","hex":"#c9a0ff"},{"name":"Light Wood","hex":"#856363"},{"name":"Light Worker","hex":"#f2e3b5"},{"name":"Light Yellow","hex":"#fffe7a"},{"name":"Light Yellow Green","hex":"#ccfd7f"},{"name":"Light Yellowish Green","hex":"#c2ff89"},{"name":"Light Youth","hex":"#ead7d5"},{"name":"Light Zen","hex":"#d1dbd2"},{"name":"Light Zenith Heights","hex":"#bad5d4"},{"name":"Lighter Green","hex":"#75fd63"},{"name":"Lighter Purple","hex":"#a55af4"},{"name":"Lightest Sky","hex":"#e4eadf"},{"name":"Lighthearted Rose","hex":"#c7a1a9"},{"name":"Lighthouse","hex":"#f3f4f4"},{"name":"Lighthouse Glow","hex":"#f8d568"},{"name":"Lighthouse View","hex":"#d9dcd5"},{"name":"Lightish Blue","hex":"#3d7afd"},{"name":"Lightish Green","hex":"#61e160"},{"name":"Lightish Purple","hex":"#a552e6"},{"name":"Lightish Red","hex":"#fe2f4a"},{"name":"Lightning Bolt","hex":"#e5ebe6"},{"name":"Lightning Bolt Blue","hex":"#93b9df"},{"name":"Lightning Bug","hex":"#efde74"},{"name":"Lightning Yellow","hex":"#f7a233"},{"name":"Lights Out","hex":"#3d474b"},{"name":"Lightsaber Blue","hex":"#15f2fd"},{"name":"Lilac","hex":"#cea2fd"},{"name":"Lilac Ash","hex":"#d7cdcd"},{"name":"Lilac Breeze","hex":"#b3a0c9"},{"name":"Lilac Bush","hex":"#9470c4"},{"name":"Lilac Chiffon","hex":"#de9bc4"},{"name":"Lilac Cotton Candy","hex":"#cdd7ec"},{"name":"Lilac Crystal","hex":"#cbc5d9"},{"name":"Lilac Flare","hex":"#b2badb"},{"name":"Lilac Fluff","hex":"#c8a4bf"},{"name":"Lilac Frost","hex":"#e8deea"},{"name":"Lilac Geode","hex":"#bb88ff"},{"name":"Lilac Grey","hex":"#9896a4"},{"name":"Lilac Haze","hex":"#d5b6d4"},{"name":"Lilac Hint","hex":"#d0d0da"},{"name":"Lilac Light","hex":"#d7c1ba"},{"name":"Lilac Lust","hex":"#c3b9d8"},{"name":"Lilac Luster","hex":"#ae98aa"},{"name":"Lilac Marble","hex":"#c3babf"},{"name":"Lilac Paradise","hex":"#dcbbba"},{"name":"Lilac Rose","hex":"#bd4275"},{"name":"Lilac Sachet","hex":"#abb6d7"},{"name":"Lilac Smoke","hex":"#b6a3a0"},{"name":"Lilac Snow","hex":"#e0c7d7"},{"name":"Lilac Suede","hex":"#ba9b97"},{"name":"Lilac Time","hex":"#a4abbf"},{"name":"Lilas","hex":"#b88995"},{"name":"Lilás","hex":"#cc99ff"},{"name":"Liliac","hex":"#c48efd"},{"name":"Lily","hex":"#c19fb3"},{"name":"Lily Green","hex":"#c5cf98"},{"name":"Lily Legs","hex":"#eec7d6"},{"name":"Lily Pad","hex":"#818f84"},{"name":"Lily Pond","hex":"#deead8"},{"name":"Lily Pond Blue","hex":"#55707f"},{"name":"Lily White","hex":"#f0e7d3"},{"name":"Lilylock","hex":"#e0e1c1"},{"name":"Lima","hex":"#a9f971"},{"name":"Lima Bean","hex":"#e1d590"},{"name":"Lima Bean Green","hex":"#88be69"},{"name":"Lima Sombrio","hex":"#7aac21"},{"name":"Limbert Leather","hex":"#988870"},{"name":"Lime","hex":"#aaff32"},{"name":"Lime Acid","hex":"#afff01"},{"name":"Lime Blossom","hex":"#f4f2d3"},{"name":"Lime Candy Pearl","hex":"#aaff00"},{"name":"Lime Chalk","hex":"#e5ddc8"},{"name":"Lime Cream","hex":"#d7e8bc"},{"name":"Lime Daiquiri","hex":"#dde6d7"},{"name":"Lime Dream","hex":"#c2ecbc"},{"name":"Lime Fizz","hex":"#cfe838"},{"name":"Lime Flip","hex":"#d2e3cc"},{"name":"Lime Hawk Moth","hex":"#cdaea5"},{"name":"Lime Ice","hex":"#d1dd86"},{"name":"Lime Jelly","hex":"#e3ff00"},{"name":"Lime Lizard","hex":"#abd35d"},{"name":"Lime Meringue","hex":"#e6ecd6"},{"name":"Lime Parfait","hex":"#95c577"},{"name":"Lime Peel","hex":"#c6c191"},{"name":"Lime Popsicle","hex":"#c0db3a"},{"name":"Lime Punch","hex":"#c0d725"},{"name":"Lime Rasp","hex":"#b5ce08"},{"name":"Lime Sherbet","hex":"#cdd78a"},{"name":"Lime Shot","hex":"#1df914"},{"name":"Lime Slice","hex":"#f0fded"},{"name":"Lime Soap","hex":"#7af9ab"},{"name":"Lime Sorbet","hex":"#bee5be"},{"name":"Lime Splash","hex":"#cfdb8d"},{"name":"Lime Spritz","hex":"#dae1cf"},{"name":"Lime Taffy","hex":"#bad1b5"},{"name":"Lime Time","hex":"#ebe734"},{"name":"Lime Twist","hex":"#c6d624"},{"name":"Lime Wash","hex":"#dfe3d0"},{"name":"Lime Yellow","hex":"#d0fe1d"},{"name":"Lime Zest","hex":"#ddff00"},{"name":"Limeade","hex":"#5f9727"},{"name":"Limed Ash","hex":"#747d63"},{"name":"Limed Oak","hex":"#ac8a56"},{"name":"Limed Spruce","hex":"#394851"},{"name":"Limed White","hex":"#cfc9c0"},{"name":"Limelight","hex":"#f0e87d"},{"name":"Limerick","hex":"#76857b"},{"name":"Limesicle","hex":"#f2eabf"},{"name":"Limestone","hex":"#dcd8c7"},{"name":"Limetta","hex":"#8e9a21"},{"name":"Limited Lime","hex":"#eaecb9"},{"name":"Limitless","hex":"#f0ddb8"},{"name":"Limoge Pink","hex":"#f3e0db"},{"name":"Limoges","hex":"#243f6c"},{"name":"Limoncello","hex":"#bfff00"},{"name":"Limone","hex":"#d6c443"},{"name":"Limonite","hex":"#be7f51"},{"name":"Limpet Shell","hex":"#98ddde"},{"name":"Limpid Light","hex":"#cdc2ca"},{"name":"Limuyi Yellow","hex":"#fefc7e"},{"name":"Lincoln Green","hex":"#195905"},{"name":"Linden Green","hex":"#c4bf71"},{"name":"Linden Spear","hex":"#8e9985"},{"name":"Lindworm Green","hex":"#172808"},{"name":"Lineage","hex":"#4c3430"},{"name":"Linear","hex":"#164975"},{"name":"Linen","hex":"#faf0e6"},{"name":"Linen Ruffle","hex":"#efebe3"},{"name":"Linen White","hex":"#e9dcd1"},{"name":"Lingering Lilac","hex":"#e6def0"},{"name":"Lingonberry","hex":"#ff255c"},{"name":"Link","hex":"#778290"},{"name":"Link Green","hex":"#01a049"},{"name":"Link to the Past","hex":"#d2b48c"},{"name":"Link Water","hex":"#c7cdd8"},{"name":"Linnet","hex":"#c3bcb3"},{"name":"Linnet Egg Red","hex":"#ffccdd"},{"name":"Linseed","hex":"#b0a895"},{"name":"Lint","hex":"#b6ba99"},{"name":"Lion","hex":"#c19a62"},{"name":"Lion King","hex":"#dd9933"},{"name":"Lion's Mane","hex":"#e8af49"},{"name":"Lionfish Red","hex":"#e03c28"},{"name":"Lip Gloss","hex":"#dfcdc7"},{"name":"Lippie","hex":"#d16a68"},{"name":"Lips of Apricot","hex":"#fbceb1"},{"name":"Lipstick","hex":"#c95b83"},{"name":"Lipstick Red","hex":"#c0022f"},{"name":"Liquid Green Stuff","hex":"#3b7a5f"},{"name":"Liquid Lime","hex":"#cdf80c"},{"name":"Liquorice","hex":"#0a0502"},{"name":"Liquorice Green","hex":"#2a4041"},{"name":"Liquorice Root","hex":"#222200"},{"name":"Lira","hex":"#e2c28d"},{"name":"Lisbon Brown","hex":"#423921"},{"name":"Lisbon Lemon","hex":"#fffb00"},{"name":"Liselotte Syrup","hex":"#dd5511"},{"name":"Liseran Purple","hex":"#de6fa1"},{"name":"Lit","hex":"#fffed8"},{"name":"Lit'L Buoy Blew","hex":"#d6e8e1"},{"name":"Lithic Sand","hex":"#53626e"},{"name":"Litmus","hex":"#9895c5"},{"name":"Little Baby Girl","hex":"#f8b9d4"},{"name":"Little Bear","hex":"#604b42"},{"name":"Little Beaux Blue","hex":"#b6d3c5"},{"name":"Little Blue Heron","hex":"#3c4378"},{"name":"Little Boy Blue","hex":"#6ca0dc"},{"name":"Little Dipper","hex":"#e4e6ea"},{"name":"Little Lamb","hex":"#eae6d7"},{"name":"Little League","hex":"#6a9a8e"},{"name":"Little Lilac","hex":"#e0d8df"},{"name":"Little Mermaid","hex":"#2d454a"},{"name":"Little Valley","hex":"#a4a191"},{"name":"Lively Coral","hex":"#e67c7a"},{"name":"Lively Ivy","hex":"#b3ae87"},{"name":"Lively Laugh","hex":"#e1dd8e"},{"name":"Lively Lavender","hex":"#816f7a"},{"name":"Lively Light","hex":"#a18899"},{"name":"Liver","hex":"#534b4f"},{"name":"Liver Chestnut","hex":"#987456"},{"name":"Livery Green","hex":"#a8d275"},{"name":"Livid","hex":"#6688cc"},{"name":"Livid Brown","hex":"#312a29"},{"name":"Livid Lime","hex":"#b8e100"},{"name":"Living Coral","hex":"#ff6f61"},{"name":"Living Large","hex":"#c87163"},{"name":"Livingstone","hex":"#cbcbbb"},{"name":"Lizard","hex":"#71643e"},{"name":"Lizard Belly","hex":"#cccc33"},{"name":"Lizard Legs","hex":"#7f6944"},{"name":"Loafer","hex":"#dbd9c2"},{"name":"Lobaria Lichen","hex":"#9fc8b2"},{"name":"Loblolly","hex":"#b3bbb7"},{"name":"Lobster Bisque","hex":"#dd9289"},{"name":"Lobster Brown","hex":"#a73836"},{"name":"Lobster Butter Sauce","hex":"#cc8811"},{"name":"Loch Blue","hex":"#609795"},{"name":"Loch Ness","hex":"#5f6db0"},{"name":"Lochinvar","hex":"#489084"},{"name":"Lochmara","hex":"#316ea0"},{"name":"Locomotion","hex":"#988171"},{"name":"Locust","hex":"#a2a580"},{"name":"Loden Frost","hex":"#788f74"},{"name":"Loden Green","hex":"#6e7153"},{"name":"Lodgepole Pines","hex":"#aca690"},{"name":"Log Cabin","hex":"#705a46"},{"name":"Logan","hex":"#9d9cb4"},{"name":"Loganberry","hex":"#5a4769"},{"name":"Lola","hex":"#b9acbb"},{"name":"Lolita","hex":"#bf2735"},{"name":"Lollipop","hex":"#cc1c3b"},{"name":"Lolly","hex":"#fd978f"},{"name":"Lolly Ice","hex":"#a6dad0"},{"name":"London Fog","hex":"#a29e92"},{"name":"London Grey","hex":"#666677"},{"name":"London Hue","hex":"#ae94ab"},{"name":"London Square","hex":"#7f909d"},{"name":"Lone Pine","hex":"#575a44"},{"name":"Lonely Road","hex":"#947754"},{"name":"Lonestar","hex":"#522426"},{"name":"Long Forgotten Purple","hex":"#a1759c"},{"name":"Long Island Sound","hex":"#95d0fc"},{"name":"Long Lake","hex":"#68757e"},{"name":"Long Spring","hex":"#c97586"},{"name":"Longbeard Grey","hex":"#ceceaf"},{"name":"Longboat","hex":"#60513a"},{"name":"Longlure Frogfish","hex":"#ebd84b"},{"name":"Loofah","hex":"#e3d3b5"},{"name":"Look At Me!","hex":"#a67e4b"},{"name":"Looking Glass","hex":"#888786"},{"name":"Loom of Fate","hex":"#454151"},{"name":"Loophole","hex":"#cbc0b3"},{"name":"Loose Leather","hex":"#84613d"},{"name":"Loquat Brown","hex":"#ae7c4f"},{"name":"Loren Forest","hex":"#50702d"},{"name":"Lorian","hex":"#8ebcbd"},{"name":"Lorna","hex":"#658477"},{"name":"Lost At Sea","hex":"#8d9ca7"},{"name":"Lost Lace","hex":"#c2ebd1"},{"name":"Lost Lake","hex":"#b5adb5"},{"name":"Lost Love","hex":"#e5d7d4"},{"name":"Lost Soul Grey","hex":"#929591"},{"name":"Lothern Blue","hex":"#6699cc"},{"name":"Lotion","hex":"#fefdfa"},{"name":"Lots of Bubbles","hex":"#e5ecb7"},{"name":"Lottery Winnings","hex":"#768371"},{"name":"Lotti Red","hex":"#e40046"},{"name":"Lotus","hex":"#8b504b"},{"name":"Lotus Flower","hex":"#f4f0da"},{"name":"Lotus Petal","hex":"#f2e9dc"},{"name":"Louisiana Mud","hex":"#655856"},{"name":"Loulou","hex":"#4c3347"},{"name":"Lounge Leather","hex":"#563e31"},{"name":"Love Affair","hex":"#ffbec8"},{"name":"Love Bird","hex":"#ba5b6a"},{"name":"Love In A Mist","hex":"#e1b9c2"},{"name":"Love Letter","hex":"#e4658e"},{"name":"Love Potion","hex":"#c01352"},{"name":"Love Red","hex":"#ff496c"},{"name":"Love Spell","hex":"#f8b4c4"},{"name":"Love-Struck Chinchilla","hex":"#aeaeb7"},{"name":"Lovecloud","hex":"#eebbee"},{"name":"Loveliest Leaves","hex":"#a69a5c"},{"name":"Lovely Euphoric Delight","hex":"#ffeeff"},{"name":"Lovely Lilac","hex":"#a7b0cc"},{"name":"Lovely Linen","hex":"#dbceac"},{"name":"Lover's Hideaway","hex":"#d0c6b5"},{"name":"Lover's Knot","hex":"#f2dbdb"},{"name":"Lover's Leap","hex":"#957e68"},{"name":"Lover's Retreat","hex":"#f4ced8"},{"name":"Lover's Tryst","hex":"#b48ca3"},{"name":"Lower Lip","hex":"#f7468a"},{"name":"Lǜ Sè Green","hex":"#02c14d"},{"name":"Lucea","hex":"#7cafe1"},{"name":"Lucid Blue","hex":"#7e8d9f"},{"name":"Lucidity","hex":"#1e4469"},{"name":"Lucius Lilac","hex":"#baa2ce"},{"name":"Lucky","hex":"#ab9a1c"},{"name":"Lucky Clover","hex":"#008400"},{"name":"Lucky Dog","hex":"#d3c8ba"},{"name":"Lucky Duck","hex":"#f4ecd7"},{"name":"Lucky Orange","hex":"#ff7700"},{"name":"Lucky Penny","hex":"#bc6f37"},{"name":"Lucky Point","hex":"#292d4f"},{"name":"Lucky Shamrock","hex":"#487a7b"},{"name":"Luftwaffe Ca. Green","hex":"#4d5e42"},{"name":"Lugganath Orange","hex":"#f7a58b"},{"name":"Luigi Green","hex":"#4cbb17"},{"name":"Lumber","hex":"#ffe4cd"},{"name":"Lumberjack","hex":"#9d4542"},{"name":"Luminary","hex":"#fffeed"},{"name":"Luminary Green","hex":"#e3eaa5"},{"name":"Luminous Light","hex":"#bbaeb9"},{"name":"Luna Pier","hex":"#414d62"},{"name":"Lunar Dust","hex":"#ccccdd"},{"name":"Lunar Eclipse","hex":"#415053"},{"name":"Lunar Green","hex":"#4e5541"},{"name":"Lunar Landing","hex":"#d2cfc1"},{"name":"Lunar Light","hex":"#9b959c"},{"name":"Lunar Rock","hex":"#c5c5c5"},{"name":"Lunette","hex":"#d0c8c6"},{"name":"Lupin Grey","hex":"#d1e0e9"},{"name":"Lupine","hex":"#be9cc1"},{"name":"Luscious Lavender","hex":"#696987"},{"name":"Luscious Leek","hex":"#bbcc22"},{"name":"Luscious Lime","hex":"#91a673"},{"name":"Luscious Lobster","hex":"#c5847c"},{"name":"Lush Garden","hex":"#008811"},{"name":"Lush Green","hex":"#bbee00"},{"name":"Lush Greenery","hex":"#7ff23e"},{"name":"Lush Hosta","hex":"#6c765c"},{"name":"Lush Lilac","hex":"#9d7eb7"},{"name":"Lush Mauve","hex":"#a091b7"},{"name":"Lush Meadow","hex":"#006e51"},{"name":"Lust","hex":"#e62020"},{"name":"Luster Green","hex":"#bece61"},{"name":"Lustrian Undergrowth","hex":"#415a09"},{"name":"Lustrous Yellow","hex":"#e6da78"},{"name":"Lusty Lavender","hex":"#8d828c"},{"name":"Lusty Lips","hex":"#d5174e"},{"name":"Lusty-Gallant","hex":"#ffcccc"},{"name":"Luxor Gold","hex":"#ab8d3f"},{"name":"Luxury","hex":"#818eb1"},{"name":"Lyceum (Was Lycra Strip)","hex":"#adcf43"},{"name":"Lychee","hex":"#ba0b32"},{"name":"Lychee Pulp","hex":"#f7f2da"},{"name":"Lye","hex":"#9e9478"},{"name":"Lye Tinted","hex":"#7f6b5d"},{"name":"Lynch","hex":"#697d89"},{"name":"Lynx","hex":"#604d47"},{"name":"Lynx Screen Blue","hex":"#2cb1eb"},{"name":"Lynx White","hex":"#f7f7f7"},{"name":"Lyons Blue","hex":"#005871"},{"name":"Lyrebird","hex":"#0087ad"},{"name":"Lythrum","hex":"#72696f"},{"name":"M. Bison Red","hex":"#b4023d"},{"name":"Maastricht Blue","hex":"#001c3d"},{"name":"Mabel","hex":"#cbe8e8"},{"name":"Macadamia","hex":"#e4cfb6"},{"name":"Macadamia Nut","hex":"#eee3dd"},{"name":"Macaroni and Cheese","hex":"#ffb97b"},{"name":"Macaroon","hex":"#b38b71"},{"name":"Macaroon Cream","hex":"#fee8d6"},{"name":"Macau","hex":"#46c299"},{"name":"Macaw Green","hex":"#9bb53e"},{"name":"Macharius Solar Orange","hex":"#dd4400"},{"name":"Machine Green","hex":"#a6a23f"},{"name":"Machine Gun Metal","hex":"#454545"},{"name":"Machine Oil","hex":"#f1e782"},{"name":"Machined Iron","hex":"#cbcdcd"},{"name":"Machu Picchu Gardens","hex":"#99bb33"},{"name":"Mack Creek","hex":"#bfae5b"},{"name":"MacKintosh Midnight","hex":"#41434e"},{"name":"Macquarie","hex":"#007d82"},{"name":"Macragge Blue","hex":"#004577"},{"name":"Maculata Bark","hex":"#ada5a3"},{"name":"Mad For Mango","hex":"#f8a200"},{"name":"Madagascar Pink","hex":"#d194a1"},{"name":"Madam Butterfly","hex":"#7ca7cb"},{"name":"Madame Mauve","hex":"#b5adb4"},{"name":"Madang","hex":"#b7e3a8"},{"name":"Madder Blue","hex":"#b5b6ce"},{"name":"Madder Brown","hex":"#6a3331"},{"name":"Madder Lake","hex":"#cc3336"},{"name":"Madder Red","hex":"#b7282e"},{"name":"Made of Steel","hex":"#5b686f"},{"name":"Mademoiselle Pink","hex":"#f504c9"},{"name":"Madera","hex":"#eed09d"},{"name":"Madison","hex":"#2d3c54"},{"name":"Madonna","hex":"#3f4250"},{"name":"Madonna Lily","hex":"#eee6db"},{"name":"Madras","hex":"#473e23"},{"name":"Madrid Beige","hex":"#ecbf9f"},{"name":"Magenta","hex":"#ff00ff"},{"name":"Magenta Affair","hex":"#aa44dd"},{"name":"Magenta Crayon","hex":"#ff55a3"},{"name":"Magenta Dye","hex":"#ca1f7b"},{"name":"Magenta Elephant","hex":"#de0170"},{"name":"Magenta Haze","hex":"#9d446e"},{"name":"Magenta Ink","hex":"#513d3c"},{"name":"Magenta Pink","hex":"#cc338b"},{"name":"Magenta Purple","hex":"#6b264b"},{"name":"Magenta Stream","hex":"#fa5ff7"},{"name":"Magenta Twilight","hex":"#bb989f"},{"name":"Maggie's Magic","hex":"#ddeee2"},{"name":"Magic","hex":"#656b78"},{"name":"Magic Blue","hex":"#3e8baa"},{"name":"Magic Carpet","hex":"#9488be"},{"name":"Magic Dust","hex":"#817c85"},{"name":"Magic Fountain","hex":"#1f75ff"},{"name":"Magic Gem","hex":"#8e7282"},{"name":"Magic Ink","hex":"#0247fe"},{"name":"Magic Lamp","hex":"#c2a260"},{"name":"Magic Magenta","hex":"#7f4774"},{"name":"Magic Malt","hex":"#a5887e"},{"name":"Magic Melon","hex":"#de9851"},{"name":"Magic Metal","hex":"#3f3925"},{"name":"Magic Mint","hex":"#aaf0d1"},{"name":"Magic Moments","hex":"#e9dbe0"},{"name":"Magic Mountain","hex":"#717462"},{"name":"Magic Night","hex":"#3a3b5b"},{"name":"Magic Potion","hex":"#ff4466"},{"name":"Magic Sage","hex":"#598556"},{"name":"Magic Sail","hex":"#e0d2ba"},{"name":"Magic Spell","hex":"#544f66"},{"name":"Magic Wand","hex":"#c3d9e4"},{"name":"Magical","hex":"#c1ceda"},{"name":"Magical Mauve","hex":"#baa3a9"},{"name":"Magical Melon","hex":"#e9e9d0"},{"name":"Magical Merlin","hex":"#3d8ed0"},{"name":"Magical Moonlight","hex":"#f0eeeb"},{"name":"Magical Stardust","hex":"#eaeadb"},{"name":"Magma","hex":"#ff4e01"},{"name":"Magnesia Bay","hex":"#64bfdc"},{"name":"Magnesium","hex":"#c1c2c3"},{"name":"Magnet","hex":"#4d4b4f"},{"name":"Magnetic Blue","hex":"#054c8a"},{"name":"Magnetic Green","hex":"#2b6867"},{"name":"Magnetic Grey","hex":"#eef0f3"},{"name":"Magnetic Magic","hex":"#3fbbb2"},{"name":"Magnetos","hex":"#bf3cff"},{"name":"Magnificence","hex":"#7f556f"},{"name":"Magnitude","hex":"#ae8d7b"},{"name":"Magnolia","hex":"#fff9e4"},{"name":"Magnolia Blossom","hex":"#f4e7ce"},{"name":"Magnolia Spray","hex":"#f6e6cb"},{"name":"Magos","hex":"#69475a"},{"name":"Maharaja","hex":"#3f354f"},{"name":"Mahogany","hex":"#c04000"},{"name":"Mahogany Brown","hex":"#812308"},{"name":"Mahogany Cherry","hex":"#82495a"},{"name":"Mahogany Rose","hex":"#c5a193"},{"name":"Mai Tai","hex":"#a56531"},{"name":"Maiden Hair","hex":"#f5e9ca"},{"name":"Maiden Mist","hex":"#b9c0c0"},{"name":"Maiden Pink","hex":"#ff2feb"},{"name":"Maiden's Blush","hex":"#f3d3bf"},{"name":"Maidenhair Fern","hex":"#44764a"},{"name":"Maiko","hex":"#d8baa6"},{"name":"Main Mast Gold","hex":"#b79400"},{"name":"Maine-Anjou Cattle","hex":"#a95249"},{"name":"Maire","hex":"#2a2922"},{"name":"Maison De Campagne","hex":"#bb9b7d"},{"name":"Maize","hex":"#f4d054"},{"name":"Maizena","hex":"#fbec5e"},{"name":"Majestic","hex":"#5d4250"},{"name":"Majestic Magic","hex":"#555570"},{"name":"Majesty","hex":"#593761"},{"name":"Majin Bū Pink","hex":"#ffaacc"},{"name":"Majolica Blue","hex":"#274357"},{"name":"Majolica Earthenware","hex":"#976352"},{"name":"Major Brown","hex":"#5b5149"},{"name":"Majorca Blue","hex":"#4a9c95"},{"name":"Majorelle Blue","hex":"#6050dc"},{"name":"Makara","hex":"#695f50"},{"name":"Mako","hex":"#505555"},{"name":"Malachite","hex":"#0bda51"},{"name":"Malachite Green","hex":"#004e00"},{"name":"Malaga","hex":"#9f5069"},{"name":"Male","hex":"#d6cec3"},{"name":"Male Betta","hex":"#347699"},{"name":"Malibu","hex":"#66b7e1"},{"name":"Malibu Beige","hex":"#c9c0b1"},{"name":"Malibu Blue","hex":"#008cc1"},{"name":"Malibu Dune","hex":"#e7ceb5"},{"name":"Malibu Sun","hex":"#fff2d9"},{"name":"Mallard","hex":"#254855"},{"name":"Mallard Blue","hex":"#3a5c6e"},{"name":"Mallard Green","hex":"#478865"},{"name":"Mallard Lake","hex":"#91b9c2"},{"name":"Mallardish","hex":"#3a4531"},{"name":"Malmö FF","hex":"#a7d7ff"},{"name":"Malt","hex":"#ddcfbc"},{"name":"Malt Shake","hex":"#bba87f"},{"name":"Malta","hex":"#a59784"},{"name":"Malted Milk","hex":"#e8d9ce"},{"name":"Malted Mint","hex":"#bfd6c8"},{"name":"Mama Racoon","hex":"#594f40"},{"name":"Mamala Bay","hex":"#005e8c"},{"name":"Mamba","hex":"#766d7c"},{"name":"Mamba Green","hex":"#77ad3b"},{"name":"Mamie Pink","hex":"#ee82ee"},{"name":"Mammoth Wool","hex":"#995522"},{"name":"Man Cave","hex":"#816045"},{"name":"Man Friday","hex":"#3c4c5d"},{"name":"Mana","hex":"#b09737"},{"name":"Mana Tree Green","hex":"#4f7942"},{"name":"Manakin","hex":"#94bbda"},{"name":"Manatee","hex":"#8d90a1"},{"name":"Mandalay","hex":"#b57b2e"},{"name":"Mandarin","hex":"#f37a48"},{"name":"Mandarin Jelly","hex":"#ffad01"},{"name":"Mandarin Orange","hex":"#ec6a37"},{"name":"Mandarin Peel","hex":"#ff9f00"},{"name":"Mandarin Red","hex":"#e74a33"},{"name":"Mandarin Sorbet","hex":"#ffae42"},{"name":"Mandrake","hex":"#8889a0"},{"name":"Mandy","hex":"#cd525b"},{"name":"Mandys Pink","hex":"#f5b799"},{"name":"Mangala Pink","hex":"#e781a6"},{"name":"Manganese Red","hex":"#e52b50"},{"name":"Mango","hex":"#ffa62b"},{"name":"Mango Cheesecake","hex":"#fbedda"},{"name":"Mango Green","hex":"#96ff00"},{"name":"Mango Margarita","hex":"#f7b74e"},{"name":"Mango Mojito","hex":"#d69c2f"},{"name":"Mango Salsa","hex":"#ffb066"},{"name":"Mango Squash","hex":"#8e6c39"},{"name":"Mango Tango","hex":"#ff8243"},{"name":"Mangosteen","hex":"#383e5d"},{"name":"Mangrove","hex":"#757461"},{"name":"Mangrove Leaf","hex":"#607c3d"},{"name":"Mangy Moose","hex":"#b2896c"},{"name":"Manhattan","hex":"#e2af80"},{"name":"Mani","hex":"#97908e"},{"name":"Maniac Green","hex":"#009000"},{"name":"Maniac Mansion","hex":"#004058"},{"name":"Manifest","hex":"#899888"},{"name":"Manila","hex":"#e7c9a9"},{"name":"Mannequin","hex":"#eedfdd"},{"name":"Mantella Frog","hex":"#ffbb00"},{"name":"Manticore Brown","hex":"#957840"},{"name":"Mantis","hex":"#74c365"},{"name":"Mantle","hex":"#96a793"},{"name":"Manure","hex":"#ad900d"},{"name":"Manz","hex":"#e4db55"},{"name":"Maple Brown Sugar","hex":"#a38e6f"},{"name":"Maple Elixir","hex":"#f6d193"},{"name":"Maple Sugar","hex":"#c9a38d"},{"name":"Maple Syrup","hex":"#bb9351"},{"name":"Maple View","hex":"#b49161"},{"name":"Maraschino","hex":"#ff2600"},{"name":"Marble Dust","hex":"#f3e5cb"},{"name":"Marble Garden","hex":"#646255"},{"name":"Marble Green","hex":"#8f9f97"},{"name":"Marble White","hex":"#f2f0e6"},{"name":"March Hare Orange","hex":"#ff750f"},{"name":"March Pink","hex":"#9a7276"},{"name":"Mardi Gras","hex":"#880085"},{"name":"Margarine","hex":"#f2d930"},{"name":"Margarita","hex":"#b5c38e"},{"name":"Mariana Trench","hex":"#445956"},{"name":"Marigold","hex":"#fcc006"},{"name":"Marigold Yellow","hex":"#fbe870"},{"name":"Marilyn Monroe","hex":"#e7c3ac"},{"name":"Marina","hex":"#4f84c4"},{"name":"Marine","hex":"#042e60"},{"name":"Marine Blue","hex":"#01386a"},{"name":"Marine Green","hex":"#40a48e"},{"name":"Marine Ink","hex":"#6384b8"},{"name":"Marine Layer","hex":"#a5b4b6"},{"name":"Marine Teal","hex":"#008384"},{"name":"Marine Tinge","hex":"#33a3b3"},{"name":"Marine Wonder","hex":"#1f7073"},{"name":"Mariner","hex":"#42639f"},{"name":"Mario Red","hex":"#e4000f"},{"name":"Marionberry","hex":"#380282"},{"name":"Maritime","hex":"#bdcfea"},{"name":"Maritime Blue","hex":"#27293d"},{"name":"Market Melon","hex":"#fbb377"},{"name":"Marlin","hex":"#515b87"},{"name":"Marlin Green","hex":"#41a1aa"},{"name":"Marmalade","hex":"#c16512"},{"name":"Marmot","hex":"#928475"},{"name":"Maroon","hex":"#800000"},{"name":"Maroon Flush","hex":"#c32249"},{"name":"Maroon Light","hex":"#bf3160"},{"name":"Maroon Oak","hex":"#520c17"},{"name":"Marooned","hex":"#86cdab"},{"name":"Marrakesh Red","hex":"#783b3c"},{"name":"Marron","hex":"#6e4c4b"},{"name":"Marrs Green","hex":"#008c8c"},{"name":"Mars Brown","hex":"#ad6242"},{"name":"Mars Red","hex":"#bc2731"},{"name":"Marsala","hex":"#964f4c"},{"name":"Marsh","hex":"#5c5337"},{"name":"Marsh Field","hex":"#d4c477"},{"name":"Marsh Fog","hex":"#c6d8c7"},{"name":"Marsh Mix","hex":"#5a653a"},{"name":"Marsh Orchid","hex":"#c4a3bf"},{"name":"Marshal Blue","hex":"#3e4355"},{"name":"Marshland","hex":"#2b2e26"},{"name":"Marshmallow","hex":"#f0eee4"},{"name":"Marshmallow Cream","hex":"#f3e0d6"},{"name":"Marshmallow Magic","hex":"#efd2d0"},{"name":"Marshmallow Rose","hex":"#f7e5e6"},{"name":"Martian","hex":"#aea132"},{"name":"Martian Green","hex":"#136c51"},{"name":"Martian Haze","hex":"#adeace"},{"name":"Martian Ironcrust","hex":"#b7410e"},{"name":"Martian Ironearth","hex":"#c15a4b"},{"name":"Martian Moon","hex":"#c3e9d3"},{"name":"Martini","hex":"#b7a8a3"},{"name":"Martini Olive","hex":"#cdc796"},{"name":"Martinique","hex":"#3c3748"},{"name":"Marvellous","hex":"#6a7fb4"},{"name":"Mary Poppins","hex":"#d1b5ca"},{"name":"Mary Rose","hex":"#d7b1b0"},{"name":"Mary's Garden","hex":"#69913d"},{"name":"Mary's Rose","hex":"#f7d1d4"},{"name":"Marzipan","hex":"#ebc881"},{"name":"Masala","hex":"#57534b"},{"name":"Mask","hex":"#ab878d"},{"name":"Masked Mauve","hex":"#c6b2be"},{"name":"Masoho Red","hex":"#d57c6b"},{"name":"Master","hex":"#3a4b61"},{"name":"Master Chief Green","hex":"#507d2a"},{"name":"Master Round Yellow","hex":"#e78303"},{"name":"Master Sword Blue","hex":"#00ffee"},{"name":"Masuhana Blue","hex":"#4d646c"},{"name":"Mat Dazzle Rose","hex":"#ff48d0"},{"name":"Matcha Picchu","hex":"#99bb00"},{"name":"Matcha Powder","hex":"#a0d404"},{"name":"Mate Tea","hex":"#7bb18d"},{"name":"Matisse","hex":"#365c7d"},{"name":"Matriarch","hex":"#7e6884"},{"name":"Matrix","hex":"#8e4d45"},{"name":"Matsuba Green","hex":"#454d32"},{"name":"Matt Black","hex":"#151515"},{"name":"Matt Blue","hex":"#2c6fbb"},{"name":"Matt Green","hex":"#39ad48"},{"name":"Matt Lilac","hex":"#dec6d3"},{"name":"Matt Pink","hex":"#ffb6c1"},{"name":"Matt Purple","hex":"#9370db"},{"name":"Matt Sage","hex":"#b2b9a5"},{"name":"Matt White","hex":"#ffffd4"},{"name":"Matterhorn","hex":"#524b4b"},{"name":"Mature","hex":"#c4afb3"},{"name":"Mature Cognac","hex":"#9a463d"},{"name":"Maud","hex":"#988286"},{"name":"Maui","hex":"#21a5be"},{"name":"Maui Blue","hex":"#52a2b4"},{"name":"Maui Mai Tai","hex":"#b66044"},{"name":"Mauve","hex":"#e0b0ff"},{"name":"Mauve Chalk","hex":"#e5d0cf"},{"name":"Mauve Day","hex":"#ac8c8c"},{"name":"Mauve Glow","hex":"#d18489"},{"name":"Mauve It","hex":"#bb4466"},{"name":"Mauve Jazz","hex":"#908186"},{"name":"Mauve Madness","hex":"#aa7982"},{"name":"Mauve Magic","hex":"#bf91b2"},{"name":"Mauve Mist","hex":"#c49bd4"},{"name":"Mauve Mole","hex":"#7d716e"},{"name":"Mauve Morn","hex":"#ecd6d6"},{"name":"Mauve Musk","hex":"#a98ca1"},{"name":"Mauve Muslin","hex":"#b59ead"},{"name":"Mauve Mystery","hex":"#685c61"},{"name":"Mauve Mystique","hex":"#bb4477"},{"name":"Mauve Nymph","hex":"#c0ada6"},{"name":"Mauve Orchid","hex":"#b58299"},{"name":"Mauve Organdie","hex":"#d9c4d0"},{"name":"Mauve Pansy","hex":"#bebbc0"},{"name":"Mauve Seductress","hex":"#bb7788"},{"name":"Mauve Shadows","hex":"#b598a3"},{"name":"Mauve Stone","hex":"#c4bab6"},{"name":"Mauve Taupe","hex":"#915f6d"},{"name":"Mauve Wine","hex":"#5b3644"},{"name":"Mauve Wisp","hex":"#eadde1"},{"name":"Mauve-a-Lish","hex":"#90686c"},{"name":"Mauvelous","hex":"#d6b3c0"},{"name":"Mauverine","hex":"#9d8888"},{"name":"Mauvewood","hex":"#a75d67"},{"name":"Mauvey Nude","hex":"#bb8899"},{"name":"Mauvey Pink","hex":"#8c8188"},{"name":"Maverick","hex":"#c8b1c0"},{"name":"Mawmaw's Pearls","hex":"#efe9dd"},{"name":"Maximum Blue","hex":"#47abcc"},{"name":"Maximum Blue Green","hex":"#30bfbf"},{"name":"Maximum Blue Purple","hex":"#acace6"},{"name":"Maximum Green","hex":"#5e8c31"},{"name":"Maximum Green Yellow","hex":"#d9e650"},{"name":"Maximum Orange","hex":"#ff5b00"},{"name":"Maximum Purple","hex":"#733380"},{"name":"Maximum Red","hex":"#d92121"},{"name":"Maximum Red Purple","hex":"#a63a79"},{"name":"Maximum Yellow","hex":"#fafa37"},{"name":"Maximum Yellow Red","hex":"#f2ba49"},{"name":"May Apple","hex":"#92d599"},{"name":"May Green","hex":"#4c9141"},{"name":"Maya Blue","hex":"#73c2fb"},{"name":"Maya Green","hex":"#98d2d9"},{"name":"Mayan Chocolate","hex":"#655046"},{"name":"Mayan Gold","hex":"#b68c37"},{"name":"Mayan Treasure","hex":"#ce9844"},{"name":"Maybe Maui","hex":"#f6d48d"},{"name":"Maybe Mushroom","hex":"#e2d8cb"},{"name":"Maybeck Muslin","hex":"#eddfc9"},{"name":"Mayfly","hex":"#65663f"},{"name":"Maypole","hex":"#bee8d3"},{"name":"Mazarine Blue","hex":"#273c76"},{"name":"Maze","hex":"#5c5638"},{"name":"Mazzone","hex":"#b0907c"},{"name":"Mazzy Star","hex":"#bf5bb0"},{"name":"McKenzie","hex":"#8c6338"},{"name":"Mead","hex":"#ffc878"},{"name":"Meadow","hex":"#8bba94"},{"name":"Meadow Green","hex":"#739957"},{"name":"Meadow Lane","hex":"#c0d7cd"},{"name":"Meadow Mauve","hex":"#a9568c"},{"name":"Meadow Mist","hex":"#d3dec4"},{"name":"Meadow Violet","hex":"#764f82"},{"name":"Meadowbrook","hex":"#60a0a3"},{"name":"Meadowlark","hex":"#ead94e"},{"name":"Meadowood","hex":"#9da28e"},{"name":"Meadowsweet Mist","hex":"#d4e3e2"},{"name":"Meander","hex":"#8f8c79"},{"name":"Meat Brown","hex":"#e5b73b"},{"name":"Meatloaf","hex":"#663311"},{"name":"Mecca Gold","hex":"#c89134"},{"name":"Mecca Orange","hex":"#bd5745"},{"name":"Mecca Red","hex":"#663f3f"},{"name":"Mecha Grey","hex":"#8d847f"},{"name":"Mechanicus Standard Grey","hex":"#3d4b4d"},{"name":"Mechrite Red","hex":"#a31713"},{"name":"Medal Bronze","hex":"#977547"},{"name":"Medallion","hex":"#c3a679"},{"name":"Medicine Man","hex":"#69556d"},{"name":"Medicine Wheel","hex":"#99a28c"},{"name":"Medieval Blue","hex":"#29304e"},{"name":"Medieval Cobblestone","hex":"#878573"},{"name":"Medieval Forest","hex":"#007e6b"},{"name":"Medieval Wine","hex":"#8c7d88"},{"name":"Mediterranea","hex":"#32575d"},{"name":"Mediterranean Blue","hex":"#0090a8"},{"name":"Mediterranean Cove","hex":"#007b84"},{"name":"Mediterranean Sea","hex":"#1e8cab"},{"name":"Mediterranean Swirl","hex":"#2999a2"},{"name":"Medium Aquamarine","hex":"#66ddaa"},{"name":"Medium Blue","hex":"#0000cd"},{"name":"Medium Brown","hex":"#7f5112"},{"name":"Medium Candy Apple Red","hex":"#e2062c"},{"name":"Medium Carmine","hex":"#af4035"},{"name":"Medium Champagne","hex":"#f3e5ac"},{"name":"Medium Electric Blue","hex":"#035096"},{"name":"Medium Goldenrod","hex":"#eaeaae"},{"name":"Medium Green","hex":"#3c824e"},{"name":"Medium Grey","hex":"#7d7f7c"},{"name":"Medium Grey Green","hex":"#4d6b53"},{"name":"Medium Gunship Grey","hex":"#3f4952"},{"name":"Medium Jungle Green","hex":"#1c352d"},{"name":"Medium Lavender Magenta","hex":"#dda0fd"},{"name":"Medium Orchid","hex":"#ba55d3"},{"name":"Medium Persian Blue","hex":"#0067a5"},{"name":"Medium Pink","hex":"#f36196"},{"name":"Medium Purple","hex":"#9e43a2"},{"name":"Medium Red Violet","hex":"#bb3385"},{"name":"Medium Ruby","hex":"#aa4069"},{"name":"Medium Scarlet","hex":"#fc2847"},{"name":"Medium Sea Green","hex":"#3cb371"},{"name":"Medium Sky Blue","hex":"#80daeb"},{"name":"Medium Slate Blue","hex":"#7b68ee"},{"name":"Medium Spring Bud","hex":"#c9dc87"},{"name":"Medium Spring Green","hex":"#00fa9a"},{"name":"Medium Taupe","hex":"#674c47"},{"name":"Medium Turquoise","hex":"#48d1cc"},{"name":"Medium Tuscan Red","hex":"#794431"},{"name":"Medium Vermilion","hex":"#d9603b"},{"name":"Medium Violet Red","hex":"#c71585"},{"name":"Medium Wood","hex":"#a68064"},{"name":"Medlar","hex":"#d5d7bf"},{"name":"Mee-hua Sunset","hex":"#ee7700"},{"name":"Meek Moss Green","hex":"#869f98"},{"name":"Meerkat","hex":"#a46f44"},{"name":"Megadrive Screen","hex":"#4a40ad"},{"name":"Megaman","hex":"#3cbcfc"},{"name":"Megaman Helmet","hex":"#0058f8"},{"name":"Méi Gūi Hóng Red","hex":"#fe023c"},{"name":"Méi Gūi Zǐ Purple","hex":"#e03fd8"},{"name":"Méi Hēi Coal","hex":"#123120"},{"name":"Melancholia","hex":"#12390d"},{"name":"Melancholic Sea","hex":"#53778f"},{"name":"Melancholy","hex":"#dd8899"},{"name":"Melanie","hex":"#e0b7c2"},{"name":"Melanzane","hex":"#342931"},{"name":"Melbourne Cup","hex":"#45c3ad"},{"name":"Melissa","hex":"#b5d96b"},{"name":"Mellow Apricot","hex":"#f8b878"},{"name":"Mellow Buff","hex":"#d8b998"},{"name":"Mellow Flower","hex":"#f1dfe9"},{"name":"Mellow Green","hex":"#d5d593"},{"name":"Mellow Mango","hex":"#cc4400"},{"name":"Mellow Mauve","hex":"#996378"},{"name":"Mellow Melon","hex":"#ee2266"},{"name":"Mellow Mint","hex":"#ddedbd"},{"name":"Mellow Mood","hex":"#b1b7a1"},{"name":"Mellow Rose","hex":"#d9a6a1"},{"name":"Mellow Yellow","hex":"#f8de7f"},{"name":"Melmac Silver","hex":"#b6b2a1"},{"name":"Melodious","hex":"#7bb5ae"},{"name":"Melon","hex":"#ff7855"},{"name":"Melon Baby","hex":"#f47869"},{"name":"Melon Balls","hex":"#f2bd85"},{"name":"Melon Green","hex":"#74ac8d"},{"name":"Melon Ice","hex":"#f4d9c8"},{"name":"Melon Melody","hex":"#f9c291"},{"name":"Melon Pink","hex":"#f1d4c4"},{"name":"Melon Seed","hex":"#332c22"},{"name":"Melon Sprinkle","hex":"#ffcd9d"},{"name":"Melon Twist","hex":"#aa6864"},{"name":"Melon Water","hex":"#fdbcb4"},{"name":"Melrose","hex":"#c3b9dd"},{"name":"Melt Ice","hex":"#b4cbe3"},{"name":"Melt with You","hex":"#e3cfab"},{"name":"Melted Butter","hex":"#ffcf53"},{"name":"Melted Copper","hex":"#ce8544"},{"name":"Melted Wax","hex":"#f6e6c5"},{"name":"Melting Glacier","hex":"#e9f9f5"},{"name":"Melting Ice","hex":"#cae1d9"},{"name":"Melting Moment","hex":"#bba2b6"},{"name":"Melting Violet","hex":"#d4b8bf"},{"name":"Meltwater","hex":"#79c0cc"},{"name":"Memoir","hex":"#ecf0da"},{"name":"Memorize","hex":"#9197a4"},{"name":"Memory Lane","hex":"#c7d1db"},{"name":"Men Brown","hex":"#5e5239"},{"name":"Mendocino Hills","hex":"#837a64"},{"name":"Menoth White Base","hex":"#f3e8b8"},{"name":"Menoth White Highlight","hex":"#f0f1ce"},{"name":"Mental Floss","hex":"#deb4c5"},{"name":"Mental Note","hex":"#eaeede"},{"name":"Menthol","hex":"#c1f9a2"},{"name":"Mephiston Red","hex":"#9a1115"},{"name":"Meranda's Spike","hex":"#614251"},{"name":"Mercer Charcoal","hex":"#aca495"},{"name":"Merchant Marine Blue","hex":"#0343df"},{"name":"Mercurial","hex":"#b6b0a9"},{"name":"Mercury","hex":"#ebebeb"},{"name":"Mercury Mist","hex":"#89c8c3"},{"name":"Merguez","hex":"#650021"},{"name":"Meridian Star","hex":"#7bc8b2"},{"name":"Merin's Fire","hex":"#ff9408"},{"name":"Meringue","hex":"#f3e4b3"},{"name":"Meringue Tips","hex":"#c2a080"},{"name":"Merino","hex":"#e1dbd0"},{"name":"Meristem","hex":"#aae1ce"},{"name":"Merlin","hex":"#4f4e48"},{"name":"Merlin's Choice","hex":"#9f8898"},{"name":"Merlin's Cloak","hex":"#89556e"},{"name":"Merlot","hex":"#730039"},{"name":"Mermaid","hex":"#817a65"},{"name":"Mermaid Tears","hex":"#d9e6a6"},{"name":"Mermaid's Cove","hex":"#8aa786"},{"name":"Mermaid's Kiss","hex":"#59c8a5"},{"name":"Mermaid's Tail","hex":"#337b35"},{"name":"Merry Music","hex":"#ced3c1"},{"name":"Merrylyn","hex":"#a5d0af"},{"name":"Mesa Beige","hex":"#f2ebd6"},{"name":"Mesa Pink","hex":"#ddb1a8"},{"name":"Mesa Red","hex":"#92555b"},{"name":"Mesa Rose","hex":"#eeb5af"},{"name":"Mesa Tan","hex":"#a78b71"},{"name":"Meški Black","hex":"#1f0b1e"},{"name":"Mesmerize","hex":"#8e9074"},{"name":"Messinesi","hex":"#fee2be"},{"name":"Metal","hex":"#babfbc"},{"name":"Metal Chi","hex":"#9c9c9b"},{"name":"Metal Deluxe","hex":"#244343"},{"name":"Metal Flake","hex":"#838782"},{"name":"Metal Fringe","hex":"#837e74"},{"name":"Metal Gear","hex":"#a2c3db"},{"name":"Metal Spark","hex":"#eeff99"},{"name":"Metalise","hex":"#34373c"},{"name":"Metallic Blue","hex":"#4f738e"},{"name":"Metallic Bronze","hex":"#554a3c"},{"name":"Metallic Copper","hex":"#6e3d34"},{"name":"Metallic Gold","hex":"#d4af37"},{"name":"Metallic Mist","hex":"#cdccbe"},{"name":"Metallic Seaweed","hex":"#0a7e8c"},{"name":"Metallic Sunburst","hex":"#9c7c38"},{"name":"Meteor","hex":"#bb7431"},{"name":"Meteor Shower","hex":"#5533ff"},{"name":"Meteorite","hex":"#4a3b6a"},{"name":"Methyl Blue","hex":"#0074a8"},{"name":"Metroid Red","hex":"#f83800"},{"name":"Metropolis","hex":"#61584f"},{"name":"Mette Penne","hex":"#f9e1d4"},{"name":"Mexican Chile","hex":"#d16d76"},{"name":"Mexican Chocolate","hex":"#6f5a48"},{"name":"Mexican Milk","hex":"#ffb9b2"},{"name":"Mexican Moonlight","hex":"#c99387"},{"name":"Mexican Mudkip","hex":"#fcd8dc"},{"name":"Mexican Pink","hex":"#e4007c"},{"name":"Mexican Red","hex":"#9b3d3d"},{"name":"Mexican Red Papaya","hex":"#c6452f"},{"name":"Mexican Sand Dollar","hex":"#dad4c5"},{"name":"Mexican Standoff","hex":"#ec9f76"},{"name":"Mǐ Bái Beige","hex":"#dad7ad"},{"name":"Mì Chéng Honey","hex":"#e8af45"},{"name":"Miami Jade","hex":"#17917f"},{"name":"Miami Spice","hex":"#907a6e"},{"name":"Mica Creek","hex":"#70828f"},{"name":"Microchip","hex":"#babcc0"},{"name":"MicroProse Red","hex":"#ee172b"},{"name":"Microwave Blue","hex":"#2d5254"},{"name":"Mid Blue","hex":"#276ab3"},{"name":"Mid Cypress","hex":"#779781"},{"name":"Mid Green","hex":"#50a747"},{"name":"Mid Grey","hex":"#5f5f6e"},{"name":"Mid Spring Morning","hex":"#cff7ef"},{"name":"Mid Tan","hex":"#c4915e"},{"name":"Mid-century Gem","hex":"#81b39c"},{"name":"Midas Finger Gold","hex":"#f6b404"},{"name":"Midas Touch","hex":"#e8bd45"},{"name":"Midday Sun","hex":"#ffe1a3"},{"name":"Middle Blue","hex":"#7ed4e6"},{"name":"Middle Blue Green","hex":"#8dd9cc"},{"name":"Middle Blue Purple","hex":"#8b72be"},{"name":"Middle Ditch","hex":"#7c6942"},{"name":"Middle Green","hex":"#4d8c57"},{"name":"Middle Green Yellow","hex":"#acbf60"},{"name":"Middle Purple","hex":"#d982b5"},{"name":"Middle Red","hex":"#e58e73"},{"name":"Middle Red Purple","hex":"#210837"},{"name":"Middle Safflower","hex":"#c85179"},{"name":"Middle Yellow","hex":"#ffeb00"},{"name":"Middle Yellow Red","hex":"#ecb176"},{"name":"Middlestone","hex":"#c7ab84"},{"name":"Midnight","hex":"#03012d"},{"name":"Midnight Badger","hex":"#585960"},{"name":"Midnight Blue","hex":"#020035"},{"name":"Midnight Blush","hex":"#979fbf"},{"name":"Midnight Brown","hex":"#706048"},{"name":"Midnight Clover","hex":"#3c574e"},{"name":"Midnight Dreams","hex":"#002233"},{"name":"Midnight Escape","hex":"#403c40"},{"name":"Midnight Express","hex":"#21263a"},{"name":"Midnight Garden","hex":"#637057"},{"name":"Midnight Green","hex":"#004953"},{"name":"Midnight Grey","hex":"#666a6d"},{"name":"Midnight Haze","hex":"#3e505f"},{"name":"Midnight Hour","hex":"#3b484f"},{"name":"Midnight Merlot","hex":"#880044"},{"name":"Midnight Moss","hex":"#242e28"},{"name":"Midnight Navy","hex":"#34414e"},{"name":"Midnight Pearl","hex":"#5f6c74"},{"name":"Midnight Purple","hex":"#280137"},{"name":"Midnight Sea","hex":"#565b8d"},{"name":"Midnight Sky","hex":"#424753"},{"name":"Midnight Spruce","hex":"#555b53"},{"name":"Midnight Sun","hex":"#4e5a6d"},{"name":"Midnight Violet","hex":"#6a75ad"},{"name":"Midori","hex":"#2a603b"},{"name":"Midori Green","hex":"#3eb370"},{"name":"Midsummer's Dream","hex":"#b4d0d9"},{"name":"Midwinter Fire","hex":"#dd1100"},{"name":"Mighty Mauve","hex":"#8f7f85"},{"name":"Migol Blue","hex":"#283482"},{"name":"Mikado","hex":"#3f3623"},{"name":"Mikado Yellow","hex":"#ffc40c"},{"name":"Mikan Orange","hex":"#f08300"},{"name":"Mike Wazowski Green","hex":"#11ee55"},{"name":"Milan","hex":"#f6f493"},{"name":"Milano Red","hex":"#9e3332"},{"name":"Mild Blue Yonder","hex":"#a2add0"},{"name":"Mild Mint","hex":"#dce6e3"},{"name":"Mildura","hex":"#667960"},{"name":"Miles","hex":"#829ba0"},{"name":"Militant Vegan","hex":"#229955"},{"name":"Military Green","hex":"#667c3e"},{"name":"Military Olive","hex":"#63563b"},{"name":"Milk","hex":"#fdfff5"},{"name":"Milk and Cookies","hex":"#e9e1df"},{"name":"Milk Brownie Dough","hex":"#8f7265"},{"name":"Milk Chocolate","hex":"#7f4e1e"},{"name":"Milk Froth","hex":"#ffeecc"},{"name":"Milk Glass","hex":"#faf7f0"},{"name":"Milk Mustache","hex":"#faf3e6"},{"name":"Milk Paint","hex":"#efe9d9"},{"name":"Milk Punch","hex":"#f3e5c0"},{"name":"Milk Quartz","hex":"#f5deae"},{"name":"Milk Tooth","hex":"#faebd7"},{"name":"Milk White","hex":"#dcd9cd"},{"name":"Milkweed","hex":"#e3e8d9"},{"name":"Milky Aquamarine","hex":"#038487"},{"name":"Milky Blue","hex":"#72a8ba"},{"name":"Milky Green","hex":"#cfdbd1"},{"name":"Milky Maize","hex":"#f9d9a0"},{"name":"Milky Way","hex":"#e8f4f7"},{"name":"Milky Yellow","hex":"#f8dd74"},{"name":"Mill Creek","hex":"#876e59"},{"name":"Millbrook","hex":"#595648"},{"name":"Mille-Feuille","hex":"#efc87d"},{"name":"Milly Green","hex":"#99bd91"},{"name":"Milpa","hex":"#689663"},{"name":"Milton","hex":"#b4b498"},{"name":"Mimesia Blue","hex":"#2269ca"},{"name":"Mimi Pink","hex":"#ffdae9"},{"name":"Mimolette Orange","hex":"#ee8811"},{"name":"Mimosa","hex":"#f5e9d5"},{"name":"Mincemeat","hex":"#b66a3c"},{"name":"Mindaro","hex":"#daea6f"},{"name":"Mine Rock","hex":"#8e8583"},{"name":"Mine Shaft","hex":"#373e41"},{"name":"Miner's Dust","hex":"#d3cec5"},{"name":"Mineral Blue","hex":"#6d9192"},{"name":"Mineral Green","hex":"#506355"},{"name":"Mineral Grey","hex":"#b2b6ac"},{"name":"Mineral Red","hex":"#b35457"},{"name":"Mineral Water","hex":"#dfebd6"},{"name":"Mineral Yellow","hex":"#d39c43"},{"name":"Minerva","hex":"#b5deda"},{"name":"Ming","hex":"#407577"},{"name":"Ming Green","hex":"#3aa278"},{"name":"Mini Bay","hex":"#8aadcf"},{"name":"Mini Blue","hex":"#96d7db"},{"name":"Mini Cake","hex":"#fbf6de"},{"name":"Minimal","hex":"#f3eecd"},{"name":"Minimal Grey","hex":"#948d99"},{"name":"Minimal Rose","hex":"#f2cfe0"},{"name":"Minion Yellow","hex":"#fed55d"},{"name":"Mink","hex":"#8a7561"},{"name":"Minotaur Red","hex":"#734b42"},{"name":"Minsk","hex":"#3e3267"},{"name":"Mint","hex":"#3eb489"},{"name":"Mint Chiffon","hex":"#e6fdf1"},{"name":"Mint Circle","hex":"#a9ceaa"},{"name":"Mint Condition","hex":"#dffbf3"},{"name":"Mint Cream","hex":"#f5fffa"},{"name":"Mint Gloss","hex":"#c8f3cd"},{"name":"Mint Ice","hex":"#bde8d8"},{"name":"Mint Ice Cream","hex":"#98cdb5"},{"name":"Mint Jelly","hex":"#45cea2"},{"name":"Mint Julep","hex":"#def0a3"},{"name":"Mint Leaf","hex":"#00b694"},{"name":"Mint Leaves","hex":"#6a7d4e"},{"name":"Mint Macaron","hex":"#afeeee"},{"name":"Mint Morning","hex":"#00ddcc"},{"name":"Mint Mousse","hex":"#b4ccbd"},{"name":"Mint Shake","hex":"#daeed3"},{"name":"Mint Smoothie","hex":"#c5e6d1"},{"name":"Mint Soap","hex":"#cbd5b1"},{"name":"Mint Tea","hex":"#afeee1"},{"name":"Mint Tonic","hex":"#99eeaa"},{"name":"Mint Tulip","hex":"#c6eadd"},{"name":"Mint Twist","hex":"#98cbba"},{"name":"Mint Wafer","hex":"#dce5d8"},{"name":"Mint-o-licious","hex":"#b6e9c8"},{"name":"Mintage","hex":"#78bfb2"},{"name":"Minted Blue","hex":"#26a6be"},{"name":"Mintos","hex":"#80d9cc"},{"name":"Minty Fresh","hex":"#d2f2e7"},{"name":"Minty Green","hex":"#0bf77d"},{"name":"Minuet","hex":"#a5b6cf"},{"name":"Mirabella","hex":"#886793"},{"name":"Miracle","hex":"#898696"},{"name":"Mirage","hex":"#373f43"},{"name":"Mirage Blue","hex":"#636c77"},{"name":"Mirage Grey","hex":"#abafae"},{"name":"Mirror Mirror","hex":"#a8b0b2"},{"name":"Mischief Maker","hex":"#954738"},{"name":"Mischief Mouse","hex":"#b7bab9"},{"name":"Mischka","hex":"#a5a9b2"},{"name":"Missed","hex":"#eff0c0"},{"name":"Missing Link","hex":"#6f5d57"},{"name":"Mission Bay Blue","hex":"#9ba9ab"},{"name":"Mission Courtyard","hex":"#f3d1b3"},{"name":"Mission Gold","hex":"#b78d61"},{"name":"Mission Jewel","hex":"#456252"},{"name":"Mission Tan","hex":"#dac6a8"},{"name":"Mission Trail","hex":"#857a64"},{"name":"Mission White","hex":"#e2d8c2"},{"name":"Mississippi River","hex":"#3b638c"},{"name":"Missouri Mud","hex":"#a6a19b"},{"name":"Mist Green","hex":"#aacebc"},{"name":"Mist Grey","hex":"#c4c4bc"},{"name":"Mist of Green","hex":"#e3f1eb"},{"name":"Mist Spirit","hex":"#e4ebe7"},{"name":"Misted Eve","hex":"#a2b7cf"},{"name":"Misted Yellow","hex":"#dab965"},{"name":"Mistletoe","hex":"#8aa282"},{"name":"Mistletoe Kiss","hex":"#98b489"},{"name":"Mistral","hex":"#b8bfcc"},{"name":"Misty Afternoon","hex":"#c6dcc7"},{"name":"Misty Aqua","hex":"#bcdbdb"},{"name":"Misty Bead","hex":"#d2d59b"},{"name":"Misty Blue","hex":"#bfcdcc"},{"name":"Misty Blush","hex":"#ddc9c6"},{"name":"Misty Grape","hex":"#65434d"},{"name":"Misty Hillside","hex":"#dce5cc"},{"name":"Misty Jade","hex":"#bcd9c8"},{"name":"Misty Lake","hex":"#c2d5c4"},{"name":"Misty Lawn","hex":"#dffae1"},{"name":"Misty Lilac","hex":"#bcb4c4"},{"name":"Misty Meadow","hex":"#bec0b0"},{"name":"Misty Moonstone","hex":"#e5e0cc"},{"name":"Misty Moor","hex":"#718981"},{"name":"Misty Morn","hex":"#e7e1e3"},{"name":"Misty Morning","hex":"#b2c8bd"},{"name":"Misty Moss","hex":"#bbb477"},{"name":"Misty Rose","hex":"#ffe4e1"},{"name":"Misty Surf","hex":"#b5c8c9"},{"name":"Misty Violet","hex":"#dbd7e4"},{"name":"Mitchell Blue","hex":"#0d789f"},{"name":"Mithril","hex":"#878787"},{"name":"Mithril Silver","hex":"#b8b8bf"},{"name":"Mithril Silver / Silver","hex":"#bbbbc1"},{"name":"Mix Or Match","hex":"#ccccba"},{"name":"Miyamoto Red","hex":"#e4030f"},{"name":"Miyazaki Verdant","hex":"#6fea3e"},{"name":"Mizu","hex":"#70c1e0"},{"name":"Mizuasagi Green","hex":"#749f8d"},{"name":"Moat","hex":"#3e6a6b"},{"name":"Mobster","hex":"#605a67"},{"name":"Moby Dick","hex":"#dde8ed"},{"name":"Moccasin","hex":"#fbebd6"},{"name":"Mocha","hex":"#9d7651"},{"name":"Mocha Bisque","hex":"#8c543a"},{"name":"Mocha Glow","hex":"#773322"},{"name":"Mocha Magic","hex":"#88796d"},{"name":"Mocha Mousse","hex":"#a47864"},{"name":"Mocha Wisp","hex":"#918278"},{"name":"Mochaccino","hex":"#945200"},{"name":"Mochito","hex":"#8efa00"},{"name":"Mock Orange","hex":"#ffa368"},{"name":"Modal","hex":"#31a6d1"},{"name":"Modal Blue","hex":"#40a6ac"},{"name":"Mode Beige","hex":"#96711f"},{"name":"Modern Ivory","hex":"#f5ecdc"},{"name":"Modern Monument","hex":"#d6d6d1"},{"name":"Moderne Class","hex":"#745b49"},{"name":"Modest Mauve","hex":"#838492"},{"name":"Modest Violet","hex":"#e9e4ef"},{"name":"Modesty","hex":"#d4c7d9"},{"name":"Moegi Green","hex":"#f19172"},{"name":"Moenkopi Soil","hex":"#c8a692"},{"name":"Mogwa-Cheong Yellow","hex":"#ddcc00"},{"name":"Moire","hex":"#beadb0"},{"name":"Moired Satin","hex":"#665d63"},{"name":"Moist Gold","hex":"#dbdb70"},{"name":"Mojave Desert","hex":"#c7b595"},{"name":"Mojito","hex":"#e4f3e0"},{"name":"Mojo","hex":"#97463c"},{"name":"Molasses","hex":"#574a47"},{"name":"Molasses Cookie","hex":"#8b714b"},{"name":"Moldy Ochre","hex":"#d5a300"},{"name":"Mole","hex":"#392d2b"},{"name":"Mole Grey","hex":"#938f8a"},{"name":"Molly Green","hex":"#e3efe3"},{"name":"Molly Robins","hex":"#4d8b72"},{"name":"Molten Bronze","hex":"#c69c04"},{"name":"Molten Core","hex":"#ff5800"},{"name":"Molten Ice","hex":"#e1ede6"},{"name":"Molten Lava","hex":"#b5332e"},{"name":"Momentum","hex":"#746f5c"},{"name":"Momo Peach","hex":"#f47983"},{"name":"Momoshio Brown","hex":"#542d24"},{"name":"Mona Lisa","hex":"#ff9889"},{"name":"Monaco Blue","hex":"#274374"},{"name":"Monarch","hex":"#6b252c"},{"name":"Monarch Migration","hex":"#bf764c"},{"name":"Monarch's Cocoon","hex":"#8cb293"},{"name":"Monastery Mantle","hex":"#41363a"},{"name":"Monastic","hex":"#aba9d2"},{"name":"Monastir","hex":"#b78999"},{"name":"Moncur","hex":"#9bb9ae"},{"name":"Mondo","hex":"#554d42"},{"name":"Mondrian Blue","hex":"#0f478c"},{"name":"Monet Magic","hex":"#c1acc3"},{"name":"Monet's Lavender","hex":"#dde0ea"},{"name":"Money","hex":"#7b9a6d"},{"name":"Money Banks","hex":"#aabe49"},{"name":"Mongolian Plateau","hex":"#777700"},{"name":"Mongoose","hex":"#a58b6f"},{"name":"Monkey Madness","hex":"#63584c"},{"name":"Monks Robe","hex":"#704822"},{"name":"Monologue","hex":"#a1bcd8"},{"name":"Monroe Kiss","hex":"#dec1b8"},{"name":"Monsoon","hex":"#7a7679"},{"name":"Monstera Deliciosa","hex":"#75bf0a"},{"name":"Mont Blanc","hex":"#9eb6d8"},{"name":"Mont Blanc Peak","hex":"#f2e7e7"},{"name":"Montana","hex":"#393b3c"},{"name":"Montana Grape","hex":"#6c5971"},{"name":"Monte Carlo","hex":"#7ac5b4"},{"name":"Montecito","hex":"#b6a180"},{"name":"Montego Bay","hex":"#3fbabd"},{"name":"Monterey Brown","hex":"#946e5c"},{"name":"Montezuma Hills","hex":"#a6b2a4"},{"name":"Montezuma's Castle","hex":"#d9ad9e"},{"name":"Montreux Blue","hex":"#5879a2"},{"name":"Monument","hex":"#84898c"},{"name":"Monza","hex":"#c7031e"},{"name":"Moo","hex":"#fbe5bd"},{"name":"Mood Indigo","hex":"#353a4c"},{"name":"Mood Lighting","hex":"#ffe7d5"},{"name":"Moody Blue","hex":"#8378c7"},{"name":"Moody Blues","hex":"#586e75"},{"name":"Mooloolaba","hex":"#c7b8a9"},{"name":"Moon Dust","hex":"#e0e6f0"},{"name":"Moon Glow","hex":"#f5f3ce"},{"name":"Moon Goddess","hex":"#cfc7d5"},{"name":"Moon Jellyfish","hex":"#8eb8ce"},{"name":"Moon Lily","hex":"#e6e6e7"},{"name":"Moon Mist","hex":"#cecdb8"},{"name":"Moon Rock","hex":"#958b84"},{"name":"Moon Rose","hex":"#b9aba5"},{"name":"Moon Shell","hex":"#e9e3d8"},{"name":"Moon White","hex":"#eaf4fc"},{"name":"Moon Yellow","hex":"#f0c420"},{"name":"Moonbeam","hex":"#cdc6bd"},{"name":"Moondance","hex":"#e5decc"},{"name":"Moondoggie","hex":"#f3debf"},{"name":"Moonless Night","hex":"#2f2d30"},{"name":"Moonlight","hex":"#f6eed5"},{"name":"Moonlight Blue","hex":"#506886"},{"name":"Moonlight Jade","hex":"#c7e5df"},{"name":"Moonlit Mauve","hex":"#d28fb0"},{"name":"Moonlit Ocean","hex":"#293b4d"},{"name":"Moonlit Snow","hex":"#eaeeec"},{"name":"Moonraker","hex":"#c0b2d7"},{"name":"Moonscape","hex":"#725f69"},{"name":"Moonshade","hex":"#5a6e9c"},{"name":"Moonshadow","hex":"#9845b0"},{"name":"Moonstone","hex":"#3aa8c1"},{"name":"Moonstone Blue","hex":"#73a9c2"},{"name":"Moonstruck","hex":"#fcf0c2"},{"name":"Moonwort","hex":"#a5ae9f"},{"name":"Moorland","hex":"#a6ab9b"},{"name":"Moorland Heather","hex":"#cc94be"},{"name":"Moose Fur","hex":"#725440"},{"name":"Moot Green","hex":"#a2db10"},{"name":"Morality","hex":"#b4cde5"},{"name":"Morass","hex":"#726138"},{"name":"Moray","hex":"#c8bd6a"},{"name":"Moray Eel","hex":"#00a78b"},{"name":"Mordant Red 19","hex":"#ae0c00"},{"name":"Mordian Blue","hex":"#2f5684"},{"name":"More Maple","hex":"#d0ab70"},{"name":"More Melon","hex":"#e0e3c8"},{"name":"More Mint","hex":"#e6e8c5"},{"name":"More Than A Week","hex":"#8d8d8d"},{"name":"Morel","hex":"#685c53"},{"name":"Morganite","hex":"#dfcdc6"},{"name":"Morning Blue","hex":"#8da399"},{"name":"Morning Breeze","hex":"#d5e3de"},{"name":"Morning Calm","hex":"#ceeeef"},{"name":"Morning Fog","hex":"#d0dbd7"},{"name":"Morning Forest","hex":"#6dae81"},{"name":"Morning Frost","hex":"#ebf4df"},{"name":"Morning Glory","hex":"#9ed1d3"},{"name":"Morning Glow","hex":"#eef0d6"},{"name":"Morning Green","hex":"#89bab2"},{"name":"Morning Light Wave","hex":"#e0efe9"},{"name":"Morning Mist","hex":"#e5edf1"},{"name":"Morning Moon","hex":"#f7eecf"},{"name":"Morning Moor","hex":"#dad6ae"},{"name":"Morning Rush","hex":"#dee4dc"},{"name":"Morning Song","hex":"#e4ece9"},{"name":"Morning Wheat","hex":"#e7d2a9"},{"name":"Mornington","hex":"#dcc6b9"},{"name":"Moroccan Blue","hex":"#0f4e67"},{"name":"Moroccan Blunt","hex":"#75583d"},{"name":"Moroccan Brown","hex":"#7c726c"},{"name":"Moroccan Dusk","hex":"#6b5e5d"},{"name":"Moroccan Leather","hex":"#6d4444"},{"name":"Moroccan Moonlight","hex":"#eae0d4"},{"name":"Morocco","hex":"#b67267"},{"name":"Morocco Brown","hex":"#442d21"},{"name":"Morocco Sand","hex":"#ece3cc"},{"name":"Morris Artichoke","hex":"#8cb295"},{"name":"Morris Leaf","hex":"#c2d3af"},{"name":"Morro Bay","hex":"#546b78"},{"name":"Morrow White","hex":"#fcfccf"},{"name":"Mortar","hex":"#565051"},{"name":"Mosaic Blue","hex":"#00758f"},{"name":"Mosaic Tile","hex":"#1c6b69"},{"name":"Moscow Papyrus","hex":"#937c00"},{"name":"Mosque","hex":"#005f5b"},{"name":"Moss","hex":"#009051"},{"name":"Moss Beach","hex":"#6b7061"},{"name":"Moss Cottage","hex":"#42544c"},{"name":"Moss Covered","hex":"#7a7e66"},{"name":"Moss Green","hex":"#638b27"},{"name":"Moss Grey","hex":"#afab97"},{"name":"Moss Island","hex":"#c8c6b4"},{"name":"Moss Point Green","hex":"#7e8d60"},{"name":"Moss Ring","hex":"#729067"},{"name":"Moss Rock","hex":"#5e5b4d"},{"name":"Moss Rose","hex":"#8f6d6b"},{"name":"Moss Stone","hex":"#b4a54b"},{"name":"Moss Vale","hex":"#38614c"},{"name":"Mossa","hex":"#b4c2b6"},{"name":"Mossleaf","hex":"#8c9d8f"},{"name":"Mosstone","hex":"#858961"},{"name":"Mossy","hex":"#857349"},{"name":"Mossy Bronze","hex":"#525f48"},{"name":"Mossy Gold","hex":"#9c9273"},{"name":"Mossy Shade","hex":"#7e6c44"},{"name":"Mossy Woods","hex":"#7a9703"},{"name":"Mostly Metal","hex":"#575e5f"},{"name":"Mote of Dust","hex":"#c1c1c5"},{"name":"Moth","hex":"#d2cbaf"},{"name":"Moth Green","hex":"#007700"},{"name":"Moth Grey","hex":"#d1c9ba"},{"name":"Moth Orchid","hex":"#c875c4"},{"name":"Moth Pink","hex":"#cfbdba"},{"name":"Mother Earth","hex":"#849c8d"},{"name":"Mother Lode","hex":"#a28761"},{"name":"Mother Nature","hex":"#bde1c4"},{"name":"Mother of Pearl","hex":"#e9d4c3"},{"name":"Motto","hex":"#917c6f"},{"name":"Mount Eden","hex":"#e7efe0"},{"name":"Mount Sterling","hex":"#cad3d4"},{"name":"Mount Tam","hex":"#7c7b6a"},{"name":"Mountain Air","hex":"#e6e0e0"},{"name":"Mountain Ash","hex":"#cc7700"},{"name":"Mountain Bluebird","hex":"#4c98c2"},{"name":"Mountain Dew","hex":"#cfe2e0"},{"name":"Mountain Fern","hex":"#94b491"},{"name":"Mountain Forest","hex":"#4d663e"},{"name":"Mountain Grey","hex":"#e8e3db"},{"name":"Mountain Haze","hex":"#6c6e7e"},{"name":"Mountain Heather","hex":"#eedae6"},{"name":"Mountain Lake","hex":"#2d5975"},{"name":"Mountain Laurel","hex":"#f4c8d5"},{"name":"Mountain Lichen","hex":"#a7ae9e"},{"name":"Mountain Maize","hex":"#efcc7c"},{"name":"Mountain Meadow","hex":"#30ba8f"},{"name":"Mountain Mint","hex":"#a7e0c2"},{"name":"Mountain Mist","hex":"#a09f9c"},{"name":"Mountain Moss","hex":"#94a293"},{"name":"Mountain Pine","hex":"#3b5257"},{"name":"Mountain Spring","hex":"#d9e1c1"},{"name":"Mountain Stream","hex":"#96afb7"},{"name":"Mountain View","hex":"#2e3d30"},{"name":"Mountbatten Pink","hex":"#997a8d"},{"name":"Mourn Mountain Snow","hex":"#e9eaeb"},{"name":"Mournfang Brown","hex":"#6f5749"},{"name":"Mourning Dove","hex":"#94908b"},{"name":"Mouse Catcher","hex":"#9e928f"},{"name":"Mouse Nose","hex":"#ffe5b4"},{"name":"Mouse Tail","hex":"#727664"},{"name":"Mouse Trap","hex":"#beb1b0"},{"name":"Mousy Indigo","hex":"#5c544e"},{"name":"Moutarde de Bénichon","hex":"#bf9005"},{"name":"Mover & Shaker","hex":"#9cce9e"},{"name":"Mow the Lawn","hex":"#a9b49a"},{"name":"Mr Frosty","hex":"#a3c5db"},{"name":"Mr Mustard","hex":"#e4b857"},{"name":"Ms. Pac-Man Kiss","hex":"#ff00aa"},{"name":"MSU Green","hex":"#18453b"},{"name":"Mt Burleigh","hex":"#597766"},{"name":"Mt. Rushmore","hex":"#7f8181"},{"name":"Mǔ Lì Bái Oyster","hex":"#f1f2d3"},{"name":"Mud","hex":"#70543e"},{"name":"Mud Ball","hex":"#966544"},{"name":"Mud Bath","hex":"#7c6841"},{"name":"Mud Berry","hex":"#d0c8c4"},{"name":"Mud Brown","hex":"#60460f"},{"name":"Mud Green","hex":"#606602"},{"name":"Mud House","hex":"#847146"},{"name":"Mud Pack","hex":"#9d9588"},{"name":"Mud Pots","hex":"#b6b5b1"},{"name":"Mud Puddle","hex":"#9d958b"},{"name":"Mud Room","hex":"#60584b"},{"name":"Mud-Dell","hex":"#a08b76"},{"name":"Muddy Brown","hex":"#886806"},{"name":"Muddy Green","hex":"#657432"},{"name":"Muddy Mauve","hex":"#e4b3cc"},{"name":"Muddy Olive","hex":"#4b5d46"},{"name":"Muddy Quicksand","hex":"#c3988b"},{"name":"Muddy River","hex":"#715d3d"},{"name":"Muddy Rose","hex":"#e2beb4"},{"name":"Muddy Waters","hex":"#a9844f"},{"name":"Muddy Yellow","hex":"#bfac05"},{"name":"Mudra","hex":"#b8d0da"},{"name":"Mudskipper","hex":"#897a69"},{"name":"Mudstone","hex":"#84846f"},{"name":"Muesli","hex":"#9e7e53"},{"name":"Mughal Green","hex":"#306030"},{"name":"Mukluks","hex":"#a38961"},{"name":"Mulberry","hex":"#920a4e"},{"name":"Mulberry Brown","hex":"#956f29"},{"name":"Mulberry Bush","hex":"#ad6ea0"},{"name":"Mulberry Mix","hex":"#9f556c"},{"name":"Mulberry Purple","hex":"#493c62"},{"name":"Mulberry Thorn","hex":"#c57f2e"},{"name":"Mulberry Wood","hex":"#5c0536"},{"name":"Mulberry Yogurt","hex":"#c54b8c"},{"name":"Mulch","hex":"#433937"},{"name":"Mule","hex":"#827b77"},{"name":"Mule Fawn","hex":"#884f40"},{"name":"Mulled Cider","hex":"#a18162"},{"name":"Mulled Grape","hex":"#675a74"},{"name":"Mulled Wine","hex":"#524d5b"},{"name":"Mummy's Tomb","hex":"#828e84"},{"name":"Munchkin","hex":"#9bb139"},{"name":"Munsell Blue","hex":"#0093af"},{"name":"Munsell Yellow","hex":"#efcc00"},{"name":"Muntok White Pepper","hex":"#d2a172"},{"name":"Murasaki","hex":"#4f284b"},{"name":"Murasaki Purple","hex":"#884898"},{"name":"Murdoch","hex":"#5b8d6b"},{"name":"Murex","hex":"#847eb1"},{"name":"Murky Green","hex":"#6c7a0e"},{"name":"Murmur","hex":"#d2d8d2"},{"name":"Murray Red","hex":"#6b3c39"},{"name":"Muscat Blanc","hex":"#ebe2cf"},{"name":"Muscovado Sugar","hex":"#9b6957"},{"name":"Mushiao Green","hex":"#2d4436"},{"name":"Mushroom","hex":"#bdaca3"},{"name":"Mushroom Risotto","hex":"#dbd0ca"},{"name":"Musk","hex":"#cca195"},{"name":"Musk Deer","hex":"#7e5b58"},{"name":"Musk Dusk","hex":"#cfbfb9"},{"name":"Musk Memory","hex":"#774548"},{"name":"Musket","hex":"#7d6d39"},{"name":"Muskmelon","hex":"#ec935e"},{"name":"Muskrat","hex":"#7e6f4f"},{"name":"Muslin","hex":"#d3d1c4"},{"name":"Mustang","hex":"#5e4a47"},{"name":"Mustard","hex":"#ceb301"},{"name":"Mustard Brown","hex":"#ac7e04"},{"name":"Mustard Flower","hex":"#d2bd0a"},{"name":"Mustard Gold","hex":"#b08e51"},{"name":"Mustard Green","hex":"#a8b504"},{"name":"Mustard Magic","hex":"#857139"},{"name":"Mustard On Toast","hex":"#ddcc33"},{"name":"Mustard Sauce","hex":"#edbd68"},{"name":"Mustard Seed","hex":"#c69f26"},{"name":"Mustard Yellow","hex":"#e1ad01"},{"name":"Mutabilis","hex":"#c29594"},{"name":"Muted Berry","hex":"#91788c"},{"name":"Muted Blue","hex":"#3b719f"},{"name":"Muted Clay","hex":"#d29380"},{"name":"Muted Green","hex":"#5fa052"},{"name":"Muted Lime","hex":"#d1c87c"},{"name":"Muted Mauve","hex":"#b3a9a3"},{"name":"Muted Pink","hex":"#d1768f"},{"name":"Muted Purple","hex":"#805b87"},{"name":"MVS Red","hex":"#ee0000"},{"name":"My Love","hex":"#e1c6a8"},{"name":"My Pink","hex":"#d68b80"},{"name":"My Sin","hex":"#fdae45"},{"name":"Mykonos","hex":"#387abe"},{"name":"Mykonos Blue","hex":"#005780"},{"name":"Myoga Purple","hex":"#e0218a"},{"name":"Myrtle","hex":"#21421e"},{"name":"Myrtle Green","hex":"#317873"},{"name":"Myrtle Pepper","hex":"#b77961"},{"name":"Myself","hex":"#8e6f76"},{"name":"Mysteria","hex":"#826f7a"},{"name":"Mysterioso","hex":"#46394b"},{"name":"Mysterious","hex":"#535e63"},{"name":"Mysterious Blue","hex":"#3e7a85"},{"name":"Mysterious Moss","hex":"#6f6a52"},{"name":"Mystery","hex":"#a4cdcc"},{"name":"Mystic","hex":"#d8ddda"},{"name":"Mystic Blue","hex":"#48a8d0"},{"name":"Mystic Green","hex":"#d8f878"},{"name":"Mystic Iris","hex":"#8596d2"},{"name":"Mystic Maroon","hex":"#ad4379"},{"name":"Mystic Mauve","hex":"#dbb7ba"},{"name":"Mystic Melon","hex":"#edebb4"},{"name":"Mystic Red","hex":"#ff5500"},{"name":"Mystical","hex":"#5f4e72"},{"name":"Mystical Trip","hex":"#7a6a75"},{"name":"Mystification","hex":"#2a4071"},{"name":"Mystified","hex":"#c9dbc7"},{"name":"Mystique","hex":"#a598a0"},{"name":"Mythical Blue","hex":"#93a8a7"},{"name":"Mythical Forest","hex":"#398467"},{"name":"Mythical Orange","hex":"#ff7f49"},{"name":"Nadeshiko Pink","hex":"#f6adc6"},{"name":"Nadia","hex":"#afc9c0"},{"name":"Naggaroth Night","hex":"#3d3354"},{"name":"Nǎi Yóu Sè Cream","hex":"#fdedc3"},{"name":"Nakabeni Pink","hex":"#c93756"},{"name":"Naked Lady","hex":"#d6b3a9"},{"name":"Naked Light","hex":"#e9b6c1"},{"name":"Naked Pink","hex":"#d8c6d6"},{"name":"Naked Rose","hex":"#ebb5b3"},{"name":"Namakabe Brown","hex":"#785e49"},{"name":"Namara Grey","hex":"#7b7c7d"},{"name":"Namaste","hex":"#bdd8c0"},{"name":"Namibia","hex":"#7c6d61"},{"name":"Nana","hex":"#a08da7"},{"name":"Nancy","hex":"#57b8dc"},{"name":"Nandor","hex":"#4e5d4e"},{"name":"Nanohanacha Gold","hex":"#e3b130"},{"name":"Nantucket Mist","hex":"#cabfbf"},{"name":"Napa","hex":"#a39a87"},{"name":"Napa Sunset","hex":"#cd915c"},{"name":"Napier Green","hex":"#2a8000"},{"name":"Naples Yellow","hex":"#fada5f"},{"name":"Napoleon","hex":"#404149"},{"name":"Nārangī Orange","hex":"#ff8050"},{"name":"Narcissus","hex":"#c39449"},{"name":"Narcomedusae","hex":"#e6e3d8"},{"name":"Nârenji Orange","hex":"#ffc14b"},{"name":"Narvik","hex":"#e9e6dc"},{"name":"Narwhale Grey","hex":"#080813"},{"name":"Nasake","hex":"#746062"},{"name":"Nasturcian Flower","hex":"#e64d1d"},{"name":"Nasturtium","hex":"#fe6347"},{"name":"Nasturtium Leaf","hex":"#87b369"},{"name":"Nasturtium Shoot","hex":"#869f49"},{"name":"Nasty Green","hex":"#70b23f"},{"name":"Nasu Purple","hex":"#5d21d0"},{"name":"Nataneyu Gold","hex":"#a17917"},{"name":"Native Berry","hex":"#dc6b67"},{"name":"Native Flora","hex":"#9aa099"},{"name":"Native Hue of Resolution","hex":"#d33300"},{"name":"Natural","hex":"#aa907d"},{"name":"Natural Bridge","hex":"#a29171"},{"name":"Natural Candy Pink","hex":"#e4717a"},{"name":"Natural Grey","hex":"#8b8680"},{"name":"Natural Instinct Green","hex":"#017374"},{"name":"Natural Leather","hex":"#a80e00"},{"name":"Natural Light","hex":"#f1ebc8"},{"name":"Natural Pumice","hex":"#4a4a43"},{"name":"Natural Radiance","hex":"#e7dcc1"},{"name":"Natural Spring","hex":"#aa838b"},{"name":"Natural Steel","hex":"#8a8287"},{"name":"Natural Stone","hex":"#aea295"},{"name":"Natural Wool","hex":"#fff6d7"},{"name":"Natural Youth","hex":"#d7e5b4"},{"name":"Nature","hex":"#bfd5b3"},{"name":"Nature Spirits","hex":"#c8c8b4"},{"name":"Nature's Delight","hex":"#a6d292"},{"name":"Nature's Gate","hex":"#666a60"},{"name":"Naughty Hottie","hex":"#ba403a"},{"name":"Nauseous Blue","hex":"#483d8b"},{"name":"Nautical","hex":"#2e4a7d"},{"name":"Nautical Blue","hex":"#1a5091"},{"name":"Nautical Star","hex":"#aab5b7"},{"name":"Navagio Bay","hex":"#3183a0"},{"name":"Navajo","hex":"#efdcc3"},{"name":"Navajo Turquoise","hex":"#007c78"},{"name":"Navajo White","hex":"#ffdead"},{"name":"Naval","hex":"#41729f"},{"name":"Naval Passage","hex":"#386782"},{"name":"Navigate","hex":"#008583"},{"name":"Navigator","hex":"#5d83ab"},{"name":"Navy","hex":"#01153e"},{"name":"Navy Blazer","hex":"#282d3c"},{"name":"Navy Blue","hex":"#000080"},{"name":"Navy Cosmos","hex":"#503b53"},{"name":"Navy Damask","hex":"#425166"},{"name":"Navy Green","hex":"#35530a"},{"name":"Navy Peony","hex":"#223a5e"},{"name":"Navy Purple","hex":"#9556eb"},{"name":"Navy Teal","hex":"#20576e"},{"name":"Navy Trim","hex":"#203462"},{"name":"Neapolitan","hex":"#9b7a78"},{"name":"Neapolitan Blue","hex":"#4d7faa"},{"name":"Nebula","hex":"#b8c6be"},{"name":"Nebula Fuchsia","hex":"#7722aa"},{"name":"Nebulas Blue","hex":"#2d62a3"},{"name":"Nebulous","hex":"#c4b9b8"},{"name":"Necklace Pearl","hex":"#f6eeed"},{"name":"Necron Compound","hex":"#828b8e"},{"name":"Necrotic Flesh","hex":"#9faf6c"},{"name":"Nectar of the Gods","hex":"#513439"},{"name":"Nectarine","hex":"#ff8656"},{"name":"Nectarous Nectarine","hex":"#dd5566"},{"name":"Negishi Green","hex":"#938b4b"},{"name":"Negroni","hex":"#eec7a2"},{"name":"Nelson's Milk Snake","hex":"#933d41"},{"name":"Neo Tokyo Grey","hex":"#bec0c2"},{"name":"Neon Blue","hex":"#04d9ff"},{"name":"Neon Carrot","hex":"#ff9933"},{"name":"Neon Fuchsia","hex":"#fe4164"},{"name":"Neon Green","hex":"#39ff14"},{"name":"Neon Pink","hex":"#fe019a"},{"name":"Neon Purple","hex":"#bc13fe"},{"name":"Neon Red","hex":"#ff073a"},{"name":"Neon Violet","hex":"#674876"},{"name":"Neon Yellow","hex":"#cfff04"},{"name":"Nepal","hex":"#93aab9"},{"name":"Nephrite","hex":"#6d9288"},{"name":"Neptune","hex":"#007dac"},{"name":"Neptune Green","hex":"#7fbb9e"},{"name":"Neptune's Wrath","hex":"#11425d"},{"name":"Nereus","hex":"#4c793c"},{"name":"Nero","hex":"#252525"},{"name":"Nero's Green","hex":"#318181"},{"name":"Nervous Neon Pink","hex":"#ff6ec7"},{"name":"Nessie","hex":"#716748"},{"name":"Net Worker","hex":"#b6a194"},{"name":"Nettle","hex":"#bbac7d"},{"name":"Neutral Buff","hex":"#9d928f"},{"name":"Neutral Green","hex":"#aaa583"},{"name":"Neutral Grey","hex":"#8e918f"},{"name":"Neutral Peach","hex":"#ffe6c3"},{"name":"Neutral Valley","hex":"#8b694d"},{"name":"Neutrino Blue","hex":"#01248f"},{"name":"Nevada","hex":"#666f6f"},{"name":"Nevada Morning","hex":"#ffd5a7"},{"name":"Never Cry Wolf","hex":"#6e6455"},{"name":"Never Forget","hex":"#a67283"},{"name":"Nevergreen","hex":"#666556"},{"name":"Neverland","hex":"#9ce5d6"},{"name":"New Amber","hex":"#6d3b24"},{"name":"New Bamboo","hex":"#adac84"},{"name":"New Brick Red","hex":"#cb4154"},{"name":"New Bulgarian Rose","hex":"#482427"},{"name":"New Car","hex":"#214fc6"},{"name":"New Clay","hex":"#efc1b5"},{"name":"New Cork","hex":"#b89b6b"},{"name":"New Fawn","hex":"#c9a171"},{"name":"New Frond","hex":"#bacca0"},{"name":"New Gold","hex":"#ead151"},{"name":"New Hope","hex":"#e2efc2"},{"name":"New Kenyan Copper","hex":"#7c1c05"},{"name":"New Life","hex":"#7c916e"},{"name":"New Limerick","hex":"#9dc209"},{"name":"New Love","hex":"#c6bbdb"},{"name":"New Neutral","hex":"#bec0aa"},{"name":"New Orleans","hex":"#e4c385"},{"name":"New Penny","hex":"#a27d66"},{"name":"New Steel","hex":"#738595"},{"name":"New Wheat","hex":"#d7b57f"},{"name":"New Wool","hex":"#d6c3b9"},{"name":"New York Pink","hex":"#dd8374"},{"name":"Newburyport","hex":"#445a79"},{"name":"Newman's Eye","hex":"#b2c7e1"},{"name":"Newport Blue","hex":"#1c8ac9"},{"name":"Newsprint","hex":"#756f6d"},{"name":"Niagara","hex":"#29a98b"},{"name":"Niagara Falls","hex":"#cbe3ee"},{"name":"Niblet Green","hex":"#7dc734"},{"name":"Nice Blue","hex":"#107ab0"},{"name":"Niche","hex":"#65758f"},{"name":"Nick's Nook","hex":"#909062"},{"name":"Nickel","hex":"#929292"},{"name":"Night Bloom","hex":"#613e3d"},{"name":"Night Blue","hex":"#040348"},{"name":"Night Fog","hex":"#2d1962"},{"name":"Night Kite","hex":"#005572"},{"name":"Night Market","hex":"#4c6177"},{"name":"Night Mode","hex":"#234e86"},{"name":"Night Night","hex":"#4f4f5e"},{"name":"Night Owl","hex":"#5d7b89"},{"name":"Night Rendezvous","hex":"#66787e"},{"name":"Night Rider","hex":"#332e2e"},{"name":"Night Romance","hex":"#715055"},{"name":"Night Rose","hex":"#b0807a"},{"name":"Night Shadz","hex":"#a23d54"},{"name":"Night Shift","hex":"#2a5c6a"},{"name":"Night Sky","hex":"#2a2a35"},{"name":"Night Tan","hex":"#ab967b"},{"name":"Night Thistle","hex":"#6b7ba7"},{"name":"Night Watch","hex":"#3c4f4e"},{"name":"Night White","hex":"#e1e1dd"},{"name":"Night Wind","hex":"#d7e2db"},{"name":"Night Wizard","hex":"#313740"},{"name":"Nightfall","hex":"#43535e"},{"name":"Nighthawk","hex":"#615452"},{"name":"Nightingale","hex":"#5c4827"},{"name":"Nightlife","hex":"#27426b"},{"name":"Nightly Aurora","hex":"#9beec1"},{"name":"Nightly Escapade","hex":"#0433ff"},{"name":"Nightly Ivy","hex":"#444940"},{"name":"Nightly Violet","hex":"#784384"},{"name":"Nightly Woods","hex":"#013220"},{"name":"Nightmare","hex":"#112211"},{"name":"Nightshade","hex":"#4f4352"},{"name":"Nightshade Berries","hex":"#1b1811"},{"name":"Nightshade Purple","hex":"#535872"},{"name":"Nightshadow Blue","hex":"#4e5368"},{"name":"Nihilakh Oxide","hex":"#a0d6b4"},{"name":"Nīlā Blue","hex":"#0055ff"},{"name":"Nile","hex":"#b4bb85"},{"name":"Nile Blue","hex":"#253f4e"},{"name":"Nile Clay","hex":"#8b8174"},{"name":"Nile Green","hex":"#a7c796"},{"name":"Nile Reed","hex":"#968f5f"},{"name":"Nile Stone","hex":"#61c9c1"},{"name":"Nimbus Cloud","hex":"#d5d5d8"},{"name":"Nina","hex":"#f5e3ea"},{"name":"Nine Iron","hex":"#46434a"},{"name":"Níng Méng Huáng Lemon","hex":"#ffef19"},{"name":"Ninja Turtle","hex":"#94b1a9"},{"name":"Ninjin Orange","hex":"#e5aa70"},{"name":"Nipple Pink","hex":"#bb7777"},{"name":"Nirvana","hex":"#a2919b"},{"name":"Nirvana Jewel","hex":"#64a5ad"},{"name":"Nirvana Nevermind","hex":"#7bc8f6"},{"name":"Nisemurasaki Purple","hex":"#43242a"},{"name":"Níu Zǎi Sè Denim","hex":"#056eee"},{"name":"No Need to Blush","hex":"#ffd6dd"},{"name":"Nobel","hex":"#a99d9d"},{"name":"Noble Cause Purple","hex":"#7e1e9c"},{"name":"Noble Knight","hex":"#394d78"},{"name":"Noble Plum","hex":"#871f78"},{"name":"Noble Robe","hex":"#807070"},{"name":"Noble Tone","hex":"#884967"},{"name":"Noblesse","hex":"#524b50"},{"name":"Noctis","hex":"#646b77"},{"name":"Nocturnal Flight","hex":"#675754"},{"name":"Nocturnal Rose","hex":"#cc6699"},{"name":"Nocturnal Sea","hex":"#0e6071"},{"name":"Nocturne","hex":"#7a4b56"},{"name":"Nocturne Shade","hex":"#356fad"},{"name":"Nomad","hex":"#a19986"},{"name":"Nomadic Taupe","hex":"#d2c6ae"},{"name":"Nomadic Travels","hex":"#e0c997"},{"name":"Nominee","hex":"#357567"},{"name":"Non Skid Grey","hex":"#8a8daa"},{"name":"Non-Photo Blue","hex":"#a4dded"},{"name":"Non-Stop Orange","hex":"#dd8811"},{"name":"Nonpareil Apple","hex":"#c1a65c"},{"name":"Noqrei Silver","hex":"#bdbebd"},{"name":"Nora's Forest","hex":"#003333"},{"name":"Nordic","hex":"#1d393c"},{"name":"Nordic Grass Green","hex":"#1fab58"},{"name":"Norfolk Green","hex":"#2e4b3c"},{"name":"Norfolk Sky","hex":"#6cbae7"},{"name":"Nori Green","hex":"#112a12"},{"name":"Norman Shaw Goldspar","hex":"#e9c68e"},{"name":"Norse Blue","hex":"#4ca5c7"},{"name":"North Atlantic","hex":"#536d70"},{"name":"North Rim","hex":"#d8a892"},{"name":"North Sea","hex":"#316c6b"},{"name":"North Sea Blue","hex":"#343c4c"},{"name":"North Star","hex":"#f2dea4"},{"name":"North Star Blue","hex":"#223399"},{"name":"North Texas Green","hex":"#059033"},{"name":"Northampton Trees","hex":"#767962"},{"name":"Northern Beach","hex":"#e9dad2"},{"name":"Northern Exposure","hex":"#bfc7d4"},{"name":"Northern Landscape","hex":"#c5c1a3"},{"name":"Northern Lights","hex":"#e6f0ea"},{"name":"Northern Pond","hex":"#a3b9cd"},{"name":"Northern Sky","hex":"#8daccc"},{"name":"Northern Star","hex":"#ffffea"},{"name":"Northern Territory","hex":"#5e463c"},{"name":"Northgate Green","hex":"#aaa388"},{"name":"Northpointe","hex":"#9e9181"},{"name":"Northrend","hex":"#b9f2ff"},{"name":"Norway","hex":"#a4b88f"},{"name":"Norwich Green","hex":"#acb597"},{"name":"Nosegay","hex":"#ffe6ec"},{"name":"Nosferatu","hex":"#a9a8a8"},{"name":"Noshime Flower","hex":"#426579"},{"name":"Nostalgia","hex":"#d6b8bd"},{"name":"Nostalgia Rose","hex":"#a4777e"},{"name":"Not My Fault","hex":"#7e7d78"},{"name":"Not Yo Cheese","hex":"#ffc12c"},{"name":"Notorious","hex":"#bda998"},{"name":"Nottingham Forest","hex":"#585d4e"},{"name":"Nougat","hex":"#b69885"},{"name":"Nougat Brown","hex":"#7c503f"},{"name":"Nouveau Rose","hex":"#996872"},{"name":"Novelle Peach","hex":"#e7cfbd"},{"name":"Novelty Navy","hex":"#515b62"},{"name":"Nuclear Waste","hex":"#7cfc00"},{"name":"Nude","hex":"#f2d3bc"},{"name":"Nugget","hex":"#bc9229"},{"name":"Nugget Gold","hex":"#c89720"},{"name":"Nuisette","hex":"#b48395"},{"name":"Nuit Blanche","hex":"#1e488f"},{"name":"Nuln Oil","hex":"#14100e"},{"name":"Nuln Oil Gloss","hex":"#171310"},{"name":"Numbers","hex":"#929bac"},{"name":"Nurgle's Rot","hex":"#9b8f22"},{"name":"Nurgling Green","hex":"#b8cc82"},{"name":"Nursery","hex":"#efd0d2"},{"name":"Nursery Green","hex":"#edf0de"},{"name":"Nurude Brown","hex":"#9d896c"},{"name":"Nut Brown","hex":"#86695e"},{"name":"Nut Cracker","hex":"#816c5b"},{"name":"Nut Milk","hex":"#d9ccc8"},{"name":"Nut Oil","hex":"#775d38"},{"name":"Nuthatch Back","hex":"#445599"},{"name":"Nutmeg","hex":"#7e4a3b"},{"name":"Nutmeg Glow","hex":"#d8b691"},{"name":"Nutmeg Wood Finish","hex":"#683600"},{"name":"Nutria","hex":"#75663e"},{"name":"Nyanza","hex":"#e9ffdb"},{"name":"NYC Taxi","hex":"#f7b731"},{"name":"Nyctophobia Blue","hex":"#4d587a"},{"name":"Nymph Green","hex":"#aec2a5"},{"name":"Nymph's Delight","hex":"#7b6c8e"},{"name":"Nymphaeaceae","hex":"#cee0e3"},{"name":"O'Brien Orange","hex":"#f3a347"},{"name":"O'grady Green","hex":"#58ac8f"},{"name":"O'Neal Green","hex":"#395643"},{"name":"Oak Barrel","hex":"#715636"},{"name":"Oak Buff","hex":"#cf9c63"},{"name":"Oak Harbour","hex":"#cdb386"},{"name":"Oak Plank","hex":"#5d4f39"},{"name":"Oak Shaving","hex":"#eed8c2"},{"name":"Oakley Apricot","hex":"#e0b695"},{"name":"Oakmoss","hex":"#6d7244"},{"name":"Oakwood","hex":"#bda58b"},{"name":"Oakwood Brown","hex":"#8f716e"},{"name":"Oasis","hex":"#0092a3"},{"name":"Oasis Sand","hex":"#fcedc5"},{"name":"Oasis Spring","hex":"#47a3c6"},{"name":"Oasis Stream","hex":"#a2ebd8"},{"name":"Oath","hex":"#4a465a"},{"name":"Oatmeal","hex":"#cbc3b4"},{"name":"Oatmeal Bath","hex":"#ddc7a2"},{"name":"Oatmeal Biscuit","hex":"#b7a86d"},{"name":"Oatmeal Cookie","hex":"#eadac6"},{"name":"Objectivity","hex":"#bbc6de"},{"name":"Obligation","hex":"#54645c"},{"name":"Observatory","hex":"#008f70"},{"name":"Obsession","hex":"#ae9550"},{"name":"Obsidian","hex":"#445055"},{"name":"Obsidian Shard","hex":"#060313"},{"name":"Ocean","hex":"#005493"},{"name":"Ocean Blue","hex":"#009dc4"},{"name":"Ocean Boat Blue","hex":"#0077be"},{"name":"Ocean Breeze","hex":"#d3e5eb"},{"name":"Ocean Bubble","hex":"#8cadcd"},{"name":"Ocean Call","hex":"#2b6c8e"},{"name":"Ocean City","hex":"#7896ba"},{"name":"Ocean Cruise","hex":"#9cd4e1"},{"name":"Ocean Current","hex":"#537783"},{"name":"Ocean Depths","hex":"#006175"},{"name":"Ocean Dream","hex":"#d4dde2"},{"name":"Ocean Drive","hex":"#b0bec5"},{"name":"Ocean Green","hex":"#3d9973"},{"name":"Ocean Liner","hex":"#189086"},{"name":"Ocean Mirage","hex":"#00748f"},{"name":"Ocean Night","hex":"#637195"},{"name":"Ocean Oasis","hex":"#006c68"},{"name":"Ocean Surf","hex":"#79a2bd"},{"name":"Ocean Trapeze","hex":"#2e526a"},{"name":"Ocean Trip","hex":"#62aeba"},{"name":"Ocean Wave","hex":"#8ec5b6"},{"name":"Ocean Weed","hex":"#6c6541"},{"name":"Oceanic","hex":"#4f6d82"},{"name":"Oceano","hex":"#9ad6e5"},{"name":"Ocher","hex":"#bf9b0c"},{"name":"Ochre","hex":"#cc7722"},{"name":"Ochre Brown","hex":"#9f7b3e"},{"name":"Ochre Maroon","hex":"#cc7733"},{"name":"Ochre Revival","hex":"#eec987"},{"name":"Octarine","hex":"#ccdd00"},{"name":"October Haze","hex":"#f8ac8c"},{"name":"Ode to Green","hex":"#b6e5d6"},{"name":"Ode to Purple","hex":"#a798c2"},{"name":"Odyssey","hex":"#374a5a"},{"name":"Odyssey Grey","hex":"#434452"},{"name":"Off Blue","hex":"#5684ae"},{"name":"Off Green","hex":"#6ba353"},{"name":"Off the Grid","hex":"#9f9049"},{"name":"Off White","hex":"#ffffe4"},{"name":"Off Yellow","hex":"#f1f33f"},{"name":"Office Green","hex":"#00800f"},{"name":"Often Orange","hex":"#ff714e"},{"name":"Ogen Melon","hex":"#d7b235"},{"name":"Ogre Odor","hex":"#fd5240"},{"name":"Ogryn Camo","hex":"#9da94b"},{"name":"Ogryn Flesh Wash","hex":"#d1a14e"},{"name":"Oh Boy!","hex":"#bbdaf8"},{"name":"Oh Dahling","hex":"#edeec5"},{"name":"Oh So Pretty","hex":"#eac7cb"},{"name":"Oil","hex":"#313330"},{"name":"Oil Blue","hex":"#658c88"},{"name":"Oil Green","hex":"#80856d"},{"name":"Oil Of Lavender","hex":"#c7bebe"},{"name":"Oil Slick","hex":"#031602"},{"name":"Oil Yellow","hex":"#c4a647"},{"name":"Oiled Up Kardashian","hex":"#996644"},{"name":"Oilseed Crops","hex":"#c2be0e"},{"name":"Oily Steel","hex":"#99aaaa"},{"name":"Oitake Green","hex":"#5e644f"},{"name":"OK Corral","hex":"#d07360"},{"name":"Okra","hex":"#fdefe9"},{"name":"Okroshka","hex":"#40533d"},{"name":"Old Army Helmet","hex":"#616652"},{"name":"Old Asparagus","hex":"#929000"},{"name":"Old Bamboo","hex":"#769164"},{"name":"Old Benchmark","hex":"#029386"},{"name":"Old Bone","hex":"#dbc2ab"},{"name":"Old Boot","hex":"#7c644b"},{"name":"Old Brick","hex":"#8a3335"},{"name":"Old Brown Crayon","hex":"#330000"},{"name":"Old Burgundy","hex":"#43302e"},{"name":"Old Chalk","hex":"#e3d6e9"},{"name":"Old Copper","hex":"#73503b"},{"name":"Old Cumin","hex":"#784430"},{"name":"Old Doeskin","hex":"#bdab9b"},{"name":"Old Driftwood","hex":"#97694f"},{"name":"Old Eggplant","hex":"#614051"},{"name":"Old Faithful","hex":"#82a2be"},{"name":"Old Fashioned Purple","hex":"#73486b"},{"name":"Old Four Leaf Clover","hex":"#757d43"},{"name":"Old Geranium","hex":"#c66787"},{"name":"Old Glory Blue","hex":"#002868"},{"name":"Old Glory Red","hex":"#bf0a30"},{"name":"Old Gold","hex":"#cfb53b"},{"name":"Old Grey Mare","hex":"#b4b6ad"},{"name":"Old Gungeon Red","hex":"#0063ec"},{"name":"Old Heliotrope","hex":"#563c5c"},{"name":"Old Ivory","hex":"#ffffcb"},{"name":"Old Lace","hex":"#fdf5e6"},{"name":"Old Laser Lemon","hex":"#fdfc74"},{"name":"Old Lavender","hex":"#796878"},{"name":"Old Leather","hex":"#a88b66"},{"name":"Old Lime","hex":"#aec571"},{"name":"Old Mahogany","hex":"#4a0100"},{"name":"Old Mandarin","hex":"#8e2323"},{"name":"Old Mauve","hex":"#673147"},{"name":"Old Mill","hex":"#343b4e"},{"name":"Old Mill Blue","hex":"#6e6f82"},{"name":"Old Mission Pink","hex":"#d8c2ca"},{"name":"Old Money","hex":"#2c5c4f"},{"name":"Old Moss Green","hex":"#867e36"},{"name":"Old Nan Yarn","hex":"#5e5896"},{"name":"Old Pearls","hex":"#f6ebd7"},{"name":"Old Pink","hex":"#c77986"},{"name":"Old Rose","hex":"#c08081"},{"name":"Old Ruin","hex":"#917b53"},{"name":"Old School","hex":"#353c3d"},{"name":"Old Silver","hex":"#848482"},{"name":"Old Trail","hex":"#bb8811"},{"name":"Old Treasure Chest","hex":"#544333"},{"name":"Old Truck","hex":"#0a888a"},{"name":"Old Whiskey","hex":"#ddaa55"},{"name":"Old Willow Leaf","hex":"#756947"},{"name":"Old Wine","hex":"#90091f"},{"name":"Old World","hex":"#b2b7d1"},{"name":"Old Yella","hex":"#feed9a"},{"name":"Ole Yeller","hex":"#c79e5f"},{"name":"Oleander Pink","hex":"#f85898"},{"name":"Olive","hex":"#808010"},{"name":"Olive Bark","hex":"#5f5537"},{"name":"Olive Branch","hex":"#646a45"},{"name":"Olive Brown","hex":"#645403"},{"name":"Olive Chutney","hex":"#a6997a"},{"name":"Olive Court","hex":"#5f5d48"},{"name":"Olive Creed","hex":"#e8ecc0"},{"name":"Olive Drab","hex":"#6f7632"},{"name":"Olive Green","hex":"#677a04"},{"name":"Olive Grey","hex":"#afa78d"},{"name":"Olive Grove","hex":"#716a4d"},{"name":"Olive Haze","hex":"#888064"},{"name":"Olive Hint","hex":"#c9bd88"},{"name":"Olive It","hex":"#aeab9a"},{"name":"Olive Leaf","hex":"#4e4b35"},{"name":"Olive Leaf Tea","hex":"#78866b"},{"name":"Olive Martini","hex":"#ced2ab"},{"name":"Olive Night","hex":"#535040"},{"name":"Olive Ochre","hex":"#837752"},{"name":"Olive Oil","hex":"#bab86c"},{"name":"Olive Paste","hex":"#83826d"},{"name":"Olive Pit","hex":"#a9a491"},{"name":"Olive Reserve","hex":"#a4a84d"},{"name":"Olive Sand","hex":"#9abf8d"},{"name":"Olive Sapling","hex":"#7f7452"},{"name":"Olive Soap","hex":"#97a49a"},{"name":"Olive Sprig","hex":"#acaf95"},{"name":"Olive Wood","hex":"#756244"},{"name":"Olive Yellow","hex":"#c2b709"},{"name":"Olivenite","hex":"#333311"},{"name":"Olivetone","hex":"#747028"},{"name":"Olivine","hex":"#9ab973"},{"name":"Olm Pink","hex":"#ffe6e2"},{"name":"Olympia Ivy","hex":"#5a6647"},{"name":"Olympian Blue","hex":"#1a4c8b"},{"name":"Ombre Blue","hex":"#434854"},{"name":"Omphalodes","hex":"#b5cedf"},{"name":"On Cloud Nine","hex":"#c2e7e8"},{"name":"On the Avenue","hex":"#948776"},{"name":"On the Nile","hex":"#b29aa7"},{"name":"Onahau","hex":"#c2e6ec"},{"name":"Onion","hex":"#48412b"},{"name":"Onion Powder","hex":"#ece2d4"},{"name":"Onion Seedling","hex":"#47885e"},{"name":"Onion Skin","hex":"#eeeddf"},{"name":"Online Lime","hex":"#44883c"},{"name":"Only Oatmeal","hex":"#d4cdb5"},{"name":"Only Olive","hex":"#cbccb5"},{"name":"Only Yesterday","hex":"#f4d1b9"},{"name":"Ontario Violet","hex":"#777cb0"},{"name":"Onyx","hex":"#464544"},{"name":"Onyx Heart","hex":"#353839"},{"name":"Ooid Sand","hex":"#c2beb6"},{"name":"Opal","hex":"#aee0e4"},{"name":"Opal Blue","hex":"#c3ddd6"},{"name":"Opal Fire","hex":"#e49c86"},{"name":"Opal Flame","hex":"#e95c4b"},{"name":"Opal Green","hex":"#157954"},{"name":"Opal Grey","hex":"#a49e9e"},{"name":"Opalescent","hex":"#3c94c1"},{"name":"Opalescent Coral","hex":"#ffd2a9"},{"name":"Opaline","hex":"#c1d1c4"},{"name":"Opaline Green","hex":"#a3c57d"},{"name":"Open Range","hex":"#91876b"},{"name":"Open Sesame","hex":"#f8e2a9"},{"name":"Opera","hex":"#816575"},{"name":"Opera Mauve","hex":"#b784a7"},{"name":"Opera Red","hex":"#ff1b2d"},{"name":"Opium","hex":"#987e7e"},{"name":"Opulent Violet","hex":"#a09ec6"},{"name":"Opus","hex":"#cecae1"},{"name":"Oracle","hex":"#395555"},{"name":"Orange","hex":"#ffa500"},{"name":"Orange Aura","hex":"#ff9682"},{"name":"Orange Brown","hex":"#b16002"},{"name":"Orange Burst","hex":"#ff6e3a"},{"name":"Orange Chalk","hex":"#fad48b"},{"name":"Orange Chiffon","hex":"#f9aa7d"},{"name":"Orange Chocolate","hex":"#f3c775"},{"name":"Orange Clay","hex":"#e6a57f"},{"name":"Orange Com","hex":"#da321c"},{"name":"Orange Danger","hex":"#dd6600"},{"name":"Orange Daylily","hex":"#eb7d5d"},{"name":"Orange Delight","hex":"#ffc355"},{"name":"Orange Drop","hex":"#e18e3f"},{"name":"Orange Essential","hex":"#d1907c"},{"name":"Orange Fire","hex":"#ffaf6b"},{"name":"Orange Glass","hex":"#ffca7d"},{"name":"Orange Hibiscus","hex":"#ff9a45"},{"name":"Orange Jelly","hex":"#fac205"},{"name":"Orange Jewel","hex":"#ff9731"},{"name":"Orange Juice","hex":"#ff7f00"},{"name":"Orange Keeper","hex":"#ca5333"},{"name":"Orange Liqueur","hex":"#edaa80"},{"name":"Orange Maple","hex":"#d3a083"},{"name":"Orange Marmalade","hex":"#faac72"},{"name":"Orange Ochre","hex":"#dc793a"},{"name":"Orange Outburst","hex":"#dd7700"},{"name":"Orange Peel","hex":"#ffa000"},{"name":"Orange Pepper","hex":"#df7500"},{"name":"Orange Piñata","hex":"#ff6611"},{"name":"Orange Pink","hex":"#ff6f52"},{"name":"Orange Poppy","hex":"#e68750"},{"name":"Orange Popsicle","hex":"#ff7913"},{"name":"Orange Red","hex":"#fe4401"},{"name":"Orange Roughy","hex":"#a85335"},{"name":"Orange Rust","hex":"#c25a3c"},{"name":"Orange Salmonberry","hex":"#f0b073"},{"name":"Orange Shot","hex":"#dd7744"},{"name":"Orange Soda","hex":"#fa5b3d"},{"name":"Orange Squash","hex":"#c27635"},{"name":"Orange Tea Rose","hex":"#ff8379"},{"name":"Orange Tiger","hex":"#f96714"},{"name":"Orange Vermillion","hex":"#bc5339"},{"name":"Orange White","hex":"#eae3cd"},{"name":"Orange Wood","hex":"#b74923"},{"name":"Orange Yellow","hex":"#fdb915"},{"name":"Orange Zest","hex":"#f07227"},{"name":"Orangeade","hex":"#e2552c"},{"name":"Orangealicious","hex":"#ee5511"},{"name":"Orangeville","hex":"#e57059"},{"name":"Orangina","hex":"#fec615"},{"name":"Orangish","hex":"#fd8d49"},{"name":"Orangish Brown","hex":"#b25f03"},{"name":"Orangish Red","hex":"#f43605"},{"name":"Oranzhewyi Orange","hex":"#ee6237"},{"name":"Orbital","hex":"#6d83bb"},{"name":"Orca White","hex":"#d0ccc9"},{"name":"Orchid","hex":"#7a81ff"},{"name":"Orchid Bloom","hex":"#c5aecf"},{"name":"Orchid Blossom","hex":"#e4e1e4"},{"name":"Orchid Bouquet","hex":"#d1acce"},{"name":"Orchid Dottyback","hex":"#aa55aa"},{"name":"Orchid Ecstasy","hex":"#bb4488"},{"name":"Orchid Haze","hex":"#b0879b"},{"name":"Orchid Hue","hex":"#e5e999"},{"name":"Orchid Hush","hex":"#cec3d2"},{"name":"Orchid Ice","hex":"#e0d0db"},{"name":"Orchid Lane","hex":"#e5dde7"},{"name":"Orchid Lei","hex":"#9c4a7d"},{"name":"Orchid Mist","hex":"#e8e6e8"},{"name":"Orchid Orange","hex":"#ffa180"},{"name":"Orchid Petal","hex":"#bfb4cb"},{"name":"Orchid Pink","hex":"#f3bbca"},{"name":"Orchid Smoke","hex":"#d294aa"},{"name":"Orchid Tint","hex":"#dbd2db"},{"name":"Orchid Whisper","hex":"#dde0e8"},{"name":"Orchid White","hex":"#f1ebd9"},{"name":"Orchilla","hex":"#938ea9"},{"name":"Ordain","hex":"#998188"},{"name":"Oregano","hex":"#7f8353"},{"name":"Oregon","hex":"#9b4703"},{"name":"Oregon Grape","hex":"#49354e"},{"name":"Oregon Hazel","hex":"#916238"},{"name":"Orenju Ogon Koi","hex":"#ffcda8"},{"name":"Organic","hex":"#747261"},{"name":"Organic Bamboo","hex":"#e1cda4"},{"name":"Organic Fiber","hex":"#feede0"},{"name":"Organic Matter","hex":"#a99e54"},{"name":"Organza","hex":"#ffdea6"},{"name":"Orient","hex":"#255b77"},{"name":"Orient Blue","hex":"#47457a"},{"name":"Oriental Blush","hex":"#d7c6e1"},{"name":"Oriental Pink","hex":"#c28e88"},{"name":"Oriental Spice","hex":"#8b5131"},{"name":"Origami","hex":"#ece0c6"},{"name":"Orinoco","hex":"#d2d3b3"},{"name":"Orioles Orange","hex":"#fb4f14"},{"name":"Orion Blue","hex":"#3e4f5c"},{"name":"Orka Black","hex":"#27221f"},{"name":"Orkhide Shade","hex":"#3e5755"},{"name":"Orlean's Tune","hex":"#b8995b"},{"name":"Ornate","hex":"#806d95"},{"name":"Ornery Tangerine","hex":"#f77d25"},{"name":"Oro","hex":"#c29436"},{"name":"Orpiment Yellow","hex":"#f9c89b"},{"name":"Orpington Chicken","hex":"#be855e"},{"name":"Osiris","hex":"#5b5a4d"},{"name":"Oslo Grey","hex":"#878d91"},{"name":"Osprey Nest","hex":"#ccbab1"},{"name":"Osso Bucco","hex":"#ad9769"},{"name":"Ostrich Egg","hex":"#dcd0bb"},{"name":"Oswego Tea","hex":"#665d59"},{"name":"Ōtan Red","hex":"#ff4e20"},{"name":"Otter","hex":"#7f674f"},{"name":"Otter Brown","hex":"#654320"},{"name":"Otto Ice","hex":"#bedfd3"},{"name":"Ottoman","hex":"#d3dbcb"},{"name":"OU Crimson Red","hex":"#990000"},{"name":"Oubliette","hex":"#4f4944"},{"name":"Ouni Red","hex":"#ee7948"},{"name":"Out of Blue","hex":"#c0f7db"},{"name":"Out of Plumb","hex":"#9c909c"},{"name":"Outback","hex":"#c9a375"},{"name":"Outer Boundary","hex":"#654846"},{"name":"Outer Reef","hex":"#2a6295"},{"name":"Outer Space","hex":"#414a4c"},{"name":"Outlawed Orange","hex":"#b67350"},{"name":"Outrageous Orange","hex":"#ff6e4a"},{"name":"Outrigger","hex":"#82714d"},{"name":"Overboard","hex":"#005555"},{"name":"Overcast","hex":"#73a3d0"},{"name":"Overcast Night","hex":"#42426f"},{"name":"Overcast Sky","hex":"#a7b8c4"},{"name":"Overdue Grey","hex":"#c7c3be"},{"name":"Overgrown","hex":"#6b6048"},{"name":"Overgrown Trellis","hex":"#6a8988"},{"name":"Overtake","hex":"#33557f"},{"name":"Overtone","hex":"#a4e3b3"},{"name":"Ovoid Fruit","hex":"#8c7e49"},{"name":"Owl Manner Malt","hex":"#c0af87"},{"name":"Oxalis","hex":"#c1e28a"},{"name":"Oxblood","hex":"#800020"},{"name":"Oxford","hex":"#b1bbc5"},{"name":"Oxford Blue","hex":"#002147"},{"name":"Oxford Brick","hex":"#743b39"},{"name":"Oxford Brown","hex":"#504139"},{"name":"Oxford Tan","hex":"#b8a99a"},{"name":"Oxley","hex":"#6d9a78"},{"name":"Oxygen Blue","hex":"#92b6d5"},{"name":"Oyster","hex":"#e3d3bf"},{"name":"Oyster Bay","hex":"#71818c"},{"name":"Oyster Cracker","hex":"#f4f0d2"},{"name":"Oyster Grey","hex":"#cbc1ae"},{"name":"Oyster Haze","hex":"#e4ded2"},{"name":"Oyster Linen","hex":"#b1ab96"},{"name":"Oyster Mushroom","hex":"#c3c6c8"},{"name":"Oyster Pink","hex":"#d4b5b0"},{"name":"Oyster White","hex":"#d2caaf"},{"name":"Ozone","hex":"#8b95a2"},{"name":"Ozone Blue","hex":"#c7d3e0"},{"name":"Pa Red","hex":"#5e3a39"},{"name":"Paarl","hex":"#864b36"},{"name":"Pablo","hex":"#7a715c"},{"name":"Pac-Man","hex":"#ffe737"},{"name":"Pachyderm","hex":"#8f989d"},{"name":"Pacific","hex":"#1f595c"},{"name":"Pacific Bliss","hex":"#96acb8"},{"name":"Pacific Blue","hex":"#1ca9c9"},{"name":"Pacific Blues","hex":"#4470b0"},{"name":"Pacific Coast","hex":"#5480ac"},{"name":"Pacific Harbour","hex":"#77b9db"},{"name":"Pacific Line","hex":"#2d3544"},{"name":"Pacific Palisade","hex":"#69a4b9"},{"name":"Pacific Pearl","hex":"#e8eae6"},{"name":"Pacific Queen","hex":"#026b5d"},{"name":"Pacific Spirit","hex":"#3c4a56"},{"name":"Pacific Storm","hex":"#035453"},{"name":"Pacifica","hex":"#4e77a3"},{"name":"Pacifika","hex":"#778120"},{"name":"Paco","hex":"#4f4037"},{"name":"Padded Leaf","hex":"#859e94"},{"name":"Paddle Wheel","hex":"#88724d"},{"name":"Paddy","hex":"#da9585"},{"name":"Paddy Field","hex":"#99bb44"},{"name":"Padua","hex":"#7eb394"},{"name":"Pageant Song","hex":"#b6c3d1"},{"name":"Pagoda","hex":"#127e93"},{"name":"Pagoda Blue","hex":"#1a7f8e"},{"name":"Paid In Full","hex":"#8c8e65"},{"name":"Painite","hex":"#6b4947"},{"name":"Painted Bark","hex":"#5f3d32"},{"name":"Painted Clay","hex":"#eb8f6f"},{"name":"Painted Desert","hex":"#beb8b6"},{"name":"Painted Pony","hex":"#bb9471"},{"name":"Painted Sea","hex":"#008595"},{"name":"Painted Turtle","hex":"#56745f"},{"name":"Painter's White","hex":"#f2ebdd"},{"name":"Paisley","hex":"#726f7e"},{"name":"Paisley Purple","hex":"#8b79b1"},{"name":"Pakistan Green","hex":"#006600"},{"name":"Palace Blue","hex":"#346cb0"},{"name":"Palace Purple","hex":"#68457a"},{"name":"Palatinate Blue","hex":"#273be2"},{"name":"Palatinate Purple","hex":"#682860"},{"name":"Pale","hex":"#fff9d0"},{"name":"Pale Ale","hex":"#fef068"},{"name":"Pale Apricot","hex":"#ffe3cb"},{"name":"Pale Aqua","hex":"#bcd4e1"},{"name":"Pale Avocado","hex":"#d7d3a6"},{"name":"Pale Banana","hex":"#fae199"},{"name":"Pale Beach","hex":"#d6c5a9"},{"name":"Pale Berries","hex":"#e2ccc7"},{"name":"Pale Beryl","hex":"#98ded9"},{"name":"Pale Blossom","hex":"#fde1f0"},{"name":"Pale Blue","hex":"#d0fefe"},{"name":"Pale Blue Grey","hex":"#a2adb1"},{"name":"Pale Blush","hex":"#e4bfb3"},{"name":"Pale Brown","hex":"#b1916e"},{"name":"Pale Buttercup","hex":"#f3cf64"},{"name":"Pale Cactus","hex":"#d0f7e4"},{"name":"Pale Canary","hex":"#ffff88"},{"name":"Pale Carmine","hex":"#af403c"},{"name":"Pale Cast of Thought","hex":"#c1c1d1"},{"name":"Pale Celadon","hex":"#c9cbbe"},{"name":"Pale Cerulean","hex":"#9bc4e2"},{"name":"Pale Cherry Blossom","hex":"#fdeff2"},{"name":"Pale Chestnut","hex":"#ddadaf"},{"name":"Pale Chinese Ink","hex":"#a3a3a2"},{"name":"Pale Clay","hex":"#dab27d"},{"name":"Pale Cloud","hex":"#dadee9"},{"name":"Pale Copper","hex":"#df8f67"},{"name":"Pale Coral","hex":"#f2d1c4"},{"name":"Pale Corn","hex":"#f7d497"},{"name":"Pale Cornflower Blue","hex":"#abcdee"},{"name":"Pale Cyan","hex":"#87d3f8"},{"name":"Pale Daffodil","hex":"#fde89a"},{"name":"Pale Dogwood","hex":"#edcdc2"},{"name":"Pale Dry Rose","hex":"#d3a194"},{"name":"Pale Dull","hex":"#adadad"},{"name":"Pale Earth","hex":"#b1a99f"},{"name":"Pale Ecru","hex":"#f2ebe1"},{"name":"Pale Egg","hex":"#fde8d0"},{"name":"Pale Eggplant","hex":"#8a779a"},{"name":"Pale Fallen Leaves","hex":"#aa8736"},{"name":"Pale Flesh","hex":"#f2dbd7"},{"name":"Pale Flower","hex":"#698aab"},{"name":"Pale Flower Cherry Blossom","hex":"#5a79ba"},{"name":"Pale Flower Field","hex":"#507ea4"},{"name":"Pale Frost","hex":"#cfe5f0"},{"name":"Pale Gold","hex":"#fdde6c"},{"name":"Pale Goldenrod","hex":"#eee8aa"},{"name":"Pale Grape","hex":"#c0a2c7"},{"name":"Pale Green","hex":"#69b076"},{"name":"Pale Grey","hex":"#fdfdfe"},{"name":"Pale Grey Blue","hex":"#d4e2eb"},{"name":"Pale Grey Shade Wash","hex":"#922b9c"},{"name":"Pale Icelandish","hex":"#bdd4d1"},{"name":"Pale Incense","hex":"#ffa565"},{"name":"Pale Indigo","hex":"#0094c8"},{"name":"Pale Iris","hex":"#8895c5"},{"name":"Pale Jade","hex":"#77c3b4"},{"name":"Pale Jasper","hex":"#fed6cc"},{"name":"Pale Khaki","hex":"#bfaf92"},{"name":"Pale Lady","hex":"#c7bdc1"},{"name":"Pale Lavender","hex":"#dcd0ff"},{"name":"Pale Leaf","hex":"#bdcaa8"},{"name":"Pale Light Green","hex":"#b1fc99"},{"name":"Pale Lilac","hex":"#e1c6cc"},{"name":"Pale Lily","hex":"#f3ece7"},{"name":"Pale Lime","hex":"#befd73"},{"name":"Pale Lime Green","hex":"#b1ff65"},{"name":"Pale Lime Yellow","hex":"#dfe69f"},{"name":"Pale Lychee","hex":"#c4acb2"},{"name":"Pale Magenta","hex":"#d767ad"},{"name":"Pale Magenta Pink","hex":"#ff99cc"},{"name":"Pale Marigold","hex":"#ffc66e"},{"name":"Pale Mauve","hex":"#c6a4a4"},{"name":"Pale Mint","hex":"#aac2a1"},{"name":"Pale Morning","hex":"#fcfcda"},{"name":"Pale Moss Green","hex":"#d0dbc4"},{"name":"Pale Mouse","hex":"#9790a4"},{"name":"Pale Mustard","hex":"#d5bd66"},{"name":"Pale Nectar","hex":"#fff7ed"},{"name":"Pale Oak","hex":"#bba46d"},{"name":"Pale Olive","hex":"#b9cc81"},{"name":"Pale Olive Green","hex":"#b1d27b"},{"name":"Pale Opal","hex":"#bbc6d9"},{"name":"Pale Orange","hex":"#ffa756"},{"name":"Pale Orchid","hex":"#dedbe5"},{"name":"Pale Orchid Petal","hex":"#f6e2ec"},{"name":"Pale Oriental","hex":"#e6d699"},{"name":"Pale Oyster","hex":"#9c8d72"},{"name":"Pale Parchment","hex":"#d1c3ad"},{"name":"Pale Pastel","hex":"#9adedb"},{"name":"Pale Peach","hex":"#ffe5ad"},{"name":"Pale Peach Pink","hex":"#fed1bd"},{"name":"Pale Pearl","hex":"#fff2de"},{"name":"Pale Persimmon","hex":"#d4acad"},{"name":"Pale Petticoat","hex":"#ba9ba5"},{"name":"Pale Phthalo Blue","hex":"#ccd5ff"},{"name":"Pale Pine","hex":"#c3c7b2"},{"name":"Pale Pink","hex":"#ffcfdc"},{"name":"Pale Plum","hex":"#dda0df"},{"name":"Pale Plum Blossom","hex":"#f0908d"},{"name":"Pale Poppy","hex":"#bca8ad"},{"name":"Pale Prim","hex":"#f9f59f"},{"name":"Pale Primrose","hex":"#eec8d3"},{"name":"Pale Purple","hex":"#b790d4"},{"name":"Pale Rays","hex":"#fff8d5"},{"name":"Pale Red","hex":"#d9544d"},{"name":"Pale Red Violet","hex":"#db7192"},{"name":"Pale Robin Egg Blue","hex":"#96ded1"},{"name":"Pale Rose","hex":"#efd6da"},{"name":"Pale Sage","hex":"#acbda1"},{"name":"Pale Salmon","hex":"#ffb19a"},{"name":"Pale Sand","hex":"#e5d5ba"},{"name":"Pale Scarlet","hex":"#df7163"},{"name":"Pale Seafoam","hex":"#c3e7e8"},{"name":"Pale Shale","hex":"#cacfdc"},{"name":"Pale Silver","hex":"#c9c0bb"},{"name":"Pale Sky","hex":"#636d70"},{"name":"Pale Sky Blue","hex":"#bdf6fe"},{"name":"Pale Slate","hex":"#c3bebb"},{"name":"Pale Spring","hex":"#b3be98"},{"name":"Pale Spring Bud","hex":"#ecebbd"},{"name":"Pale Sunshine","hex":"#f2c880"},{"name":"Pale Taupe","hex":"#bc987e"},{"name":"Pale Teal","hex":"#82cbb2"},{"name":"Pale Tendril","hex":"#cecdbb"},{"name":"Pale Turquoise","hex":"#a5fbd5"},{"name":"Pale Ultramarine","hex":"#5383c3"},{"name":"Pale View","hex":"#f4f2e2"},{"name":"Pale Violet","hex":"#ceaefa"},{"name":"Pale Violet Red","hex":"#db7093"},{"name":"Pale Vista","hex":"#d8dece"},{"name":"Pale Wheat","hex":"#fcf0e5"},{"name":"Pale Willow","hex":"#89ab98"},{"name":"Pale Wisteria","hex":"#bbc8e6"},{"name":"Pale Wood","hex":"#ead2a2"},{"name":"Pale Yellow","hex":"#ffff84"},{"name":"Paler Pumpkin","hex":"#b58338"},{"name":"Palest of Lemon","hex":"#f4eed1"},{"name":"Palisade Orchid","hex":"#af8ea5"},{"name":"Pallid Flesh","hex":"#f3dfdb"},{"name":"Pallid Wych Flesh","hex":"#cdcebe"},{"name":"Palm","hex":"#afaf5e"},{"name":"Palm Frond","hex":"#aead5b"},{"name":"Palm Green","hex":"#20392c"},{"name":"Palm Lane","hex":"#7a7363"},{"name":"Palm Leaf","hex":"#36482f"},{"name":"Palm Springs Splash","hex":"#20887a"},{"name":"Palm Tree","hex":"#74b560"},{"name":"Palmerin","hex":"#577063"},{"name":"Palmetto","hex":"#6d9a9b"},{"name":"Palmito","hex":"#eaeacf"},{"name":"Palo Verde","hex":"#5f6356"},{"name":"Paloma","hex":"#9f9c99"},{"name":"Paloma Tan","hex":"#e9b679"},{"name":"Palomino","hex":"#bb7744"},{"name":"Palomino Gold","hex":"#daae00"},{"name":"Palomino Mane","hex":"#e6d6ba"},{"name":"Palomino Pony","hex":"#837871"},{"name":"Pampas","hex":"#eae4dc"},{"name":"Pampered Princess","hex":"#f5eaeb"},{"name":"Panache","hex":"#ebf7e4"},{"name":"Panama Rose","hex":"#c6577c"},{"name":"Pancake","hex":"#f7d788"},{"name":"Pancake Mix","hex":"#d7bfa6"},{"name":"Pancho","hex":"#dfb992"},{"name":"Panda","hex":"#544f3a"},{"name":"Pandanus","hex":"#616c44"},{"name":"Pandora's Box","hex":"#fedbb7"},{"name":"Pannikin","hex":"#7895cc"},{"name":"Panorama","hex":"#327a88"},{"name":"Pansy","hex":"#f75394"},{"name":"Pansy Petal","hex":"#5f4561"},{"name":"Pansy Purple","hex":"#78184a"},{"name":"Pantomime","hex":"#adafba"},{"name":"Paolo Veronese Green","hex":"#009b7d"},{"name":"Papaya","hex":"#fea166"},{"name":"Papaya Punch","hex":"#fca289"},{"name":"Papaya Whip","hex":"#ffd1af"},{"name":"Paper Brown","hex":"#d7ac7f"},{"name":"Paper Daisy","hex":"#f0e5c7"},{"name":"Paper Sack","hex":"#b4a07a"},{"name":"Paper Tiger","hex":"#fdf1af"},{"name":"Paperboy's Lawn","hex":"#249148"},{"name":"Paprika","hex":"#7c2d37"},{"name":"Papyrus Map","hex":"#c0ac92"},{"name":"Papyrus Paper","hex":"#f5edd6"},{"name":"Par Four","hex":"#507069"},{"name":"Parachute","hex":"#beb755"},{"name":"Parachute Purple","hex":"#392852"},{"name":"Parachute Silk","hex":"#ffe2b5"},{"name":"Parachuting","hex":"#00589b"},{"name":"Paradise Bird","hex":"#ff8c55"},{"name":"Paradise Found","hex":"#83988c"},{"name":"Paradise Grape","hex":"#746565"},{"name":"Paradise Green","hex":"#b2e79f"},{"name":"Paradise Island","hex":"#5aa7a0"},{"name":"Paradise Pink","hex":"#e4445e"},{"name":"Paradiso","hex":"#488084"},{"name":"Parador Inn","hex":"#a99a8a"},{"name":"Parakeet","hex":"#78ae48"},{"name":"Parakeet Blue","hex":"#7eb6ff"},{"name":"Parakeet Pete","hex":"#cbd3c6"},{"name":"Parasailing","hex":"#00736c"},{"name":"Parasite Brown","hex":"#914b13"},{"name":"Parchment","hex":"#fefcaf"},{"name":"Parchment Paper","hex":"#f0e7d8"},{"name":"Parfait","hex":"#c8a6a1"},{"name":"Parfait d'Amour","hex":"#734f96"},{"name":"Parfait Pink","hex":"#e9c3cf"},{"name":"Paris Creek","hex":"#888873"},{"name":"Paris Daisy","hex":"#fbeb50"},{"name":"Paris Green","hex":"#50c87c"},{"name":"Paris M","hex":"#312760"},{"name":"Paris Pink","hex":"#da6d91"},{"name":"Paris White","hex":"#bfcdc0"},{"name":"Parisian Blue","hex":"#4f7ca4"},{"name":"Parisian Cashmere","hex":"#d1c7b8"},{"name":"Parisian Night","hex":"#323441"},{"name":"Park Avenue","hex":"#465048"},{"name":"Park Green Flat","hex":"#88c9a6"},{"name":"Parkview","hex":"#46483e"},{"name":"Parlor Rose","hex":"#baa1b2"},{"name":"Parma Violet","hex":"#55455a"},{"name":"Parmentier","hex":"#887cab"},{"name":"Parmesan","hex":"#ffffdd"},{"name":"Parrot Green","hex":"#8db051"},{"name":"Parrot Pink","hex":"#d998a0"},{"name":"Parsley","hex":"#305d35"},{"name":"Parsnip","hex":"#d6c69a"},{"name":"Partial Pink","hex":"#ffedf8"},{"name":"Particular Mint","hex":"#d0d2c5"},{"name":"Partridge","hex":"#844c44"},{"name":"Partridge Knoll","hex":"#a9875b"},{"name":"Pasadena Rose","hex":"#a84a49"},{"name":"Paseo Verde","hex":"#929178"},{"name":"Paspalum Grass","hex":"#b9bd97"},{"name":"Pass Time Blue","hex":"#5d98b3"},{"name":"Passion Flower","hex":"#6d5698"},{"name":"Passion Potion","hex":"#e398af"},{"name":"Passion Razz","hex":"#59355e"},{"name":"Passionate Blue","hex":"#1f3465"},{"name":"Passionate Blueberry","hex":"#334159"},{"name":"Passionate Pause","hex":"#edefcb"},{"name":"Passionate Pink","hex":"#dd00cc"},{"name":"Passionate Plum","hex":"#753a58"},{"name":"Passive Pink","hex":"#dba29e"},{"name":"Passive Royal","hex":"#795365"},{"name":"Pasta","hex":"#f7dfaf"},{"name":"Pastel Blue","hex":"#a2bffe"},{"name":"Pastel Brown","hex":"#836953"},{"name":"Pastel Day","hex":"#dfd8e1"},{"name":"Pastel Green","hex":"#77dd77"},{"name":"Pastel Grey","hex":"#cfcfc4"},{"name":"Pastel Lavender","hex":"#d8a1c4"},{"name":"Pastel Lilac","hex":"#bdb0d0"},{"name":"Pastel Magenta","hex":"#f49ac2"},{"name":"Pastel Mint","hex":"#cef0cc"},{"name":"Pastel Orange","hex":"#ff964f"},{"name":"Pastel Parchment","hex":"#e5d9d3"},{"name":"Pastel Pea","hex":"#bee7a5"},{"name":"Pastel Pink","hex":"#dea5a4"},{"name":"Pastel Purple","hex":"#b39eb5"},{"name":"Pastel Red","hex":"#ff6961"},{"name":"Pastel Rose Tan","hex":"#e9d1bf"},{"name":"Pastel Turquoise","hex":"#99c5c4"},{"name":"Pastel Violet","hex":"#cb99c9"},{"name":"Pastel Yellow","hex":"#fdfd96"},{"name":"Pastoral","hex":"#edfad9"},{"name":"Pastry","hex":"#f8deb8"},{"name":"Pastry Shell","hex":"#bd8c66"},{"name":"Patches","hex":"#8a7d6b"},{"name":"Patina","hex":"#639283"},{"name":"Patina Creek","hex":"#b6c4bd"},{"name":"Patina Green","hex":"#b9eab3"},{"name":"Patriarch","hex":"#800070"},{"name":"Patrice","hex":"#8cd9a1"},{"name":"Patrician Purple","hex":"#6c4e79"},{"name":"Patrinia Flowers","hex":"#d9b611"},{"name":"Patrinia Scabiosaefolia","hex":"#f2f2b0"},{"name":"Patriot Blue","hex":"#363756"},{"name":"Pattens Blue","hex":"#d3e5ef"},{"name":"Pattipan","hex":"#bcc6b1"},{"name":"Paua","hex":"#2a2551"},{"name":"Paua Shell","hex":"#245056"},{"name":"Pauley","hex":"#629191"},{"name":"Pauper","hex":"#343445"},{"name":"Pavement","hex":"#524d50"},{"name":"Pavilion","hex":"#bebf84"},{"name":"Pavilion Peach","hex":"#df9c45"},{"name":"Paving Stone","hex":"#a8a498"},{"name":"Pavlova","hex":"#baab87"},{"name":"Paw Paw","hex":"#fbd49c"},{"name":"Paw Print","hex":"#827a6d"},{"name":"Pawn Broker","hex":"#473430"},{"name":"Pax","hex":"#c8c6da"},{"name":"Payne's Grey","hex":"#536878"},{"name":"Pea","hex":"#a4bf20"},{"name":"Pea Case","hex":"#709d3d"},{"name":"Pea Green","hex":"#8eab12"},{"name":"Pea Soup","hex":"#929901"},{"name":"Pea Soup Green","hex":"#94a617"},{"name":"Peabody","hex":"#3f7074"},{"name":"Peace","hex":"#a2b2bd"},{"name":"Peace N Quiet","hex":"#cacfe0"},{"name":"Peace River","hex":"#a8bfcc"},{"name":"Peaceful Night","hex":"#d6e7e3"},{"name":"Peaceful Pastures","hex":"#94d8ac"},{"name":"Peaceful Peach","hex":"#ffddcd"},{"name":"Peaceful Purple","hex":"#660088"},{"name":"Peaceful Rain","hex":"#f1fbf1"},{"name":"Peach","hex":"#ffb07c"},{"name":"Peach A La Mode","hex":"#efc9aa"},{"name":"Peach Amber","hex":"#fb9f93"},{"name":"Peach Ash","hex":"#efc4bb"},{"name":"Peach Beauty","hex":"#e7c3ab"},{"name":"Peach Beige","hex":"#d3a297"},{"name":"Peach Bellini","hex":"#fedcad"},{"name":"Peach Bloom","hex":"#d99b7c"},{"name":"Peach Blossom","hex":"#de8286"},{"name":"Peach Blush","hex":"#e4ccc6"},{"name":"Peach Breeze","hex":"#ffece5"},{"name":"Peach Brick","hex":"#e5ccbd"},{"name":"Peach Bud","hex":"#fdb2ab"},{"name":"Peach Buff","hex":"#cc99bb"},{"name":"Peach Burst","hex":"#f39998"},{"name":"Peach Caramel","hex":"#c5733d"},{"name":"Peach Cider","hex":"#ffd9aa"},{"name":"Peach Cobbler","hex":"#ffb181"},{"name":"Peach Crayon","hex":"#ffcba7"},{"name":"Peach Cream","hex":"#fff0db"},{"name":"Peach Darling","hex":"#efcdb4"},{"name":"Peach Dip","hex":"#f4debf"},{"name":"Peach Dust","hex":"#f0d8cc"},{"name":"Peach Echo","hex":"#f7786b"},{"name":"Peach Everlasting","hex":"#f4e2d4"},{"name":"Peach Fizz","hex":"#ffa883"},{"name":"Peach Flower","hex":"#e198b4"},{"name":"Peach Fuzz","hex":"#ffc7b9"},{"name":"Peach Juice","hex":"#ffcfab"},{"name":"Peach Melba","hex":"#fbbdaf"},{"name":"Peach Nectar","hex":"#ffb59b"},{"name":"Peach Nirvana","hex":"#edb48f"},{"name":"Peach Nougat","hex":"#e6af91"},{"name":"Peach Orange","hex":"#ffcc99"},{"name":"Peach Parfait","hex":"#f8bfa8"},{"name":"Peach Patch","hex":"#f3d5a1"},{"name":"Peach Pearl","hex":"#ffb2a5"},{"name":"Peach Pink","hex":"#ff9a8a"},{"name":"Peach Poppy","hex":"#ddaaaa"},{"name":"Peach Powder","hex":"#e2bdb3"},{"name":"Peach Puff","hex":"#ffdab9"},{"name":"Peach Puree","hex":"#efcfba"},{"name":"Peach Quartz","hex":"#f5b895"},{"name":"Peach Schnapps","hex":"#ffdcd6"},{"name":"Peach Shortcake","hex":"#f3dfd4"},{"name":"Peach Smoothie","hex":"#ffe5bd"},{"name":"Peach Souffle","hex":"#ecbcb2"},{"name":"Peach Surprise","hex":"#f3e3d1"},{"name":"Peach Temptation","hex":"#f2c5b2"},{"name":"Peach Tone","hex":"#f2e3dc"},{"name":"Peach Umbrella","hex":"#f9e8ce"},{"name":"Peach Whip","hex":"#dbbeb7"},{"name":"Peach Yellow","hex":"#fadfad"},{"name":"Peachade","hex":"#fadfc7"},{"name":"Peaches 'n' Cream","hex":"#eec9a6"},{"name":"Peaches N Cream","hex":"#f4a6a3"},{"name":"Peachskin","hex":"#dfb8b6"},{"name":"Peachtree","hex":"#f3ddcd"},{"name":"Peachy Bon-Bon","hex":"#ffd2b9"},{"name":"Peachy Keen","hex":"#ffdeda"},{"name":"Peachy Milk","hex":"#f3e0d8"},{"name":"Peachy Pico","hex":"#ffccaa"},{"name":"Peachy Sand","hex":"#ffdcb7"},{"name":"Peachy Scene","hex":"#dd7755"},{"name":"Peacoat","hex":"#2b2e43"},{"name":"Peacock Blue","hex":"#016795"},{"name":"Peacock Green","hex":"#006a50"},{"name":"Peacock Plume","hex":"#206d71"},{"name":"Peacock Purple","hex":"#513843"},{"name":"Peacock Silk","hex":"#6da893"},{"name":"Peahen","hex":"#719e8a"},{"name":"Peanut","hex":"#7a4434"},{"name":"Peanut Brittle","hex":"#a6893a"},{"name":"Peanut Butter","hex":"#ffb75f"},{"name":"Peapod","hex":"#82b185"},{"name":"Pear","hex":"#d1e231"},{"name":"Pear Cactus","hex":"#91af88"},{"name":"Pear Perfume","hex":"#ccdd99"},{"name":"Pear Sorbet","hex":"#f3eac3"},{"name":"Pear Spritz","hex":"#cbf85f"},{"name":"Pearl","hex":"#eae0c8"},{"name":"Pearl Aqua","hex":"#88d8c0"},{"name":"Pearl Ash","hex":"#d0c9c3"},{"name":"Pearl Bay","hex":"#7fc6cc"},{"name":"Pearl Blue","hex":"#79b4c9"},{"name":"Pearl Blush","hex":"#f4cec5"},{"name":"Pearl Bush","hex":"#ded1c6"},{"name":"Pearl City","hex":"#dce4e9"},{"name":"Pearl Dust","hex":"#efe5d9"},{"name":"Pearl Grey","hex":"#b0b7be"},{"name":"Pearl Lusta","hex":"#eae1c8"},{"name":"Pearl Necklace","hex":"#fcf7eb"},{"name":"Pearl Oyster","hex":"#ddd6cb"},{"name":"Pearl Sugar","hex":"#f4f1eb"},{"name":"Pearl White","hex":"#f3f2ed"},{"name":"Pearled Couscous","hex":"#f2e9d5"},{"name":"Pearled Ivory","hex":"#f0dfcc"},{"name":"Pearls and Lace","hex":"#eee7dc"},{"name":"Pearly Flesh","hex":"#f4e3df"},{"name":"Pearly Purple","hex":"#b768a2"},{"name":"Pearly Putty","hex":"#dbd3bd"},{"name":"Pearly Star","hex":"#e4e4da"},{"name":"Pearly Swirly","hex":"#eee9d8"},{"name":"Peas in a Pod","hex":"#7b9459"},{"name":"Peas Please","hex":"#8c7f3c"},{"name":"Peaslake","hex":"#8caa95"},{"name":"Peat","hex":"#766d52"},{"name":"Peat Swamp Forest","hex":"#988c75"},{"name":"Peaty Brown","hex":"#552211"},{"name":"Pebble","hex":"#9d9880"},{"name":"Pebble Beach","hex":"#7f8285"},{"name":"Pebble Walk","hex":"#afb2a7"},{"name":"Pecan Brown","hex":"#a36e51"},{"name":"Pecan Sandie","hex":"#f4decb"},{"name":"Pecan Veneer","hex":"#e09f78"},{"name":"Pedestrian Lemon","hex":"#ffff22"},{"name":"Pedigree","hex":"#31646e"},{"name":"Peekaboo","hex":"#e6dee6"},{"name":"Peeled Asparagus","hex":"#87a96b"},{"name":"Pegasus","hex":"#e8e9e4"},{"name":"Pekin Chicken","hex":"#f5d2ac"},{"name":"Pelagic","hex":"#355d83"},{"name":"Pelati","hex":"#ff3333"},{"name":"Pelican","hex":"#c1bcac"},{"name":"Pelican Bill","hex":"#d7c0c7"},{"name":"Pelican Feather","hex":"#e8c3c2"},{"name":"Pelican Pecker","hex":"#fb9a30"},{"name":"Pelican Pink","hex":"#e2a695"},{"name":"Pelorus","hex":"#2599b2"},{"name":"Pencil Eraser","hex":"#dbb7bb"},{"name":"Pencil Lead","hex":"#5c6274"},{"name":"Penelope Pink","hex":"#9d6984"},{"name":"Penna","hex":"#b9c8e0"},{"name":"Pensive","hex":"#c2c1cb"},{"name":"Pensive Pink","hex":"#eab6ad"},{"name":"Pentagon","hex":"#96ccd1"},{"name":"Pentalon","hex":"#dbb2bc"},{"name":"Penzance","hex":"#627e75"},{"name":"Peony","hex":"#ed9ca8"},{"name":"People's Choice","hex":"#b6a8d0"},{"name":"Pepper Green","hex":"#007d60"},{"name":"Pepper Jelly","hex":"#cc2244"},{"name":"Pepperberry","hex":"#c79d9b"},{"name":"Peppercorn","hex":"#6c5656"},{"name":"Peppercorn Rent","hex":"#4f4337"},{"name":"Peppered Moss","hex":"#807548"},{"name":"Peppered Pecan","hex":"#957d6f"},{"name":"Peppermint","hex":"#d7e7d0"},{"name":"Peppermint Bar","hex":"#81bca8"},{"name":"Peppermint Fresh","hex":"#64be9f"},{"name":"Peppermint Frosting","hex":"#b8ffeb"},{"name":"Peppermint Patty","hex":"#d1e6d5"},{"name":"Peppermint Pie","hex":"#aac7c1"},{"name":"Peppermint Twist","hex":"#96ced5"},{"name":"Pepperoni","hex":"#aa4400"},{"name":"Peppy","hex":"#72d7b7"},{"name":"Peppy Pineapple","hex":"#ffff44"},{"name":"Peptalk","hex":"#0060a6"},{"name":"Pêra Rocha","hex":"#a3ce27"},{"name":"Perano","hex":"#acb9e8"},{"name":"Percale","hex":"#f0e8dd"},{"name":"Perdu Pink","hex":"#c1ada9"},{"name":"Perennial Phlox","hex":"#e6a7ac"},{"name":"Perfect Dark","hex":"#313390"},{"name":"Perfect Ocean","hex":"#3062a0"},{"name":"Perfect Pear","hex":"#e9e8bb"},{"name":"Perfect Pink","hex":"#e5b3b2"},{"name":"Perfect Solution","hex":"#f2edd7"},{"name":"Perfectly Purple","hex":"#694878"},{"name":"Perfume","hex":"#c2a9db"},{"name":"Perfume Cloud","hex":"#e2c9ce"},{"name":"Perfume Haze","hex":"#f3e9f7"},{"name":"Pergament","hex":"#bfa58a"},{"name":"Pericallis Hybrida","hex":"#904fef"},{"name":"Peridot","hex":"#e6e200"},{"name":"Periglacial Blue","hex":"#acb6b2"},{"name":"Périgord Truffle","hex":"#524a46"},{"name":"Periscope","hex":"#52677b"},{"name":"Periwinkle","hex":"#8e82fe"},{"name":"Periwinkle Blue","hex":"#8f99fb"},{"name":"Periwinkle Dust","hex":"#c5d0e6"},{"name":"Periwinkle Grey","hex":"#c3cde6"},{"name":"Periwinkle Powder","hex":"#c5cbe1"},{"name":"Periwinkle Tint","hex":"#d3ddd6"},{"name":"Perk Up","hex":"#d6c7be"},{"name":"Perky","hex":"#408e7c"},{"name":"Permafrost","hex":"#98eff9"},{"name":"Permanent Geranium Lake","hex":"#e12c2c"},{"name":"Perplexed","hex":"#bdb3c3"},{"name":"Perrigloss Tan","hex":"#ddaa99"},{"name":"Perrywinkle","hex":"#8f8ce7"},{"name":"Perseverance","hex":"#acb3c7"},{"name":"Persian Bazaar","hex":"#c5988c"},{"name":"Persian Belt","hex":"#99ac4b"},{"name":"Persian Blinds","hex":"#e3e1cc"},{"name":"Persian Blue","hex":"#1c39bb"},{"name":"Persian Fable","hex":"#d4ebdd"},{"name":"Persian Flatbread","hex":"#e1c7a8"},{"name":"Persian Green","hex":"#00a693"},{"name":"Persian Indigo","hex":"#32127a"},{"name":"Persian Jewel","hex":"#6e81be"},{"name":"Persian Orange","hex":"#d99058"},{"name":"Persian Pastel","hex":"#aa9499"},{"name":"Persian Pink","hex":"#f77fbe"},{"name":"Persian Plum","hex":"#701c1c"},{"name":"Persian Plush","hex":"#575b93"},{"name":"Persian Prince","hex":"#38343e"},{"name":"Persian Red","hex":"#cc3333"},{"name":"Persian Rose","hex":"#fe28a2"},{"name":"Persian Violet","hex":"#8c8eb2"},{"name":"Persicus","hex":"#ffb49b"},{"name":"Persimmon","hex":"#e59b34"},{"name":"Persimmon Fade","hex":"#f7bd8f"},{"name":"Persimmon Juice","hex":"#934337"},{"name":"Persimmon Orange","hex":"#f47327"},{"name":"Persimmon Varnish","hex":"#9f563a"},{"name":"Perspective","hex":"#cebeda"},{"name":"Persuasion","hex":"#c4ae96"},{"name":"Peru","hex":"#cd853f"},{"name":"Peruvian Lily","hex":"#cd7db5"},{"name":"Peruvian Soil","hex":"#733d1f"},{"name":"Pervenche","hex":"#0099ee"},{"name":"Pesto","hex":"#c1b23e"},{"name":"Pesto Alla Genovese","hex":"#558800"},{"name":"Petal Dust","hex":"#f4dfcd"},{"name":"Petal Pink","hex":"#f2e2e0"},{"name":"Petal Plush","hex":"#ddaaee"},{"name":"Petal Purple","hex":"#53465d"},{"name":"Peter Pan","hex":"#19a700"},{"name":"Petit Four","hex":"#87c2d4"},{"name":"Petite Orchid","hex":"#da9790"},{"name":"Petite Pink","hex":"#eacacb"},{"name":"Petite Purple","hex":"#cfbbd8"},{"name":"Petrel","hex":"#4076b4"},{"name":"Petrified Oak","hex":"#8d7960"},{"name":"Petrol","hex":"#005f6a"},{"name":"Petticoat","hex":"#fecdac"},{"name":"Petula","hex":"#ffbab0"},{"name":"Petunia","hex":"#4f3466"},{"name":"Pewter","hex":"#91a092"},{"name":"Pewter Blue","hex":"#8ba8b7"},{"name":"Pewter Grey","hex":"#a7a19e"},{"name":"Pewter Mug","hex":"#8b8283"},{"name":"Pewter Patter","hex":"#bab4a6"},{"name":"Peyote","hex":"#c5bbae"},{"name":"Phantom","hex":"#6e797b"},{"name":"Phantom Green","hex":"#dce4d7"},{"name":"Phantom Hue","hex":"#645d5e"},{"name":"Phantom Mist","hex":"#4b4441"},{"name":"Pharaoh's Gem","hex":"#007367"},{"name":"Pharaoh's Jade","hex":"#83d1a9"},{"name":"Pharaoh's Seas","hex":"#59bbc2"},{"name":"Pharlap","hex":"#826663"},{"name":"Pharmacy Green","hex":"#005500"},{"name":"Phaser Beam","hex":"#ff4d00"},{"name":"Pheasant","hex":"#c68463"},{"name":"Pheasant Brown","hex":"#795435"},{"name":"Phellodendron Amurense","hex":"#f3c13a"},{"name":"Phenomenon","hex":"#3e729b"},{"name":"Philippine Blue","hex":"#0038a7"},{"name":"Philippine Bronze","hex":"#6e3a07"},{"name":"Philippine Brown","hex":"#5d1916"},{"name":"Philippine Gold","hex":"#b17304"},{"name":"Philippine Golden Yellow","hex":"#eebb00"},{"name":"Philippine Green","hex":"#008543"},{"name":"Philippine Orange","hex":"#ff7300"},{"name":"Philippine Pink","hex":"#fa1a8e"},{"name":"Philippine Red","hex":"#ce1127"},{"name":"Philippine Violet","hex":"#81007f"},{"name":"Philippine Yellow","hex":"#fecb00"},{"name":"Phlox","hex":"#df00ff"},{"name":"Phlox Pink","hex":"#ce5e9a"},{"name":"Phoenix Fossil","hex":"#f8d99e"},{"name":"Phoenix Red","hex":"#e2725b"},{"name":"Phoenix Rising","hex":"#d2813a"},{"name":"Phoenix Villa","hex":"#f7efde"},{"name":"Phosphor Green","hex":"#00aa00"},{"name":"Phosphorescent Blue","hex":"#11eeee"},{"name":"Phosphorescent Green","hex":"#11ff00"},{"name":"Phosphorus","hex":"#a5d0c6"},{"name":"Photo Grey","hex":"#aead96"},{"name":"Photon White","hex":"#f8f8e8"},{"name":"PHP Purple","hex":"#8892bf"},{"name":"Phthalo Blue","hex":"#000f89"},{"name":"Phthalo Green","hex":"#123524"},{"name":"Phuket Palette","hex":"#0480bd"},{"name":"Physalis","hex":"#ef9548"},{"name":"Physalis Peal","hex":"#e1d8bb"},{"name":"Pianissimo","hex":"#e6d0ca"},{"name":"Piano Keys","hex":"#eee5d4"},{"name":"Picador","hex":"#765c52"},{"name":"Picante","hex":"#8d3f2d"},{"name":"Picasso","hex":"#f8ea97"},{"name":"Picasso Lily","hex":"#634878"},{"name":"Piccolo","hex":"#8bd2e2"},{"name":"Picket Fence","hex":"#f3f2ea"},{"name":"Pickford","hex":"#c9f0d1"},{"name":"Pickle Juice","hex":"#bba528"},{"name":"Pickled","hex":"#b3a74b"},{"name":"Pickled Bean","hex":"#6e4826"},{"name":"Pickled Beet","hex":"#4d233d"},{"name":"Pickled Bluewood","hex":"#314459"},{"name":"Pickled Cucumber","hex":"#94a135"},{"name":"Pickled Okra","hex":"#887647"},{"name":"Pickled Plum","hex":"#8e4785"},{"name":"Pickled Purple","hex":"#8e7aa1"},{"name":"Pickling Spice","hex":"#cfd2b5"},{"name":"Picnic Bay","hex":"#bcdbd4"},{"name":"Picnic Day Sky","hex":"#00ccee"},{"name":"Pico Earth","hex":"#ab5236"},{"name":"Pico Eggplant","hex":"#7e2553"},{"name":"Pico Ivory","hex":"#fff1e8"},{"name":"Pico Metal","hex":"#c2c3c7"},{"name":"Pico Orange","hex":"#ffa300"},{"name":"Pico Sun","hex":"#ffec27"},{"name":"Pico Void","hex":"#1d2b53"},{"name":"Pico-8 Pink","hex":"#ff77a8"},{"name":"Picton Blue","hex":"#5ba0d0"},{"name":"Pictorial Carmine","hex":"#c30b4e"},{"name":"Picture Book Green","hex":"#00804c"},{"name":"Pie Safe","hex":"#877a64"},{"name":"Pied Wagtail Grey","hex":"#bebdc2"},{"name":"Pier 17 Steel","hex":"#647d8e"},{"name":"Piercing Pink","hex":"#dd00ee"},{"name":"Piercing Red","hex":"#dd1122"},{"name":"Piezo Blue","hex":"#a1c8db"},{"name":"Pig Iron","hex":"#484848"},{"name":"Pig Pink","hex":"#fdd7e4"},{"name":"Pigeon","hex":"#a9afaa"},{"name":"Pigeon Grey","hex":"#c1b4a0"},{"name":"Pigeon Pink","hex":"#9d857f"},{"name":"Pigeon Post","hex":"#afbdd9"},{"name":"Piggy","hex":"#ef98aa"},{"name":"Piglet","hex":"#ffc0c6"},{"name":"Pigment Indigo","hex":"#4d0082"},{"name":"Pigskin Puffball","hex":"#e8dad1"},{"name":"Pika Yellow","hex":"#eee92d"},{"name":"Pike Lake","hex":"#6c7779"},{"name":"Pikkoro Green","hex":"#15b01a"},{"name":"Pīlā Yellow","hex":"#ffff55"},{"name":"Pilsener","hex":"#f8f753"},{"name":"Piment Piquant","hex":"#cc2200"},{"name":"Pimlico","hex":"#df9e9d"},{"name":"Pimm's","hex":"#c3585c"},{"name":"Pinafore Blue","hex":"#7198c0"},{"name":"Pinball","hex":"#d3d3d3"},{"name":"Pinch Me","hex":"#c88ca4"},{"name":"Pinch of Pearl","hex":"#fff8e3"},{"name":"Pinch of Pistachio","hex":"#ddddcc"},{"name":"Pinch Purple","hex":"#b4abaf"},{"name":"Pincushion","hex":"#ac989c"},{"name":"Pindjur Red","hex":"#bb4411"},{"name":"Pine","hex":"#2b5d34"},{"name":"Pine Bark","hex":"#827064"},{"name":"Pine Cone","hex":"#61473b"},{"name":"Pine Crush","hex":"#b7b8a5"},{"name":"Pine Forest","hex":"#415241"},{"name":"Pine Frost","hex":"#deeae0"},{"name":"Pine Garland","hex":"#797e65"},{"name":"Pine Glade","hex":"#bdc07e"},{"name":"Pine Grain","hex":"#ebc79e"},{"name":"Pine Green","hex":"#0a481e"},{"name":"Pine Grove","hex":"#213631"},{"name":"Pine Haven","hex":"#486358"},{"name":"Pine Hutch","hex":"#ecdbd2"},{"name":"Pine Leaves","hex":"#839b5c"},{"name":"Pine Mist","hex":"#d5d8bc"},{"name":"Pine Needle","hex":"#334d41"},{"name":"Pine Nut","hex":"#eadac2"},{"name":"Pine Ridge","hex":"#6d9185"},{"name":"Pine Strain","hex":"#d5bfa5"},{"name":"Pine Trail","hex":"#9c9f75"},{"name":"Pine Tree","hex":"#2a2f23"},{"name":"Pine Water","hex":"#e5e7d5"},{"name":"Pine Whisper","hex":"#b3c6b9"},{"name":"Pineal Pink","hex":"#786d72"},{"name":"Pineapple","hex":"#563c0d"},{"name":"Pineapple Blossom","hex":"#b4655c"},{"name":"Pineapple Delight","hex":"#f0e7a9"},{"name":"Pineapple Perfume","hex":"#eeee88"},{"name":"Pineapple Sage","hex":"#9c8f60"},{"name":"Pineapple Slice","hex":"#e7d391"},{"name":"Pineapple Soda","hex":"#e4e5ce"},{"name":"Pineapple Sorbet","hex":"#f7f4da"},{"name":"Pineberry","hex":"#f0d6dd"},{"name":"Pinebrook","hex":"#5d695a"},{"name":"Pinehurst","hex":"#2b7b66"},{"name":"Pinetop","hex":"#57593f"},{"name":"Píng Gǔo Lǜ Green","hex":"#23c48b"},{"name":"Pink","hex":"#ffc0cb"},{"name":"Pink and Sleek","hex":"#ffc3c6"},{"name":"Pink Apatite","hex":"#d7b8ab"},{"name":"Pink Bite","hex":"#e936a7"},{"name":"Pink Blush","hex":"#f4acb6"},{"name":"Pink Booties","hex":"#efe1e4"},{"name":"Pink Bubble Tea","hex":"#fdbac4"},{"name":"Pink Cardoon","hex":"#ecc9ca"},{"name":"Pink Carnation","hex":"#ed7a9e"},{"name":"Pink Cattleya","hex":"#ffb2d0"},{"name":"Pink Chablis","hex":"#f4ded9"},{"name":"Pink Chalk","hex":"#f2a3bd"},{"name":"Pink Charge","hex":"#dd66bb"},{"name":"Pink Chi","hex":"#e4898a"},{"name":"Pink Clay","hex":"#ffd5d1"},{"name":"Pink Clay Pot","hex":"#d99294"},{"name":"Pink Cupcake","hex":"#f5d0d6"},{"name":"Pink Currant","hex":"#fed5e9"},{"name":"Pink Dahlia","hex":"#b94c66"},{"name":"Pink Dazzle","hex":"#c97376"},{"name":"Pink Delight","hex":"#ff8ad8"},{"name":"Pink Diamond","hex":"#fed0fc"},{"name":"Pink Discord","hex":"#b499a1"},{"name":"Pink Dogwood","hex":"#f7d1d1"},{"name":"Pink Dream","hex":"#fea5a2"},{"name":"Pink Dust","hex":"#e4b5b2"},{"name":"Pink Earth","hex":"#b08272"},{"name":"Pink Fetish","hex":"#dd77ff"},{"name":"Pink Fever","hex":"#cc55ff"},{"name":"Pink Fire","hex":"#fc845d"},{"name":"Pink Flambe","hex":"#d3507a"},{"name":"Pink Flamingo","hex":"#ff66ff"},{"name":"Pink Flare","hex":"#d8b4b6"},{"name":"Pink Floyd","hex":"#eb9a9d"},{"name":"Pink Fluorite","hex":"#fbd3d9"},{"name":"Pink Frosting","hex":"#f7d7e2"},{"name":"Pink Garnet","hex":"#d2738f"},{"name":"Pink Gin","hex":"#dfa3ba"},{"name":"Pink Glamour","hex":"#ff787b"},{"name":"Pink Glow","hex":"#ffece0"},{"name":"Pink Grapefruit","hex":"#f3bac9"},{"name":"Pink Horror","hex":"#90305d"},{"name":"Pink Ice","hex":"#cf9fa9"},{"name":"Pink Icing","hex":"#eea0a6"},{"name":"Pink Illusion","hex":"#d8b8f8"},{"name":"Pink Ink","hex":"#ff1476"},{"name":"Pink Insanity","hex":"#cc44ff"},{"name":"Pink Jazz","hex":"#9e6b89"},{"name":"Pink Katydid","hex":"#ff55aa"},{"name":"Pink Lace","hex":"#f6ccd7"},{"name":"Pink Lady","hex":"#f3d7b6"},{"name":"Pink Lavender","hex":"#d9afca"},{"name":"Pink Lemonade","hex":"#ffeaeb"},{"name":"Pink Lily","hex":"#f8d0e7"},{"name":"Pink Linen","hex":"#d2bfc4"},{"name":"Pink Lotus","hex":"#fadbd7"},{"name":"Pink Makeup","hex":"#fc80a5"},{"name":"Pink Manhattan","hex":"#c16c7b"},{"name":"Pink Marble","hex":"#e5d0ca"},{"name":"Pink Mist","hex":"#e6bccd"},{"name":"Pink Moroccan","hex":"#a98981"},{"name":"Pink Nectar","hex":"#d8aab7"},{"name":"Pink OCD","hex":"#6844fc"},{"name":"Pink Orange","hex":"#ff9066"},{"name":"Pink Orchid","hex":"#da70d6"},{"name":"Pink Orchid Mantis","hex":"#fd82c3"},{"name":"Pink Orthoclase","hex":"#aa98a9"},{"name":"Pink Overflow","hex":"#ff33ff"},{"name":"Pink Pail","hex":"#eaced4"},{"name":"Pink Pampas","hex":"#d1b6c3"},{"name":"Pink Pandora","hex":"#e1c5c9"},{"name":"Pink Panther","hex":"#ff0090"},{"name":"Pink Papaya","hex":"#d5877e"},{"name":"Pink Parakeet","hex":"#ad546e"},{"name":"Pink Party","hex":"#ff55ee"},{"name":"Pink Peacock","hex":"#c62168"},{"name":"Pink Pearl","hex":"#e7accf"},{"name":"Pink Peony","hex":"#e1bed9"},{"name":"Pink Pepper","hex":"#c62d42"},{"name":"Pink Perfume","hex":"#ffdbe5"},{"name":"Pink Persimmon","hex":"#ffad97"},{"name":"Pink Petal","hex":"#f6e6e2"},{"name":"Pink Piano","hex":"#f62681"},{"name":"Pink Pieris","hex":"#efc9b8"},{"name":"Pink Pleasure","hex":"#ffdfe5"},{"name":"Pink Poison","hex":"#ff007e"},{"name":"Pink Polar","hex":"#ccbabe"},{"name":"Pink Poppy","hex":"#8e6e74"},{"name":"Pink Potion","hex":"#ceaebb"},{"name":"Pink Power","hex":"#d5b6cd"},{"name":"Pink Pride","hex":"#ef1de7"},{"name":"Pink Punch","hex":"#d04a70"},{"name":"Pink Purple","hex":"#db4bda"},{"name":"Pink Pussycat","hex":"#dc9f9f"},{"name":"Pink Quartz","hex":"#ffbbee"},{"name":"Pink Quince","hex":"#ab485b"},{"name":"Pink Raspberry","hex":"#980036"},{"name":"Pink Red","hex":"#f5054f"},{"name":"Pink Rose Bud","hex":"#feab9a"},{"name":"Pink Sachet","hex":"#eebcb8"},{"name":"Pink Salt","hex":"#f7cdc7"},{"name":"Pink Sand","hex":"#dfb19b"},{"name":"Pink Sangria","hex":"#f6dbd3"},{"name":"Pink Satin","hex":"#ffbbdd"},{"name":"Pink Scallop","hex":"#f2e0d4"},{"name":"Pink Shadow","hex":"#bb3377"},{"name":"Pink Sherbet","hex":"#f780a1"},{"name":"Pink Slip","hex":"#d58d8a"},{"name":"Pink Sparkle","hex":"#ffe9eb"},{"name":"Pink Spinel","hex":"#e7c9ca"},{"name":"Pink Spyro","hex":"#a328b3"},{"name":"Pink Stock","hex":"#ddabab"},{"name":"Pink Sugar","hex":"#eeaaff"},{"name":"Pink Swan","hex":"#bfb3b2"},{"name":"Pink Tease","hex":"#ff81c0"},{"name":"Pink Theory","hex":"#ffe6e4"},{"name":"Pink Tint","hex":"#dbcbbd"},{"name":"Pink Tulip","hex":"#985672"},{"name":"Pink Tulle","hex":"#deb59a"},{"name":"Pink Tutu","hex":"#f9e4e9"},{"name":"Pink Wink","hex":"#ffaaee"},{"name":"Pink Yarrow","hex":"#ce3175"},{"name":"Pink-N-Purple","hex":"#866180"},{"name":"Pinkalicious","hex":"#ff99ff"},{"name":"Pinkham","hex":"#e8c5ae"},{"name":"Pinkish","hex":"#d46a7e"},{"name":"Pinkish Brown","hex":"#b17261"},{"name":"Pinkish Grey","hex":"#c8aca9"},{"name":"Pinkish Orange","hex":"#ff724c"},{"name":"Pinkish Purple","hex":"#d648d7"},{"name":"Pinkish Red","hex":"#f10c45"},{"name":"Pinkish Tan","hex":"#d99b82"},{"name":"Pinktone","hex":"#f9ced1"},{"name":"Pinky","hex":"#fc86aa"},{"name":"Pinnacle","hex":"#beddd5"},{"name":"Pinot Noir","hex":"#605258"},{"name":"Pinwheel Geyser","hex":"#d2dcde"},{"name":"Pinyon Pine","hex":"#625a42"},{"name":"Pion Purple","hex":"#480840"},{"name":"Pioneer Village","hex":"#aa9076"},{"name":"Pipe","hex":"#857165"},{"name":"Pipe Clay","hex":"#cac7bc"},{"name":"Piper","hex":"#9d5432"},{"name":"Pipitschah","hex":"#f5e6c4"},{"name":"Pippin","hex":"#fcdbd2"},{"name":"Piquant Green","hex":"#769358"},{"name":"Piquant Pink","hex":"#ee00ee"},{"name":"Pirat's Wine","hex":"#71424a"},{"name":"Pirate Black","hex":"#363838"},{"name":"Pirate Gold","hex":"#ba782a"},{"name":"Pirate Plunder","hex":"#b1905e"},{"name":"Pirate Silver","hex":"#818988"},{"name":"Pirate's Haven","hex":"#005176"},{"name":"Pirate's Hook","hex":"#b08f42"},{"name":"Pirate's Trinket","hex":"#716970"},{"name":"Pisco Sour","hex":"#beeb71"},{"name":"Pistachio","hex":"#93c572"},{"name":"Pistachio Cream","hex":"#d5e2e1"},{"name":"Pistachio Flour","hex":"#4f8f00"},{"name":"Pistachio Green","hex":"#a9d39e"},{"name":"Pistachio Ice Cream","hex":"#a0b7ad"},{"name":"Pistachio Mousse","hex":"#c0fa8b"},{"name":"Pistachio Pudding","hex":"#c6d4ac"},{"name":"Pistachio Shell","hex":"#d7cfbb"},{"name":"Pistachio Tang","hex":"#d7d2b8"},{"name":"Pistou Green","hex":"#00bb55"},{"name":"Pit Stop","hex":"#414958"},{"name":"Pita Bread","hex":"#f5e7d2"},{"name":"Pitapat","hex":"#edeb9a"},{"name":"Pitch Black","hex":"#483c41"},{"name":"Pitch Mary Brown","hex":"#5c4033"},{"name":"Pitcher","hex":"#b5d1be"},{"name":"Pitter Patter","hex":"#9bc2bd"},{"name":"Pixel Cream","hex":"#f7d384"},{"name":"Pixel Nature","hex":"#008751"},{"name":"Pixelated Grass","hex":"#009337"},{"name":"Pixie Green","hex":"#bbcda5"},{"name":"Pixie Powder","hex":"#391285"},{"name":"Pixieland","hex":"#b4a6c6"},{"name":"Pizazz","hex":"#e57f3d"},{"name":"Pizza","hex":"#bf8d3c"},{"name":"Pizza Pie","hex":"#a06165"},{"name":"Placid Blue","hex":"#8cadd3"},{"name":"Plague Brown","hex":"#dfb900"},{"name":"Plain and Simple","hex":"#ebf0d6"},{"name":"Planet Green","hex":"#496a76"},{"name":"Planetarium","hex":"#1c70ad"},{"name":"Plantain","hex":"#97943b"},{"name":"Plantation","hex":"#3e594c"},{"name":"Plantation Island","hex":"#9b8a44"},{"name":"Plasma Trail","hex":"#d59cfc"},{"name":"Plaster Mix","hex":"#ead1a6"},{"name":"Plastic Veggie","hex":"#22ff22"},{"name":"Plasticine","hex":"#4a623b"},{"name":"Plate Mail Metal","hex":"#8c8589"},{"name":"Plateau","hex":"#d3e7e5"},{"name":"Platinum","hex":"#e5e4e2"},{"name":"Platinum Granite","hex":"#807f7e"},{"name":"Platinum Ogon Koi","hex":"#ece1d3"},{"name":"Platonic Blue","hex":"#88ccff"},{"name":"Platoon Green","hex":"#2a4845"},{"name":"Plaudit","hex":"#39536c"},{"name":"Play on Grey","hex":"#bab6a9"},{"name":"Play School","hex":"#ce5924"},{"name":"Playful Plum","hex":"#ba99a2"},{"name":"Playful Purple","hex":"#bfb9d5"},{"name":"Playing Hooky","hex":"#8b8c6b"},{"name":"Plaza Taupe","hex":"#aea393"},{"name":"Pleasant Pomegranate","hex":"#cc3300"},{"name":"Pleasing Pink","hex":"#f5cdd2"},{"name":"Pleasure","hex":"#80385c"},{"name":"Plein Air","hex":"#bfcad6"},{"name":"Ploughed Earth","hex":"#6c6459"},{"name":"Plum Blossom","hex":"#f2a0a1"},{"name":"Plum Blossom Dye","hex":"#b48a76"},{"name":"Plum Caspia","hex":"#61224a"},{"name":"Plum Crush","hex":"#716063"},{"name":"Plum Dust","hex":"#aa4c8f"},{"name":"Plum Fuzz","hex":"#313048"},{"name":"Plum Haze","hex":"#8b7574"},{"name":"Plum Jam","hex":"#624076"},{"name":"Plum Juice","hex":"#dea1dd"},{"name":"Plum Kitten","hex":"#625b5c"},{"name":"Plum Mouse","hex":"#c099a0"},{"name":"Plum Paradise","hex":"#aa1166"},{"name":"Plum Passion","hex":"#9b4b80"},{"name":"Plum Perfect","hex":"#aa1155"},{"name":"Plum Perfume","hex":"#a489a3"},{"name":"Plum Pie","hex":"#8e4585"},{"name":"Plum Point","hex":"#d4bddf"},{"name":"Plum Power","hex":"#7e5e8d"},{"name":"Plum Purple","hex":"#580f41"},{"name":"Plum Sauce","hex":"#6a3939"},{"name":"Plum Savor","hex":"#915d88"},{"name":"Plum Shade","hex":"#78738b"},{"name":"Plum Skin","hex":"#51304e"},{"name":"Plum Truffle","hex":"#675657"},{"name":"Plum Wine","hex":"#674550"},{"name":"Plumberry","hex":"#735054"},{"name":"Plumburn","hex":"#7d665f"},{"name":"Plume","hex":"#a5cfd5"},{"name":"Plume Grass","hex":"#d9d5c5"},{"name":"Plumosa","hex":"#64a281"},{"name":"Plumville","hex":"#9e8185"},{"name":"Plunder","hex":"#5072a9"},{"name":"Plunge","hex":"#035568"},{"name":"Plunge Pool","hex":"#656457"},{"name":"Plunging Waterfall","hex":"#8cd4df"},{"name":"Plush","hex":"#3b3549"},{"name":"Plush Purple","hex":"#5d4a61"},{"name":"Plush Suede","hex":"#b1928c"},{"name":"Plushy Pink","hex":"#eab7a8"},{"name":"Pluto","hex":"#34acb1"},{"name":"Plutonium","hex":"#35fa00"},{"name":"Plymouth Grey","hex":"#b0b1ac"},{"name":"Poached","hex":"#f5d893"},{"name":"Poached Rainbow Trout","hex":"#ff8552"},{"name":"Pochard Duck Head","hex":"#ee9977"},{"name":"Poetic Green","hex":"#00a844"},{"name":"Poetic License","hex":"#e4e8e1"},{"name":"Poetic Yellow","hex":"#fffed7"},{"name":"Pogo Sands","hex":"#ece4d2"},{"name":"Pohutukawa","hex":"#651c26"},{"name":"Poinciana","hex":"#ca3422"},{"name":"Poinsettia","hex":"#cb3441"},{"name":"Pointed Rock","hex":"#646767"},{"name":"Poise","hex":"#a77693"},{"name":"Poised Peach","hex":"#ffa99d"},{"name":"Poison Green","hex":"#40fd14"},{"name":"Poison Ivy","hex":"#00ad43"},{"name":"Poison Purple","hex":"#7f01fe"},{"name":"Poisoning Green","hex":"#66ff11"},{"name":"Poisonous Apple","hex":"#993333"},{"name":"Poisonous Dart","hex":"#77ff66"},{"name":"Poker Green","hex":"#35654d"},{"name":"Polar","hex":"#e5f2e7"},{"name":"Polar Bear","hex":"#eae9e0"},{"name":"Polar Ice","hex":"#71a6d2"},{"name":"Polar Mist","hex":"#adafbd"},{"name":"Polaris","hex":"#a0aead"},{"name":"Polenta","hex":"#efc47f"},{"name":"Police Blue","hex":"#374f6b"},{"name":"Polignac","hex":"#c28799"},{"name":"Polished Aqua","hex":"#77bcb6"},{"name":"Polished Bronze","hex":"#cd7f32"},{"name":"Polished Brown","hex":"#985538"},{"name":"Polished Copper","hex":"#b66325"},{"name":"Polished Garnet","hex":"#953640"},{"name":"Polished Gold","hex":"#bdd043"},{"name":"Polished Limestone","hex":"#dcd5c8"},{"name":"Polished Metal","hex":"#819ab1"},{"name":"Polished Pewter","hex":"#9c9a99"},{"name":"Polished Pine","hex":"#5da493"},{"name":"Polished Pink","hex":"#fff2ef"},{"name":"Polished Silver","hex":"#c5d1da"},{"name":"Polished Steel","hex":"#6f828a"},{"name":"Polished Stone","hex":"#beb49e"},{"name":"Polka Dot Plum","hex":"#5a4458"},{"name":"Pollen","hex":"#eeeeaa"},{"name":"Pollinate","hex":"#e3d6bc"},{"name":"Pollination","hex":"#b8a02a"},{"name":"Polly","hex":"#ffcaa4"},{"name":"Polo Blue","hex":"#8aa7cc"},{"name":"Polo Pony","hex":"#d09258"},{"name":"Polo Tan","hex":"#f4e5dd"},{"name":"Polyanthus Narcissus","hex":"#feffcc"},{"name":"Pomegranate","hex":"#c35550"},{"name":"Pomegranate Tea","hex":"#ab6f73"},{"name":"Pomodoro","hex":"#c30232"},{"name":"Pomp and Power","hex":"#87608e"},{"name":"Pompadour","hex":"#6a1f44"},{"name":"Pompeian Pink","hex":"#c87763"},{"name":"Pompeian Red","hex":"#a4292e"},{"name":"Pompeii Ash","hex":"#6c757d"},{"name":"Pompeii Ruins","hex":"#5e615b"},{"name":"Pompeius Blue","hex":"#77a8ab"},{"name":"Pompelmo","hex":"#ff6666"},{"name":"Pomtini","hex":"#ca93c1"},{"name":"Ponceau","hex":"#f75c75"},{"name":"Pond Bath","hex":"#00827f"},{"name":"Pond Blue","hex":"#8bb6c6"},{"name":"Pond Moss","hex":"#01796f"},{"name":"Pond Newt","hex":"#486b67"},{"name":"Ponderosa Pine","hex":"#203b3d"},{"name":"Pont Moss","hex":"#5f9228"},{"name":"Pontoon","hex":"#0c608e"},{"name":"Pony","hex":"#c6aa81"},{"name":"Pony Express","hex":"#726a60"},{"name":"Pony Tail","hex":"#d2bc9b"},{"name":"Ponzu Brown","hex":"#220000"},{"name":"Poodle Skirt","hex":"#ffaebb"},{"name":"Poodle Skirt Peach","hex":"#ea927a"},{"name":"Pookie Bear","hex":"#824b2e"},{"name":"Pool Bar","hex":"#8fabbd"},{"name":"Pool Blue","hex":"#67bcb3"},{"name":"Pool Floor","hex":"#7daee1"},{"name":"Pool Green","hex":"#00af9d"},{"name":"Pool Party","hex":"#bee9e3"},{"name":"Pool Side","hex":"#aad5d9"},{"name":"Pool Tiles","hex":"#89cff0"},{"name":"Pop Shop","hex":"#93d4c0"},{"name":"Popcorn","hex":"#f8de8d"},{"name":"Poplar","hex":"#a29f46"},{"name":"Poplar Kitten","hex":"#ece9e9"},{"name":"Poppy Crepe","hex":"#fbe9d8"},{"name":"Poppy Flower","hex":"#ec5800"},{"name":"Poppy Leaf","hex":"#88a496"},{"name":"Poppy Petal","hex":"#f6a08c"},{"name":"Poppy Pods","hex":"#736157"},{"name":"Poppy Pompadour","hex":"#6b3fa0"},{"name":"Poppy Power","hex":"#ed2939"},{"name":"Poppy Red","hex":"#dc343b"},{"name":"Popstar","hex":"#be4f62"},{"name":"Porcelain","hex":"#dddcdb"},{"name":"Porcelain Basin","hex":"#d9d0c4"},{"name":"Porcelain Blue","hex":"#95c0cb"},{"name":"Porcelain Crab","hex":"#e9b7a8"},{"name":"Porcelain Earth","hex":"#eeffbb"},{"name":"Porcelain Figurines","hex":"#a9998c"},{"name":"Porcelain Green","hex":"#108780"},{"name":"Porcelain Jasper","hex":"#dfe2e4"},{"name":"Porcelain Pink","hex":"#ecd9b9"},{"name":"Porcelain Rose","hex":"#ea6b6a"},{"name":"Porcelain Skin","hex":"#ffe7eb"},{"name":"Porcelain Tan","hex":"#f7d8c4"},{"name":"Porcellana","hex":"#ffbfab"},{"name":"Porch Swing","hex":"#597175"},{"name":"Porcini","hex":"#cca580"},{"name":"Porcupine Needles","hex":"#917a75"},{"name":"Pork Belly","hex":"#f8e0e7"},{"name":"Porous Stone","hex":"#d4cebf"},{"name":"Porpita Porpita","hex":"#2792c3"},{"name":"Porpoise","hex":"#dbdbda"},{"name":"Porpoise Fin","hex":"#c8cbcd"},{"name":"Porpoise Place","hex":"#076a7e"},{"name":"Porsche","hex":"#df9d5b"},{"name":"Port","hex":"#663336"},{"name":"Port Au Prince","hex":"#006a93"},{"name":"Port Glow","hex":"#54383b"},{"name":"Port Gore","hex":"#3b436c"},{"name":"Port Hope","hex":"#54c3c1"},{"name":"Port Malmesbury","hex":"#0e4d4e"},{"name":"Port Royale","hex":"#502b33"},{"name":"Port Wine","hex":"#a17a83"},{"name":"Port Wine Stain","hex":"#85677b"},{"name":"Portabella","hex":"#937b6a"},{"name":"Portage","hex":"#8b98d8"},{"name":"Portica","hex":"#f0d555"},{"name":"Portland Orange","hex":"#ff5a36"},{"name":"Portobello","hex":"#a28c82"},{"name":"Portobello Mushroom","hex":"#9d928a"},{"name":"Portofino","hex":"#f4f09b"},{"name":"Portrait Pink","hex":"#c6b4a9"},{"name":"Poseidon","hex":"#123955"},{"name":"Poseidon Jr.","hex":"#66eeee"},{"name":"Posey Blue","hex":"#a5b4c6"},{"name":"Positively Palm","hex":"#76745d"},{"name":"Possessed Plum","hex":"#773355"},{"name":"Post Boy","hex":"#7a99ad"},{"name":"Post It","hex":"#0074b4"},{"name":"Post Yellow","hex":"#ffee01"},{"name":"Postwar Boom","hex":"#466f97"},{"name":"Posy Green","hex":"#325b51"},{"name":"Posy Petal","hex":"#f3879c"},{"name":"Pot Black","hex":"#161616"},{"name":"Potash","hex":"#e07757"},{"name":"Potent Purple","hex":"#462639"},{"name":"Potpourri","hex":"#f1e0db"},{"name":"Potted Plant","hex":"#9ecca7"},{"name":"Potter's Pink","hex":"#c2937b"},{"name":"Potters Pot","hex":"#845c40"},{"name":"Pottery Blue","hex":"#54a6c2"},{"name":"Pottery Clay","hex":"#b9714a"},{"name":"Potting Soil","hex":"#54392d"},{"name":"Poudretteite Pink","hex":"#e68e96"},{"name":"Pound Sterling","hex":"#818081"},{"name":"Pouring Copper","hex":"#fb9b82"},{"name":"Pout Pink","hex":"#ff82ce"},{"name":"Pouty Purple","hex":"#e7d7ef"},{"name":"Powder Ash","hex":"#bcc9c2"},{"name":"Powder Blue","hex":"#b0e0e6"},{"name":"Powder Dust","hex":"#b7b7bc"},{"name":"Powder Mill","hex":"#9cb3b5"},{"name":"Powder Pink","hex":"#fdd6e5"},{"name":"Powder Puff","hex":"#ffeff3"},{"name":"Powder Puff Pink","hex":"#ffcebe"},{"name":"Powder Rose","hex":"#f5b3bc"},{"name":"Powdered","hex":"#f9f2e7"},{"name":"Powdered Brick","hex":"#ac9b9b"},{"name":"Powdered Coffee","hex":"#a0450e"},{"name":"Powdered Granite","hex":"#c3c9e6"},{"name":"Powdered Green Tea","hex":"#c5c56a"},{"name":"Powdered Gum","hex":"#a0b0a4"},{"name":"Powdered Petals","hex":"#e3c7c6"},{"name":"Power Peony","hex":"#ee5588"},{"name":"Powered Rock","hex":"#bbb7ab"},{"name":"Practical Tan","hex":"#e1cbb6"},{"name":"Pragmatic","hex":"#c2a593"},{"name":"Prairie Clay","hex":"#935444"},{"name":"Prairie Dog","hex":"#937067"},{"name":"Prairie Dune","hex":"#fbd5bd"},{"name":"Prairie Dusk","hex":"#cec5ad"},{"name":"Prairie Dust","hex":"#b9ab8f"},{"name":"Prairie Fire","hex":"#996e5a"},{"name":"Prairie Green","hex":"#50a400"},{"name":"Prairie Grove","hex":"#8e7d5d"},{"name":"Prairie Land","hex":"#e2cc9c"},{"name":"Prairie Sage","hex":"#b3a98c"},{"name":"Prairie Sand","hex":"#883c32"},{"name":"Prairie Sun","hex":"#eea372"},{"name":"Prairie Sunset","hex":"#ffbb9e"},{"name":"Prairie Winds","hex":"#e8e6d9"},{"name":"Praise the Sun","hex":"#f3f4d9"},{"name":"Praline","hex":"#ad8b75"},{"name":"Prancer","hex":"#c58380"},{"name":"Praxeti White","hex":"#01b44c"},{"name":"Prayer Flag","hex":"#d59c6a"},{"name":"Praying Mantis","hex":"#a5be8f"},{"name":"Pre School","hex":"#b5c2cd"},{"name":"Pre-Raphaelite","hex":"#8b7f7a"},{"name":"Precious Blue","hex":"#008389"},{"name":"Precious Nectar","hex":"#ffde9c"},{"name":"Precious Oxley ","hex":"#6d9a79"},{"name":"Precious Pearls","hex":"#f1f0ef"},{"name":"Precious Pink","hex":"#f6b5b6"},{"name":"Precision","hex":"#2c3944"},{"name":"Prediction","hex":"#6d6e7b"},{"name":"Prefect","hex":"#5772b0"},{"name":"Prehistoric Meteor","hex":"#ee2211"},{"name":"Prehistoric Stone","hex":"#9aa0a3"},{"name":"Prelude","hex":"#dfebee"},{"name":"Preserve","hex":"#4a3c50"},{"name":"Presidential","hex":"#3e4d59"},{"name":"Presidio Peach","hex":"#ec9580"},{"name":"Presidio Plaza","hex":"#bb9174"},{"name":"Presley Purple","hex":"#634875"},{"name":"Press Agent","hex":"#606b77"},{"name":"Pressed Laser Lemon","hex":"#fefe22"},{"name":"Prestige Blue","hex":"#303742"},{"name":"Prestige Green","hex":"#154647"},{"name":"Presumption","hex":"#5e6277"},{"name":"Pretty in Pink","hex":"#fabfe4"},{"name":"Pretty in Plum","hex":"#cc5588"},{"name":"Pretty Lady","hex":"#c3a1b6"},{"name":"Pretty Maiden","hex":"#849457"},{"name":"Pretty Pale","hex":"#e3c6d6"},{"name":"Pretty Petunia","hex":"#d6b7e2"},{"name":"Pretty Pink","hex":"#ebb3b2"},{"name":"Pretty Please","hex":"#ffccc8"},{"name":"Pretty Primrose","hex":"#f5a994"},{"name":"Pretty Puce","hex":"#7b6065"},{"name":"Priceless Purple","hex":"#46373f"},{"name":"Prickly Pear Cactus","hex":"#69916e"},{"name":"Prim","hex":"#e2cdd5"},{"name":"Primal","hex":"#cba792"},{"name":"Primary Blue","hex":"#0804f9"},{"name":"Primavera","hex":"#6fa77a"},{"name":"Prime Blue","hex":"#0064a1"},{"name":"Prime Pink","hex":"#ff8d86"},{"name":"Primitive Plum","hex":"#663c55"},{"name":"Primo","hex":"#7cbc6c"},{"name":"Primrose","hex":"#d6859f"},{"name":"Primrose Garden","hex":"#f3949b"},{"name":"Primrose Path","hex":"#ffe262"},{"name":"Primrose Pink","hex":"#eed4d9"},{"name":"Primrose Yellow","hex":"#f6d155"},{"name":"Primula","hex":"#ca9fa5"},{"name":"Prince","hex":"#4b384c"},{"name":"Prince Royal","hex":"#60606f"},{"name":"Princely","hex":"#7d4961"},{"name":"Princely Violet","hex":"#6d5c7b"},{"name":"Princess Blue","hex":"#00539c"},{"name":"Princess Bride","hex":"#f4c1c1"},{"name":"Princess Elle","hex":"#f6e9ea"},{"name":"Princess Kate","hex":"#6599a4"},{"name":"Princess Peach Pink","hex":"#f878f8"},{"name":"Princess Perfume","hex":"#ff85cf"},{"name":"Princess Pink","hex":"#dfb5b0"},{"name":"Princeton Orange","hex":"#ff8f00"},{"name":"Priory","hex":"#756f54"},{"name":"Prism","hex":"#aadccd"},{"name":"Prism Pink","hex":"#f0a1bf"},{"name":"Prism Violet","hex":"#53357d"},{"name":"Prismatic Springs","hex":"#005c77"},{"name":"Prison Jumpsuit","hex":"#fdaa48"},{"name":"Pristine","hex":"#f2e8da"},{"name":"Pristine Petal","hex":"#d5e1e0"},{"name":"Private Eye","hex":"#006e89"},{"name":"Private Tone","hex":"#845469"},{"name":"Prize Winning Orchid","hex":"#cc9dc6"},{"name":"Professor Plum","hex":"#393540"},{"name":"Prom","hex":"#daa5aa"},{"name":"Prom Corsage","hex":"#e7c3e7"},{"name":"Promenade","hex":"#f8f6df"},{"name":"Prompt","hex":"#5e7fb5"},{"name":"Property","hex":"#4b5667"},{"name":"Prophetic Purple","hex":"#624f59"},{"name":"Prophetic Sea","hex":"#818b9c"},{"name":"Prosciutto","hex":"#e0b4a4"},{"name":"Prosecco","hex":"#fad6a5"},{"name":"Proton Red","hex":"#840804"},{"name":"Protoss Pylon","hex":"#00aaff"},{"name":"Provence","hex":"#658dc6"},{"name":"Provincial Blue","hex":"#5c798e"},{"name":"Provincial Pink","hex":"#f6e3da"},{"name":"Prudence","hex":"#d4c6db"},{"name":"Prune","hex":"#701c11"},{"name":"Prune Plum","hex":"#211640"},{"name":"Prune Purple","hex":"#5c3a4d"},{"name":"Prunelle","hex":"#220878"},{"name":"Prunus Avium","hex":"#dd4492"},{"name":"Prussian Blue","hex":"#003366"},{"name":"Psychedelic Purple","hex":"#dd00ff"},{"name":"Psychic","hex":"#625981"},{"name":"Pú Táo Zǐ Purple","hex":"#ce5dae"},{"name":"Puce","hex":"#cc8899"},{"name":"Puddle","hex":"#c8b69e"},{"name":"Puddle Jumper","hex":"#6a8389"},{"name":"Pueblo","hex":"#6e3326"},{"name":"Pueblo Rose","hex":"#e9786e"},{"name":"Pueblo White","hex":"#e5dfcd"},{"name":"Puerto Rico","hex":"#59baa3"},{"name":"Puff Dragon","hex":"#635940"},{"name":"Puffball","hex":"#ccbfc9"},{"name":"Puffins Bill","hex":"#e95c20"},{"name":"Pulled Taffy","hex":"#f1d6bc"},{"name":"Pullman Brown","hex":"#644117"},{"name":"Pullman Green","hex":"#3b331c"},{"name":"Pulp","hex":"#e18289"},{"name":"Puma","hex":"#96711c"},{"name":"Pumice","hex":"#bac0b4"},{"name":"Pumice Stone","hex":"#cac2b9"},{"name":"Pumpernickel Brown","hex":"#6c462d"},{"name":"Pumpkin","hex":"#ff7518"},{"name":"Pumpkin Bread","hex":"#d27d46"},{"name":"Pumpkin Cream","hex":"#e6c8a9"},{"name":"Pumpkin Orange","hex":"#fb7d07"},{"name":"Pumpkin Patch","hex":"#d59466"},{"name":"Pumpkin Pie","hex":"#e99e56"},{"name":"Pumpkin Seed","hex":"#fffdd8"},{"name":"Pumpkin Skin","hex":"#b1610b"},{"name":"Pumpkin Soup","hex":"#e17701"},{"name":"Pumpkin Spice","hex":"#a05c17"},{"name":"Punch","hex":"#dc4333"},{"name":"Punch of Yellow","hex":"#ecd086"},{"name":"Punch Out Glove","hex":"#6888fc"},{"name":"Punchit Purple","hex":"#56414d"},{"name":"Punctuate","hex":"#856b71"},{"name":"Punga","hex":"#534931"},{"name":"Punk Rock Pink","hex":"#8811ff"},{"name":"Puppeteers","hex":"#79ccb3"},{"name":"Puppy","hex":"#bcaea0"},{"name":"Puppy Love","hex":"#e2babf"},{"name":"Pure Apple","hex":"#6ab54b"},{"name":"Pure Black","hex":"#595652"},{"name":"Pure Blue","hex":"#0203e2"},{"name":"Pure Cashmere","hex":"#ada396"},{"name":"Pure Red","hex":"#d22d1d"},{"name":"Pure Zeal","hex":"#615753"},{"name":"Purebred","hex":"#67707d"},{"name":"Pureed Pumpkin","hex":"#c34121"},{"name":"Purification","hex":"#c3dce9"},{"name":"Puritan Grey","hex":"#a8b0ae"},{"name":"Purity","hex":"#d7c9e3"},{"name":"Purple","hex":"#800080"},{"name":"Purple Agate","hex":"#988eb4"},{"name":"Purple Amethyst","hex":"#9190ba"},{"name":"Purple Anemone","hex":"#8866ff"},{"name":"Purple Anxiety","hex":"#c20078"},{"name":"Purple Ash","hex":"#8f8395"},{"name":"Purple Balance","hex":"#9d9eb4"},{"name":"Purple Basil","hex":"#5c4450"},{"name":"Purple Berry","hex":"#4c4a74"},{"name":"Purple Blue","hex":"#661aee"},{"name":"Purple Brown","hex":"#673a3f"},{"name":"Purple cabbage","hex":"#3d34a5"},{"name":"Purple Chalk","hex":"#c4adc9"},{"name":"Purple Comet","hex":"#6e6970"},{"name":"Purple Corallite","hex":"#5a4e8f"},{"name":"Purple Cort","hex":"#593c50"},{"name":"Purple Crystal","hex":"#e7e7eb"},{"name":"Purple Daze","hex":"#63647e"},{"name":"Purple Door","hex":"#331144"},{"name":"Purple Dove","hex":"#98878c"},{"name":"Purple Dragon","hex":"#c6bedd"},{"name":"Purple Dreamer","hex":"#660066"},{"name":"Purple Dusk","hex":"#7c6b76"},{"name":"Purple Empire","hex":"#5a4d55"},{"name":"Purple Essence","hex":"#c2b1c8"},{"name":"Purple Feather","hex":"#594670"},{"name":"Purple Grapes","hex":"#736993"},{"name":"Purple Grey","hex":"#866f85"},{"name":"Purple Gumball","hex":"#6a6283"},{"name":"Purple Gumdrop","hex":"#7a596f"},{"name":"Purple Haze","hex":"#807396"},{"name":"Purple Heart","hex":"#69359c"},{"name":"Purple Heart Kiwi ","hex":"#cc2288"},{"name":"Purple Heather","hex":"#bab8d3"},{"name":"Purple Hepatica","hex":"#ccaaff"},{"name":"Purple Illusion","hex":"#b8b8f8"},{"name":"Purple Illusionist","hex":"#a675fe"},{"name":"Purple Impression","hex":"#858fb1"},{"name":"Purple Ink","hex":"#9a2ca0"},{"name":"Purple Kasbah","hex":"#73626f"},{"name":"Purple Kite","hex":"#512c31"},{"name":"Purple Lepidolite","hex":"#b88aac"},{"name":"Purple Magic","hex":"#663271"},{"name":"Purple Mountain Majesty","hex":"#7a70a8"},{"name":"Purple Mountains Majesty","hex":"#9678b6"},{"name":"Purple Mountains’ Majesty","hex":"#9d81ba"},{"name":"Purple Mystery","hex":"#815989"},{"name":"Purple Navy","hex":"#4e5180"},{"name":"Purple Odyssey","hex":"#643e65"},{"name":"Purple Opulence","hex":"#60569a"},{"name":"Purple Orchid","hex":"#ad4d8c"},{"name":"Purple Passion","hex":"#683d62"},{"name":"Purple Pennant","hex":"#432c47"},{"name":"Purple People Eater","hex":"#5b4763"},{"name":"Purple Pink","hex":"#c83cb9"},{"name":"Purple Pizzazz","hex":"#fe4eda"},{"name":"Purple Pj's","hex":"#c7cee8"},{"name":"Purple Plum","hex":"#9c51b6"},{"name":"Purple Plumeria","hex":"#473854"},{"name":"Purple Poodle","hex":"#dab4cc"},{"name":"Purple Pool","hex":"#4c4976"},{"name":"Purple Potion","hex":"#aa00aa"},{"name":"Purple Premiere","hex":"#b9a0d2"},{"name":"Purple Pride","hex":"#a274b5"},{"name":"Purple Prince","hex":"#5b4d54"},{"name":"Purple Prophet","hex":"#bb9eca"},{"name":"Purple Prose","hex":"#554348"},{"name":"Purple Punch","hex":"#696374"},{"name":"Purple Ragwort","hex":"#8c8798"},{"name":"Purple Rain","hex":"#7442c8"},{"name":"Purple Red","hex":"#990147"},{"name":"Purple Reign","hex":"#56456b"},{"name":"Purple Rhapsody","hex":"#8278ad"},{"name":"Purple Rose","hex":"#b09fca"},{"name":"Purple Sage","hex":"#75697e"},{"name":"Purple Sand","hex":"#c2b2f0"},{"name":"Purple Sapphire","hex":"#6f4685"},{"name":"Purple Shade","hex":"#4e2e53"},{"name":"Purple Shine","hex":"#c8bad4"},{"name":"Purple Snail","hex":"#cc69e4"},{"name":"Purple Sphinx","hex":"#563948"},{"name":"Purple Spot","hex":"#652dc1"},{"name":"Purple Springs","hex":"#ab9bbc"},{"name":"Purple Squid","hex":"#845998"},{"name":"Purple Starburst","hex":"#b16d90"},{"name":"Purple Statement","hex":"#6e5755"},{"name":"Purple Statice","hex":"#a885b5"},{"name":"Purple Stone","hex":"#605467"},{"name":"Purple Surf","hex":"#9b95a9"},{"name":"Purple Tanzanite","hex":"#835995"},{"name":"Purple Taupe","hex":"#50404d"},{"name":"Purple Thorn","hex":"#f0b9be"},{"name":"Purple Tone Ink","hex":"#a22da4"},{"name":"Purple Trinket","hex":"#665261"},{"name":"Purple Urn Orchid","hex":"#c364c5"},{"name":"Purple Velvet","hex":"#41354d"},{"name":"Purple Verbena","hex":"#46354b"},{"name":"Purple Wine","hex":"#8c3573"},{"name":"Purple Wineberry","hex":"#5a395b"},{"name":"Purple Zergling ","hex":"#a15589"},{"name":"Purplish","hex":"#98568d"},{"name":"Purplish Blue","hex":"#6140ef"},{"name":"Purplish Brown","hex":"#6b4247"},{"name":"Purplish Grey","hex":"#7a687f"},{"name":"Purplish Pink","hex":"#df4ec8"},{"name":"Purplish Red","hex":"#b0054b"},{"name":"Purposeful","hex":"#776c76"},{"name":"Purpura","hex":"#8d8485"},{"name":"Purpureus","hex":"#9a4eae"},{"name":"Purri Sticks","hex":"#898078"},{"name":"Purslane","hex":"#879f6c"},{"name":"Pussy Foot","hex":"#cebada"},{"name":"Pussywillow Grey","hex":"#aeaca1"},{"name":"Putnam Plum","hex":"#8d4362"},{"name":"Putrid Green","hex":"#89a572"},{"name":"Putting Green","hex":"#3a9234"},{"name":"Putty","hex":"#cdae70"},{"name":"Putty Pearl","hex":"#a99891"},{"name":"Puturple","hex":"#ada2ce"},{"name":"Puyo Blob Green","hex":"#55ff55"},{"name":"Pylon","hex":"#9fbadf"},{"name":"Pyramid","hex":"#9f7d4f"},{"name":"Python Blue","hex":"#3776ab"},{"name":"Python Yellow","hex":"#ffd343"},{"name":"Qahvei Brown","hex":"#7b5804"},{"name":"Qermez Red","hex":"#cf3c71"},{"name":"Qiān Hūi Grey","hex":"#89a0b0"},{"name":"Quack Quack","hex":"#ffe989"},{"name":"Quagmire Green","hex":"#998811"},{"name":"Quail","hex":"#98868c"},{"name":"Quail Valley","hex":"#ab9673"},{"name":"Quaking Grass","hex":"#bbc6a4"},{"name":"Quantum Blue","hex":"#6e799b"},{"name":"Quantum of Light","hex":"#130173"},{"name":"Quarry","hex":"#98a0a5"},{"name":"Quarry Quartz","hex":"#af9a91"},{"name":"Quarter Pearl Lusta","hex":"#f2eddd"},{"name":"Quarter Spanish White","hex":"#ebe2d2"},{"name":"Quarterdeck","hex":"#1272a3"},{"name":"Quartz","hex":"#d9d9f3"},{"name":"Quartz Pink","hex":"#efa6aa"},{"name":"Quartz Sand","hex":"#a9aaab"},{"name":"Quartzite","hex":"#232e26"},{"name":"Quaver","hex":"#bed3cb"},{"name":"Queen Anne's Lace","hex":"#f2eede"},{"name":"Queen Blue","hex":"#436b95"},{"name":"Queen Conch Shell","hex":"#e8bc95"},{"name":"Queen of Hearts","hex":"#98333a"},{"name":"Queen Palm","hex":"#ad9e4b"},{"name":"Queen Pink","hex":"#e8ccd7"},{"name":"Queen Valley","hex":"#6c7068"},{"name":"Queen's","hex":"#7b6fa0"},{"name":"Queen's Honour","hex":"#8b5776"},{"name":"Quest","hex":"#bdc1c1"},{"name":"Question Mark Block","hex":"#ef9a49"},{"name":"Quetzal Green","hex":"#006865"},{"name":"Quibble","hex":"#b393c0"},{"name":"Quicksand","hex":"#ac9884"},{"name":"Quicksilver","hex":"#a6a6a6"},{"name":"Quiet Bay","hex":"#6597cc"},{"name":"Quiet Drizzle","hex":"#b7d0c5"},{"name":"Quiet Green","hex":"#9ebc97"},{"name":"Quiet Grey","hex":"#b9babd"},{"name":"Quiet Harbour","hex":"#5a789a"},{"name":"Quiet Night","hex":"#3e8fbc"},{"name":"Quiet Pink","hex":"#dba39a"},{"name":"Quiet Rain","hex":"#e7efcf"},{"name":"Quiet Shade","hex":"#66676d"},{"name":"Quiet Splendor","hex":"#fae6ca"},{"name":"Quill Grey","hex":"#cbc9c0"},{"name":"Quill Tip","hex":"#2d3359"},{"name":"Quilotoa Blue","hex":"#7f9daf"},{"name":"Quilotoa Green","hex":"#70a38d"},{"name":"Quilt","hex":"#fcd9c6"},{"name":"Quinacridone Magenta","hex":"#8e3a59"},{"name":"Quince Jelly","hex":"#f89330"},{"name":"Quincy","hex":"#6a5445"},{"name":"Quinoa","hex":"#f9ecd1"},{"name":"Quinoline Yellow","hex":"#f5e326"},{"name":"Quintana","hex":"#008ca9"},{"name":"Quintessential","hex":"#c2dbc6"},{"name":"Quithayran Green","hex":"#9be510"},{"name":"Quiver","hex":"#886037"},{"name":"Quixotic","hex":"#948491"},{"name":"Rabbit","hex":"#5f575c"},{"name":"Rabbit Paws","hex":"#885d62"},{"name":"Rabbit-Ear Iris","hex":"#491e3c"},{"name":"Raccoon Tail","hex":"#735e56"},{"name":"Racing Green","hex":"#014600"},{"name":"Racing Red","hex":"#bd162c"},{"name":"Rackham Red","hex":"#d6341e"},{"name":"Rackley","hex":"#5d8aaa"},{"name":"Racoon Eyes","hex":"#776a3c"},{"name":"Radar","hex":"#b6c8e4"},{"name":"Radar Blip Green","hex":"#96f97b"},{"name":"Radiant Glow","hex":"#ffeed2"},{"name":"Radiant Orchid","hex":"#ad5e99"},{"name":"Radiant Rouge","hex":"#d7b1b2"},{"name":"Radiant Sunrise","hex":"#eebe1b"},{"name":"Radiant Yellow","hex":"#fc9e21"},{"name":"Radiation Carrot","hex":"#ffa343"},{"name":"Radical Red","hex":"#ff355e"},{"name":"Radioactive","hex":"#89fe05"},{"name":"Radioactive Eggplant","hex":"#f9006f"},{"name":"Radioactive Green","hex":"#2cfa1f"},{"name":"Radish Lips","hex":"#ee3355"},{"name":"Radisson","hex":"#e5e7e6"},{"name":"Radium","hex":"#7fff00"},{"name":"Radler","hex":"#ffd15c"},{"name":"Radome Tan","hex":"#f1c7a1"},{"name":"Raffia","hex":"#dcc6a0"},{"name":"Raffia Cream","hex":"#cda09a"},{"name":"Raffles Tan","hex":"#ca9a5d"},{"name":"Raftsman","hex":"#3c5f9b"},{"name":"Ragin' Cajun","hex":"#8d514c"},{"name":"Raging Raisin","hex":"#aa3333"},{"name":"Raging Tide","hex":"#5187a0"},{"name":"Ragtime Blues","hex":"#4a5e6c"},{"name":"Railroad Ties","hex":"#544540"},{"name":"Rain Barrel","hex":"#8b795f"},{"name":"Rain Cloud","hex":"#919fa1"},{"name":"Rain Dance","hex":"#a9ccdb"},{"name":"Rain Drop","hex":"#e7eee8"},{"name":"Rain Drum","hex":"#5f4c40"},{"name":"Rainbow","hex":"#f6bfbc"},{"name":"Rainbow Bright","hex":"#2863ad"},{"name":"Rainbow Trout","hex":"#ff975c"},{"name":"Rainbow's Inner Rim","hex":"#ff09ff"},{"name":"Rainbow's Outer Rim","hex":"#ff0001"},{"name":"Raindrops","hex":"#ece5e1"},{"name":"Rainee","hex":"#b3c1b1"},{"name":"Rainford","hex":"#759180"},{"name":"Rainforest","hex":"#009a70"},{"name":"Rainforest Fern","hex":"#cec192"},{"name":"Rainforest Glow","hex":"#b2c346"},{"name":"Rainforest Nights","hex":"#002200"},{"name":"Rainforest Zipline","hex":"#7f795f"},{"name":"Rainier Blue","hex":"#558484"},{"name":"Rainmaker","hex":"#485769"},{"name":"Rainsong","hex":"#acbdb1"},{"name":"Rainy Day","hex":"#cfc8bd"},{"name":"Rainy Grey","hex":"#a5a5a5"},{"name":"Rainy Lake","hex":"#3f6c8f"},{"name":"Rainy Season","hex":"#d1d8d6"},{"name":"Raisin","hex":"#524144"},{"name":"Raisin Black","hex":"#242124"},{"name":"Raisin in the Sun","hex":"#78615c"},{"name":"Rajah","hex":"#fbab60"},{"name":"Rajah Rose","hex":"#e6d9e2"},{"name":"Rakuda Brown","hex":"#bf794e"},{"name":"Ramadi Grey","hex":"#b7a9ac"},{"name":"Ramjet","hex":"#4c73af"},{"name":"Ramona","hex":"#8f9a88"},{"name":"Rampart","hex":"#bcb7b1"},{"name":"Ramsons","hex":"#195456"},{"name":"Ranch Mink","hex":"#968379"},{"name":"Rancho Verde","hex":"#dfd8b3"},{"name":"Randall","hex":"#756e60"},{"name":"Range Land","hex":"#68bd56"},{"name":"Ranger Green","hex":"#6a8472"},{"name":"Ranger Station","hex":"#707651"},{"name":"Rangitoto","hex":"#2e3222"},{"name":"Rangoon Green","hex":"#2b2e25"},{"name":"Ranier White","hex":"#f7ecd8"},{"name":"Rapakivi Granite","hex":"#d28239"},{"name":"Rape Blossoms","hex":"#ffec47"},{"name":"Rapeseed","hex":"#c19a13"},{"name":"Rapeseed Oil","hex":"#a69425"},{"name":"Rapid Rock","hex":"#a39281"},{"name":"Rapier Silver","hex":"#d8dfda"},{"name":"Rapt","hex":"#45363a"},{"name":"Rapture Rose","hex":"#d16277"},{"name":"Rapunzel","hex":"#f6d77f"},{"name":"Rare Blue","hex":"#0044ff"},{"name":"Rare Find","hex":"#ac8044"},{"name":"Rare Happening","hex":"#8daca0"},{"name":"Rare Orchid","hex":"#dbdce2"},{"name":"Rare Red","hex":"#dd1133"},{"name":"Rare Rhubarb","hex":"#cc0022"},{"name":"Rare Turquoise","hex":"#00748e"},{"name":"Rare White Jade","hex":"#e8e9cc"},{"name":"Raspberry","hex":"#b00149"},{"name":"Raspberry Fool","hex":"#8e3643"},{"name":"Raspberry Glace","hex":"#915f6c"},{"name":"Raspberry Glaze","hex":"#ff77aa"},{"name":"Raspberry Ice","hex":"#d9ccc7"},{"name":"Raspberry Jam","hex":"#ca3767"},{"name":"Raspberry Kahlua","hex":"#c9a196"},{"name":"Raspberry Milk","hex":"#ebd2d1"},{"name":"Raspberry Mousse","hex":"#e06f8b"},{"name":"Raspberry Parfait","hex":"#b96482"},{"name":"Raspberry Patch","hex":"#a34f66"},{"name":"Raspberry Pink","hex":"#e25098"},{"name":"Raspberry Radiance","hex":"#802a50"},{"name":"Raspberry Ripple","hex":"#cd827d"},{"name":"Raspberry Rose","hex":"#b3436c"},{"name":"Raspberry Sorbet","hex":"#d2386c"},{"name":"Raspberry Truffle","hex":"#8a5d55"},{"name":"Raspberry Whip","hex":"#b3737f"},{"name":"Raspberry Wine","hex":"#b63753"},{"name":"Raspberry Yogurt","hex":"#e30b5d"},{"name":"Rat Brown","hex":"#885f01"},{"name":"Rationality","hex":"#6f6138"},{"name":"Ratskin Flesh","hex":"#f7b273"},{"name":"Rattan","hex":"#a58e61"},{"name":"Rattan Basket","hex":"#a79069"},{"name":"Rattan Palm","hex":"#8f876b"},{"name":"Rattlesnake","hex":"#7f7667"},{"name":"Rave Regatta","hex":"#00619d"},{"name":"Raven","hex":"#6f747b"},{"name":"Raven Night","hex":"#3b3f66"},{"name":"Raven's Coat","hex":"#030205"},{"name":"Ravishing Rouge","hex":"#bb2200"},{"name":"Raw Amethyst","hex":"#544173"},{"name":"Raw Cashew Nut","hex":"#c8beb1"},{"name":"Raw Chocolate","hex":"#662200"},{"name":"Raw Cotton","hex":"#e3d4bb"},{"name":"Raw Linen","hex":"#cc8844"},{"name":"Raw Sienna","hex":"#9a6200"},{"name":"Raw Sugar","hex":"#d8cab2"},{"name":"Raw Sunset","hex":"#f95d2d"},{"name":"Raw Umber","hex":"#a75e09"},{"name":"Rawhide","hex":"#865e49"},{"name":"Rawhide Canoe","hex":"#7a643f"},{"name":"Razee","hex":"#7197cb"},{"name":"Razzberries","hex":"#d1768c"},{"name":"Razzle Dazzle","hex":"#ba417b"},{"name":"Razzle Dazzle Rose","hex":"#ff33cc"},{"name":"Razzmatazz","hex":"#e30b5c"},{"name":"Razzmatazz Lips","hex":"#e3256b"},{"name":"Razzmic Berry","hex":"#8d4e85"},{"name":"Rè Dài Chéng Orange","hex":"#f08101"},{"name":"Ready Lawn","hex":"#7ba570"},{"name":"Real Brown","hex":"#563d2d"},{"name":"Real Mccoy","hex":"#00577e"},{"name":"Real Raspberry","hex":"#dd79a2"},{"name":"Real Simple","hex":"#ccb896"},{"name":"Real Teal","hex":"#405d73"},{"name":"Really Light Blue","hex":"#d4ffff"},{"name":"Really Light Green","hex":"#e9eadb"},{"name":"Really Rain","hex":"#e8ecdb"},{"name":"Realm","hex":"#796c70"},{"name":"Rebecca Purple","hex":"#663399"},{"name":"Rebel","hex":"#453430"},{"name":"Rebel Red","hex":"#cd4035"},{"name":"Rebel Rouser","hex":"#9b7697"},{"name":"Rebellion Red","hex":"#cc0404"},{"name":"Rebounder","hex":"#bad56b"},{"name":"Receding Night","hex":"#4a4e5c"},{"name":"Reclaimed Wood","hex":"#bab6ab"},{"name":"Recuperate","hex":"#decce4"},{"name":"Recycled","hex":"#cdb6a0"},{"name":"Red","hex":"#ff0000"},{"name":"Red Alert","hex":"#ff0f0f"},{"name":"Red Baron","hex":"#bb0011"},{"name":"Red Bean","hex":"#3d0c02"},{"name":"Red Beech","hex":"#7b3801"},{"name":"Red Berry","hex":"#701f28"},{"name":"Red Birch","hex":"#9d2b22"},{"name":"Red Blood","hex":"#660000"},{"name":"Red Blooded","hex":"#8a3c38"},{"name":"Red Brown","hex":"#a52a2f"},{"name":"Red Bud","hex":"#962d49"},{"name":"Red Cabbage","hex":"#534a77"},{"name":"Red Cedar","hex":"#d87678"},{"name":"Red Chalk","hex":"#ed7777"},{"name":"Red Clay","hex":"#8f4b41"},{"name":"Red Clown","hex":"#d43e38"},{"name":"Red Contrast","hex":"#b33234"},{"name":"Red Craft","hex":"#91433e"},{"name":"Red Cray","hex":"#e45e32"},{"name":"Red Crayon","hex":"#ee204d"},{"name":"Red Dahlia","hex":"#7d2027"},{"name":"Red Damask","hex":"#cb6f4a"},{"name":"Red Dead Redemption","hex":"#bb012d"},{"name":"Red Devil","hex":"#860111"},{"name":"Red Dit","hex":"#ff4500"},{"name":"Red Earth","hex":"#a2816e"},{"name":"Red Endive","hex":"#794d60"},{"name":"Red Gooseberry","hex":"#604046"},{"name":"Red Gore","hex":"#ad1400"},{"name":"Red Gravel","hex":"#b8866e"},{"name":"Red Gumball","hex":"#ac3a3e"},{"name":"Red Hook","hex":"#845544"},{"name":"Red Hot Jazz","hex":"#773c31"},{"name":"Red Icon","hex":"#c93543"},{"name":"Red Ink","hex":"#ac3235"},{"name":"Red Kite","hex":"#913228"},{"name":"Red Knuckles ","hex":"#dd0011"},{"name":"Red Leather","hex":"#ab4d50"},{"name":"Red Leever","hex":"#881400"},{"name":"Red Licorice","hex":"#a83e4c"},{"name":"Red Light Neon","hex":"#ff0055"},{"name":"Red Mahogany","hex":"#60373d"},{"name":"Red Mane","hex":"#6d3d2a"},{"name":"Red Maple Leaf","hex":"#834c4b"},{"name":"Red Mull","hex":"#ff8888"},{"name":"Red Ochre","hex":"#913832"},{"name":"Red October","hex":"#fe2712"},{"name":"Red Onion","hex":"#473442"},{"name":"Red Orange","hex":"#ff3f34"},{"name":"Red Orange Juice","hex":"#ff5349"},{"name":"Red Oxide","hex":"#5d1f1e"},{"name":"Red Pear","hex":"#7b3539"},{"name":"Red Pegasus","hex":"#dd0000"},{"name":"Red Perfume","hex":"#f6b894"},{"name":"Red Pigment","hex":"#ed1c24"},{"name":"Red Pink","hex":"#fa2a55"},{"name":"Red Plum","hex":"#7c2946"},{"name":"Red Power","hex":"#d63d3b"},{"name":"Red Prayer Flag","hex":"#bb1100"},{"name":"Red Purple","hex":"#e40078"},{"name":"Red Revival","hex":"#a8453b"},{"name":"Red Ribbon","hex":"#ed0a3f"},{"name":"Red Riding Hood","hex":"#fe2713"},{"name":"Red River","hex":"#b95543"},{"name":"Red Robin","hex":"#7d4138"},{"name":"Red Rock","hex":"#a65052"},{"name":"Red Rock Falls","hex":"#a27253"},{"name":"Red Rock Panorama","hex":"#b29e9d"},{"name":"Red Rooster","hex":"#7e5146"},{"name":"Red Rust","hex":"#8a3319"},{"name":"Red Safflower","hex":"#c53d43"},{"name":"Red Salsa","hex":"#fd3a4a"},{"name":"Red Sandstorm","hex":"#e5cac0"},{"name":"Red Shade Wash","hex":"#862808"},{"name":"Red Sparowes","hex":"#c8756d"},{"name":"Red Stage","hex":"#ad522e"},{"name":"Red Stop","hex":"#97382c"},{"name":"Red Stop ","hex":"#ff2222"},{"name":"Red Terra","hex":"#ae4930"},{"name":"Red Tolumnia Orchid","hex":"#be0119"},{"name":"Red Tone Ink","hex":"#8b2e08"},{"name":"Red Velvet","hex":"#783b38"},{"name":"Red Vine","hex":"#5f383c"},{"name":"Red Violet","hex":"#9e0168"},{"name":"Red Wattle Hog","hex":"#765952"},{"name":"Red Wine","hex":"#8c0034"},{"name":"Red Wine Vinegar","hex":"#722f37"},{"name":"Red-Tailed-Hawk","hex":"#a27547"},{"name":"Redalicious","hex":"#bb2211"},{"name":"Redbox","hex":"#94332f"},{"name":"Reddish","hex":"#c44240"},{"name":"Reddish Brown","hex":"#7f2b0a"},{"name":"Reddish Grey","hex":"#997570"},{"name":"Reddish Orange","hex":"#f8481c"},{"name":"Reddish Pink","hex":"#fe2c54"},{"name":"Reddish Purple","hex":"#910951"},{"name":"Reddy Brown","hex":"#6e1005"},{"name":"Rediscover","hex":"#c3cdc9"},{"name":"Redrum","hex":"#ff2200"},{"name":"Redstone","hex":"#e46b71"},{"name":"Redtail","hex":"#af4544"},{"name":"Redwood","hex":"#5b342e"},{"name":"Redwood City","hex":"#b45f56"},{"name":"Redwood Forest","hex":"#916f5e"},{"name":"Reed","hex":"#c3d3a8"},{"name":"Reed Bed","hex":"#b0ad96"},{"name":"Reed Green","hex":"#a1a14a"},{"name":"Reed Mace","hex":"#cd5e3c"},{"name":"Reed Mace Brown","hex":"#726250"},{"name":"Reed Yellow","hex":"#dcc99e"},{"name":"Reeds","hex":"#a0bca7"},{"name":"Reef","hex":"#d1ef9f"},{"name":"Reef Encounter","hex":"#00968f"},{"name":"Reef Escape","hex":"#0474ad"},{"name":"Reef Gold","hex":"#a98d36"},{"name":"Reef Resort","hex":"#274256"},{"name":"Reef Waters","hex":"#6f9fa9"},{"name":"Refined Green","hex":"#384543"},{"name":"Refined Mint","hex":"#f1f9ec"},{"name":"Reflecting Pond","hex":"#203e4a"},{"name":"Reflection Pool","hex":"#cadbdf"},{"name":"Reform","hex":"#8aaad6"},{"name":"Refreshed","hex":"#cfe587"},{"name":"Refreshing Primer","hex":"#d7fffe"},{"name":"Regal Blue","hex":"#203f58"},{"name":"Regal Destiny","hex":"#2e508a"},{"name":"Regal Gown","hex":"#655777"},{"name":"Regal Orchid","hex":"#a98baf"},{"name":"Regal Violet","hex":"#a298a2"},{"name":"Regalia","hex":"#522d80"},{"name":"Regatta","hex":"#487ab7"},{"name":"Regatta Bay","hex":"#2d5367"},{"name":"Regency Cream","hex":"#e1bb87"},{"name":"Regent Grey","hex":"#798488"},{"name":"Regent St Blue","hex":"#a0cdd9"},{"name":"Registra","hex":"#c2bbbf"},{"name":"Registration Black","hex":"#000100"},{"name":"Regula Barbara Blue","hex":"#009999"},{"name":"Reign Over Me","hex":"#76679e"},{"name":"Reikland Fleshshade","hex":"#ca6c4d"},{"name":"Reikland Fleshshade Gloss","hex":"#cb7351"},{"name":"Reindeer","hex":"#dac0ba"},{"name":"Reindeer Moss","hex":"#bdf8a3"},{"name":"Relax","hex":"#b9d2d3"},{"name":"Relic","hex":"#88789b"},{"name":"Relief","hex":"#bf2133"},{"name":"Remembrance","hex":"#ca9e9c"},{"name":"Remington Rust","hex":"#a25d4c"},{"name":"Remote Control","hex":"#6d7a6a"},{"name":"Remy","hex":"#f6deda"},{"name":"Renaissance Rose","hex":"#865560"},{"name":"Renanthera Orchid","hex":"#820747"},{"name":"Rendezvous","hex":"#abbed0"},{"name":"Renga Brick","hex":"#b55233"},{"name":"Renkon Beige","hex":"#989f7a"},{"name":"Rennie's Rose","hex":"#b87f84"},{"name":"Reno Sand","hex":"#b26e33"},{"name":"Renwick Brown","hex":"#504e47"},{"name":"Reptile Green","hex":"#24da91"},{"name":"Reptilian Green","hex":"#009e82"},{"name":"Requiem","hex":"#4e3f44"},{"name":"Reseda","hex":"#a1ad92"},{"name":"Reservation","hex":"#8c7544"},{"name":"Resolution Blue","hex":"#002387"},{"name":"Restoration","hex":"#939581"},{"name":"Retributor Armour Metal","hex":"#c39e81"},{"name":"Retro","hex":"#9bdc96"},{"name":"Retro Blue","hex":"#2b62f4"},{"name":"Retro Orange","hex":"#e85112"},{"name":"Retro Peach","hex":"#e7c0ad"},{"name":"Revenant Brown","hex":"#c59782"},{"name":"Revered","hex":"#a78faf"},{"name":"Reversed Grey","hex":"#080808"},{"name":"Revival","hex":"#5f81a4"},{"name":"Revival Red","hex":"#7f4e47"},{"name":"Revival Rose","hex":"#c09084"},{"name":"Revolver","hex":"#37363f"},{"name":"Rhapsody","hex":"#9f86aa"},{"name":"Rhapsody In Blue","hex":"#002244"},{"name":"Rhapsody Rap","hex":"#74676c"},{"name":"Rhind Papyrus","hex":"#969565"},{"name":"Rhinestone","hex":"#8e6c94"},{"name":"Rhino","hex":"#3d4653"},{"name":"Rhinoceros","hex":"#727a7c"},{"name":"Rhinox Hide","hex":"#493435"},{"name":"Rhode Island Red","hex":"#9b5b55"},{"name":"Rhododendron","hex":"#722b3f"},{"name":"Rhubarb","hex":"#77202f"},{"name":"Rhubarb Gin","hex":"#d9a6c1"},{"name":"Rhubarb Pie","hex":"#d78187"},{"name":"Rhubarb Smoothie","hex":"#8c474b"},{"name":"Rhys","hex":"#beceb4"},{"name":"Rhythm","hex":"#767194"},{"name":"Rhythm & Blues","hex":"#70767b"},{"name":"Ribbon Red","hex":"#b92636"},{"name":"Rice Bowl","hex":"#f1e7d5"},{"name":"Rice Cake","hex":"#efecde"},{"name":"Rice Fibre","hex":"#e4d8ab"},{"name":"Rice Flower","hex":"#eff5d1"},{"name":"Rice Paper","hex":"#fffcdb"},{"name":"Rice Pudding","hex":"#fff0e3"},{"name":"Rich Biscuit","hex":"#948165"},{"name":"Rich Black","hex":"#004040"},{"name":"Rich Blue","hex":"#021bf9"},{"name":"Rich Brilliant Lavender","hex":"#f1a7fe"},{"name":"Rich Carmine","hex":"#d70041"},{"name":"Rich Electric Blue","hex":"#0892d0"},{"name":"Rich Gardenia","hex":"#f57f4f"},{"name":"Rich Georgia Clay","hex":"#de7a63"},{"name":"Rich Gold","hex":"#aa8833"},{"name":"Rich Honey","hex":"#f9bc7d"},{"name":"Rich Ivory","hex":"#fff0c4"},{"name":"Rich Lavender","hex":"#a76bcf"},{"name":"Rich Lilac","hex":"#b666d2"},{"name":"Rich Loam","hex":"#583d37"},{"name":"Rich Maroon","hex":"#b0306a"},{"name":"Rich Mocha","hex":"#745342"},{"name":"Rich Purple","hex":"#720058"},{"name":"Rich Red Violet","hex":"#7c3651"},{"name":"Rich Texture","hex":"#645671"},{"name":"Rickrack","hex":"#a6a660"},{"name":"Ricochet","hex":"#817c74"},{"name":"Ridge Light","hex":"#b2c8dd"},{"name":"Ridgecrest","hex":"#9d8861"},{"name":"Riding Boots","hex":"#734a35"},{"name":"Riding Star","hex":"#a0a197"},{"name":"Rifle Green","hex":"#414833"},{"name":"Rigby Ridge","hex":"#a0a082"},{"name":"Rikan Brown","hex":"#534a32"},{"name":"Rikyū Brown","hex":"#826b58"},{"name":"Rikyūnezumi Brown","hex":"#656255"},{"name":"Rikyūshira Brown","hex":"#b0927a"},{"name":"Rincon Cove","hex":"#c7b39e"},{"name":"Ringlet","hex":"#fbedbe"},{"name":"Rinsed-Out red","hex":"#ff7952"},{"name":"Rio Grande","hex":"#b7c61a"},{"name":"Rio Red","hex":"#8a2232"},{"name":"Rip Cord","hex":"#dfab56"},{"name":"Rip Van Periwinkle","hex":"#8fa4d2"},{"name":"Ripasso","hex":"#774041"},{"name":"Ripe Lemon","hex":"#f4d81c"},{"name":"Ripe Mango","hex":"#ffc324"},{"name":"Ripe Melon","hex":"#febaad"},{"name":"Ripe Pear","hex":"#e1e36e"},{"name":"Ripe Pineapple","hex":"#ffe07b"},{"name":"Ripe Plum","hex":"#410056"},{"name":"Ripe Pumpkin","hex":"#ffaf37"},{"name":"Ripe Rhubarb","hex":"#7e3947"},{"name":"Ripening Grape","hex":"#6f3942"},{"name":"Riptide","hex":"#89d9c8"},{"name":"Rise-N-Shine","hex":"#ffc632"},{"name":"Rising Ash","hex":"#978888"},{"name":"Risotto","hex":"#f8f5e9"},{"name":"Rita Repulsa","hex":"#00aa55"},{"name":"Ritterlich Blue","hex":"#293286"},{"name":"Ritual","hex":"#767081"},{"name":"Ritual Experience","hex":"#533844"},{"name":"Ritzy","hex":"#d79c5f"},{"name":"River Bank","hex":"#7e705e"},{"name":"River Blue","hex":"#38afcd"},{"name":"River Fountain","hex":"#248591"},{"name":"River Reed","hex":"#dedbc4"},{"name":"River Rock","hex":"#d8cdc4"},{"name":"River Rouge","hex":"#ec9b9d"},{"name":"River Shark","hex":"#dfdcd5"},{"name":"River Styx","hex":"#161820"},{"name":"Riverbed","hex":"#556061"},{"name":"Rivergrass","hex":"#84a27b"},{"name":"Riverside","hex":"#4c6a92"},{"name":"Riveter Rose","hex":"#b7a9a2"},{"name":"Riviera","hex":"#189fac"},{"name":"Riviera Paradise","hex":"#009a9e"},{"name":"Riviera Rose","hex":"#f7b1a6"},{"name":"Riviera Sea","hex":"#1b8188"},{"name":"Rix","hex":"#605655"},{"name":"Roadster Yellow","hex":"#f3dea2"},{"name":"Roan Rouge","hex":"#885157"},{"name":"Roast Coffee","hex":"#704341"},{"name":"Roasted Almond","hex":"#d2b49c"},{"name":"Roasted Cashew","hex":"#918579"},{"name":"Roasted Coconut","hex":"#ab8c72"},{"name":"Roasted Kona","hex":"#574038"},{"name":"Roasted Pecan","hex":"#93592b"},{"name":"Roasted Pistachio","hex":"#c9b27c"},{"name":"Roasted Sienna","hex":"#ea7e5d"},{"name":"Roasted Squash","hex":"#e6a255"},{"name":"Rob Roy","hex":"#ddad56"},{"name":"Robeson Rose","hex":"#654f4f"},{"name":"Robin Egg Blue","hex":"#8af1fe"},{"name":"Robin's Egg","hex":"#6dedfd"},{"name":"Robin's Egg Blue","hex":"#00cccc"},{"name":"Robinhood","hex":"#6e6a3b"},{"name":"Robot Grendizer Gold","hex":"#eeee11"},{"name":"Rock","hex":"#5a4d41"},{"name":"Rock Blue","hex":"#93a2ba"},{"name":"Rock Cliffs","hex":"#c0af92"},{"name":"Rock Slide","hex":"#a1968c"},{"name":"Rock Spray","hex":"#9d442d"},{"name":"Rock'n Oak","hex":"#8b785c"},{"name":"Rock'n'Rose","hex":"#fc8aaa"},{"name":"Rockabilly","hex":"#6c7186"},{"name":"Rockabye Baby","hex":"#f4e4e0"},{"name":"Rocket Man","hex":"#bebec3"},{"name":"Rocket Metallic","hex":"#8a7f80"},{"name":"Rockfall","hex":"#aabbaa"},{"name":"Rockin Red","hex":"#bc363c"},{"name":"Rocking Chair","hex":"#721f37"},{"name":"Rockman Blue","hex":"#31a2f2"},{"name":"Rockmelon Rind","hex":"#d3e0b1"},{"name":"Rockpool","hex":"#519ea1"},{"name":"Rocky Creek","hex":"#3e4d50"},{"name":"Rocky Mountain Red","hex":"#76443e"},{"name":"Rocky Ridge","hex":"#918c86"},{"name":"Rocky Road","hex":"#5a3e36"},{"name":"Rococco Red","hex":"#bb363f"},{"name":"Rodeo","hex":"#7f5e46"},{"name":"Rodeo Dust","hex":"#c7a384"},{"name":"Rodeo Roundup","hex":"#a68e6d"},{"name":"Rodham","hex":"#b2b26c"},{"name":"Roebuck","hex":"#b09080"},{"name":"Rogue","hex":"#807a6c"},{"name":"Rogue Cowboy","hex":"#ba9e88"},{"name":"Rogue Pink","hex":"#f8a4c0"},{"name":"Rokō Brown","hex":"#665343"},{"name":"Rokou Brown","hex":"#8c7042"},{"name":"Rokushō Green","hex":"#407a52"},{"name":"Roller Coaster","hex":"#8c8578"},{"name":"Roller Coaster Chariot","hex":"#0078be"},{"name":"Rolling Hills","hex":"#7c7e6a"},{"name":"Rolling Sea","hex":"#5a6d77"},{"name":"Rolling Stone","hex":"#6d7876"},{"name":"Rolling Waves","hex":"#bfd1c9"},{"name":"Roman","hex":"#d8625b"},{"name":"Roman Bath","hex":"#8c97a3"},{"name":"Roman Brick","hex":"#ab7f5b"},{"name":"Roman Coffee","hex":"#7d6757"},{"name":"Roman Gold","hex":"#d19b2f"},{"name":"Roman Purple","hex":"#524765"},{"name":"Roman Silver","hex":"#838996"},{"name":"Roman Snail","hex":"#a49593"},{"name":"Roman Violet","hex":"#4d517f"},{"name":"Romance","hex":"#f4f0e6"},{"name":"Romantic","hex":"#ffc69e"},{"name":"Romantic Isle","hex":"#007c75"},{"name":"Romantic Rose","hex":"#aa4488"},{"name":"Romeo","hex":"#e3d2ce"},{"name":"Ronchi","hex":"#eab852"},{"name":"Rondo of Blood","hex":"#a60044"},{"name":"Roof Terracotta","hex":"#a14743"},{"name":"Rooibos Tea","hex":"#a23c26"},{"name":"Rooster Comb","hex":"#96463f"},{"name":"Root Beer","hex":"#714a41"},{"name":"Root Beer Float","hex":"#cfa46b"},{"name":"Root Brew","hex":"#290e05"},{"name":"Rope","hex":"#8e593c"},{"name":"Roquefort Blue","hex":"#aec6cf"},{"name":"Rosa","hex":"#fe86a4"},{"name":"Rosarian","hex":"#faeadd"},{"name":"Rose","hex":"#ff007f"},{"name":"Rose Ashes","hex":"#b5acab"},{"name":"Rose Aspect","hex":"#f1c6ca"},{"name":"Rose Bisque","hex":"#c6a499"},{"name":"Rose Bonbon","hex":"#f9429e"},{"name":"Rose Branch","hex":"#80565b"},{"name":"Rose Brown","hex":"#bc8f8f"},{"name":"Rose Bud","hex":"#b65f9a"},{"name":"Rose Cloud","hex":"#dbb0a2"},{"name":"Rose Colored Glasses","hex":"#e5c4c0"},{"name":"Rose Daphne","hex":"#ff9ede"},{"name":"Rose Dawn","hex":"#b38380"},{"name":"Rose de Mai","hex":"#cb8e81"},{"name":"Rose Dragée","hex":"#eecffe"},{"name":"Rose Dusk","hex":"#e5a192"},{"name":"Rose Dust","hex":"#cdb2a5"},{"name":"Rose Ebony","hex":"#674846"},{"name":"Rose Fog","hex":"#e7bcb4"},{"name":"Rose Frost","hex":"#ffece9"},{"name":"Rose Fusion","hex":"#f96653"},{"name":"Rose Garnet","hex":"#960145"},{"name":"Rose Glory","hex":"#e585a5"},{"name":"Rose Glow","hex":"#ffdbeb"},{"name":"Rose Gold","hex":"#b76e79"},{"name":"Rose Hip","hex":"#fd0e35"},{"name":"Rose Hip Tonic","hex":"#dbb9b6"},{"name":"Rose Madder","hex":"#e33636"},{"name":"Rose Marble","hex":"#ceb9c4"},{"name":"Rose Mauve","hex":"#af9690"},{"name":"Rose Meadow","hex":"#c4989e"},{"name":"Rose Melody","hex":"#ecbfc9"},{"name":"Rose Mochi","hex":"#ffe9ed"},{"name":"Rose of Sharon","hex":"#ac512d"},{"name":"Rose Petal","hex":"#e6c1bb"},{"name":"Rose Pink","hex":"#ff66cc"},{"name":"Rose Pink Villa","hex":"#7c383e"},{"name":"Rose Quartz","hex":"#f7cac1"},{"name":"Rose Red","hex":"#c92351"},{"name":"Rose Reminder","hex":"#f4c0c6"},{"name":"Rose Romantic","hex":"#eed1cd"},{"name":"Rose Rush","hex":"#dd2255"},{"name":"Rose Shadow","hex":"#f9c2cd"},{"name":"Rose Smoke","hex":"#d3b4ad"},{"name":"Rose Stain","hex":"#d3b6ba"},{"name":"Rose Tan","hex":"#fae8e1"},{"name":"Rose Tattoo","hex":"#e1a890"},{"name":"Rose Taupe","hex":"#905d5d"},{"name":"Rose Tea","hex":"#b48993"},{"name":"Rose Tonic","hex":"#ffdddd"},{"name":"Rose Turkish Delight","hex":"#db5079"},{"name":"Rose Vale","hex":"#ab4e5f"},{"name":"Rose Vapor","hex":"#f2dbd6"},{"name":"Rose Violet","hex":"#c0428a"},{"name":"Rose Water","hex":"#f6dbd8"},{"name":"Rose White","hex":"#fbeee8"},{"name":"Rose Wine","hex":"#9d5c75"},{"name":"Rose Yogurt","hex":"#d9bcb7"},{"name":"Roseberry","hex":"#f4a6a1"},{"name":"Rosebloom","hex":"#e290b2"},{"name":"Rosebud Cherry","hex":"#8a2d52"},{"name":"Rosemary","hex":"#405e5c"},{"name":"Rosenkavalier","hex":"#bc8a90"},{"name":"Roses are Red","hex":"#aa3646"},{"name":"Rosetta","hex":"#ba8f7f"},{"name":"Rosette","hex":"#ce8e8b"},{"name":"Rosewood","hex":"#65000b"},{"name":"Rosey Afterglow","hex":"#fac8ce"},{"name":"Rosin","hex":"#36362d"},{"name":"Rosso Corsa","hex":"#d40000"},{"name":"Rosy Cheeks","hex":"#dc506e"},{"name":"Rosy Highlight","hex":"#f7d994"},{"name":"Rosy Maple Moth","hex":"#fec9ed"},{"name":"Rosy Pink","hex":"#f6688e"},{"name":"Rosy Queen","hex":"#cf9384"},{"name":"Rosy Skin","hex":"#f7b978"},{"name":"Roti","hex":"#b69642"},{"name":"Rotting Flesh","hex":"#8aa775"},{"name":"Rotunda White","hex":"#d7d1c6"},{"name":"Rouge","hex":"#ab1239"},{"name":"Rouge Like","hex":"#a94064"},{"name":"Rouge Red","hex":"#e24666"},{"name":"Rough Ride","hex":"#7a8687"},{"name":"Rough Stone","hex":"#9ea2aa"},{"name":"Roulette","hex":"#97635f"},{"name":"Rousseau Green","hex":"#175844"},{"name":"Rowdy Orange","hex":"#eaa007"},{"name":"Rowntree","hex":"#8e8e6e"},{"name":"Roxy Brown","hex":"#7a5546"},{"name":"Royal","hex":"#0c1793"},{"name":"Royal Azure","hex":"#0038a8"},{"name":"Royal Battle","hex":"#2f3844"},{"name":"Royal Blue","hex":"#4169e1"},{"name":"Royal Brown","hex":"#523b35"},{"name":"Royal Consort","hex":"#2e5686"},{"name":"Royal Coronation","hex":"#3e3542"},{"name":"Royal Curtsy","hex":"#282a4a"},{"name":"Royal Decree","hex":"#403547"},{"name":"Royal Fuchsia","hex":"#ca2c92"},{"name":"Royal Heath","hex":"#b54b73"},{"name":"Royal Hunter Green","hex":"#3f5948"},{"name":"Royal Hyacinth","hex":"#464b6a"},{"name":"Royal Indigo","hex":"#4e4260"},{"name":"Royal Lavender","hex":"#7851a9"},{"name":"Royal Lilac","hex":"#774d8e"},{"name":"Royal Maroon","hex":"#543938"},{"name":"Royal Mile","hex":"#a1a0b7"},{"name":"Royal Navy Blue","hex":"#0066cc"},{"name":"Royal Oakleaf","hex":"#879473"},{"name":"Royal Palm","hex":"#418d84"},{"name":"Royal Plum","hex":"#654161"},{"name":"Royal Pretender","hex":"#a063a1"},{"name":"Royal Purple","hex":"#4b006e"},{"name":"Royal Red Flush","hex":"#8e3c3f"},{"name":"Royal Robe","hex":"#614a7b"},{"name":"Royal Silk","hex":"#4b3841"},{"name":"Royal Silver","hex":"#e0dddd"},{"name":"Royal Yellow","hex":"#fada50"},{"name":"Rozowyi Pink","hex":"#f2a8b8"},{"name":"Rub Elbows","hex":"#5f5547"},{"name":"Rubber","hex":"#815b37"},{"name":"Rubber Band","hex":"#ce4676"},{"name":"Rubber Ducky","hex":"#facf58"},{"name":"Rubidium","hex":"#c5b9b4"},{"name":"Rubine","hex":"#6c383c"},{"name":"Rubine Red","hex":"#d10056"},{"name":"Ruby","hex":"#ca0147"},{"name":"Ruby Dust","hex":"#e0115f"},{"name":"Ruby Lips","hex":"#813e45"},{"name":"Ruby Red","hex":"#9b111e"},{"name":"Ruby Slippers","hex":"#9c2e33"},{"name":"Ruby Star","hex":"#bb1122"},{"name":"Ruby Wine","hex":"#77333b"},{"name":"Rucksack Tan","hex":"#edb508"},{"name":"Ruddy","hex":"#ff0028"},{"name":"Ruddy Brown","hex":"#bb6528"},{"name":"Ruddy Oak","hex":"#a5654e"},{"name":"Ruddy Pink","hex":"#e18e96"},{"name":"Rudraksha Beads","hex":"#894e45"},{"name":"Rufous","hex":"#a81c07"},{"name":"Rugby Tan","hex":"#c2a594"},{"name":"Ruined Smores","hex":"#0f1012"},{"name":"Rum","hex":"#716675"},{"name":"Rum Custard","hex":"#e9cfaa"},{"name":"Rum Punch","hex":"#aa423a"},{"name":"Rum Raisin","hex":"#583432"},{"name":"Rum Riche","hex":"#990044"},{"name":"Rum Swizzle","hex":"#f1edd4"},{"name":"Rumba Red","hex":"#7c2439"},{"name":"Runefang Steel","hex":"#c4c4c7"},{"name":"Runelord Brass","hex":"#b6a89a"},{"name":"Runic Mauve","hex":"#cab2c1"},{"name":"Rural Eyes","hex":"#99af73"},{"name":"Ruri Blue","hex":"#1e50a2"},{"name":"Rurikon Blue","hex":"#1b294b"},{"name":"Rushing River","hex":"#5f7797"},{"name":"Ruskie","hex":"#866c5e"},{"name":"Ruskin Blue","hex":"#546b75"},{"name":"Ruskin Bronze","hex":"#4d4d41"},{"name":"Ruskin Red","hex":"#935242"},{"name":"Russ Grey","hex":"#547588"},{"name":"Russet","hex":"#80461b"},{"name":"Russet Brown","hex":"#743332"},{"name":"Russet Green","hex":"#e3d9a0"},{"name":"Russet Leather","hex":"#965849"},{"name":"Russet Orange","hex":"#e47127"},{"name":"Russian Green","hex":"#679267"},{"name":"Russian Olive","hex":"#726647"},{"name":"Russian Toffee","hex":"#d0c4af"},{"name":"Russian Unif.","hex":"#888a8e"},{"name":"Russian Uniform WW2","hex":"#5f6d36"},{"name":"Russian Violet","hex":"#32174d"},{"name":"Rust","hex":"#a83c09"},{"name":"Rust Brown","hex":"#8b3103"},{"name":"Rust Orange","hex":"#c45508"},{"name":"Rust Red","hex":"#aa2704"},{"name":"Rusted Crimson","hex":"#60372e"},{"name":"Rustic Brown","hex":"#855141"},{"name":"Rustic Cabin","hex":"#705536"},{"name":"Rustic Hacienda","hex":"#9c8e74"},{"name":"Rustic Pottery","hex":"#df745b"},{"name":"Rustic Ranch","hex":"#8d794f"},{"name":"Rustic Red","hex":"#3a181a"},{"name":"Rustic Taupe","hex":"#cdb9a2"},{"name":"Rustique","hex":"#f5bfb2"},{"name":"Rustling Leaves","hex":"#6b6d4e"},{"name":"Rusty","hex":"#96512a"},{"name":"Rusty Chainmail","hex":"#c6494c"},{"name":"Rusty Nail","hex":"#8d5f2c"},{"name":"Rusty Orange","hex":"#cd5909"},{"name":"Rusty Red","hex":"#af2f0d"},{"name":"Rusty Sand","hex":"#edb384"},{"name":"Rusty Sword","hex":"#a4493d"},{"name":"Rutabaga","hex":"#ecddbe"},{"name":"Ryn Flesh","hex":"#f6ebe7"},{"name":"Ryoku-Ou-Shoku Yellow","hex":"#dccb18"},{"name":"Ryu's Kimono","hex":"#f3f1e1"},{"name":"Ryza Dust","hex":"#ec631a"},{"name":"S'mores","hex":"#a87f5f"},{"name":"Sabiasagi Blue","hex":"#6a7f7a"},{"name":"Sabionando Grey","hex":"#455859"},{"name":"Sabiseiji Grey","hex":"#898a74"},{"name":"Sable","hex":"#6e403c"},{"name":"Sablé","hex":"#f6d8be"},{"name":"Sablewood","hex":"#ecdfd6"},{"name":"Sabz Green","hex":"#a5d610"},{"name":"Sachet Pink","hex":"#f18aad"},{"name":"Sacramento State Green","hex":"#00563f"},{"name":"Sacred Blue","hex":"#97b9e0"},{"name":"Sacred Ground","hex":"#b2865d"},{"name":"Sacred Turquoise","hex":"#49b3a5"},{"name":"Sacred Vortex","hex":"#a59c8d"},{"name":"Sacrifice","hex":"#2a5774"},{"name":"Sacrifice Altar","hex":"#850101"},{"name":"Saddle","hex":"#5d4e46"},{"name":"Saddle Brown","hex":"#8b4513"},{"name":"Saddle Soap","hex":"#9f906e"},{"name":"Saddle Up","hex":"#ab927a"},{"name":"Saddlebag","hex":"#8a534e"},{"name":"Safari","hex":"#baaa91"},{"name":"Safari Brown","hex":"#976c60"},{"name":"Safari Trail","hex":"#8f7b51"},{"name":"Safe Harbour","hex":"#1e8ea1"},{"name":"Safe Haven","hex":"#5588aa"},{"name":"Safety Orange","hex":"#ff6600"},{"name":"Safety Yellow","hex":"#eed202"},{"name":"Safflower","hex":"#fdae44"},{"name":"Safflower Bark","hex":"#bb5548"},{"name":"Safflower Kite","hex":"#9a493f"},{"name":"Safflower Purple","hex":"#b44c97"},{"name":"Safflower Red","hex":"#d9333f"},{"name":"Safflower Scarlet","hex":"#e83929"},{"name":"Safflower Wisteria","hex":"#cca6bf"},{"name":"Safflowerish Sky","hex":"#8491c3"},{"name":"Saffron","hex":"#f4c430"},{"name":"Saffron Mango","hex":"#f9bf58"},{"name":"Saffron Robe","hex":"#d49f4e"},{"name":"Saffron soufflé","hex":"#feb209"},{"name":"Saffron Sunset","hex":"#da9e35"},{"name":"Sagat Purple","hex":"#6a31ca"},{"name":"Sage","hex":"#87ae73"},{"name":"Sage Advice","hex":"#948b76"},{"name":"Sage Leaves","hex":"#7b8b5d"},{"name":"Sage Splash","hex":"#e4e5d2"},{"name":"Sage Splendor","hex":"#c3c6a4"},{"name":"Sagebrush Green","hex":"#567572"},{"name":"Sago","hex":"#d8cfc3"},{"name":"Sago Garden","hex":"#94be7f"},{"name":"Sahara","hex":"#b79826"},{"name":"Sahara Dust","hex":"#a8989b"},{"name":"Sahara Gravel","hex":"#dfc08a"},{"name":"Sahara Sand","hex":"#f1e788"},{"name":"Sahara Splendor","hex":"#9b7448"},{"name":"Sahara Sun","hex":"#c67363"},{"name":"Sahara Wind","hex":"#dfd4b7"},{"name":"Sail","hex":"#a5ceec"},{"name":"Sail Away","hex":"#55b4de"},{"name":"Sail Cover","hex":"#588fa0"},{"name":"Sail Maker","hex":"#0e4d72"},{"name":"Sail On","hex":"#4575ad"},{"name":"Sail to the Sea","hex":"#99c3f0"},{"name":"Sailcloth","hex":"#ece0c4"},{"name":"Sailing Safari","hex":"#3a5161"},{"name":"Sailor Blue","hex":"#0e3a53"},{"name":"Sailor Boy","hex":"#aebbd0"},{"name":"Sailor Moon Locks","hex":"#ffee00"},{"name":"Sailor's Coat","hex":"#334b58"},{"name":"Sailor's Knot","hex":"#b8a47a"},{"name":"Sainsbury","hex":"#66b89c"},{"name":"Saint Seiya Gold","hex":"#eeee00"},{"name":"Sakura","hex":"#dfb1b6"},{"name":"Sakura Mochi","hex":"#cea19f"},{"name":"Sakura Nezu","hex":"#e8dfe4"},{"name":"Salad","hex":"#8ba673"},{"name":"Saladin","hex":"#7e8f69"},{"name":"Salal Leaves","hex":"#637d74"},{"name":"Salamander","hex":"#63775b"},{"name":"Salami Slice","hex":"#da655e"},{"name":"Salem","hex":"#177b4d"},{"name":"Salem Black","hex":"#45494d"},{"name":"Salem Blue","hex":"#66a9d3"},{"name":"Salina Springs","hex":"#cad2d4"},{"name":"Saline Water","hex":"#c5e8e7"},{"name":"Salisbury Stone","hex":"#ddd8c6"},{"name":"Salmon","hex":"#ff796c"},{"name":"Salmon Buff","hex":"#feaa7b"},{"name":"Salmon Carpaccio","hex":"#ee867d"},{"name":"Salmon Grey","hex":"#e3b6aa"},{"name":"Salmon Nigiri","hex":"#f9906f"},{"name":"Salmon Orange","hex":"#ff8c69"},{"name":"Salmon Pate","hex":"#d5847e"},{"name":"Salmon Pink","hex":"#ff91a4"},{"name":"Salmon Rose","hex":"#ff8d94"},{"name":"Salmon Run","hex":"#edaf9c"},{"name":"Salmon Salt","hex":"#e7968b"},{"name":"Salmon Sashimi","hex":"#ff7e79"},{"name":"Salmon Slice","hex":"#f1ac8d"},{"name":"Salmon Smoke","hex":"#d4bfbd"},{"name":"Salmon Tartare","hex":"#ff9baa"},{"name":"Salmon Upstream","hex":"#ffa8a6"},{"name":"Salome","hex":"#bbeddb"},{"name":"Salomie","hex":"#ffd67b"},{"name":"Salon Bleu","hex":"#7d8697"},{"name":"Salsa","hex":"#aa182b"},{"name":"Salsa Diane","hex":"#bb4f5c"},{"name":"Salsify Grass","hex":"#2bb179"},{"name":"Salt Blue","hex":"#7d9c9d"},{"name":"Salt Box","hex":"#f5e9d9"},{"name":"Salt Box Blue","hex":"#648fa4"},{"name":"Salt Island Green","hex":"#757261"},{"name":"Salt Lake","hex":"#74c6d3"},{"name":"Salt Spray","hex":"#a7c5ce"},{"name":"Salt Steppe","hex":"#eeddbb"},{"name":"Salt Water","hex":"#95bbd8"},{"name":"Salt Water Taffy","hex":"#d1ab99"},{"name":"Salted Pretzel","hex":"#816b56"},{"name":"Saltpan","hex":"#eef3e5"},{"name":"Salty Breeze","hex":"#dde2d7"},{"name":"Salty Cracker","hex":"#e2c681"},{"name":"Salty Seeds","hex":"#c1b993"},{"name":"Salty Thyme","hex":"#96b403"},{"name":"Salute","hex":"#282b34"},{"name":"Salvation","hex":"#514e5c"},{"name":"Salvia","hex":"#a8b59e"},{"name":"Salvia Divinorum","hex":"#929752"},{"name":"Samantha's Room","hex":"#f2d7e6"},{"name":"Samba","hex":"#a2242f"},{"name":"Sambuca","hex":"#3b2e25"},{"name":"Sambucus","hex":"#17182b"},{"name":"Samoan Sun","hex":"#fbc85f"},{"name":"Samphire Green","hex":"#4db560"},{"name":"San Carlos Plaza","hex":"#d9bb8e"},{"name":"San Felix","hex":"#2c6e31"},{"name":"San Francisco Fog","hex":"#c4c2bc"},{"name":"San Francisco Mauve","hex":"#936a6d"},{"name":"San Gabriel Blue","hex":"#2f6679"},{"name":"San Juan","hex":"#445761"},{"name":"San Marino","hex":"#4e6c9d"},{"name":"San Miguel Blue","hex":"#527585"},{"name":"Sanctuary","hex":"#d4c9a6"},{"name":"Sanctuary Spa","hex":"#66b2e4"},{"name":"Sand","hex":"#e2ca76"},{"name":"Sand Blast","hex":"#decbab"},{"name":"Sand Brown","hex":"#cba560"},{"name":"Sand Diamond","hex":"#fae8bc"},{"name":"Sand Dollar","hex":"#decdbe"},{"name":"Sand Dune","hex":"#e3d2c0"},{"name":"Sand Fossil","hex":"#decfb3"},{"name":"Sand Paper","hex":"#ccbb88"},{"name":"Sand Pebble","hex":"#b09d7f"},{"name":"Sand Pyramid","hex":"#ddcc77"},{"name":"Sand Shark","hex":"#5a86ad"},{"name":"Sand Trail","hex":"#d0c6a1"},{"name":"Sand Verbena","hex":"#9f90c1"},{"name":"Sand Yellow","hex":"#fdee73"},{"name":"Sandal","hex":"#a3876a"},{"name":"Sandalwood","hex":"#615543"},{"name":"Sandbank","hex":"#e9d5ad"},{"name":"Sandcastle","hex":"#e5d7c4"},{"name":"Sandgrass Green","hex":"#93917f"},{"name":"Sanding Sugar","hex":"#efebde"},{"name":"Sandpaper","hex":"#d7b1a5"},{"name":"Sandpiper","hex":"#ebdac8"},{"name":"Sandpiper Cove","hex":"#717474"},{"name":"Sandpit","hex":"#9e7c5e"},{"name":"Sandrift","hex":"#af937d"},{"name":"Sandshell","hex":"#d8ccbb"},{"name":"Sandstone","hex":"#c9ae74"},{"name":"Sandstorm","hex":"#ecd540"},{"name":"Sandwashed Glassshard","hex":"#dee8e3"},{"name":"Sandwisp","hex":"#decb81"},{"name":"Sandworm","hex":"#fce883"},{"name":"Sandy","hex":"#f1da7a"},{"name":"Sandy Ash","hex":"#e4ded5"},{"name":"Sandy Beach","hex":"#f9e2d0"},{"name":"Sandy Day","hex":"#d7cfc1"},{"name":"Sandy Pail","hex":"#d2c098"},{"name":"Sandy Shore","hex":"#f2e9bb"},{"name":"Sandy Tan","hex":"#fdd9b5"},{"name":"Sandy Taupe","hex":"#967111"},{"name":"Sandy Toes","hex":"#c7b8a4"},{"name":"Sang de Boeuf","hex":"#771100"},{"name":"Sango Pink","hex":"#f5b1aa"},{"name":"Sango Red","hex":"#f8674f"},{"name":"Sangoire Red","hex":"#881100"},{"name":"Sangria","hex":"#b14566"},{"name":"Sanguine Brown","hex":"#6c3736"},{"name":"Sanskrit","hex":"#e69332"},{"name":"Santa Fe","hex":"#b16d52"},{"name":"Santa Fe Sunrise","hex":"#cc9469"},{"name":"Santa Fe Sunset","hex":"#a75a4c"},{"name":"Santana Soul","hex":"#714636"},{"name":"Santas Grey","hex":"#9fa0b1"},{"name":"Santolina Blooms","hex":"#e3d0d5"},{"name":"Santorini","hex":"#41b0d0"},{"name":"Sap Green","hex":"#5c8b15"},{"name":"Sapless Green","hex":"#bebdac"},{"name":"Sapling","hex":"#e1d5a6"},{"name":"Sappanwood","hex":"#9e3d3f"},{"name":"Sappanwood Incense","hex":"#a24f46"},{"name":"Sappanwood Perfume","hex":"#a86965"},{"name":"Sapphire","hex":"#0f52ba"},{"name":"Sapphire Blue","hex":"#0067bc"},{"name":"Sapphire Fog","hex":"#99a8c9"},{"name":"Sapphire Siren","hex":"#662288"},{"name":"Sapphire Stone","hex":"#41495d"},{"name":"Saratoga","hex":"#555b2c"},{"name":"Sarawak White Pepper","hex":"#f4eeba"},{"name":"Sarcoline","hex":"#ffddaa"},{"name":"Sardinia Beaches","hex":"#28a4cb"},{"name":"Sargasso Sea","hex":"#35435a"},{"name":"Sarsaparilla","hex":"#5b4c44"},{"name":"Sasquatch Socks","hex":"#ff4681"},{"name":"Sassafras","hex":"#54353b"},{"name":"Sassafras Tea","hex":"#dbd8ca"},{"name":"Sassy","hex":"#c18862"},{"name":"Satellite","hex":"#9f8d89"},{"name":"Satin Blush","hex":"#ffe4c6"},{"name":"Satin Green","hex":"#c7dfb8"},{"name":"Satin Latour","hex":"#fad7b0"},{"name":"Satin Linen","hex":"#e6e4d4"},{"name":"Satin Pink","hex":"#fbe0dc"},{"name":"Satin Purse","hex":"#fff8ee"},{"name":"Satin Ribbon","hex":"#ffd8dc"},{"name":"Satin Sheen Gold","hex":"#cba135"},{"name":"Satin Soil","hex":"#6b4836"},{"name":"Satin Weave","hex":"#f3edd9"},{"name":"Sativa","hex":"#b5bf50"},{"name":"Satoimo Brown","hex":"#654321"},{"name":"Satsuma Imo Red","hex":"#96466a"},{"name":"Saturated Sky","hex":"#4b4cfc"},{"name":"Saturn","hex":"#fae5bf"},{"name":"Satyr Brown","hex":"#bca17a"},{"name":"Saudi Sand","hex":"#9e958a"},{"name":"Sausalito","hex":"#f4e5c5"},{"name":"Sausalito Ridge","hex":"#6a5d53"},{"name":"Sauteed Mushroom","hex":"#ab9378"},{"name":"Sauterne","hex":"#c5a253"},{"name":"Sauvignon","hex":"#f4eae4"},{"name":"Sauvignon Blanc","hex":"#b18276"},{"name":"Savannah","hex":"#d1bd92"},{"name":"Savannah Grass","hex":"#babc72"},{"name":"Savannah Sun","hex":"#ffb989"},{"name":"Savile Row","hex":"#c0b7cf"},{"name":"Savon de Provence","hex":"#eed9b6"},{"name":"Savoy","hex":"#87b550"},{"name":"Sawdust","hex":"#f6e9cf"},{"name":"Sawshark","hex":"#aa7766"},{"name":"Sawtooth Aak","hex":"#ec956c"},{"name":"Saxon","hex":"#abc1a0"},{"name":"Saxony Blue","hex":"#1f6680"},{"name":"Saxophone Gold","hex":"#ceaf81"},{"name":"Sazerac","hex":"#f5dec4"},{"name":"Scab Red","hex":"#8b0000"},{"name":"Scallion","hex":"#6b8e23"},{"name":"Scallop Shell","hex":"#fbd8c9"},{"name":"Scalloped Oak","hex":"#f2d1a0"},{"name":"Scalloped Shell","hex":"#f3e9e0"},{"name":"Scallywag","hex":"#e5d5bd"},{"name":"Scaly Green","hex":"#027275"},{"name":"Scampi","hex":"#6f63a0"},{"name":"Scandal","hex":"#add9d1"},{"name":"Scandinavian Sky","hex":"#c2d3d6"},{"name":"Scarab","hex":"#23312d"},{"name":"Scarabaeus Sacer","hex":"#414040"},{"name":"Scarborough","hex":"#809391"},{"name":"Scarlet","hex":"#ff2400"},{"name":"Scarlet Apple","hex":"#922e4a"},{"name":"Scarlet Flame","hex":"#993366"},{"name":"Scarlet Gum","hex":"#4a2d57"},{"name":"Scarlet Ibis","hex":"#f45520"},{"name":"Scarlet Past","hex":"#a53b3d"},{"name":"Scarlet Ribbons","hex":"#a4334a"},{"name":"Scarlet Sage","hex":"#9d202f"},{"name":"Scarlet Shade","hex":"#7e2530"},{"name":"Scarpa Flow","hex":"#6b6a6c"},{"name":"Scarpetta","hex":"#8ca468"},{"name":"Scatman Blue","hex":"#647983"},{"name":"Scenario","hex":"#81a79e"},{"name":"Scented Frill","hex":"#caaeb8"},{"name":"Scented Valentine","hex":"#f3d9d6"},{"name":"Sceptre Blue","hex":"#353542"},{"name":"Schabziger Yellow","hex":"#eeeebb"},{"name":"Schauss Pink","hex":"#ff91af"},{"name":"Schindler Brown","hex":"#8b714c"},{"name":"Schist","hex":"#87876f"},{"name":"Scholarship","hex":"#586a7d"},{"name":"School Bus Yellow","hex":"#ffd800"},{"name":"School Ink","hex":"#31373f"},{"name":"Schooner","hex":"#8d8478"},{"name":"Sci-fi Petrol","hex":"#006666"},{"name":"Sci-Fi Takeout","hex":"#00604b"},{"name":"Science Blue","hex":"#0076cc"},{"name":"Scintillating Violet","hex":"#764663"},{"name":"Sconce","hex":"#ae935d"},{"name":"Scooter","hex":"#308ea0"},{"name":"Scorched","hex":"#351f19"},{"name":"Scorched Brown","hex":"#4d0001"},{"name":"Scorched Earth","hex":"#44403d"},{"name":"Scorched Metal","hex":"#423d27"},{"name":"Scorpion","hex":"#6a6466"},{"name":"Scorpion Grass Blue","hex":"#99aac8"},{"name":"Scorpion Venom","hex":"#97ea10"},{"name":"Scorpy Green","hex":"#8eef15"},{"name":"Scorzonera Brown","hex":"#544e03"},{"name":"Scotch Blue","hex":"#000077"},{"name":"Scotch Mist","hex":"#eee7c8"},{"name":"Scotchtone","hex":"#ebccb9"},{"name":"Scots Pine","hex":"#5f653b"},{"name":"Scott Base","hex":"#66a3c3"},{"name":"Scouring Rush","hex":"#3b7960"},{"name":"Screamer Pink","hex":"#ab0040"},{"name":"Screamin' Green","hex":"#66ff66"},{"name":"Screaming Bell Metal","hex":"#c16f45"},{"name":"Screaming Magenta","hex":"#cc00cc"},{"name":"Screaming Skull","hex":"#f0f2d2"},{"name":"Screen Test","hex":"#999eb0"},{"name":"Scribe","hex":"#9fabb6"},{"name":"Scrofulous Brown","hex":"#dba539"},{"name":"Scrolled Parchment","hex":"#e9ddc9"},{"name":"Scrub","hex":"#3d4031"},{"name":"Scuba","hex":"#6392b7"},{"name":"Scuba Blue","hex":"#00abc0"},{"name":"Scud","hex":"#acd7c8"},{"name":"Sculptural Silver","hex":"#d1dad5"},{"name":"Scurf Green","hex":"#02737a"},{"name":"Sè Lèi Orange","hex":"#fc824a"},{"name":"Sea","hex":"#3c9992"},{"name":"Sea Anemone","hex":"#e8dad6"},{"name":"Sea Angel","hex":"#98bfca"},{"name":"Sea Bed","hex":"#29848d"},{"name":"Sea Blithe","hex":"#41545c"},{"name":"Sea Blue","hex":"#006994"},{"name":"Sea Breeze","hex":"#a4bfce"},{"name":"Sea Buckthorn","hex":"#ffbf65"},{"name":"Sea Cabbage","hex":"#519d76"},{"name":"Sea Caller","hex":"#45868b"},{"name":"Sea Capture","hex":"#61bddc"},{"name":"Sea Cave","hex":"#005986"},{"name":"Sea Challenge","hex":"#2c585c"},{"name":"Sea Cliff","hex":"#a5c7df"},{"name":"Sea Creature","hex":"#00586d"},{"name":"Sea Crystal","hex":"#608ba6"},{"name":"Sea Current","hex":"#4c959d"},{"name":"Sea Deep","hex":"#2d3c44"},{"name":"Sea Drifter","hex":"#4b7794"},{"name":"Sea Drive","hex":"#c2d2e0"},{"name":"Sea Elephant","hex":"#77675c"},{"name":"Sea Fantasy","hex":"#1a9597"},{"name":"Sea Foam","hex":"#87e0cf"},{"name":"Sea Fog","hex":"#dfddd6"},{"name":"Sea Frost","hex":"#d5dcdc"},{"name":"Sea Garden","hex":"#568e88"},{"name":"Sea Glass","hex":"#afc1bf"},{"name":"Sea Goddess","hex":"#216987"},{"name":"Sea Going","hex":"#2a2e44"},{"name":"Sea Grass","hex":"#67ad83"},{"name":"Sea Green","hex":"#53fca1"},{"name":"Sea Hunter","hex":"#245878"},{"name":"Sea Kale","hex":"#30a299"},{"name":"Sea Kelp","hex":"#354a55"},{"name":"Sea Lavender","hex":"#cfb1d8"},{"name":"Sea Lettuce","hex":"#67a181"},{"name":"Sea Lion","hex":"#7f8793"},{"name":"Sea Loch","hex":"#6e99d1"},{"name":"Sea Mark","hex":"#92b6cf"},{"name":"Sea Mist","hex":"#dbeee0"},{"name":"Sea Monster","hex":"#658c7b"},{"name":"Sea Moss","hex":"#254445"},{"name":"Sea Nettle","hex":"#f47633"},{"name":"Sea Note","hex":"#5482c2"},{"name":"Sea Nymph","hex":"#8aaea4"},{"name":"Sea of Atlantis","hex":"#2d535a"},{"name":"Sea Paint","hex":"#00507a"},{"name":"Sea Palm","hex":"#72897e"},{"name":"Sea Pea","hex":"#457973"},{"name":"Sea Pearl","hex":"#e0e9e4"},{"name":"Sea Pine","hex":"#4c6969"},{"name":"Sea Pink","hex":"#db817e"},{"name":"Sea Quest","hex":"#3e7984"},{"name":"Sea Radish","hex":"#799781"},{"name":"Sea Salt","hex":"#f1e6de"},{"name":"Sea Serpent","hex":"#4bc7cf"},{"name":"Sea Sight","hex":"#00789b"},{"name":"Sea Sparkle","hex":"#469ba7"},{"name":"Sea Spray","hex":"#d2ebea"},{"name":"Sea Sprite","hex":"#b7ccc7"},{"name":"Sea Squash","hex":"#baa243"},{"name":"Sea Star","hex":"#4d939a"},{"name":"Sea Swimmer","hex":"#337f86"},{"name":"Sea Turtle","hex":"#818a40"},{"name":"Sea Urchin","hex":"#367d83"},{"name":"Sea Wonder","hex":"#0f9bc0"},{"name":"Seaborne","hex":"#7aa5c9"},{"name":"Seabrook","hex":"#4b81af"},{"name":"Seachange","hex":"#3e8896"},{"name":"Seacrest","hex":"#bfd1b3"},{"name":"Seafair Green","hex":"#b8f8d8"},{"name":"Seafoam Blue","hex":"#78d1b6"},{"name":"Seagrass","hex":"#bcc6a2"},{"name":"Seagrass Green","hex":"#264e50"},{"name":"Seagull","hex":"#e0ded8"},{"name":"Seagull Wail","hex":"#c7bda8"},{"name":"Seal Brown","hex":"#321414"},{"name":"Seal Pup","hex":"#65869b"},{"name":"Sealegs","hex":"#6b8b8b"},{"name":"Seamount","hex":"#15646d"},{"name":"Seance","hex":"#69326e"},{"name":"Seaplane Grey","hex":"#3a3f41"},{"name":"Seaport","hex":"#005e7d"},{"name":"Seaport Steam","hex":"#aecac8"},{"name":"Searchlight","hex":"#eff0bf"},{"name":"Seared Earth","hex":"#9a5633"},{"name":"Seascape Blue","hex":"#a6bad1"},{"name":"Seascape Green","hex":"#b5e4e4"},{"name":"Seashell","hex":"#fff5ee"},{"name":"Seashell Cove","hex":"#104c77"},{"name":"Seashell Peach","hex":"#fff6de"},{"name":"Seashell Pink","hex":"#f7c8c2"},{"name":"Seasonal Beige","hex":"#e6b99f"},{"name":"Seasoned Acorn","hex":"#7f6640"},{"name":"Seasoned Apple Green","hex":"#8db600"},{"name":"Seattle Red","hex":"#7d212a"},{"name":"Seaweed","hex":"#18d17b"},{"name":"Seaweed Green","hex":"#35ad6b"},{"name":"Seaweed Tea","hex":"#5d7759"},{"name":"Seaweed Wrap","hex":"#4d473d"},{"name":"Seaworld","hex":"#125459"},{"name":"Sebright Chicken","hex":"#bd5701"},{"name":"Secluded Canyon","hex":"#c6876f"},{"name":"Secluded Green","hex":"#6f6d56"},{"name":"Second Nature","hex":"#585642"},{"name":"Second Wind","hex":"#dfece9"},{"name":"Secrecy","hex":"#50759e"},{"name":"Secret Crush","hex":"#d7dfd6"},{"name":"Secret of Mana","hex":"#4166f5"},{"name":"Secret Passageway","hex":"#6d695e"},{"name":"Secret Path","hex":"#737054"},{"name":"Secret Safari","hex":"#c6bb68"},{"name":"Secret Story","hex":"#ff1493"},{"name":"Security","hex":"#d6e1c2"},{"name":"Sedge Green","hex":"#707a68"},{"name":"Sedia","hex":"#b0a67e"},{"name":"Sedona at Sunset","hex":"#bf7c45"},{"name":"Sedona Sage","hex":"#686d6c"},{"name":"Seduction","hex":"#fbf2bf"},{"name":"Seed Pearl","hex":"#e6dac4"},{"name":"Seedling","hex":"#c0cba1"},{"name":"Seeress","hex":"#a99ba9"},{"name":"Sefid White","hex":"#fff1f1"},{"name":"Seiheki Green","hex":"#3a6960"},{"name":"Seiji Green","hex":"#819c8b"},{"name":"Sekichiku Pink","hex":"#e5abbe"},{"name":"Sekkasshoku Brown","hex":"#683f36"},{"name":"Selago","hex":"#e6dfe7"},{"name":"Selective Yellow","hex":"#ffba00"},{"name":"Self Powered","hex":"#8c7591"},{"name":"Self-Destruct","hex":"#c2b398"},{"name":"Sell Out","hex":"#90a2b7"},{"name":"Semi Sweet Chocolate","hex":"#6b4226"},{"name":"Semolina","hex":"#ceb899"},{"name":"Semolina Pudding","hex":"#ffe8c7"},{"name":"Sēn Lín Lǜ Forest","hex":"#4ca973"},{"name":"Senate","hex":"#4a515f"},{"name":"Sencha Brown","hex":"#824b35"},{"name":"Seneca Rock","hex":"#9a927f"},{"name":"Senior Moment","hex":"#fdecc7"},{"name":"Sensai Brown","hex":"#494a41"},{"name":"Sensaicha brown","hex":"#3b3429"},{"name":"Sensaimidori Green","hex":"#374231"},{"name":"Sensitivity","hex":"#a1b0be"},{"name":"Sensual Fumes","hex":"#cd68e2"},{"name":"Sentimental Lady","hex":"#c4d3dc"},{"name":"Sentimental Pink","hex":"#f8eef4"},{"name":"Sephiroth Grey","hex":"#8c92ac"},{"name":"Sepia","hex":"#704214"},{"name":"Sepia Black","hex":"#2b0202"},{"name":"Sepia Rose","hex":"#d4bab6"},{"name":"Sepia Skin","hex":"#9f5c42"},{"name":"Sepia Tint","hex":"#897560"},{"name":"Sepia Tone","hex":"#b8a88a"},{"name":"Sepia Wash","hex":"#995915"},{"name":"September Morn","hex":"#ede6b3"},{"name":"Sequesta","hex":"#d4d158"},{"name":"Sequoia","hex":"#804839"},{"name":"Sequoia Fog","hex":"#c5bbaf"},{"name":"Sequoia Redwood","hex":"#763f3d"},{"name":"Seraphim Sepia","hex":"#d7824b"},{"name":"Seraphinite","hex":"#616f65"},{"name":"Serena","hex":"#cfd0c1"},{"name":"Serenade","hex":"#fce9d7"},{"name":"Serendibite Black","hex":"#4a4354"},{"name":"Serendipity","hex":"#bde1d8"},{"name":"Serene Scene","hex":"#d2c880"},{"name":"Serene Sea","hex":"#78a7c3"},{"name":"Serene Stream","hex":"#819daa"},{"name":"Serene Thought","hex":"#c5c0ac"},{"name":"Serenity","hex":"#91a8d0"},{"name":"Seriously Sand","hex":"#dcccb4"},{"name":"Serpent","hex":"#817f6d"},{"name":"Serpentine","hex":"#9b8e54"},{"name":"Serpentine Shadow","hex":"#003300"},{"name":"Seryi Grey","hex":"#9ca9ad"},{"name":"Sesame","hex":"#baa38b"},{"name":"Sesame Crunch","hex":"#c26a35"},{"name":"Sesame Seed","hex":"#e1d9b8"},{"name":"Sesame Street Green","hex":"#00a870"},{"name":"Settler","hex":"#8b9cac"},{"name":"Seven Seas","hex":"#4a5c6a"},{"name":"Seven Veils","hex":"#e3b8bd"},{"name":"Seville Scarlet","hex":"#955843"},{"name":"Shabby Chic","hex":"#bb8a8e"},{"name":"Shade of Amber","hex":"#ff7e00"},{"name":"Shade of Marigold","hex":"#b88a3d"},{"name":"Shade of Mauve","hex":"#ae7181"},{"name":"Shade of Violet","hex":"#8601af"},{"name":"Shaded Fern","hex":"#786947"},{"name":"Shaded Fuchsia","hex":"#664348"},{"name":"Shaded Glen","hex":"#8e824a"},{"name":"Shaded Hammock","hex":"#859c9b"},{"name":"Shaded Spruce","hex":"#00585e"},{"name":"Shaded Sun","hex":"#f3eba5"},{"name":"Shadow","hex":"#837050"},{"name":"Shadow Azalea Pink","hex":"#e96a97"},{"name":"Shadow Blue","hex":"#778ba5"},{"name":"Shadow Cliff","hex":"#7a6f66"},{"name":"Shadow Dance","hex":"#877d83"},{"name":"Shadow Effect","hex":"#788788"},{"name":"Shadow Gargoyle","hex":"#686767"},{"name":"Shadow Green","hex":"#9ac0b6"},{"name":"Shadow Grey","hex":"#bba5a0"},{"name":"Shadow Leaf","hex":"#395648"},{"name":"Shadow Lime","hex":"#cfe09d"},{"name":"Shadow of the Colossus","hex":"#a3a2a1"},{"name":"Shadow Purple","hex":"#4e334e"},{"name":"Shadow White","hex":"#eef1ea"},{"name":"Shadow Woods","hex":"#8a795d"},{"name":"Shadowed Steel","hex":"#4b4b4b"},{"name":"Shady","hex":"#dbd6cb"},{"name":"Shady Glade","hex":"#006e5b"},{"name":"Shady Lady","hex":"#9f9b9d"},{"name":"Shady Neon Blue","hex":"#5555ff"},{"name":"Shady Oak","hex":"#73694b"},{"name":"Shagbark Olive","hex":"#645d41"},{"name":"Shaggy Barked","hex":"#b3ab98"},{"name":"Shaker Grey","hex":"#6c6556"},{"name":"Shaker Peg","hex":"#886a3f"},{"name":"Shakespeare","hex":"#609ab8"},{"name":"Shaku-Do Copper","hex":"#752100"},{"name":"Shale","hex":"#4a3f41"},{"name":"Shale Green","hex":"#739072"},{"name":"Shalimar","hex":"#f8f6a8"},{"name":"Shallot Leaf","hex":"#505c3a"},{"name":"Shallow End","hex":"#c5f5e8"},{"name":"Shallow Sea","hex":"#9ab8c2"},{"name":"Shallow Shoal","hex":"#9dd6d4"},{"name":"Shallow Shore","hex":"#b0dec8"},{"name":"Shallow Water","hex":"#8caeac"},{"name":"Shamanic Journey","hex":"#cc855a"},{"name":"Shampoo","hex":"#ffcff1"},{"name":"Shamrock","hex":"#009e60"},{"name":"Shamrock Field","hex":"#358d52"},{"name":"Shān Hú Hóng Coral","hex":"#fa9a85"},{"name":"Shandy","hex":"#ffe670"},{"name":"Shanghai Silk","hex":"#c8dfc3"},{"name":"Shangri La","hex":"#ecd4d2"},{"name":"Shani Purple","hex":"#4c1050"},{"name":"Shank","hex":"#a18b5d"},{"name":"Sharbah Fizz","hex":"#9be3d7"},{"name":"Sharegaki Persimmon","hex":"#ffa26b"},{"name":"Shark","hex":"#cadcde"},{"name":"Sharkskin","hex":"#838487"},{"name":"Sharp Blue","hex":"#2b3d54"},{"name":"Sharp Green","hex":"#c6ec7a"},{"name":"Sharp Grey","hex":"#c9cad1"},{"name":"Sharp Yellow","hex":"#ecc043"},{"name":"Sharp-Rip Drill","hex":"#eae1d6"},{"name":"Shattan Gold","hex":"#bb5577"},{"name":"Shattell","hex":"#b5a088"},{"name":"Shaved Chocolate","hex":"#543b35"},{"name":"Shebang","hex":"#81876f"},{"name":"Sheen Green","hex":"#8fd400"},{"name":"Sheepskin","hex":"#dab58f"},{"name":"Sheepskin Gloves","hex":"#ad9e87"},{"name":"Sheer Green","hex":"#b0c69a"},{"name":"Sheer Lavender","hex":"#efe2f2"},{"name":"Sheer Lilac","hex":"#b793c0"},{"name":"Sheer Peach","hex":"#fff7e7"},{"name":"Sheer Pink","hex":"#f6e5db"},{"name":"Sheer Rosebud","hex":"#ffe8e5"},{"name":"Sheer Sunlight","hex":"#fffedf"},{"name":"Sheet Metal","hex":"#5e6063"},{"name":"Sheffield","hex":"#638f7b"},{"name":"Sheffield Grey","hex":"#6b7680"},{"name":"Shell","hex":"#e1cfc6"},{"name":"Shell Brown","hex":"#56564b"},{"name":"Shell Coral","hex":"#ea9575"},{"name":"Shell Haven","hex":"#ebdfc0"},{"name":"Shell Pink","hex":"#f88180"},{"name":"Shell Tint","hex":"#fdd7ca"},{"name":"Shelter","hex":"#b8986c"},{"name":"Sheltered Bay","hex":"#758f9a"},{"name":"Shēn Chéng Orange","hex":"#c03f20"},{"name":"Shēn Hóng Red","hex":"#be0620"},{"name":"Shepherd's Warning","hex":"#c06f68"},{"name":"Sheriff","hex":"#ebcfaa"},{"name":"Sheringa Rose","hex":"#735153"},{"name":"Sherpa Blue","hex":"#00494e"},{"name":"Sherwood Forest","hex":"#555a4c"},{"name":"Sherwood Green","hex":"#1b4636"},{"name":"Shetland Lace","hex":"#dfd0c0"},{"name":"Shì Zǐ Chéng Persimmon","hex":"#e29f31"},{"name":"Shifting Sand","hex":"#d8c0ad"},{"name":"Shiitake Mushroom","hex":"#736253"},{"name":"Shikon","hex":"#2b2028"},{"name":"Shilo","hex":"#e6b2a6"},{"name":"Shimmer","hex":"#88c7e9"},{"name":"Shimmering Blush","hex":"#d98695"},{"name":"Shimmering Brook","hex":"#64b3d3"},{"name":"Shimmering Champagne","hex":"#f3debc"},{"name":"Shimmering Glade","hex":"#a4943a"},{"name":"Shimmering Sea","hex":"#2b526a"},{"name":"Shimmering Sky","hex":"#dbd1e8"},{"name":"Shinbashi","hex":"#59b9c6"},{"name":"Shinbashi Azure","hex":"#006c7f"},{"name":"Shindig","hex":"#00a990"},{"name":"Shiner","hex":"#773ca7"},{"name":"Shingle Fawn","hex":"#745937"},{"name":"Shining Armor","hex":"#908b8e"},{"name":"Shining Gold","hex":"#bad147"},{"name":"Shining Knight","hex":"#989ea7"},{"name":"Shining Silver","hex":"#c7c7c9"},{"name":"Shinshu","hex":"#8f1d21"},{"name":"Shiny Armor","hex":"#a1a9a8"},{"name":"Shiny Nickel","hex":"#ccd3d8"},{"name":"Shiny Rubber","hex":"#3a363b"},{"name":"Shiny Shamrock","hex":"#5fa778"},{"name":"Shiny Silk","hex":"#f7ecca"},{"name":"Ship Cove","hex":"#7988ab"},{"name":"Ship Grey","hex":"#3e3a44"},{"name":"Ship Steering Wheel","hex":"#62493b"},{"name":"Ship's Harbour","hex":"#4f84af"},{"name":"Ship's Officer","hex":"#2d3a49"},{"name":"Shipwreck","hex":"#968772"},{"name":"Shiracha Brown","hex":"#c48e69"},{"name":"Shiraz","hex":"#842833"},{"name":"Shire","hex":"#646b59"},{"name":"Shire Green","hex":"#68e52f"},{"name":"Shiroi White","hex":"#ebf5f0"},{"name":"Shironeri Silk","hex":"#feddcb"},{"name":"Shisha Coal","hex":"#3c3b3c"},{"name":"Shishi Pink","hex":"#efab93"},{"name":"Shishito Pepper Green","hex":"#bbf90f"},{"name":"Shiso Green","hex":"#63a950"},{"name":"Shiva Blue","hex":"#99dbfe"},{"name":"Shocking","hex":"#e899be"},{"name":"Shocking Pink","hex":"#fe02a2"},{"name":"Shockwave","hex":"#72c8b8"},{"name":"Shoelace Beige","hex":"#f6ebd3"},{"name":"Shoji Screen","hex":"#ded5c7"},{"name":"Shojo's Blood","hex":"#e2041b"},{"name":"Shōjōhi Red","hex":"#dc3023"},{"name":"Shooting Star","hex":"#ecf0eb"},{"name":"Shopping Bag","hex":"#5a4743"},{"name":"Shore Water","hex":"#6797a2"},{"name":"Shoreland","hex":"#ead9cb"},{"name":"Short and Sweet","hex":"#edd1d3"},{"name":"Short Phase","hex":"#bbdfd5"},{"name":"Shortbread","hex":"#f5e6d3"},{"name":"Shot Over","hex":"#4a5c69"},{"name":"Shot-Put","hex":"#716b63"},{"name":"Show Business","hex":"#dd835b"},{"name":"Shower","hex":"#9fadb7"},{"name":"Shrimp","hex":"#e29a86"},{"name":"Shrimp Boat","hex":"#f5be9d"},{"name":"Shrimp Boudin","hex":"#dbbfa3"},{"name":"Shrimp Toast","hex":"#f7c5a0"},{"name":"Shrinking Violet","hex":"#5d84b1"},{"name":"Shrubbery","hex":"#a9c08a"},{"name":"Shu Red","hex":"#eb6101"},{"name":"Shǔi Cǎo Lǜ Green","hex":"#40826d"},{"name":"Shukra Blue","hex":"#2b64ad"},{"name":"Shutter Blue","hex":"#666e7f"},{"name":"Shutterbug","hex":"#bba262"},{"name":"Shutters","hex":"#6c705e"},{"name":"Shuttle Grey","hex":"#61666b"},{"name":"Shy Cupid","hex":"#f0d6ca"},{"name":"Shy Girl","hex":"#ffd7cf"},{"name":"Shy Guy Red","hex":"#aa0055"},{"name":"Shy Moment","hex":"#aaaaff"},{"name":"Shy Violet","hex":"#d6c7d6"},{"name":"Shylock","hex":"#5ab9a4"},{"name":"Shyness","hex":"#f3f3d9"},{"name":"Siam","hex":"#686b50"},{"name":"Siamese Kitten","hex":"#efe1d5"},{"name":"Siberian Fur","hex":"#eee2d5"},{"name":"Sicilia Bougainvillea","hex":"#ff44ff"},{"name":"Sicilian Villa","hex":"#fcc792"},{"name":"Sicily Sea","hex":"#c1c6ad"},{"name":"Sick Blue","hex":"#502d86"},{"name":"Sick Green","hex":"#9db92c"},{"name":"Sickly Green","hex":"#94b21c"},{"name":"Sickly Yellow","hex":"#d0e429"},{"name":"Sidecar","hex":"#e9d9a9"},{"name":"Sidekick","hex":"#bfc3ae"},{"name":"Sideshow","hex":"#e2c591"},{"name":"Sidewalk Chalk Blue","hex":"#dbe9ed"},{"name":"Sidewalk Chalk Pink","hex":"#f7ccc4"},{"name":"Sidewalk Grey","hex":"#7b8f99"},{"name":"Sienna","hex":"#a9561e"},{"name":"Sienna Red","hex":"#b1635e"},{"name":"Sierra","hex":"#985c41"},{"name":"Sierra Foothills","hex":"#a28a67"},{"name":"Siesta","hex":"#f0c3a7"},{"name":"Siesta Dreams","hex":"#c9a480"},{"name":"Siesta Rose","hex":"#ec7878"},{"name":"Siesta Sands","hex":"#f1e6e0"},{"name":"Sightful","hex":"#76a4a6"},{"name":"Sigmarite","hex":"#caad76"},{"name":"Silent Breath","hex":"#e9f1ec"},{"name":"Silent Delight","hex":"#e5e7e8"},{"name":"Silent Ivory","hex":"#fef2c7"},{"name":"Silent Night","hex":"#526771"},{"name":"Silent Ripple","hex":"#abe3de"},{"name":"Silent Sage","hex":"#729988"},{"name":"Silent Smoke","hex":"#dbd7ce"},{"name":"Silent Storm","hex":"#c3c7bd"},{"name":"Silentropae Cloud","hex":"#ccbbbb"},{"name":"Silhouette","hex":"#cbcdc4"},{"name":"Silica Sand","hex":"#ede2e0"},{"name":"Silk","hex":"#bbada1"},{"name":"Silk Chiffon","hex":"#ccbfc7"},{"name":"Silk Crepe Grey","hex":"#354e4b"},{"name":"Silk Jewel","hex":"#02517a"},{"name":"Silk Khimar","hex":"#70939e"},{"name":"Silk Road","hex":"#97976f"},{"name":"Silk Sails","hex":"#f6eecd"},{"name":"Silk Sari","hex":"#009283"},{"name":"Silk Sheets","hex":"#efdddf"},{"name":"Silk Sox","hex":"#a5b2c7"},{"name":"Silk Star","hex":"#f5eec6"},{"name":"Silk Stone","hex":"#cc9999"},{"name":"Silken Raspberry","hex":"#aa7d89"},{"name":"Silkie Chicken","hex":"#fdefdb"},{"name":"Silkworm","hex":"#eeeecc"},{"name":"Silky Green","hex":"#bdc2bb"},{"name":"Silky Pink","hex":"#ffddf4"},{"name":"Silky Tofu","hex":"#fff5e4"},{"name":"Silly Puddy","hex":"#f4b0bb"},{"name":"Silt","hex":"#8a7d72"},{"name":"Silt Green","hex":"#a9bdb1"},{"name":"Silver","hex":"#c0c0c0"},{"name":"Silver Bells","hex":"#b8b4b6"},{"name":"Silver Birch","hex":"#d2cfc4"},{"name":"Silver Blue","hex":"#8a9a9a"},{"name":"Silver Blueberry","hex":"#5b7085"},{"name":"Silver Bullet","hex":"#b6b5b8"},{"name":"Silver Chalice","hex":"#acaea9"},{"name":"Silver Charm","hex":"#adb0b4"},{"name":"Silver City","hex":"#e2e4e9"},{"name":"Silver Cloud","hex":"#beb7b0"},{"name":"Silver Creek","hex":"#d9dad2"},{"name":"Silver Cross","hex":"#cdc5c2"},{"name":"Silver Dollar","hex":"#bdb6ae"},{"name":"Silver Drop","hex":"#9ab2a9"},{"name":"Silver Feather","hex":"#edebe7"},{"name":"Silver Fern","hex":"#e1ddbf"},{"name":"Silver Filigree","hex":"#7f7c81"},{"name":"Silver Fox","hex":"#bdbcc4"},{"name":"Silver Grass","hex":"#c6cec3"},{"name":"Silver Green","hex":"#d7d7c7"},{"name":"Silver Grey","hex":"#c1b7b0"},{"name":"Silver Lake","hex":"#dedddd"},{"name":"Silver Lake Blue","hex":"#618bb9"},{"name":"Silver Laurel","hex":"#d8dcc8"},{"name":"Silver Leaf","hex":"#9db7a5"},{"name":"Silver Lined","hex":"#bbbfc3"},{"name":"Silver Lining","hex":"#bdb6ab"},{"name":"Silver Lustre","hex":"#a8a798"},{"name":"Silver Mauve","hex":"#dbccd3"},{"name":"Silver Medal","hex":"#d6d6d6"},{"name":"Silver Mink","hex":"#9f8d7c"},{"name":"Silver Peony","hex":"#e7cfc7"},{"name":"Silver Pink","hex":"#dcb1af"},{"name":"Silver Polish","hex":"#c6c6c6"},{"name":"Silver Rust","hex":"#c9a0df"},{"name":"Silver Sage","hex":"#938b78"},{"name":"Silver Sand","hex":"#bebdb6"},{"name":"Silver Sconce","hex":"#a19fa5"},{"name":"Silver Screen","hex":"#a6aeaa"},{"name":"Silver Service","hex":"#b2aaaa"},{"name":"Silver Setting","hex":"#d8dadb"},{"name":"Silver Skate","hex":"#87a1b1"},{"name":"Silver Spoon","hex":"#d3d3d2"},{"name":"Silver Springs","hex":"#b7bdc4"},{"name":"Silver Spruce","hex":"#cadfdd"},{"name":"Silver Star","hex":"#98a0b8"},{"name":"Silver Storm","hex":"#8599a8"},{"name":"Silver Strand Beach","hex":"#cacdca"},{"name":"Silver Strawberry","hex":"#f2c1c0"},{"name":"Silver Surfer","hex":"#7e7d88"},{"name":"Silver Sweetpea","hex":"#c4c9e2"},{"name":"Silver Tree","hex":"#67be90"},{"name":"Silverado","hex":"#6a6472"},{"name":"Silverbeet","hex":"#5a6a43"},{"name":"Silverberry","hex":"#bebbc9"},{"name":"Silverfish","hex":"#8d95aa"},{"name":"Silverpine","hex":"#4e6866"},{"name":"Silverton","hex":"#bfd9ce"},{"name":"Silvery Moon","hex":"#e6e5dc"},{"name":"Silvery Streak","hex":"#d5dbd5"},{"name":"Simmered Seaweed","hex":"#4c3d30"},{"name":"Simmering Smoke","hex":"#a99f96"},{"name":"Simple Pink","hex":"#f9a3aa"},{"name":"Simply Delicious","hex":"#ffd2c1"},{"name":"Simply Elegant","hex":"#cedde7"},{"name":"Simply Green","hex":"#009b75"},{"name":"Simply Peachy","hex":"#ffc06c"},{"name":"Simply Taupe","hex":"#ad9f93"},{"name":"Simply Violet","hex":"#a6a1d7"},{"name":"Simpson Surprise","hex":"#82856d"},{"name":"Simpsons Yellow","hex":"#ffd90f"},{"name":"Sinatra","hex":"#4675b7"},{"name":"Sinbad","hex":"#a6d5d0"},{"name":"Sinful","hex":"#645059"},{"name":"Singapore Orchid","hex":"#a020f0"},{"name":"Singing Blue","hex":"#0074a4"},{"name":"Singing the Blues","hex":"#2b4d68"},{"name":"Siniy Blue","hex":"#4c4dff"},{"name":"Sinkhole","hex":"#49716d"},{"name":"Sinking Sand","hex":"#d8b778"},{"name":"Sinner's City","hex":"#fee5cb"},{"name":"Sinoper Red","hex":"#bb1111"},{"name":"Sinopia","hex":"#cb410b"},{"name":"Sip of Mint","hex":"#dedfc9"},{"name":"Sir Edmund","hex":"#20415d"},{"name":"Siren","hex":"#69293b"},{"name":"Sirocco","hex":"#68766e"},{"name":"Sisal","hex":"#c5baa0"},{"name":"Siskin Sprout","hex":"#7a942e"},{"name":"Sixteen Million Pink","hex":"#fd02ff"},{"name":"Sixties Blue","hex":"#0079a9"},{"name":"Siyâh Black","hex":"#1c1b1a"},{"name":"Sizzling Red","hex":"#ff3855"},{"name":"Sizzling Sunrise","hex":"#ffdb00"},{"name":"Skarsnik Green","hex":"#5f9370"},{"name":"Skavenblight Dinge","hex":"#47413b"},{"name":"Skeleton","hex":"#ebdecc"},{"name":"Skeleton Bone","hex":"#f4ebbc"},{"name":"Skeletor's Cape","hex":"#773399"},{"name":"Skeptic","hex":"#9db4aa"},{"name":"Ski Patrol","hex":"#bb1237"},{"name":"Skimmed Milk White","hex":"#feffe3"},{"name":"Skin Tone","hex":"#decaae"},{"name":"Skink Blue","hex":"#5cbfce"},{"name":"Skinny Dip","hex":"#f9dbd2"},{"name":"Skipper Blue","hex":"#484a72"},{"name":"Skipping Stone","hex":"#d0cbb6"},{"name":"Skirret Green","hex":"#51b73b"},{"name":"Skobeloff","hex":"#007474"},{"name":"Skrag Brown","hex":"#b04e0f"},{"name":"Skull","hex":"#e3dac9"},{"name":"Skullcrusher Brass","hex":"#f1c78e"},{"name":"Sky","hex":"#76d6ff"},{"name":"Sky Babe","hex":"#88c1d8"},{"name":"Sky Blue","hex":"#9fb9e2"},{"name":"Sky Blue Pink","hex":"#dcbfe1"},{"name":"Sky Bus","hex":"#99c1d6"},{"name":"Sky Captain","hex":"#262934"},{"name":"Sky Chase","hex":"#a5cad1"},{"name":"Sky City","hex":"#a0bdd9"},{"name":"Sky Cloud","hex":"#addee5"},{"name":"Sky Eyes","hex":"#8eaabd"},{"name":"Sky Glass","hex":"#d1dcd8"},{"name":"Sky Grey","hex":"#bcc8c6"},{"name":"Sky High","hex":"#a7c2eb"},{"name":"Sky Lodge","hex":"#546977"},{"name":"Sky Magenta","hex":"#cf71af"},{"name":"Sky of Magritte","hex":"#0099ff"},{"name":"Sky of Ocean","hex":"#82cde5"},{"name":"Sky Pilot","hex":"#a2bad4"},{"name":"Sky Splash","hex":"#c9d3d3"},{"name":"Skydiver","hex":"#83acd3"},{"name":"Skydiving","hex":"#c6d6d7"},{"name":"Skydome","hex":"#38a3cc"},{"name":"Skylight","hex":"#c8e0e0"},{"name":"Skyline","hex":"#959eb7"},{"name":"Skysail Blue","hex":"#818db3"},{"name":"Skyway","hex":"#adbed3"},{"name":"Slaanesh Grey","hex":"#dbd5e6"},{"name":"Slap Happy","hex":"#c9cc4a"},{"name":"Slate","hex":"#516572"},{"name":"Slate Black","hex":"#4b3d33"},{"name":"Slate Blue","hex":"#5b7c99"},{"name":"Slate Brown","hex":"#a0987c"},{"name":"Slate Green","hex":"#658d6d"},{"name":"Slate Grey","hex":"#59656d"},{"name":"Slate Pebble","hex":"#b4ada9"},{"name":"Slate Rose","hex":"#b45865"},{"name":"Slate Wall","hex":"#40535d"},{"name":"Sleep","hex":"#4579ac"},{"name":"Sleep Baby Sleep","hex":"#bed1e1"},{"name":"Sleeping Easy","hex":"#98bddd"},{"name":"Sleeping Giant","hex":"#786d5e"},{"name":"Sleet","hex":"#92949b"},{"name":"Slice of Watermelon","hex":"#e1697c"},{"name":"Slices of Happy","hex":"#ede5bc"},{"name":"Slick Mud","hex":"#a66e49"},{"name":"Sliding","hex":"#97aeaf"},{"name":"Slight Mushroom","hex":"#cfc9c5"},{"name":"Slightly Golden","hex":"#cb904e"},{"name":"Slightly Peach","hex":"#f1ddd8"},{"name":"Slightly Rose","hex":"#e6cfce"},{"name":"Slimer Green","hex":"#aadd00"},{"name":"Slimlime","hex":"#b8ebc5"},{"name":"Slimy Green","hex":"#7ded17"},{"name":"Slipper Satin","hex":"#bfc1cb"},{"name":"Slippery Moss","hex":"#beba82"},{"name":"Slippery Salmon","hex":"#f87e63"},{"name":"Slippery Stone","hex":"#8d6a4a"},{"name":"Slopes","hex":"#d2b698"},{"name":"Slow Dance","hex":"#dbdcc4"},{"name":"Slow Perch","hex":"#d5d4ce"},{"name":"Slubbed Silk","hex":"#e1c2be"},{"name":"Sludge","hex":"#ca6b02"},{"name":"Slugger","hex":"#42342b"},{"name":"Slumber","hex":"#2d517c"},{"name":"Sly Shrimp","hex":"#f8e2d9"},{"name":"Smallmouth Bass","hex":"#ac9a7e"},{"name":"Smalt","hex":"#003399"},{"name":"Smalt Blue","hex":"#496267"},{"name":"Smaragdine","hex":"#4a9976"},{"name":"Smashed Grape","hex":"#8775a1"},{"name":"Smashed Potatoes","hex":"#e2d0b9"},{"name":"Smashed Pumpkin","hex":"#ff6d3a"},{"name":"Smitten","hex":"#c84186"},{"name":"Smoke","hex":"#bfc8c3"},{"name":"Smoke & Ash","hex":"#939789"},{"name":"Smoke and Mirrors","hex":"#d9e6e8"},{"name":"Smoke Bush","hex":"#cc7788"},{"name":"Smoke Cloud","hex":"#adb6b9"},{"name":"Smoke Green","hex":"#a8bba2"},{"name":"Smoke Grey","hex":"#cebaa8"},{"name":"Smoke Pine","hex":"#3e6257"},{"name":"Smoke Screen","hex":"#aeaeae"},{"name":"Smoke Tree","hex":"#bb5f34"},{"name":"Smoked Amethyst","hex":"#5a4351"},{"name":"Smoked Black Coffee","hex":"#3b2f2f"},{"name":"Smoked Claret","hex":"#583a39"},{"name":"Smoked Flamingo","hex":"#674244"},{"name":"Smoked Lavender","hex":"#ceb5b3"},{"name":"Smoked Paprika","hex":"#6e362c"},{"name":"Smoked Pearl","hex":"#656466"},{"name":"Smoked Purple","hex":"#444251"},{"name":"Smoked Salmon","hex":"#fa8072"},{"name":"Smoked Silver","hex":"#ddbbcc"},{"name":"Smoking Red","hex":"#992200"},{"name":"Smoky","hex":"#605d6b"},{"name":"Smoky Black","hex":"#100c08"},{"name":"Smoky Blue","hex":"#7196a6"},{"name":"Smoky Day","hex":"#a49e93"},{"name":"Smoky Emerald","hex":"#4c726b"},{"name":"Smoky Forest","hex":"#817d68"},{"name":"Smoky Grape","hex":"#9b8fa6"},{"name":"Smoky Mountain","hex":"#afa8a9"},{"name":"Smoky Orchid","hex":"#e1d9dc"},{"name":"Smoky Pink","hex":"#bb8d88"},{"name":"Smoky Quartz","hex":"#51484f"},{"name":"Smoky Slate","hex":"#a1a18f"},{"name":"Smoky Sunrise","hex":"#aa9793"},{"name":"Smoky Topaz","hex":"#7e7668"},{"name":"Smooth As Corn Silk","hex":"#f4e4b3"},{"name":"Smooth Beech","hex":"#d3bb96"},{"name":"Smooth Satin","hex":"#a2d5d3"},{"name":"Smooth Stone","hex":"#bcb6b3"},{"name":"Smooth-Hound Shark","hex":"#97b2b1"},{"name":"Snail Trail Silver","hex":"#e9eeeb"},{"name":"Snake Eyes","hex":"#e9cb4c"},{"name":"Snake River","hex":"#45698c"},{"name":"Snakebite Leather","hex":"#baa208"},{"name":"Snakes in the Grass","hex":"#889717"},{"name":"Snap-Shot","hex":"#2b3e52"},{"name":"Snapdragon","hex":"#fed777"},{"name":"Snappy Happy","hex":"#eb8239"},{"name":"Sneezy","hex":"#9d7938"},{"name":"Snip of Tannin","hex":"#dccebb"},{"name":"Snoop","hex":"#49556c"},{"name":"Snorkel Blue","hex":"#034f84"},{"name":"Snorkel Sea","hex":"#004f7d"},{"name":"Snot","hex":"#acbb0d"},{"name":"Snot Green","hex":"#9dc100"},{"name":"Snow","hex":"#fffafa"},{"name":"Snow Ballet","hex":"#def1e7"},{"name":"Snow Drift","hex":"#e3e3dc"},{"name":"Snow Drop","hex":"#eeffcc"},{"name":"Snow Flurry","hex":"#eaf7c9"},{"name":"Snow Globe","hex":"#f4f2e9"},{"name":"Snow Goose","hex":"#c3d9cb"},{"name":"Snow Green","hex":"#c8dac2"},{"name":"Snow Leopard","hex":"#cfdfdb"},{"name":"Snow Pea","hex":"#6ccc7b"},{"name":"Snow Peak","hex":"#e0dcdb"},{"name":"Snow Plum","hex":"#f4eaf0"},{"name":"Snow Shadow","hex":"#d7e4ed"},{"name":"Snow Storm","hex":"#eeedea"},{"name":"Snow White","hex":"#eeffee"},{"name":"Snow White Blush","hex":"#f8afa9"},{"name":"Snowbank","hex":"#e8e9e9"},{"name":"Snowflake","hex":"#eff0f0"},{"name":"Snowpink","hex":"#f1c5c2"},{"name":"Snowshoe Hare","hex":"#e7e3d6"},{"name":"Snowy Evergreen","hex":"#edf2e0"},{"name":"Snowy Mint","hex":"#d6f0cd"},{"name":"Snowy Mount","hex":"#f1eeeb"},{"name":"Snowy Shadow","hex":"#d3dbec"},{"name":"Snub","hex":"#a5adbd"},{"name":"Snuff","hex":"#e4d7e5"},{"name":"Snug Cottage","hex":"#fff9e2"},{"name":"Snuggle Pie","hex":"#a58f73"},{"name":"So Chic!","hex":"#cecdc5"},{"name":"So Sublime","hex":"#8b847c"},{"name":"So-Sari","hex":"#006f47"},{"name":"Soap","hex":"#cec8ef"},{"name":"Soap Bubble","hex":"#b2dcef"},{"name":"Soapstone","hex":"#ece5da"},{"name":"Soaring Eagle","hex":"#9badbe"},{"name":"Soaring Sky","hex":"#b9e5e8"},{"name":"Sodalite Blue","hex":"#253668"},{"name":"Sōdenkaracha Brown","hex":"#9b533f"},{"name":"Sodium Silver","hex":"#fffcee"},{"name":"Soft Amber","hex":"#cfbea5"},{"name":"Soft Amethyst","hex":"#cfb7c9"},{"name":"Soft Bark","hex":"#897670"},{"name":"Soft Beige","hex":"#b9b5af"},{"name":"Soft Blue","hex":"#6488ea"},{"name":"Soft Blush","hex":"#e3bcbc"},{"name":"Soft Bromeliad","hex":"#99656c"},{"name":"Soft Candlelight","hex":"#f7eacf"},{"name":"Soft Cashmere","hex":"#efb6d8"},{"name":"Soft Celadon","hex":"#bfcfc8"},{"name":"Soft Celery","hex":"#c4cd87"},{"name":"Soft Chamois","hex":"#dbb67a"},{"name":"Soft Charcoal","hex":"#838298"},{"name":"Soft Cocoa","hex":"#987b71"},{"name":"Soft Coral","hex":"#ffeee0"},{"name":"Soft Cream","hex":"#f5efd6"},{"name":"Soft Doeskin","hex":"#e0cfb9"},{"name":"Soft Dove","hex":"#c2bbb2"},{"name":"Soft Fern","hex":"#c7d368"},{"name":"Soft Focus","hex":"#e2efdd"},{"name":"Soft Fresco","hex":"#c0d5ca"},{"name":"Soft Froth","hex":"#bdccb3"},{"name":"Soft Fur","hex":"#7e7574"},{"name":"Soft Green","hex":"#6fc276"},{"name":"Soft Impact","hex":"#b28ea8"},{"name":"Soft Impala","hex":"#a28b7e"},{"name":"Soft Ivory","hex":"#fbf1df"},{"name":"Soft Kind","hex":"#d1d2be"},{"name":"Soft Lavender","hex":"#f6e5f6"},{"name":"Soft Leather","hex":"#d9a077"},{"name":"Soft Lilac","hex":"#e2d4df"},{"name":"Soft Lumen","hex":"#beddba"},{"name":"Soft Metal","hex":"#bab2b1"},{"name":"Soft Mint","hex":"#e6f9f1"},{"name":"Soft Moss","hex":"#cce1c7"},{"name":"Soft Orange Bloom","hex":"#ffdcd2"},{"name":"Soft Peach","hex":"#eedfde"},{"name":"Soft Peach Mist","hex":"#fff3f0"},{"name":"Soft Petals","hex":"#ebf8ef"},{"name":"Soft Pink","hex":"#fdb0c0"},{"name":"Soft Pumice","hex":"#949ea2"},{"name":"Soft Purple","hex":"#a66fb5"},{"name":"Soft Salmon","hex":"#eaaaa2"},{"name":"Soft Satin","hex":"#eec5ce"},{"name":"Soft Savvy","hex":"#837e87"},{"name":"Soft Silver","hex":"#f7f9e9"},{"name":"Soft Sky","hex":"#b5b5cb"},{"name":"Soft Steel","hex":"#404854"},{"name":"Soft Straw","hex":"#f5d180"},{"name":"Soft Suede","hex":"#d8cbad"},{"name":"Soft Tone","hex":"#c3b3b2"},{"name":"Soft Tone Ink","hex":"#9d6016"},{"name":"Soft Touch","hex":"#639b95"},{"name":"Softly Softly","hex":"#c9b7ce"},{"name":"Softsun","hex":"#f3ca40"},{"name":"Sohi Orange","hex":"#e0815e"},{"name":"Sohi Red","hex":"#e35c38"},{"name":"Soho Red","hex":"#ab6953"},{"name":"Soil Of Avagddu","hex":"#845c00"},{"name":"Solar","hex":"#fbeab8"},{"name":"Solar Power","hex":"#f4bf3a"},{"name":"Solar Wind","hex":"#fce9b9"},{"name":"Soldier Green","hex":"#545a2c"},{"name":"Soleil","hex":"#e9cb2e"},{"name":"Solid Empire","hex":"#635c59"},{"name":"Solid Gold","hex":"#b7d24b"},{"name":"Solid Pink","hex":"#c78b95"},{"name":"Solid Snake","hex":"#a1a58c"},{"name":"Solitaire","hex":"#c6decf"},{"name":"Solitary State","hex":"#c4c7c4"},{"name":"Solitude","hex":"#e9ecf1"},{"name":"Solstice","hex":"#babdb8"},{"name":"Solution","hex":"#77abab"},{"name":"Somber","hex":"#cbb489"},{"name":"Sombre Grey","hex":"#555470"},{"name":"Someday","hex":"#efe4cc"},{"name":"Sonata","hex":"#abc8d8"},{"name":"Songbird","hex":"#a3d1eb"},{"name":"Sonia Rose","hex":"#f3c8c2"},{"name":"Sonic Blue","hex":"#17569b"},{"name":"Sonic Silver","hex":"#757575"},{"name":"Sonoma Chardonnay","hex":"#ddcb91"},{"name":"Sonoma Sage","hex":"#90a58a"},{"name":"Sonoma Sky","hex":"#bfd1ca"},{"name":"Sonora Apricot","hex":"#e0b493"},{"name":"Sonora Hills","hex":"#bea77d"},{"name":"Sonora Rose","hex":"#e8d2e3"},{"name":"Sonora Shade","hex":"#c89672"},{"name":"Soooo Bloody","hex":"#550000"},{"name":"Soot","hex":"#555e5f"},{"name":"Soothing Breeze","hex":"#b3bec4"},{"name":"Soothing Sea","hex":"#c3e9e4"},{"name":"Soothsayer","hex":"#8092bc"},{"name":"Sooty","hex":"#141414"},{"name":"Sooty Willow Bamboo","hex":"#4d4b3a"},{"name":"Sophisticated Plum","hex":"#5d5153"},{"name":"Sophistication","hex":"#bfb5a6"},{"name":"Sophomore","hex":"#7d7170"},{"name":"Sora Blue","hex":"#a0d8ef"},{"name":"Sora Sky","hex":"#4d8fac"},{"name":"Sorbus","hex":"#dd6b38"},{"name":"Sorcerer","hex":"#3398ce"},{"name":"Sorrel Felt","hex":"#a49688"},{"name":"Sorrell Brown","hex":"#9d7f61"},{"name":"Sorx Red","hex":"#fc0156"},{"name":"Sotek Green","hex":"#47788a"},{"name":"Souffle","hex":"#edd1a8"},{"name":"Soul Quenching","hex":"#7e989d"},{"name":"Soul Side","hex":"#ffaa55"},{"name":"Soulstone Blue","hex":"#0047ab"},{"name":"Sour Apple","hex":"#d2c785"},{"name":"Sour Candy","hex":"#66b348"},{"name":"Sour Face","hex":"#adc979"},{"name":"Sour Lemon","hex":"#ffeea5"},{"name":"Sour Patch Peach","hex":"#f4d9c5"},{"name":"Sourdough","hex":"#c9b59a"},{"name":"South Peak","hex":"#eadfd2"},{"name":"South Rim Trail","hex":"#a6847b"},{"name":"South Shore Sun","hex":"#ffdc9e"},{"name":"Southern Belle","hex":"#a6d6c3"},{"name":"Southern Breeze","hex":"#e4dfd1"},{"name":"Southern Moss","hex":"#bca66a"},{"name":"Southern Pine","hex":"#acb4ab"},{"name":"Southern Platyfish","hex":"#d0d34d"},{"name":"Southwestern Clay","hex":"#cc6758"},{"name":"Sovereignty","hex":"#304e63"},{"name":"Soya","hex":"#fae3bc"},{"name":"Soya Bean","hex":"#6f634b"},{"name":"Soybean","hex":"#d2c29d"},{"name":"Soylent Green","hex":"#578363"},{"name":"Spa Blue","hex":"#d3dedf"},{"name":"Spa Dream","hex":"#1993be"},{"name":"Spa Sangria","hex":"#d7c9a5"},{"name":"Space Angel","hex":"#3b4271"},{"name":"Space Cadet","hex":"#1d2951"},{"name":"Space Grey","hex":"#110022"},{"name":"Space Invader","hex":"#139d08"},{"name":"Space Shuttle","hex":"#4b433b"},{"name":"Space Station","hex":"#6c6d7a"},{"name":"Space Wolves Grey","hex":"#dae6ef"},{"name":"Spaceman","hex":"#5f6882"},{"name":"Spacious Plain","hex":"#9a8557"},{"name":"Spacious Sky","hex":"#aeb5c7"},{"name":"Spaghetti","hex":"#fef69e"},{"name":"Spaghetti Carbonara","hex":"#ddddaa"},{"name":"Spaghetti Monster","hex":"#eecc88"},{"name":"Spaghetti Strap Pink","hex":"#fbaed2"},{"name":"Spandex Green","hex":"#36b14e"},{"name":"Spanish Bistre","hex":"#807532"},{"name":"Spanish Blue","hex":"#0070b8"},{"name":"Spanish Carmine","hex":"#d10047"},{"name":"Spanish Cream","hex":"#fce5c0"},{"name":"Spanish Crimson","hex":"#e51a4c"},{"name":"Spanish Gold","hex":"#b09a4f"},{"name":"Spanish Green","hex":"#7b8976"},{"name":"Spanish Grey","hex":"#989898"},{"name":"Spanish Mustang","hex":"#684b40"},{"name":"Spanish Olive","hex":"#a1a867"},{"name":"Spanish Orange","hex":"#e86100"},{"name":"Spanish Peanut","hex":"#c57556"},{"name":"Spanish Pink","hex":"#f7bfbe"},{"name":"Spanish Plum","hex":"#5c3357"},{"name":"Spanish Purple","hex":"#66033c"},{"name":"Spanish Red","hex":"#e60026"},{"name":"Spanish Sand","hex":"#cab08e"},{"name":"Spanish Sky Blue","hex":"#00fffe"},{"name":"Spanish Style","hex":"#93765c"},{"name":"Spanish Villa","hex":"#dfbaa9"},{"name":"Spanish Violet","hex":"#4c2882"},{"name":"Spanish Viridian","hex":"#007f5c"},{"name":"Spanish White","hex":"#ded1b7"},{"name":"Spanish Yellow","hex":"#f6b511"},{"name":"Sparkling Champagne","hex":"#efcf98"},{"name":"Sparkling Cider","hex":"#fffdeb"},{"name":"Sparkling Cove","hex":"#2da4b6"},{"name":"Sparkling Frost","hex":"#d2d5da"},{"name":"Sparkling Grape","hex":"#773376"},{"name":"Sparkling Pink","hex":"#f5cee6"},{"name":"Sparkling River","hex":"#d6edf1"},{"name":"Sparrow","hex":"#69595c"},{"name":"Spartacus","hex":"#76a4a7"},{"name":"Spartan Blue","hex":"#7a8898"},{"name":"Spartan Crimson","hex":"#9e1316"},{"name":"Spatial Spirit","hex":"#c1edd3"},{"name":"Spätzle Yellow","hex":"#ffee88"},{"name":"Speak To Me","hex":"#ffd9a6"},{"name":"Speakeasy","hex":"#826a6c"},{"name":"Spear Shaft","hex":"#885500"},{"name":"Spearfish","hex":"#5fb6bf"},{"name":"Spearmint","hex":"#64bfa4"},{"name":"Spearmint Ice","hex":"#bfd3cb"},{"name":"Spearmint Stick","hex":"#e8f0e2"},{"name":"Spearmint Water","hex":"#b1eae8"},{"name":"Special Delivery","hex":"#a5b2b7"},{"name":"Special Ops","hex":"#868b53"},{"name":"Species","hex":"#dcd867"},{"name":"Speckled Easter Egg","hex":"#d38798"},{"name":"Spectra","hex":"#375d4f"},{"name":"Spectra Green","hex":"#009b8c"},{"name":"Spectra Yellow","hex":"#f7b718"},{"name":"Spectrum Blue","hex":"#3d3c7c"},{"name":"Speedwell","hex":"#5a6272"},{"name":"Spell","hex":"#5e4f50"},{"name":"Spell Caster","hex":"#4a373e"},{"name":"Sphagnales Moss","hex":"#a5ad44"},{"name":"Sphagnum Moss","hex":"#75693d"},{"name":"Sphinx","hex":"#ab9895"},{"name":"Spice","hex":"#6c4f3f"},{"name":"Spice Cake","hex":"#b87243"},{"name":"Spice Cookie","hex":"#f0ded3"},{"name":"Spice Delight","hex":"#f3e9cf"},{"name":"Spice Girl","hex":"#e1c2c1"},{"name":"Spice Is Nice","hex":"#ebd0a4"},{"name":"Spice Ivory","hex":"#f4eedc"},{"name":"Spice of Life","hex":"#86493f"},{"name":"Spice Route","hex":"#b95b3f"},{"name":"Spiced Apple","hex":"#783937"},{"name":"Spiced Berry","hex":"#85443f"},{"name":"Spiced Butternut","hex":"#ffd978"},{"name":"Spiced Cider","hex":"#915b41"},{"name":"Spiced Cinnamon","hex":"#805b48"},{"name":"Spiced Coral","hex":"#d75c5d"},{"name":"Spiced Hot Chocolate","hex":"#53433e"},{"name":"Spiced Nectarine","hex":"#ffbb72"},{"name":"Spiced Nutmeg","hex":"#927d6c"},{"name":"Spiced Orange","hex":"#edc7b6"},{"name":"Spiced Plum","hex":"#6d4773"},{"name":"Spiced Up","hex":"#b14b38"},{"name":"Spiced Vinegar","hex":"#cdba99"},{"name":"Spiced Wine","hex":"#664942"},{"name":"Spicy Mix","hex":"#8b5f4d"},{"name":"Spicy Mustard","hex":"#74640d"},{"name":"Spicy Orange","hex":"#d73c26"},{"name":"Spicy Pink","hex":"#ff1cae"},{"name":"Spicy Red","hex":"#ff1111"},{"name":"Spicy Tomato","hex":"#c75433"},{"name":"Spider Cotton","hex":"#e2e8df"},{"name":"Spike","hex":"#656271"},{"name":"Spiked Apricot","hex":"#fdddb7"},{"name":"Spinach Banana Smoothie","hex":"#aaaa55"},{"name":"Spinach Dip","hex":"#b1cdac"},{"name":"Spinach Green","hex":"#909b4c"},{"name":"Spinach Soup","hex":"#6e750e"},{"name":"Spindle","hex":"#b3c4d8"},{"name":"Spindrift","hex":"#73fcd6"},{"name":"Spinnaker","hex":"#a3e2dd"},{"name":"Spinning Blue","hex":"#5b6a7c"},{"name":"Spirit","hex":"#b2bbc6"},{"name":"Spirit Dance","hex":"#514b80"},{"name":"Spirit Mountain","hex":"#6a8b98"},{"name":"Spirit Rock","hex":"#5f534e"},{"name":"Spiritstone Red","hex":"#fd411e"},{"name":"Spiro Disco Ball","hex":"#0fc0fc"},{"name":"Spirulina","hex":"#5a665c"},{"name":"Splash","hex":"#f1d79e"},{"name":"Splash Of Grenadine","hex":"#f984e5"},{"name":"Splash of Honey","hex":"#d8b98c"},{"name":"Splash Palace","hex":"#5984b0"},{"name":"Splatter","hex":"#a9586c"},{"name":"Splendiferous","hex":"#806e7c"},{"name":"Splinter","hex":"#a3713f"},{"name":"Splish Splash","hex":"#3194ce"},{"name":"Split Pea","hex":"#9c9a40"},{"name":"Split Pea Soup","hex":"#c8b165"},{"name":"Spoiled Egg","hex":"#e8ff2a"},{"name":"Sponge","hex":"#a49775"},{"name":"Sponge Cake","hex":"#fffe40"},{"name":"Spooky","hex":"#d1d2bf"},{"name":"Spooky Graveyard","hex":"#685e4f"},{"name":"Spooled White","hex":"#f5eae3"},{"name":"Spores","hex":"#7f8162"},{"name":"Spotlight","hex":"#faeacd"},{"name":"Spotted Dove","hex":"#bfbfbd"},{"name":"Spotted Snake Eel","hex":"#b1d3e3"},{"name":"Spray","hex":"#7ecddd"},{"name":"Spray Green","hex":"#aea692"},{"name":"Spray of Mint","hex":"#bdd0c3"},{"name":"Sprig Muslin","hex":"#d6c1c5"},{"name":"Sprig of Mint","hex":"#8be0ba"},{"name":"Spring","hex":"#00f900"},{"name":"Spring Blossom","hex":"#e9edbd"},{"name":"Spring Bouquet","hex":"#6dce87"},{"name":"Spring Boutique","hex":"#d7b9cb"},{"name":"Spring Bud","hex":"#a7fc00"},{"name":"Spring Burst","hex":"#c9e0c8"},{"name":"Spring Buttercup","hex":"#fff6c2"},{"name":"Spring Crocus","hex":"#ba69a1"},{"name":"Spring Fever","hex":"#e5e3bf"},{"name":"Spring Fields","hex":"#b3cdac"},{"name":"Spring Fog","hex":"#ecf1ec"},{"name":"Spring Frost","hex":"#87ff2a"},{"name":"Spring Garden","hex":"#558961"},{"name":"Spring Green","hex":"#00ff7c"},{"name":"Spring Heat","hex":"#fffddd"},{"name":"Spring Juniper","hex":"#4a754a"},{"name":"Spring Kiss","hex":"#e3efb2"},{"name":"Spring Leaves","hex":"#a8c3aa"},{"name":"Spring Lilac","hex":"#b1b3cb"},{"name":"Spring Lily","hex":"#fcf4c8"},{"name":"Spring Lobster","hex":"#640125"},{"name":"Spring Lobster Brown","hex":"#6c2c2f"},{"name":"Spring Lobster Dye","hex":"#7a4171"},{"name":"Spring Marsh","hex":"#c0b05d"},{"name":"Spring Mist","hex":"#d3e0de"},{"name":"Spring Onion","hex":"#596c3c"},{"name":"Spring Rain","hex":"#a3bd9c"},{"name":"Spring Roll","hex":"#c4a661"},{"name":"Spring Savor","hex":"#cceecc"},{"name":"Spring Shoot","hex":"#e2edc1"},{"name":"Spring Shower","hex":"#abdcee"},{"name":"Spring Slumber Green","hex":"#b8f8b8"},{"name":"Spring Sprout","hex":"#86ba4a"},{"name":"Spring Sun","hex":"#f1f1c6"},{"name":"Spring Thaw","hex":"#d9dcdd"},{"name":"Spring Thyme","hex":"#d8dcb3"},{"name":"Spring White","hex":"#ecfcec"},{"name":"Spring Wisteria","hex":"#cda4de"},{"name":"Spring Wood","hex":"#e9e1d9"},{"name":"Springtime Dew","hex":"#ffffef"},{"name":"Springtime Rain","hex":"#ebeef3"},{"name":"Sprite Twist","hex":"#b9dcc3"},{"name":"Spritzig","hex":"#76c5e7"},{"name":"Sprout","hex":"#b8ca9d"},{"name":"Sprout Green","hex":"#cbd7d2"},{"name":"Spruce","hex":"#0a5f38"},{"name":"Spruce Shade","hex":"#91a49d"},{"name":"Spruce Stone","hex":"#9fc09c"},{"name":"Spruce Tree Flower","hex":"#b35e97"},{"name":"Spruce Woods","hex":"#6e6a51"},{"name":"Spruce Yellow","hex":"#be8a4a"},{"name":"Spruced Up","hex":"#9a7f28"},{"name":"Spumoni","hex":"#bccfa4"},{"name":"Spun Cotton","hex":"#f3ecdc"},{"name":"Spun Jute","hex":"#f4e4cf"},{"name":"Spun Pearl","hex":"#a2a1ac"},{"name":"Spun Sugar","hex":"#fae2ed"},{"name":"SQL Injection Purple","hex":"#5e0092"},{"name":"Squash","hex":"#f2ab15"},{"name":"Squash Blossom","hex":"#f8b438"},{"name":"Squeaky","hex":"#6cc4da"},{"name":"Squeeze Toy Alien","hex":"#11ee00"},{"name":"Squid Hat","hex":"#6e2233"},{"name":"Squid Ink Powder","hex":"#001133"},{"name":"Squid Pink","hex":"#f5b4bd"},{"name":"Squid's Ink","hex":"#4d4e5c"},{"name":"Squig Orange","hex":"#aa4f44"},{"name":"Squirrel","hex":"#8f7d6b"},{"name":"Squirt","hex":"#95bcc5"},{"name":"St Tropez","hex":"#325482"},{"name":"St. Augustine","hex":"#d0ddcc"},{"name":"St. Patrick's Blue","hex":"#23297a"},{"name":"St.Patrick","hex":"#2b8c4e"},{"name":"Stability","hex":"#c1d0b2"},{"name":"Stack","hex":"#858885"},{"name":"Stacked Limestone","hex":"#d1b992"},{"name":"Stacked Stone","hex":"#918676"},{"name":"Stadium Grass","hex":"#d5f534"},{"name":"Stadium Lawn","hex":"#9af764"},{"name":"Stag Beetle","hex":"#603b41"},{"name":"Stained Glass","hex":"#556682"},{"name":"Stalactite Brown","hex":"#d4c4a7"},{"name":"Stalk","hex":"#7cb26e"},{"name":"Stamina","hex":"#b0a8ad"},{"name":"Stand Out","hex":"#7f8596"},{"name":"Standing Waters","hex":"#005599"},{"name":"Stanford Green","hex":"#658f7c"},{"name":"Stanford Stone","hex":"#bcab9c"},{"name":"Stanley","hex":"#9bc2b4"},{"name":"Star Anise","hex":"#5c5042"},{"name":"Star Bright","hex":"#e8ddae"},{"name":"Star City","hex":"#5796a1"},{"name":"Star Command Blue","hex":"#007bb8"},{"name":"Star Grass","hex":"#75dbc1"},{"name":"Star Magic","hex":"#e4d8d8"},{"name":"Star Map","hex":"#dae2e9"},{"name":"Star of Gold","hex":"#ebe3c7"},{"name":"Star Sapphire","hex":"#386192"},{"name":"Star White","hex":"#efefe8"},{"name":"Star-Studded","hex":"#f7ebac"},{"name":"Starbur","hex":"#6cb037"},{"name":"Starburst","hex":"#dce7e5"},{"name":"Stardust","hex":"#ddd3ae"},{"name":"Starfish","hex":"#e5bca5"},{"name":"Starfleet Blue","hex":"#0096ff"},{"name":"Stargate","hex":"#b7c4d3"},{"name":"Stargate Shimmer","hex":"#7777ff"},{"name":"Stargazer","hex":"#39505c"},{"name":"Stargazing","hex":"#414549"},{"name":"Stark White","hex":"#d2c6b6"},{"name":"Starlight","hex":"#bcc0cc"},{"name":"Starlight Blue","hex":"#b5ced4"},{"name":"Starlit Eve","hex":"#384351"},{"name":"Starry Night","hex":"#286492"},{"name":"Starship","hex":"#e3dd39"},{"name":"Starsilt","hex":"#758ba4"},{"name":"Starstruck","hex":"#4664a5"},{"name":"Stately Frills","hex":"#c5bdc4"},{"name":"Stately Stems","hex":"#577a6c"},{"name":"Static","hex":"#d5d3c3"},{"name":"Statue of Liberty","hex":"#376d64"},{"name":"Steadfast","hex":"#4a5777"},{"name":"Steam Chestnut","hex":"#ebe1a9"},{"name":"Steamboat Geyser","hex":"#d2ccb4"},{"name":"Steamed Chestnut","hex":"#d3b17d"},{"name":"Steamy Spring","hex":"#b1cfc7"},{"name":"Steel","hex":"#797979"},{"name":"Steel Armor","hex":"#767275"},{"name":"Steel Blue","hex":"#4682b4"},{"name":"Steel Blue Eyes","hex":"#7d94c6"},{"name":"Steel Grey","hex":"#43464b"},{"name":"Steel Legion Drab","hex":"#7a744d"},{"name":"Steel Me","hex":"#ddd5ce"},{"name":"Steel Pan Mallet","hex":"#71a6a1"},{"name":"Steel Pink","hex":"#cc33cc"},{"name":"Steel Teal","hex":"#5f8a8b"},{"name":"Steel Wool","hex":"#777777"},{"name":"Steeple Grey","hex":"#827e7c"},{"name":"Stegadon Scale Green","hex":"#074863"},{"name":"Steiglitz Fog","hex":"#415862"},{"name":"Stella","hex":"#f5d056"},{"name":"Stella Dora","hex":"#f9daa5"},{"name":"Stellar","hex":"#46647e"},{"name":"Stellar Explorer","hex":"#002222"},{"name":"Stellar Light","hex":"#fff4dd"},{"name":"Stellar Mist","hex":"#ab9d9c"},{"name":"Stem Green","hex":"#abdf8f"},{"name":"Stepping Stone","hex":"#a4a7a4"},{"name":"Sterling Blue","hex":"#a2b9c2"},{"name":"Sterling Shadow","hex":"#e9ebde"},{"name":"Sterling Silver","hex":"#9eafc2"},{"name":"Stetson","hex":"#9e7a58"},{"name":"Steveareno Beige","hex":"#c5b5a4"},{"name":"Sticks & Stones","hex":"#baa482"},{"name":"Sticky Toffee","hex":"#cc8149"},{"name":"Stieglitz Silver","hex":"#8d8f8e"},{"name":"Stil De Grain Yellow","hex":"#fadb5e"},{"name":"Stiletto","hex":"#323235"},{"name":"Still","hex":"#adaf9c"},{"name":"Still Fuchsia","hex":"#c154c0"},{"name":"Still Morning","hex":"#fff8e1"},{"name":"Stillwater","hex":"#70a4b0"},{"name":"Stillwater Lake","hex":"#c2d0df"},{"name":"Stilted Stalks","hex":"#a29a6a"},{"name":"Stinging Nettle","hex":"#495d39"},{"name":"Stirland Battlemire","hex":"#ae5a2c"},{"name":"Stirland Mud","hex":"#492b00"},{"name":"Stizza","hex":"#900910"},{"name":"Stock Horse","hex":"#806852"},{"name":"Stocking White","hex":"#e9e5d8"},{"name":"Stockleaf","hex":"#647b72"},{"name":"Stoic White","hex":"#e0e0ff"},{"name":"Stomy Shower","hex":"#0088b0"},{"name":"Stone","hex":"#ada587"},{"name":"Stone Blue","hex":"#829ca5"},{"name":"Stone Bridge","hex":"#52706c"},{"name":"Stone Craft","hex":"#7d867c"},{"name":"Stone Creek","hex":"#8f9183"},{"name":"Stone Green","hex":"#658e67"},{"name":"Stone Grey","hex":"#9f9484"},{"name":"Stone Harbour","hex":"#e8e0d8"},{"name":"Stone Hearth","hex":"#636869"},{"name":"Stone Mason","hex":"#7a7b75"},{"name":"Stone Path","hex":"#e4efe5"},{"name":"Stone Pillar","hex":"#efe5d4"},{"name":"Stone Pine","hex":"#665c46"},{"name":"Stone Quarry","hex":"#ece4dc"},{"name":"Stone Silver","hex":"#8ba8ae"},{"name":"Stone Terrace","hex":"#a09484"},{"name":"Stone's Throw","hex":"#605c58"},{"name":"Stonebread","hex":"#ddcea7"},{"name":"Stonecrop","hex":"#a08f6f"},{"name":"Stonegate","hex":"#99917e"},{"name":"Stonehenge Greige","hex":"#a79d8d"},{"name":"Stonelake","hex":"#bab1a3"},{"name":"Stonewall","hex":"#807661"},{"name":"Stonewall Grey","hex":"#c1c1c1"},{"name":"Stonewash","hex":"#74809a"},{"name":"Stonish Beige","hex":"#ccb49a"},{"name":"Stony Creek","hex":"#948f82"},{"name":"Storksbill White","hex":"#f2f2e2"},{"name":"Storm Blue","hex":"#507b9c"},{"name":"Storm Break","hex":"#938988"},{"name":"Storm Cloud","hex":"#808283"},{"name":"Storm Dust","hex":"#65645f"},{"name":"Storm Front","hex":"#787376"},{"name":"Storm Green","hex":"#113333"},{"name":"Storm Grey","hex":"#717486"},{"name":"Storm Petrel","hex":"#7f95a5"},{"name":"Storm's Coming","hex":"#cfc9bc"},{"name":"Stormeye","hex":"#e7b57f"},{"name":"Stormfang","hex":"#80a7c1"},{"name":"Stormhost Silver","hex":"#bbc6c9"},{"name":"Stormvermin Fur","hex":"#5c5954"},{"name":"Stormy","hex":"#b0bcc3"},{"name":"Stormy Pink","hex":"#e3b5ad"},{"name":"Stormy Ridge","hex":"#507b9a"},{"name":"Stormy Sea","hex":"#6e8082"},{"name":"Stormy Strait Green","hex":"#0f9b8e"},{"name":"Stormy Strait Grey","hex":"#6b8ba4"},{"name":"Stormy Sunrise","hex":"#c8a2c8"},{"name":"Stormy Weather","hex":"#58646d"},{"name":"Stout","hex":"#0f0b0a"},{"name":"Stowaway","hex":"#7b8393"},{"name":"Straken Green","hex":"#628026"},{"name":"Stratford Sage","hex":"#8c8670"},{"name":"Stratos","hex":"#000741"},{"name":"Stratosphere","hex":"#9ec1cc"},{"name":"Stravinsky","hex":"#996e74"},{"name":"Stravinsky Pink","hex":"#77515a"},{"name":"Straw","hex":"#e4d96f"},{"name":"Straw Gold","hex":"#fcf679"},{"name":"Straw Hat","hex":"#f0d5a8"},{"name":"Straw Hut","hex":"#bdb268"},{"name":"Strawberry","hex":"#fb2943"},{"name":"Strawberry Blonde","hex":"#ffdadc"},{"name":"Strawberry Confection","hex":"#f4bfc6"},{"name":"Strawberry Cough","hex":"#990011"},{"name":"Strawberry Cream","hex":"#f4c3c4"},{"name":"Strawberry Dust","hex":"#fff0ea"},{"name":"Strawberry Frappe","hex":"#ffa2aa"},{"name":"Strawberry Frosting","hex":"#ff6ffc"},{"name":"Strawberry Glaze","hex":"#dab7be"},{"name":"Strawberry Ice","hex":"#e78b90"},{"name":"Strawberry Jam","hex":"#86423e"},{"name":"Strawberry Jubilee","hex":"#c08591"},{"name":"Strawberry Mousse","hex":"#a5647e"},{"name":"Strawberry Pink","hex":"#f57f8e"},{"name":"Strawberry Pop","hex":"#ee2255"},{"name":"Strawberry Shortcake","hex":"#fa8e99"},{"name":"Strawberry Smoothie","hex":"#e79ea6"},{"name":"Strawberry Soap","hex":"#f7879a"},{"name":"Strawberry Spinach Red","hex":"#fa4224"},{"name":"Strawberry Surprise","hex":"#b9758d"},{"name":"Strawberry Yogurt","hex":"#e9b3b4"},{"name":"Strawflower","hex":"#ddbdba"},{"name":"Stream","hex":"#495e7b"},{"name":"Stretch Limo","hex":"#2b2c30"},{"name":"Streusel Cake","hex":"#d7aa60"},{"name":"Strike It Rich","hex":"#d7b55f"},{"name":"Strikemaster","hex":"#946a81"},{"name":"Striking Purple","hex":"#944e87"},{"name":"Striking Red","hex":"#c03543"},{"name":"String","hex":"#aa9f96"},{"name":"String Ball","hex":"#f1e8d8"},{"name":"String Deep","hex":"#7f7860"},{"name":"String of Pearls","hex":"#ebe3d8"},{"name":"Stromboli","hex":"#406356"},{"name":"Strong Blue","hex":"#0c06f7"},{"name":"Strong Cerise","hex":"#960056"},{"name":"Strong Envy","hex":"#782e2c"},{"name":"Strong Mocha","hex":"#6f372d"},{"name":"Strong Olive","hex":"#646756"},{"name":"Strong Pink","hex":"#ff0789"},{"name":"Strong Sage","hex":"#2b6460"},{"name":"Strong Strawberry","hex":"#8a3e34"},{"name":"Strong Tone Wash","hex":"#454129"},{"name":"Stucco","hex":"#a58d7f"},{"name":"Stucco Tan","hex":"#e8dece"},{"name":"Studer Blue","hex":"#005577"},{"name":"Studio","hex":"#724aa1"},{"name":"Studio Cream","hex":"#ebdbaa"},{"name":"Studio White","hex":"#e8dcd5"},{"name":"Stuffed Olive","hex":"#adac7c"},{"name":"Stunning Sapphire","hex":"#185887"},{"name":"Stylish","hex":"#cec1a5"},{"name":"Su-Nezumi Grey","hex":"#9fa0a0"},{"name":"Subaqueous","hex":"#00576f"},{"name":"Subdue Red","hex":"#ccb8b3"},{"name":"Submarine","hex":"#7a7778"},{"name":"Submerge","hex":"#4a7d82"},{"name":"Submersible","hex":"#00576e"},{"name":"Subpoena","hex":"#d8ccc6"},{"name":"Subtle Blue","hex":"#d9e3e5"},{"name":"Subtle Green","hex":"#b5cbbb"},{"name":"Subtle Night Sky","hex":"#554b4f"},{"name":"Subtle Shadow","hex":"#d8d8d0"},{"name":"Subtle Suede","hex":"#d0bd94"},{"name":"Subtle Sunshine","hex":"#e4d89a"},{"name":"Subtle Violet","hex":"#b29e9e"},{"name":"Subway","hex":"#87857c"},{"name":"Succulent","hex":"#dcdd65"},{"name":"Succulent Garden","hex":"#bccbb2"},{"name":"Succulent Leaves","hex":"#658e64"},{"name":"Sudan Brown","hex":"#ac6b29"},{"name":"Suddenly Sapphire","hex":"#1a5897"},{"name":"Suds","hex":"#a6b4c5"},{"name":"Suede Leather","hex":"#896757"},{"name":"Suede Vest","hex":"#d79043"},{"name":"Suffragette Yellow","hex":"#ecd0a1"},{"name":"Sugar Almond","hex":"#935529"},{"name":"Sugar Cane","hex":"#eeefdf"},{"name":"Sugar Cane Dahlia","hex":"#f7c2bf"},{"name":"Sugar Chic","hex":"#ffccff"},{"name":"Sugar Cookie","hex":"#f2e2a4"},{"name":"Sugar Coral","hex":"#f56c73"},{"name":"Sugar Crystal","hex":"#f8f4ff"},{"name":"Sugar Dust","hex":"#f9ede3"},{"name":"Sugar Glaze","hex":"#fff0e1"},{"name":"Sugar Grape","hex":"#9437ff"},{"name":"Sugar Maple","hex":"#9c7647"},{"name":"Sugar Pie","hex":"#c7a77b"},{"name":"Sugar Pine","hex":"#73776e"},{"name":"Sugar Plum","hex":"#914e75"},{"name":"Sugar Shack","hex":"#eed5b6"},{"name":"Sugar Soap","hex":"#efe8dc"},{"name":"Sugar Swizzle","hex":"#f3eee7"},{"name":"Sugar Tooth","hex":"#d68f9f"},{"name":"Sugar Tree","hex":"#a2999a"},{"name":"Sugar-Candied Peanuts","hex":"#8b2e16"},{"name":"Sugared Pears","hex":"#ebd5b7"},{"name":"Sugarloaf Brown","hex":"#554400"},{"name":"Sugarpills","hex":"#ffddff"},{"name":"Sugilite","hex":"#a2999f"},{"name":"Sulfuric Yellow","hex":"#a79f5c"},{"name":"Sullen Gold","hex":"#a58b34"},{"name":"Sulphur","hex":"#ddb614"},{"name":"Sulphur Spring","hex":"#d5d717"},{"name":"Sultan Sand","hex":"#e3c9be"},{"name":"Sultan's Silk","hex":"#134558"},{"name":"Sultry Sea","hex":"#506770"},{"name":"Sultry Spell","hex":"#716563"},{"name":"Sulu","hex":"#c6ea80"},{"name":"Sumac dyed","hex":"#e08a1e"},{"name":"Sumatra Chicken","hex":"#4f666a"},{"name":"Sumi Ink","hex":"#595857"},{"name":"Sumire Violet","hex":"#7058a3"},{"name":"Summer Air","hex":"#3fafcf"},{"name":"Summer Breeze","hex":"#d3e5db"},{"name":"Summer Cloud","hex":"#bbffee"},{"name":"Summer Clover","hex":"#e5cfde"},{"name":"Summer Concrete","hex":"#57595d"},{"name":"Summer Daffodil","hex":"#ffe078"},{"name":"Summer Fig","hex":"#be4b3b"},{"name":"Summer Forest Green","hex":"#228b22"},{"name":"Summer Garden","hex":"#7aac80"},{"name":"Summer Green","hex":"#8fb69c"},{"name":"Summer Hill","hex":"#c1a58d"},{"name":"Summer Hue","hex":"#ffefc2"},{"name":"Summer Lake","hex":"#0077a7"},{"name":"Summer Lily","hex":"#f8d374"},{"name":"Summer Melon","hex":"#ead3ae"},{"name":"Summer Mist","hex":"#e1eaec"},{"name":"Summer Night","hex":"#36576a"},{"name":"Summer Orange","hex":"#ffb653"},{"name":"Summer Pear","hex":"#f5f0d1"},{"name":"Summer Rain","hex":"#e1e8db"},{"name":"Summer Sandcastle","hex":"#ece4ce"},{"name":"Summer Sea","hex":"#66a9b1"},{"name":"Summer Shade","hex":"#d1d9d7"},{"name":"Summer Shower","hex":"#e5ebe3"},{"name":"Summer Sky","hex":"#38b0de"},{"name":"Summer Solstice","hex":"#ded1a3"},{"name":"Summer Storm","hex":"#b0c5df"},{"name":"Summer Sun","hex":"#ffdc00"},{"name":"Summer Sunset","hex":"#d88167"},{"name":"Summer Waters","hex":"#215399"},{"name":"Summer Weasel","hex":"#bb8e55"},{"name":"Summer's Heat","hex":"#f9e699"},{"name":"Summerday Blue","hex":"#376698"},{"name":"Summertime","hex":"#f2d178"},{"name":"Summertown","hex":"#8cbc9e"},{"name":"Summerville Brown","hex":"#997651"},{"name":"Summit","hex":"#8bb6b8"},{"name":"Sun","hex":"#ef8e38"},{"name":"Sun Baked","hex":"#d27f63"},{"name":"Sun Bleached Pink","hex":"#fadadd"},{"name":"Sun City","hex":"#fffed9"},{"name":"Sun Crete","hex":"#ff8c00"},{"name":"Sun Dance","hex":"#c4aa4d"},{"name":"Sun Deck","hex":"#f0dca0"},{"name":"Sun Dial","hex":"#c79b36"},{"name":"Sun Drenched","hex":"#ffe7a3"},{"name":"Sun Dried Tomato","hex":"#752329"},{"name":"Sun Dust","hex":"#f6e0a4"},{"name":"Sun God","hex":"#dfba5a"},{"name":"Sun Kiss","hex":"#ebd1bb"},{"name":"Sun Kissed","hex":"#ffeec2"},{"name":"Sun Orange","hex":"#f48037"},{"name":"Sun Salutation","hex":"#e7c26f"},{"name":"Sun Song","hex":"#e9ad17"},{"name":"Sun Surprise","hex":"#fff2a0"},{"name":"Sun Yellow","hex":"#ffdf22"},{"name":"Sun-Kissed Brick","hex":"#b75e41"},{"name":"Sun's Glory","hex":"#f6f2e5"},{"name":"Suna White","hex":"#dcd3b2"},{"name":"Sunbaked Adobe","hex":"#ab9a6e"},{"name":"Sunbeam","hex":"#f5edb2"},{"name":"Sunblast Yellow","hex":"#feff0f"},{"name":"Sunbound","hex":"#f9d964"},{"name":"Sunburn","hex":"#b37256"},{"name":"Sunburnt Cyclops","hex":"#ff404c"},{"name":"Sunburnt Toes","hex":"#d79584"},{"name":"Sunburst","hex":"#f6c289"},{"name":"Sunburst Yellow","hex":"#ffff99"},{"name":"Sunday Best","hex":"#fcc9c7"},{"name":"Sunday Drive","hex":"#dcc9ae"},{"name":"Sunday Gloves","hex":"#d7bad1"},{"name":"Sunday Niqab","hex":"#3d4035"},{"name":"Sundaze","hex":"#fae198"},{"name":"Sundown","hex":"#f5c99e"},{"name":"Sundress","hex":"#ebcf89"},{"name":"Sunezumi Brown","hex":"#6e5f57"},{"name":"Sunflower","hex":"#ffc512"},{"name":"Sunflower Yellow","hex":"#ffda03"},{"name":"Sunglo","hex":"#c76155"},{"name":"Sunglow","hex":"#ffcc33"},{"name":"Sunglow Gecko","hex":"#ffcf48"},{"name":"Sunken Battleship","hex":"#51574f"},{"name":"Sunken Gold","hex":"#b29700"},{"name":"Sunken Ship","hex":"#6b443d"},{"name":"Sunkist Coral","hex":"#ea6676"},{"name":"Sunlight","hex":"#edd59e"},{"name":"Sunlit Allium","hex":"#9787bb"},{"name":"Sunlit Kelp Green","hex":"#7d7103"},{"name":"Sunlounge","hex":"#da8433"},{"name":"Sunny","hex":"#f2f27a"},{"name":"Sunny Disposition","hex":"#dba637"},{"name":"Sunny Festival","hex":"#ffc946"},{"name":"Sunny Green","hex":"#c5cd40"},{"name":"Sunny Lime","hex":"#dfef87"},{"name":"Sunny Mimosa","hex":"#f5f5cc"},{"name":"Sunny Side Up","hex":"#ffdc41"},{"name":"Sunny Yellow","hex":"#fff917"},{"name":"Sunray","hex":"#e3ab57"},{"name":"Sunray Venus","hex":"#cfc5b6"},{"name":"Sunset","hex":"#c0514a"},{"name":"Sunset Cove","hex":"#dcb397"},{"name":"Sunset Cruise","hex":"#ffbe94"},{"name":"Sunset Gold","hex":"#f7c46c"},{"name":"Sunset Horizon","hex":"#ba87aa"},{"name":"Sunset Meadow","hex":"#a5a796"},{"name":"Sunset Orange","hex":"#fd5e53"},{"name":"Sunset Papaya","hex":"#fc7d64"},{"name":"Sunset Pink","hex":"#fad6e5"},{"name":"Sunset Purple","hex":"#6f456e"},{"name":"Sunset Riders","hex":"#d70040"},{"name":"Sunset Strip","hex":"#ffbc00"},{"name":"Sunset Yellow","hex":"#fa873d"},{"name":"Sunshade","hex":"#fa9d49"},{"name":"Sunshine","hex":"#fade85"},{"name":"Sunshine Surprise","hex":"#fcb02f"},{"name":"Sunshine Yellow","hex":"#fffd37"},{"name":"Sunstitch","hex":"#fee2b2"},{"name":"Sunstone","hex":"#c7887f"},{"name":"Suntan","hex":"#d9b19f"},{"name":"Suō","hex":"#7e2639"},{"name":"Super Banana","hex":"#fffe71"},{"name":"Super Black","hex":"#221100"},{"name":"Super Gold","hex":"#aa8822"},{"name":"Super Leaf Brown","hex":"#ba5e0f"},{"name":"Super Lemon","hex":"#e4bf45"},{"name":"Super Pink","hex":"#ce6ba4"},{"name":"Super Saiyan","hex":"#ffdd00"},{"name":"Super Silver","hex":"#eeeeee"},{"name":"Superman Red","hex":"#ff1122"},{"name":"Supermint","hex":"#00928c"},{"name":"Supernatural","hex":"#313641"},{"name":"Supernova","hex":"#fff8d9"},{"name":"Superstar","hex":"#1d4769"},{"name":"Superstition","hex":"#5b6e74"},{"name":"Superstitious","hex":"#ac91b5"},{"name":"Supreme Grey","hex":"#86949f"},{"name":"Surati Pink","hex":"#fc53fc"},{"name":"Surf","hex":"#b8d4bb"},{"name":"Surf Crest","hex":"#c3d6bd"},{"name":"Surf Green","hex":"#427573"},{"name":"Surf Rider","hex":"#0193c2"},{"name":"Surf Spray","hex":"#b4c8c2"},{"name":"Surf the Web","hex":"#203c7f"},{"name":"Surf Wash","hex":"#87ceca"},{"name":"Surf'n'dive","hex":"#374755"},{"name":"Surf's Up","hex":"#c6e4eb"},{"name":"Surfer Girl","hex":"#db6484"},{"name":"Surfie Green","hex":"#007b77"},{"name":"Surfside","hex":"#9acad3"},{"name":"Surgeon Green","hex":"#009f6b"},{"name":"Surprise","hex":"#c9936f"},{"name":"Surya Red","hex":"#70191f"},{"name":"Sushi","hex":"#7c9f2f"},{"name":"Sushi Rice","hex":"#fff7df"},{"name":"Sussie","hex":"#58bac2"},{"name":"Susu Green","hex":"#887f7a"},{"name":"Susu-Take Bamboo","hex":"#6f514c"},{"name":"Sutherland","hex":"#859d95"},{"name":"Suva Grey","hex":"#888387"},{"name":"Suzu Grey","hex":"#9ea1a3"},{"name":"Suzume Brown","hex":"#aa4f37"},{"name":"Suzumecha Brown","hex":"#8c4736"},{"name":"Swagger","hex":"#19b6b5"},{"name":"Swallow-Tailed Moth","hex":"#ece9dd"},{"name":"Swamp","hex":"#7f755f"},{"name":"Swamp Fox","hex":"#b79d69"},{"name":"Swamp Green","hex":"#748500"},{"name":"Swamp Mosquito","hex":"#252f2f"},{"name":"Swamp Moss","hex":"#698339"},{"name":"Swamp Mud","hex":"#857947"},{"name":"Swamp Shrub","hex":"#6d753b"},{"name":"Swan Dive","hex":"#e5e4dd"},{"name":"Swan Lake","hex":"#c5e5e2"},{"name":"Swan White","hex":"#f7f1e2"},{"name":"Swanndri","hex":"#5f7963"},{"name":"Swans Down","hex":"#dae6dd"},{"name":"Sweat Bee","hex":"#1d4e8f"},{"name":"Swedish Blue","hex":"#007eb1"},{"name":"Swedish Clover","hex":"#7b8867"},{"name":"Swedish Yellow","hex":"#fce081"},{"name":"Sweet 60","hex":"#f29eab"},{"name":"Sweet Alyssum","hex":"#e7c2de"},{"name":"Sweet Angel","hex":"#f5c8bb"},{"name":"Sweet Annie","hex":"#9c946e"},{"name":"Sweet Aqua","hex":"#a7e8d3"},{"name":"Sweet Bianca","hex":"#eedadd"},{"name":"Sweet Brown","hex":"#a83731"},{"name":"Sweet Butter","hex":"#fffcd7"},{"name":"Sweet Corn","hex":"#f9e176"},{"name":"Sweet Cream","hex":"#f0eae7"},{"name":"Sweet Dough","hex":"#dbcbab"},{"name":"Sweet Dreams","hex":"#9bc7ea"},{"name":"Sweet Earth","hex":"#ab9368"},{"name":"Sweet Emily","hex":"#cbd1e1"},{"name":"Sweet Flag","hex":"#674196"},{"name":"Sweet Florence","hex":"#8a9b76"},{"name":"Sweet Frosting","hex":"#fff8e4"},{"name":"Sweet Garden","hex":"#5fd1ba"},{"name":"Sweet Gardenia","hex":"#efe4da"},{"name":"Sweet Grape","hex":"#4b3b4f"},{"name":"Sweet Honey","hex":"#d4a55c"},{"name":"Sweet Illusion","hex":"#e0e8ec"},{"name":"Sweet Jasmine","hex":"#f9f4d4"},{"name":"Sweet Lavender","hex":"#9a9bc1"},{"name":"Sweet Lilac","hex":"#e8b5ce"},{"name":"Sweet Lychee","hex":"#9b4040"},{"name":"Sweet Menthol","hex":"#c2e4bc"},{"name":"Sweet Murmur","hex":"#ecc5df"},{"name":"Sweet Mustard","hex":"#d1b871"},{"name":"Sweet Nothings","hex":"#bbdbd0"},{"name":"Sweet Pea","hex":"#a3a969"},{"name":"Sweet Peach","hex":"#e2bcb3"},{"name":"Sweet Pink","hex":"#ee918d"},{"name":"Sweet Potato","hex":"#d87c3b"},{"name":"Sweet Potato Peel","hex":"#917798"},{"name":"Sweet Romance","hex":"#ffc4dd"},{"name":"Sweet Sachet","hex":"#ffd8f0"},{"name":"Sweet Serenade","hex":"#ffc5d5"},{"name":"Sweet Sheba","hex":"#f0b9a9"},{"name":"Sweet Sixteen","hex":"#ffc9d3"},{"name":"Sweet Slumber Pink","hex":"#f8b8f8"},{"name":"Sweet Sparrow","hex":"#a8946b"},{"name":"Sweet Spiceberry","hex":"#7b453e"},{"name":"Sweet Spring","hex":"#d1e8c2"},{"name":"Sweet Tea","hex":"#c18244"},{"name":"Sweet Tooth","hex":"#5f6255"},{"name":"Sweet Truffle","hex":"#f0dcd7"},{"name":"Sweet Violet","hex":"#8c667a"},{"name":"Sweet William","hex":"#8892c1"},{"name":"Sweetheart","hex":"#f3c3d8"},{"name":"Sweetie Pie","hex":"#e1bbdb"},{"name":"Sweetly","hex":"#ffe5ef"},{"name":"Sweetness","hex":"#f8dbc4"},{"name":"Sweety Pie","hex":"#e7cee3"},{"name":"Swift","hex":"#82aadc"},{"name":"Swimmer","hex":"#0a91bf"},{"name":"Swing Sage","hex":"#c2c0a9"},{"name":"Swinging Vine","hex":"#706842"},{"name":"Swirl","hex":"#d7cec5"},{"name":"Swirling Smoke","hex":"#cecac1"},{"name":"Swiss Cheese","hex":"#fff4b9"},{"name":"Swiss Coffee","hex":"#d5c3ad"},{"name":"Swiss Lilac","hex":"#86608e"},{"name":"Swiss Plum","hex":"#5946b2"},{"name":"Swollen Sky","hex":"#67667c"},{"name":"Sybarite Green","hex":"#8bcbab"},{"name":"Sycamore","hex":"#908d39"},{"name":"Sycamore Stand","hex":"#959e8f"},{"name":"Sycorax Bronze","hex":"#cbb394"},{"name":"Syhar Soil","hex":"#a16717"},{"name":"Sylph","hex":"#adaab1"},{"name":"Sylvan","hex":"#979381"},{"name":"Sylvan Green","hex":"#e7eacb"},{"name":"Sylvaneth Bark","hex":"#ac8262"},{"name":"Symbolic","hex":"#b29ead"},{"name":"Symmetry","hex":"#8fa0a7"},{"name":"Symphony of Blue","hex":"#89a0a6"},{"name":"Synchronicity","hex":"#c7d4ce"},{"name":"Synthetic Mint","hex":"#9ffeb0"},{"name":"Synthetic Pumpkin","hex":"#ff7538"},{"name":"Synthetic Spearmint","hex":"#1ef876"},{"name":"Syrah","hex":"#6a282c"},{"name":"Syrian Violet","hex":"#dfcae4"},{"name":"Szöllősi Grape","hex":"#8020ff"},{"name":"T-Bird Turquoise","hex":"#6fc1af"},{"name":"T-Rex Fossil","hex":"#8e908d"},{"name":"Ta Prohm","hex":"#c7c4a5"},{"name":"Tabasco","hex":"#a02712"},{"name":"Tabbouleh Green","hex":"#526525"},{"name":"Tacao","hex":"#f6ae78"},{"name":"Tacha","hex":"#d2b960"},{"name":"Tactile","hex":"#d3e7c7"},{"name":"Tadpole","hex":"#7d7771"},{"name":"Taffy","hex":"#c39b6a"},{"name":"Taffy Pink","hex":"#fea6c8"},{"name":"Taffy Twist","hex":"#aad0ba"},{"name":"Tahiti Gold","hex":"#dc722a"},{"name":"Tahitian Sand","hex":"#f5dcb4"},{"name":"Tahitian Tide","hex":"#006b7e"},{"name":"Tahitian Treat","hex":"#00686d"},{"name":"Tahoe Snow","hex":"#d7e1e5"},{"name":"Tahuna Sands","hex":"#d8cc9b"},{"name":"Tainted Gold","hex":"#ead795"},{"name":"Taisha Brown","hex":"#bb5520"},{"name":"Taisha Red","hex":"#9f5233"},{"name":"Taiwan Blue Magpie","hex":"#3377a2"},{"name":"Taiwan Gold","hex":"#c7aa71"},{"name":"Taj","hex":"#734a33"},{"name":"Taj Mahal","hex":"#ede9df"},{"name":"Take the Plunge","hex":"#d8d4dd"},{"name":"Talavera","hex":"#a0928b"},{"name":"Talâyi Gold","hex":"#e7b25d"},{"name":"Taliesin Blue","hex":"#707e84"},{"name":"Tall Poppy","hex":"#853534"},{"name":"Tall Ships","hex":"#0e81b9"},{"name":"Tallarn Flesh","hex":"#947e74"},{"name":"Tallarn Sand","hex":"#a79b5e"},{"name":"Tallow","hex":"#a39977"},{"name":"Tamago Egg","hex":"#fcd575"},{"name":"Tamago Orange","hex":"#ffa631"},{"name":"Tamale Maize","hex":"#f8e7b7"},{"name":"Tamanegi Peel","hex":"#deaa9b"},{"name":"Tamarillo","hex":"#752b2f"},{"name":"Tamarind","hex":"#341515"},{"name":"Tamarind Tart","hex":"#8e604b"},{"name":"Tambo Tank","hex":"#7c7d57"},{"name":"Tamboon","hex":"#bdc8af"},{"name":"Tambourine","hex":"#f0edd6"},{"name":"Tambua Bay","hex":"#658498"},{"name":"Tame Thyme","hex":"#c5c5ac"},{"name":"Tan","hex":"#d1b26f"},{"name":"Tan 686A","hex":"#a38d6d"},{"name":"Tan Brown","hex":"#ab7e4c"},{"name":"Tan Green","hex":"#a9be70"},{"name":"Tàn Hēi Soot","hex":"#323939"},{"name":"Tan Hide","hex":"#fa9d5a"},{"name":"Tan Oak","hex":"#c2aa87"},{"name":"Tan Plan","hex":"#c19e78"},{"name":"Tan Temptation","hex":"#f0bd9e"},{"name":"Tan Wagon","hex":"#a3755d"},{"name":"Tan Whirl","hex":"#f1d7ce"},{"name":"Tan Your Hide","hex":"#b5905a"},{"name":"Tana","hex":"#b8b5a1"},{"name":"Tanager Turquoise","hex":"#91dce8"},{"name":"Tanami Desert","hex":"#d0b25c"},{"name":"Tandoori Red","hex":"#d25762"},{"name":"Tandoori Spice","hex":"#9f4440"},{"name":"Tangara","hex":"#97725f"},{"name":"Tangaroa","hex":"#1e2f3c"},{"name":"Tangelo","hex":"#f94d00"},{"name":"Tangelo Cream","hex":"#f2e9de"},{"name":"Tangent","hex":"#ead3a2"},{"name":"Tangerine","hex":"#ff9300"},{"name":"Tangerine Bliss","hex":"#d86130"},{"name":"Tangerine Cream","hex":"#ffa089"},{"name":"Tangerine Dream","hex":"#ff8449"},{"name":"Tangerine Flake","hex":"#e57f5b"},{"name":"Tangerine Skin","hex":"#f28500"},{"name":"Tangerine Tango","hex":"#ff9e4b"},{"name":"Tangerine Yellow","hex":"#fecd01"},{"name":"Tangier","hex":"#a97164"},{"name":"Tangle","hex":"#7c7c65"},{"name":"Tangled Twine","hex":"#b19466"},{"name":"Tangled Vines","hex":"#cac19a"},{"name":"Tanglewood","hex":"#a58f85"},{"name":"Tango","hex":"#d46f31"},{"name":"Tango Mango","hex":"#f8c884"},{"name":"Tango Pink","hex":"#e47f7a"},{"name":"Tango Red","hex":"#ac0e2e"},{"name":"Tangy Taffy","hex":"#e7cac3"},{"name":"Tank","hex":"#5c6141"},{"name":"Tank Grey","hex":"#848481"},{"name":"Tanned Flesh","hex":"#f7b45e"},{"name":"Tanned Leather","hex":"#f2c108"},{"name":"Tanned Skin","hex":"#f7cd08"},{"name":"Tanned Wood","hex":"#8f6e4b"},{"name":"Tannin","hex":"#a68a6d"},{"name":"Tanooki Suit Brown","hex":"#ae6c37"},{"name":"Tansy","hex":"#c7c844"},{"name":"Tantanmen Brown","hex":"#857158"},{"name":"Tanzanite","hex":"#1478a7"},{"name":"Taos Taupe","hex":"#bfa77f"},{"name":"Tap Shoe","hex":"#2a2b2d"},{"name":"Tapa","hex":"#7c7c72"},{"name":"Tapenade","hex":"#805d24"},{"name":"Tapering Light","hex":"#f7f2dd"},{"name":"Tapestry","hex":"#b37084"},{"name":"Tapestry Beige","hex":"#b8ac9e"},{"name":"Tapioca","hex":"#dccdbc"},{"name":"Tara","hex":"#def1dd"},{"name":"Tara's Drapes","hex":"#767a49"},{"name":"Tarawera","hex":"#253c48"},{"name":"Tardis","hex":"#105673"},{"name":"Tareyton","hex":"#a1cdbf"},{"name":"Tarmac","hex":"#5a5348"},{"name":"Tarmac Green","hex":"#477f4a"},{"name":"Tarnished Brass","hex":"#7f6c24"},{"name":"Tarnished Silver","hex":"#797b80"},{"name":"Tarpon Green","hex":"#c1b55c"},{"name":"Tarragon","hex":"#a4ae77"},{"name":"Tarsier","hex":"#825e61"},{"name":"Tart Orange","hex":"#fb4d46"},{"name":"Tartare","hex":"#bf5b3c"},{"name":"Tartrazine","hex":"#f7d917"},{"name":"Tarzan Green","hex":"#919585"},{"name":"Tasman","hex":"#bac0b3"},{"name":"Tassel Flower","hex":"#f9c0ce"},{"name":"Tassel Taupe","hex":"#9f9291"},{"name":"Tatami","hex":"#deccaf"},{"name":"Tatarian Aster","hex":"#976e9a"},{"name":"Tattered Teddy","hex":"#a2806f"},{"name":"Tattletail","hex":"#80736a"},{"name":"Tatzelwurm Green","hex":"#376d03"},{"name":"Tau Light Ochre","hex":"#f7d60d"},{"name":"Taupe","hex":"#b9a281"},{"name":"Taupe Grey","hex":"#8b8589"},{"name":"Taupe Night","hex":"#705a56"},{"name":"Taupe Tapestry","hex":"#c3a79a"},{"name":"Taupe White","hex":"#c7c1bb"},{"name":"Tausept Ochre","hex":"#a3813f"},{"name":"Tavern","hex":"#b7a594"},{"name":"Tavern Creek","hex":"#957046"},{"name":"Tawny Amber","hex":"#d19776"},{"name":"Tawny Birch","hex":"#ae856c"},{"name":"Tawny Brown","hex":"#ab856f"},{"name":"Tawny Daylily","hex":"#eabd5b"},{"name":"Tawny Mushroom","hex":"#b39997"},{"name":"Tawny Olive","hex":"#c4962c"},{"name":"Tawny Orange","hex":"#d37f6f"},{"name":"Tawny Owl","hex":"#978b71"},{"name":"Tawny Port","hex":"#643a48"},{"name":"Tax Break","hex":"#496569"},{"name":"Taxite","hex":"#5c3937"},{"name":"Taylor","hex":"#5f5879"},{"name":"Te Papa Green","hex":"#2b4b40"},{"name":"Tea","hex":"#bfb5a2"},{"name":"Tea Bag","hex":"#726259"},{"name":"Tea Biscuit","hex":"#f5ebe1"},{"name":"Tea Chest","hex":"#605547"},{"name":"Tea Green","hex":"#d0f0c0"},{"name":"Tea Leaf","hex":"#8f8667"},{"name":"Tea Leaf Brown","hex":"#a59564"},{"name":"Tea Leaf Mouse","hex":"#888e7e"},{"name":"Tea Party","hex":"#ffd7d0"},{"name":"Tea Rose","hex":"#f883c2"},{"name":"Tea Time","hex":"#d9bebc"},{"name":"Teaberry","hex":"#dc3855"},{"name":"Teaberry Blossom","hex":"#b44940"},{"name":"Teak","hex":"#ab8953"},{"name":"Teak Wood","hex":"#624133"},{"name":"Teal","hex":"#008080"},{"name":"Teal Bayou","hex":"#57a1a0"},{"name":"Teal Blue","hex":"#01889f"},{"name":"Teal Deer","hex":"#99e6b3"},{"name":"Teal Essence","hex":"#3da3ae"},{"name":"Teal Fury","hex":"#1a6c76"},{"name":"Teal Green","hex":"#25a36f"},{"name":"Teal Me No Lies","hex":"#0daca7"},{"name":"Teal Tree","hex":"#94b9b4"},{"name":"Teal Trip","hex":"#00a093"},{"name":"Teal Tune","hex":"#02708c"},{"name":"Teal Waters","hex":"#007765"},{"name":"Tealish","hex":"#24bca8"},{"name":"Tealish Green","hex":"#0cdc73"},{"name":"Team Spirit","hex":"#416986"},{"name":"Teardrop","hex":"#d1eaea"},{"name":"Tears of Joy","hex":"#f0f1da"},{"name":"Teatime Mauve","hex":"#c8a89e"},{"name":"Tech Wave","hex":"#4c7a9d"},{"name":"Techno Green","hex":"#69ac58"},{"name":"Teclis Blue","hex":"#a3bae3"},{"name":"Teddy Bear","hex":"#9d8164"},{"name":"Teddy's Taupe","hex":"#bcac9f"},{"name":"Tee Off","hex":"#68855a"},{"name":"Teeny Bikini","hex":"#326395"},{"name":"Telemagenta","hex":"#cf3476"},{"name":"Tempest","hex":"#79839b"},{"name":"Template","hex":"#a6c9e3"},{"name":"Temple Guard Blue","hex":"#339a8d"},{"name":"Tempo","hex":"#33abb2"},{"name":"Tempting Taupe","hex":"#ccaa99"},{"name":"Temptress","hex":"#3c2126"},{"name":"Tender Greens","hex":"#c5cfb6"},{"name":"Tender Peach","hex":"#f8d5b8"},{"name":"Tender Shoots","hex":"#b5cc39"},{"name":"Tender Touch","hex":"#d5c6d6"},{"name":"Tender Yellow","hex":"#ededb7"},{"name":"Tenderness","hex":"#c8dbce"},{"name":"Tendril","hex":"#89a06b"},{"name":"Tenné","hex":"#cd5700"},{"name":"Tennis Ball","hex":"#dfff4f"},{"name":"Tentacle Pink","hex":"#ffbacd"},{"name":"Tenzing","hex":"#9ecfd9"},{"name":"Tequila","hex":"#f4d0a4"},{"name":"Teri-Gaki Persimmon","hex":"#eb6238"},{"name":"Terminatus Stone","hex":"#bdb192"},{"name":"Termite Beige","hex":"#ddbb66"},{"name":"Terra Rosa","hex":"#bb6569"},{"name":"Terra Rose","hex":"#9f6d66"},{"name":"Terra Tone","hex":"#b6706b"},{"name":"Terracotta","hex":"#cb6843"},{"name":"Terracotta Chip","hex":"#c47c5e"},{"name":"Terracotta Sand","hex":"#d6ba9b"},{"name":"Terran Khaki","hex":"#a1965e"},{"name":"Terrazzo Tan","hex":"#be8973"},{"name":"Teton Breeze","hex":"#dfeae8"},{"name":"Tetrarose","hex":"#8e6f73"},{"name":"Tetsu Black","hex":"#2b3733"},{"name":"Tetsu Green","hex":"#005243"},{"name":"Tetsu Iron","hex":"#455765"},{"name":"Tetsu-Guro Black","hex":"#281a14"},{"name":"Tetsu-Kon Blue","hex":"#17184b"},{"name":"Tetsuonando Black","hex":"#2b3736"},{"name":"Texan Angel","hex":"#e2ddd1"},{"name":"Texas","hex":"#ece67e"},{"name":"Texas Boots","hex":"#8b6947"},{"name":"Texas Heatwave","hex":"#a54e37"},{"name":"Texas Hills","hex":"#c9926e"},{"name":"Texas Longhorn","hex":"#e08d3c"},{"name":"Texas Ranger Brown","hex":"#a0522d"},{"name":"Texas Rose","hex":"#f1d2c9"},{"name":"Texas Sage","hex":"#b9a77c"},{"name":"Texas Sweet Tea","hex":"#794840"},{"name":"Thai Basil","hex":"#7a7f3f"},{"name":"Thai Curry","hex":"#ab6819"},{"name":"Thai Mango","hex":"#e77200"},{"name":"Thai Teak","hex":"#624435"},{"name":"Thai Temple","hex":"#e7c630"},{"name":"Thallium Flame","hex":"#58f898"},{"name":"Thamar Black","hex":"#181818"},{"name":"That's Atomic","hex":"#b0b08e"},{"name":"Thatch","hex":"#b1948f"},{"name":"Thatch Green","hex":"#544e31"},{"name":"Thatched Cottage","hex":"#d6c7a6"},{"name":"Thatched Roof","hex":"#efe0c6"},{"name":"Thawed Out","hex":"#e1eeec"},{"name":"The Blarney Stone","hex":"#ab9f89"},{"name":"The Bluff","hex":"#ffc8c2"},{"name":"The Boulevard","hex":"#d0a492"},{"name":"The Broadway","hex":"#145775"},{"name":"The Fang","hex":"#585673"},{"name":"The Fang Grey","hex":"#436174"},{"name":"The Golden State","hex":"#e9d2af"},{"name":"The Killing Joke","hex":"#b0bf1a"},{"name":"The Rainbow Fish","hex":"#4466ee"},{"name":"The Speed of Light","hex":"#f6f4ef"},{"name":"The White in my Eye","hex":"#f1eee5"},{"name":"Theatre Dress","hex":"#274242"},{"name":"Themeda Japonica","hex":"#e2b13c"},{"name":"Thermos","hex":"#d2bb95"},{"name":"Thick Fog","hex":"#dcd3ce"},{"name":"Thicket","hex":"#69865b"},{"name":"Thimbleberry","hex":"#e34b50"},{"name":"Thimbleberry Leaf","hex":"#afa97d"},{"name":"Thin Air","hex":"#c6fcff"},{"name":"Thin Cloud","hex":"#d4dcda"},{"name":"Thin Ice","hex":"#d9dcdb"},{"name":"Think Pink","hex":"#e5a5c1"},{"name":"Thirsty Thursday","hex":"#726e9b"},{"name":"Thistle","hex":"#d8bfd8"},{"name":"Thistle Down","hex":"#9499bb"},{"name":"Thistle Green","hex":"#cccaa8"},{"name":"Thistle Grey","hex":"#e2dcd4"},{"name":"Thor's Thunder","hex":"#915a7f"},{"name":"Thorn Crown","hex":"#b5a197"},{"name":"Thought","hex":"#d8cdc8"},{"name":"Thousand Herb","hex":"#317589"},{"name":"Thousand Sons Blue","hex":"#02d8e9"},{"name":"Thousand Years Green","hex":"#316745"},{"name":"Thraka Green Wash","hex":"#4f6446"},{"name":"Thredbo","hex":"#73c4d7"},{"name":"Three Ring Circus","hex":"#fddbb6"},{"name":"Thresher Shark","hex":"#93cce7"},{"name":"Thrush","hex":"#936b4f"},{"name":"Thulian Pink","hex":"#df6fa1"},{"name":"Thumper","hex":"#bdada4"},{"name":"Thundelarra","hex":"#e88a76"},{"name":"Thunder","hex":"#4d4d4b"},{"name":"Thunder Bay","hex":"#cbd9d7"},{"name":"Thunder Chi","hex":"#aac4d4"},{"name":"Thunderbird","hex":"#923830"},{"name":"Thunderbolt","hex":"#7c8783"},{"name":"Thunderbolt Blue","hex":"#454c56"},{"name":"Thundercat","hex":"#8a99a3"},{"name":"Thundercloud","hex":"#698589"},{"name":"Thunderhawk Blue","hex":"#417074"},{"name":"Thunderstorm","hex":"#9098a1"},{"name":"Thunderstruck","hex":"#5f5755"},{"name":"Thurman","hex":"#7f7b60"},{"name":"Thy Flesh Consumed","hex":"#98514a"},{"name":"Thyme","hex":"#50574c"},{"name":"Thyme and Salt","hex":"#629a31"},{"name":"Thyme Green","hex":"#737b6c"},{"name":"Tia Maria","hex":"#97422d"},{"name":"Tiamo","hex":"#9bb2aa"},{"name":"Tiān Lán Sky","hex":"#5db3ff"},{"name":"Tiara","hex":"#b9c3be"},{"name":"Tiara Jewel","hex":"#eae0e8"},{"name":"Tiber","hex":"#184343"},{"name":"Tibetan Plateau","hex":"#88ffdd"},{"name":"Tibetan Red","hex":"#782a39"},{"name":"Tibetan Silk","hex":"#9c8a52"},{"name":"Tibetan Stone","hex":"#82c2c7"},{"name":"Tibetan Temple","hex":"#814d50"},{"name":"Tibetan Yellow","hex":"#fedf00"},{"name":"Tickle Me Pink","hex":"#fc89ac"},{"name":"Tickled Crow","hex":"#b6baa4"},{"name":"Tickled Pink","hex":"#efa7bf"},{"name":"Tidal","hex":"#f0f590"},{"name":"Tidal Foam","hex":"#bfb9a3"},{"name":"Tidal Green","hex":"#cdca98"},{"name":"Tidal Mist","hex":"#e5e9e1"},{"name":"Tidal Pool","hex":"#005e59"},{"name":"Tidal Thicket","hex":"#8b866b"},{"name":"Tidal Wave","hex":"#355978"},{"name":"Tide","hex":"#beb4ab"},{"name":"Tidepool","hex":"#0a6f69"},{"name":"Tides of Darkness","hex":"#002400"},{"name":"Tiě Hēi Metal","hex":"#343450"},{"name":"Tiffany Amber","hex":"#b58141"},{"name":"Tiffany Blue","hex":"#7bf2da"},{"name":"Tiffany Rose","hex":"#d2a694"},{"name":"Tiger Cat","hex":"#cda035"},{"name":"Tiger Claw","hex":"#e1daca"},{"name":"Tiger Cub","hex":"#deae46"},{"name":"Tiger Moth","hex":"#f8f2dd"},{"name":"Tiger Moth Orange","hex":"#dd6611"},{"name":"Tiger Tail","hex":"#fee9c4"},{"name":"Tiger's Eye","hex":"#977c61"},{"name":"Tigerlily","hex":"#e2583e"},{"name":"Tijolo","hex":"#aa5500"},{"name":"Tiki Hut","hex":"#8a6e45"},{"name":"Tiki Monster","hex":"#8fbc8f"},{"name":"Tiki Straw","hex":"#b9a37e"},{"name":"Tiki Torch","hex":"#bb9e3f"},{"name":"Tile Blue","hex":"#008491"},{"name":"Tillandsia Purple","hex":"#563474"},{"name":"Timber Beam","hex":"#a0855c"},{"name":"Timber Green","hex":"#324336"},{"name":"Timber Wolf","hex":"#8d8070"},{"name":"Timber Wolf White","hex":"#d9d6cf"},{"name":"Time Capsule","hex":"#a59888"},{"name":"Time Travel","hex":"#b3c4d5"},{"name":"Time Warp","hex":"#9397a3"},{"name":"Timeless","hex":"#b1d8db"},{"name":"Timeless Beauty","hex":"#b6273e"},{"name":"Timeless Lilac","hex":"#afb2c4"},{"name":"Timid Sea","hex":"#66a9b0"},{"name":"Tin","hex":"#919191"},{"name":"Tin Bitz","hex":"#48452b"},{"name":"Tin Lizzie","hex":"#928a98"},{"name":"Tin Man","hex":"#a4a298"},{"name":"Tin Soldier","hex":"#bebebe"},{"name":"Tinge Of Mauve","hex":"#d4c3cc"},{"name":"Tingle","hex":"#e6541b"},{"name":"Tinker Light","hex":"#fbedb8"},{"name":"Tinny Tin","hex":"#4b492d"},{"name":"Tinsel","hex":"#c3964d"},{"name":"Tint of Earth","hex":"#ce9480"},{"name":"Tint of Green","hex":"#dae9dc"},{"name":"Tint of Turquoise","hex":"#41bfb5"},{"name":"Tinted Ice","hex":"#cff6f4"},{"name":"Tinted Iris","hex":"#c4b7d8"},{"name":"Tinted Mint","hex":"#e3e7c4"},{"name":"Tinted Rosewood","hex":"#e1c8d1"},{"name":"Tiny Bubbles","hex":"#0088ab"},{"name":"Tiny Ribbons","hex":"#b98faf"},{"name":"Tip Toes","hex":"#d8c2cd"},{"name":"Tiramisu","hex":"#634235"},{"name":"Titan White","hex":"#ddd6e1"},{"name":"Titanium","hex":"#807d7f"},{"name":"Titanium Grey","hex":"#545b62"},{"name":"Titanium Yellow","hex":"#eee600"},{"name":"Titmouse Grey","hex":"#b8b2be"},{"name":"Tizzy","hex":"#f9f3df"},{"name":"Toad","hex":"#748d70"},{"name":"Toad King","hex":"#3d6c54"},{"name":"Toadstool","hex":"#b8282f"},{"name":"Toadstool Dot","hex":"#d7e7da"},{"name":"Toadstool Soup","hex":"#988088"},{"name":"Toast","hex":"#9f715f"},{"name":"Toast and Butter","hex":"#d2ad84"},{"name":"Toasted Almond","hex":"#dacfba"},{"name":"Toasted Coconut","hex":"#e9c2a1"},{"name":"Toasted Marshmallow","hex":"#efe0d4"},{"name":"Toasted Nut","hex":"#c08768"},{"name":"Toasted Oatmeal","hex":"#efdecc"},{"name":"Toasted Sesame","hex":"#af9a73"},{"name":"Toasted Truffle","hex":"#aa3344"},{"name":"Tobacco Brown","hex":"#6d5843"},{"name":"Tobacco Leaf","hex":"#8c724f"},{"name":"Tobago","hex":"#44362d"},{"name":"Tobermory","hex":"#d39898"},{"name":"Tobernite","hex":"#077a7d"},{"name":"Tobey Rattan","hex":"#ad785c"},{"name":"Tobi Brown","hex":"#4c221b"},{"name":"Tobiko Orange","hex":"#e45c10"},{"name":"Toffee","hex":"#755139"},{"name":"Toffee Crunch","hex":"#995e39"},{"name":"Toffee Fingers","hex":"#968678"},{"name":"Toffee Tan","hex":"#c8a883"},{"name":"Tofino Belue","hex":"#03719c"},{"name":"Tofu","hex":"#e8e3d9"},{"name":"Toki Brown","hex":"#b88884"},{"name":"Tokiwa Green","hex":"#007b43"},{"name":"Toledo","hex":"#3e2631"},{"name":"Toledo Cioio","hex":"#decbb1"},{"name":"Tolopea","hex":"#2d2541"},{"name":"Tom Thumb","hex":"#4f6348"},{"name":"Tomatillo Peel","hex":"#cad3c1"},{"name":"Tomatillo Salsa","hex":"#bbb085"},{"name":"Tomato","hex":"#ef4026"},{"name":"Tomato Cream","hex":"#c57644"},{"name":"Tomato Frog","hex":"#ff4444"},{"name":"Tomato Puree","hex":"#c53346"},{"name":"Tomato Red","hex":"#ec2d01"},{"name":"Tomato Sauce","hex":"#b21807"},{"name":"Tomb Blue","hex":"#0099cc"},{"name":"Tombstone Grey","hex":"#cec5b6"},{"name":"Tōmorokoshi Corn","hex":"#faa945"},{"name":"Tomorokoshi Yellow","hex":"#eec362"},{"name":"Tongue","hex":"#d1908e"},{"name":"Tonocha","hex":"#975437"},{"name":"Tonys Pink","hex":"#e79e88"},{"name":"Too Blue","hex":"#3d6695"},{"name":"Tōō Gold","hex":"#ffb61e"},{"name":"Toolbox","hex":"#746cc0"},{"name":"Tootie Fruity","hex":"#f9dbe2"},{"name":"Top Hat Tan","hex":"#c1a393"},{"name":"Top Shelf","hex":"#82889c"},{"name":"Topaz Mountain","hex":"#92653f"},{"name":"Topiary","hex":"#8e9655"},{"name":"Topiary Garden","hex":"#6f7c00"},{"name":"Torch Light","hex":"#f69a54"},{"name":"Torch Red","hex":"#fd0d35"},{"name":"Torea Bay","hex":"#353d75"},{"name":"Toreador","hex":"#b61032"},{"name":"Tornado","hex":"#d1d3cf"},{"name":"Tornado Cloud","hex":"#5e5b60"},{"name":"Torrid Turquoise","hex":"#00938b"},{"name":"Tort","hex":"#5e8e91"},{"name":"Tortilla","hex":"#efdba7"},{"name":"Tortoise Shell","hex":"#754734"},{"name":"Tortuga","hex":"#84816f"},{"name":"Tory Blue","hex":"#374e88"},{"name":"Tosca","hex":"#744042"},{"name":"Toscana","hex":"#9f846b"},{"name":"Total Eclipse","hex":"#2c313d"},{"name":"Total Recall","hex":"#f6ead8"},{"name":"Totally Toffee","hex":"#dd9977"},{"name":"Totem Pole","hex":"#991b07"},{"name":"Touch of Blue","hex":"#c2d7e9"},{"name":"Touch of Blush","hex":"#f6ded5"},{"name":"Touch of Lime","hex":"#e1e5d7"},{"name":"Touch of Mint","hex":"#f8fff8"},{"name":"Touch of Tan","hex":"#eed9d1"},{"name":"Touch of Turquoise","hex":"#a1d4cf"},{"name":"Touchable","hex":"#ecdfd8"},{"name":"Toupe","hex":"#c7ac7d"},{"name":"Tourmaline","hex":"#86a1a9"},{"name":"Tower Grey","hex":"#9caca5"},{"name":"Towering Cliffs","hex":"#897565"},{"name":"Townhouse Taupe","hex":"#bbb09b"},{"name":"Toxic Essence","hex":"#cceebb"},{"name":"Toxic Frog","hex":"#98fb98"},{"name":"Toxic Green","hex":"#61de2a"},{"name":"Toxic Latte","hex":"#e1f8e7"},{"name":"Toxic Orange","hex":"#ff6037"},{"name":"Toy Submarine Blue","hex":"#005280"},{"name":"Toy Tank Green","hex":"#6d6f4f"},{"name":"Track and Field","hex":"#dd1111"},{"name":"Tractor Beam","hex":"#00bffe"},{"name":"Tractor Red","hex":"#fd0f35"},{"name":"Trade Secret","hex":"#6a7978"},{"name":"Trade Winds","hex":"#e6e3d6"},{"name":"Tradewind","hex":"#6dafa7"},{"name":"Trading Post","hex":"#bb8d3b"},{"name":"Traditional Rose","hex":"#be013c"},{"name":"Traditional Royal Blue","hex":"#0504aa"},{"name":"Trail Dust","hex":"#d0c4ac"},{"name":"Trail Sand","hex":"#bfaa97"},{"name":"Trailblazer","hex":"#c0b28e"},{"name":"Trailing Vine","hex":"#cfd5a7"},{"name":"Trance","hex":"#8f97a5"},{"name":"Tranquil","hex":"#ddede9"},{"name":"Tranquil Bay","hex":"#74b8de"},{"name":"Tranquil Eve","hex":"#ece7f2"},{"name":"Tranquil Green","hex":"#a4af9e"},{"name":"Tranquil Sea","hex":"#d2d2df"},{"name":"Tranquil Seashore","hex":"#629091"},{"name":"Tranquil Taupe","hex":"#b0a596"},{"name":"Tranquil Teal","hex":"#8ac7bb"},{"name":"Tranquility","hex":"#8e9b96"},{"name":"Transcend","hex":"#c3ac98"},{"name":"Transformer","hex":"#a5acb7"},{"name":"Translucent Silk","hex":"#ffe9e1"},{"name":"Translucent Vision","hex":"#e5efd7"},{"name":"Transparent Beige","hex":"#f4ecc2"},{"name":"Transparent Blue","hex":"#ddddff"},{"name":"Transparent Green","hex":"#ddffdd"},{"name":"Transparent Orange","hex":"#ffaa66"},{"name":"Transparent Pink","hex":"#ffddee"},{"name":"Transparent Yellow","hex":"#ffeeaa"},{"name":"Transtasman","hex":"#307d67"},{"name":"Travertine","hex":"#e2ddc7"},{"name":"Treasure Casket","hex":"#9b7856"},{"name":"Treasure Chest","hex":"#726854"},{"name":"Treasure Island","hex":"#47493b"},{"name":"Treasure Isle","hex":"#609d91"},{"name":"Treasure Seeker","hex":"#3f363d"},{"name":"Tree Frog","hex":"#9fb32e"},{"name":"Tree Frog Green","hex":"#7ca14e"},{"name":"Tree Green","hex":"#2a7e19"},{"name":"Tree House","hex":"#3b2820"},{"name":"Tree Lined","hex":"#8ea597"},{"name":"Tree Moss","hex":"#dcdbca"},{"name":"Tree of Life","hex":"#595d45"},{"name":"Tree Palm","hex":"#7faa4b"},{"name":"Tree Peony","hex":"#a4345d"},{"name":"Tree Poppy","hex":"#e2813b"},{"name":"Tree Pose","hex":"#bdc7bc"},{"name":"Tree Sap","hex":"#cc7711"},{"name":"Tree Shade","hex":"#476a30"},{"name":"Treeless","hex":"#d1b7a7"},{"name":"Treetop","hex":"#91b6ac"},{"name":"Trefoil","hex":"#47562f"},{"name":"Trekking Green","hex":"#355048"},{"name":"Trellis","hex":"#eaefe5"},{"name":"Trellised Ivy","hex":"#9aa097"},{"name":"Trendy Green","hex":"#7e8424"},{"name":"Trendy Pink","hex":"#805d80"},{"name":"Triamble","hex":"#94a089"},{"name":"Triassic","hex":"#67422d"},{"name":"Tribal","hex":"#807943"},{"name":"Tricycle Taupe","hex":"#b09994"},{"name":"Tried & True Blue","hex":"#494f62"},{"name":"Triforce Shine","hex":"#f5f5da"},{"name":"Triforce Yellow","hex":"#f0f00f"},{"name":"Trim","hex":"#756d44"},{"name":"Trinidad","hex":"#c54f33"},{"name":"Trinity Islands","hex":"#b9b79b"},{"name":"Trinket Box","hex":"#7e633f"},{"name":"Tripoli White","hex":"#e5e3e5"},{"name":"Tristesse","hex":"#0c0c1f"},{"name":"Trite White","hex":"#f4f0e3"},{"name":"Trixter","hex":"#705676"},{"name":"Trojan Horse Brown","hex":"#775020"},{"name":"Troll Slayer Orange","hex":"#f4a34c"},{"name":"Trolley Grey","hex":"#818181"},{"name":"Trooper","hex":"#697a7e"},{"name":"Tropic Canary","hex":"#bcc23c"},{"name":"Tropic Tide","hex":"#6cc1bb"},{"name":"Tropical Blue","hex":"#aec9eb"},{"name":"Tropical Breeze","hex":"#ebedee"},{"name":"Tropical Cascade","hex":"#8ca8a0"},{"name":"Tropical Dream","hex":"#d9eae5"},{"name":"Tropical Fog","hex":"#cbcab6"},{"name":"Tropical Forest","hex":"#024a43"},{"name":"Tropical Forest Green","hex":"#228b21"},{"name":"Tropical Green","hex":"#17806d"},{"name":"Tropical Holiday","hex":"#8fcdc7"},{"name":"Tropical Kelp","hex":"#009d7d"},{"name":"Tropical Lagoon","hex":"#1e98ae"},{"name":"Tropical Light","hex":"#9cd572"},{"name":"Tropical Moss","hex":"#d2c478"},{"name":"Tropical Orchid","hex":"#a0828a"},{"name":"Tropical Peach","hex":"#ffc4b2"},{"name":"Tropical Rainforest","hex":"#00755e"},{"name":"Tropical Siesta","hex":"#ddc073"},{"name":"Tropical Splash","hex":"#70cbce"},{"name":"Tropical Tale","hex":"#e0deb8"},{"name":"Tropical Teal","hex":"#008794"},{"name":"Tropical Tide","hex":"#5ecaae"},{"name":"Tropical Tree","hex":"#20aea7"},{"name":"Tropical Violet","hex":"#cda5df"},{"name":"Tropical Waterfall","hex":"#bee7e2"},{"name":"Tropical Wood","hex":"#ba8f68"},{"name":"Trough Shell","hex":"#726d40"},{"name":"Trough Shell Brown","hex":"#918754"},{"name":"Trout","hex":"#4c5356"},{"name":"True Blonde","hex":"#dcc49b"},{"name":"True Blue","hex":"#010fcc"},{"name":"True Crimson","hex":"#a22042"},{"name":"True Green","hex":"#089404"},{"name":"True Khaki","hex":"#b8ae98"},{"name":"True Love","hex":"#e27e8a"},{"name":"True Navy","hex":"#3f5277"},{"name":"True Purple","hex":"#65318e"},{"name":"True Red","hex":"#bf1932"},{"name":"True To You","hex":"#cdd3a3"},{"name":"True V","hex":"#8e72c7"},{"name":"Truesky Gloxym ","hex":"#99bbff"},{"name":"Trump Tan","hex":"#faa76c"},{"name":"Trumpet","hex":"#867e85"},{"name":"Trumpet Teal","hex":"#5a7d7a"},{"name":"Trumpeter","hex":"#907baa"},{"name":"Trunks Hair","hex":"#9b5fc0"},{"name":"Trustee","hex":"#527498"},{"name":"Truth","hex":"#344989"},{"name":"Tsar","hex":"#8b7f7b"},{"name":"Tsarina","hex":"#d1b4c6"},{"name":"Tsunami","hex":"#869baf"},{"name":"Tsurubami Green","hex":"#9ba88d"},{"name":"Tǔ Hēi Black","hex":"#574d35"},{"name":"Tuatara","hex":"#454642"},{"name":"Tuberose","hex":"#fffaec"},{"name":"Tudor Tan","hex":"#b68960"},{"name":"Tuffet","hex":"#a59788"},{"name":"Tuft","hex":"#cbc2ad"},{"name":"Tuft Bush","hex":"#f9d3be"},{"name":"Tufts Blue","hex":"#417dc1"},{"name":"Tuğçe Silver","hex":"#ccddee"},{"name":"Tuk Tuk","hex":"#573b2a"},{"name":"Tulip","hex":"#ff878d"},{"name":"Tulip Petals","hex":"#fbf4da"},{"name":"Tulip Tree","hex":"#e3ac3d"},{"name":"Tulipwood","hex":"#805466"},{"name":"Tumbleweed","hex":"#deaa88"},{"name":"Tumbling Tumbleweed","hex":"#cebf9c"},{"name":"Tuna","hex":"#46494e"},{"name":"Tuna Sashimi","hex":"#cf6275"},{"name":"Tundora","hex":"#585452"},{"name":"Tundra Frost","hex":"#e1e1db"},{"name":"Tungsten","hex":"#b5ac9f"},{"name":"Tunisian Stone","hex":"#ffddb5"},{"name":"Tupelo Honey","hex":"#c0a04d"},{"name":"Turbinado Sugar","hex":"#f9bb59"},{"name":"Turbo","hex":"#f5cc23"},{"name":"Turbulence","hex":"#4e545b"},{"name":"Turbulent Sea","hex":"#536a79"},{"name":"Turf","hex":"#5f4f42"},{"name":"Turf Green","hex":"#6f8c69"},{"name":"Turkish Aqua","hex":"#006169"},{"name":"Turkish Bath","hex":"#bb937b"},{"name":"Turkish Coffee","hex":"#483f39"},{"name":"Turkish Jade","hex":"#2b888d"},{"name":"Turkish Rose","hex":"#a56e75"},{"name":"Turkish Sea","hex":"#195190"},{"name":"Turkish Stone","hex":"#2f7a92"},{"name":"Turkish Tile","hex":"#00698b"},{"name":"Turkish Turquoise","hex":"#77dde7"},{"name":"Turmeric","hex":"#ae9041"},{"name":"Turmeric Root","hex":"#feae0d"},{"name":"Turmeric Tea","hex":"#d88e2d"},{"name":"Turned Leaf","hex":"#8d7448"},{"name":"Turner's Light","hex":"#93bcbb"},{"name":"Turner's Yellow","hex":"#e6c26f"},{"name":"Turning Oakleaf","hex":"#ede1a8"},{"name":"Turquesa","hex":"#448899"},{"name":"Turquoise","hex":"#06c2ac"},{"name":"Turquoise Blue","hex":"#00ffef"},{"name":"Turquoise Chalk","hex":"#6fe7db"},{"name":"Turquoise Cyan","hex":"#0e7c61"},{"name":"Turquoise Green","hex":"#04f489"},{"name":"Turquoise Panic","hex":"#30d5c8"},{"name":"Turquoise Sea","hex":"#6cdae7"},{"name":"Turquoise Surf","hex":"#00c5cd"},{"name":"Turquoise Topaz","hex":"#13bbaf"},{"name":"Turtle Bay","hex":"#84897f"},{"name":"Turtle Chalk","hex":"#ced8c1"},{"name":"Turtle Green","hex":"#75b84f"},{"name":"Turtle Lake","hex":"#73b7a5"},{"name":"Turtle Moss","hex":"#939717"},{"name":"Turtle Skin","hex":"#363e1d"},{"name":"Turtle Trail","hex":"#b6b5a0"},{"name":"Turtledove","hex":"#ded7c8"},{"name":"Tuscan","hex":"#fbd5a6"},{"name":"Tuscan Bread","hex":"#e7d2ad"},{"name":"Tuscan Brown","hex":"#6f4c37"},{"name":"Tuscan Clay","hex":"#aa5e5a"},{"name":"Tuscan Image","hex":"#dc938c"},{"name":"Tuscan Mosaic","hex":"#a08d71"},{"name":"Tuscan Olive","hex":"#5d583e"},{"name":"Tuscan Red","hex":"#7c4848"},{"name":"Tuscan Soil","hex":"#a67b5b"},{"name":"Tuscan Sun","hex":"#ffd84d"},{"name":"Tuscan Sunset","hex":"#bb7c3f"},{"name":"Tusi Grey","hex":"#9996b3"},{"name":"Tusk","hex":"#e3e5b1"},{"name":"Tuskgor Fur","hex":"#883636"},{"name":"Tussock","hex":"#bf914b"},{"name":"Tutu","hex":"#f8e4e3"},{"name":"Tutuji Pink","hex":"#e95295"},{"name":"Tweed","hex":"#937b56"},{"name":"Tweety","hex":"#ffef00"},{"name":"Twig Basket","hex":"#77623a"},{"name":"Twilight","hex":"#4e518b"},{"name":"Twilight Blue","hex":"#0a437a"},{"name":"Twilight Lavender","hex":"#8a496b"},{"name":"Twilight Light","hex":"#dac0cd"},{"name":"Twilight Mauve","hex":"#8b6f70"},{"name":"Twilight Purple","hex":"#66648b"},{"name":"Twilight Stroll","hex":"#71898d"},{"name":"Twilight Taupe","hex":"#a79994"},{"name":"Twilight Twinkle","hex":"#7b85c6"},{"name":"Twilight Twist","hex":"#e5e6d7"},{"name":"Twill","hex":"#a79b82"},{"name":"Twin Cities","hex":"#a4c7c8"},{"name":"Twine","hex":"#c19156"},{"name":"Twinkle","hex":"#adc6d3"},{"name":"Twinkle Blue","hex":"#d0d7df"},{"name":"Twinkle Little Star","hex":"#fce79a"},{"name":"Twinkle Toes","hex":"#e2d39b"},{"name":"Twinkle Twinkle","hex":"#fcf0c5"},{"name":"Twinkling Lights","hex":"#fffac1"},{"name":"Twist of Lime","hex":"#4e632c"},{"name":"Twisted Blue","hex":"#76c4d1"},{"name":"Twisted Tail","hex":"#9a845e"},{"name":"Twisted Time","hex":"#7f6c6e"},{"name":"Twisted Vine","hex":"#655f50"},{"name":"Two Harbours","hex":"#bed3e1"},{"name":"Typhus Corrosion","hex":"#463d2b"},{"name":"Tyrant Skull","hex":"#cdc586"},{"name":"Tyrian","hex":"#4e4d59"},{"name":"Tyrian Purple","hex":"#66023c"},{"name":"Tyrol","hex":"#b3cdbf"},{"name":"Tzatziki Green","hex":"#ddeecc"},{"name":"UA Blue","hex":"#0033aa"},{"name":"UA Red","hex":"#d9004c"},{"name":"Ube","hex":"#8878c3"},{"name":"UCLA Blue","hex":"#536895"},{"name":"UCLA Gold","hex":"#ffb300"},{"name":"Ufo","hex":"#989fa3"},{"name":"UFO Green","hex":"#3cd070"},{"name":"Uguisu Brown","hex":"#645530"},{"name":"Uguisu Green","hex":"#928c36"},{"name":"Ukon Saffron","hex":"#fabf14"},{"name":"Ulthuan Grey","hex":"#c7e0d9"},{"name":"Ultimate Pink","hex":"#ff55ff"},{"name":"Ultra Indigo","hex":"#4433ff"},{"name":"Ultra Pink","hex":"#f06fff"},{"name":"Ultra Red","hex":"#fc6c85"},{"name":"Ultra Violet","hex":"#7366bd"},{"name":"Ultramarine","hex":"#1805db"},{"name":"Ultramarine Green","hex":"#006b54"},{"name":"Ultramarine Highlight","hex":"#2e328f"},{"name":"Ultramarine Shadow","hex":"#090045"},{"name":"Ultramint","hex":"#b6ccb6"},{"name":"Ultraviolet Berl","hex":"#bb44cc"},{"name":"Ultraviolet Cryner","hex":"#bb44bb"},{"name":"Ultraviolet Nusp","hex":"#bb44aa"},{"name":"Ultraviolet Onsible","hex":"#bb44dd"},{"name":"Uluru Red","hex":"#921d0f"},{"name":"Ulva Lactuca Green","hex":"#90ee90"},{"name":"Umber","hex":"#b26400"},{"name":"Umber Shade Wash","hex":"#4e4d2f"},{"name":"Umbral Umber","hex":"#520200"},{"name":"Umbrella Green","hex":"#a2af70"},{"name":"Umemurasaki Purple","hex":"#8f4155"},{"name":"Umenezumi Plum","hex":"#97645a"},{"name":"Umezome Pink","hex":"#fa9258"},{"name":"Unakite","hex":"#75a14f"},{"name":"Unbleached","hex":"#fbfaf5"},{"name":"Unbleached Calico","hex":"#f5d8bb"},{"name":"Unbleached Silk","hex":"#ffddca"},{"name":"Uncharted","hex":"#19565e"},{"name":"Underbrush","hex":"#be9e48"},{"name":"Underhive Ash","hex":"#b2ac88"},{"name":"Undersea","hex":"#90b1ae"},{"name":"Underwater","hex":"#cfeee8"},{"name":"Underwater Flare","hex":"#e78ea5"},{"name":"Unexplained","hex":"#69667c"},{"name":"Ungor Flesh","hex":"#d6a766"},{"name":"Unicorn Dust","hex":"#ff2f92"},{"name":"Unicorn Silver","hex":"#e8e8e8"},{"name":"Uniform","hex":"#a7b7ca"},{"name":"Uniform Brown","hex":"#6e5d3e"},{"name":"Uniform Grey","hex":"#a8a8a8"},{"name":"Union Springs","hex":"#9c9680"},{"name":"Union Station","hex":"#c7c5ba"},{"name":"United Nations Blue","hex":"#5b92e5"},{"name":"Unity","hex":"#264d8e"},{"name":"University of California Gold","hex":"#b78727"},{"name":"University of Tennessee Orange","hex":"#f77f00"},{"name":"Unmellow Yellow","hex":"#fefe66"},{"name":"Unripe Strawberry","hex":"#f78fa7"},{"name":"Untamed Orange","hex":"#de5730"},{"name":"Untamed Red","hex":"#dd0022"},{"name":"UP Forest Green","hex":"#014431"},{"name":"Up In Smoke","hex":"#6e706d"},{"name":"UP Maroon","hex":"#7b1113"},{"name":"Up North","hex":"#6f9587"},{"name":"Upbeat","hex":"#f1d9a5"},{"name":"Upper Crust","hex":"#a3758b"},{"name":"Upsdell Red","hex":"#ae2029"},{"name":"Upstream Salmon","hex":"#f99a7a"},{"name":"Uptown Taupe","hex":"#f1e4d7"},{"name":"Urahayanagi Green","hex":"#bcb58c"},{"name":"Uranus","hex":"#ace5ee"},{"name":"Urban Bird","hex":"#ddd4c5"},{"name":"Urban Chic","hex":"#464e4d"},{"name":"Urban Pigeon","hex":"#9dacb7"},{"name":"Urbanite","hex":"#4d5659"},{"name":"Urnebes Beige","hex":"#ffecc2"},{"name":"Urobilin","hex":"#e1ad21"},{"name":"US Air Force Blue","hex":"#00308f"},{"name":"US Field Drab","hex":"#716140"},{"name":"USAFA Blue","hex":"#004f98"},{"name":"USC Cardinal","hex":"#990010"},{"name":"USC Gold","hex":"#ffcc00"},{"name":"Used Oil","hex":"#231712"},{"name":"Ushabti Bone","hex":"#bbbb7f"},{"name":"USMC Green","hex":"#373d31"},{"name":"Usu Koubai Blossom","hex":"#e597b2"},{"name":"Usu Pink","hex":"#a87ca0"},{"name":"Usuao Blue","hex":"#8c9c76"},{"name":"Usubeni Red","hex":"#f2666c"},{"name":"Usugaki Persimmon","hex":"#fca474"},{"name":"Usukō","hex":"#fea464"},{"name":"Usumoegi Green","hex":"#8db255"},{"name":"Utah Crimson","hex":"#d3003f"},{"name":"UV Light","hex":"#0098c8"},{"name":"Va Va Bloom","hex":"#efd5cf"},{"name":"Va Va Voom","hex":"#e3b34c"},{"name":"Vacherin Cheese","hex":"#fde882"},{"name":"Valencia","hex":"#d4574e"},{"name":"Valentine Red","hex":"#9b233b"},{"name":"Valentine's Day","hex":"#a63864"},{"name":"Valentino","hex":"#b64476"},{"name":"Valentino Nero","hex":"#382c38"},{"name":"Valerian","hex":"#9f7a93"},{"name":"Valhalla","hex":"#2a2b41"},{"name":"Valhallan Blizzard","hex":"#f2ede7"},{"name":"Valiant Poppy","hex":"#bc322c"},{"name":"Vallarta Blue","hex":"#30658e"},{"name":"Valley Flower","hex":"#ffdd9d"},{"name":"Valley of Fire","hex":"#ff8a4a"},{"name":"Valonia","hex":"#79c9d1"},{"name":"Valor","hex":"#a3bcdb"},{"name":"Vampire Bite","hex":"#c40233"},{"name":"Vampire Red","hex":"#dd4132"},{"name":"Vampire State Building","hex":"#cc1100"},{"name":"Vampiric Shadow","hex":"#bfb6aa"},{"name":"Van Cleef","hex":"#523936"},{"name":"Van de Cane","hex":"#faf7eb"},{"name":"Van Dyke Brown","hex":"#664228"},{"name":"Van Gogh Green","hex":"#65ce95"},{"name":"Van Gogh Olives","hex":"#759465"},{"name":"Vanadyl Blue","hex":"#00a3e0"},{"name":"Vandermint","hex":"#abdee4"},{"name":"Vanilla","hex":"#f3e5ab"},{"name":"Vanilla Blush","hex":"#fcede4"},{"name":"Vanilla Cream","hex":"#f4d8c6"},{"name":"Vanilla Custard","hex":"#f3e0be"},{"name":"Vanilla Flower","hex":"#e9dfcf"},{"name":"Vanilla Frost","hex":"#fde9c5"},{"name":"Vanilla Ice","hex":"#fdf2d1"},{"name":"Vanilla Love","hex":"#e6e0cc"},{"name":"Vanilla Milkshake","hex":"#f1ece2"},{"name":"Vanilla Pudding","hex":"#f7e26b"},{"name":"Vanilla Quake","hex":"#cbc8c2"},{"name":"Vanilla Seed","hex":"#ccb69b"},{"name":"Vanilla Shake","hex":"#fffbf0"},{"name":"Vanilla Tan","hex":"#f1e9dd"},{"name":"Vanilla Wafer","hex":"#f3ead2"},{"name":"Vanity","hex":"#5692b2"},{"name":"Vape Smoke","hex":"#e8e8d7"},{"name":"Vapor","hex":"#eaeaea"},{"name":"Vapor Blue","hex":"#bebdbd"},{"name":"Vapor Trail","hex":"#f5eedf"},{"name":"Vaporous Grey","hex":"#dfddd7"},{"name":"Vapour","hex":"#f0ffff"},{"name":"Vaquero Boots","hex":"#855f43"},{"name":"Varden","hex":"#fdefd3"},{"name":"Variegated Frond","hex":"#747d5a"},{"name":"Vast","hex":"#c9bdb8"},{"name":"Vast Escape","hex":"#d2c595"},{"name":"Vega Violet","hex":"#aa55ff"},{"name":"Vegan","hex":"#22bb88"},{"name":"Vegan Mastermind ","hex":"#22bb55"},{"name":"Vegan Villain","hex":"#aa9911"},{"name":"Vegas Gold","hex":"#c5b358"},{"name":"Vegeta Blue","hex":"#26538d"},{"name":"Vegetable Garden","hex":"#8b8c40"},{"name":"Vegetarian","hex":"#22aa00"},{"name":"Vegetarian Veteran","hex":"#78945a"},{"name":"Vegetation","hex":"#5ccd97"},{"name":"Veil of Dusk","hex":"#dad8c9"},{"name":"Veiled Delight","hex":"#b2b0bd"},{"name":"Veiled Rose","hex":"#f8cdc9"},{"name":"Veiled Spotlight","hex":"#cfd5d7"},{"name":"Veiled Violet","hex":"#b19bb0"},{"name":"Velvet","hex":"#750851"},{"name":"Velvet Cape","hex":"#623941"},{"name":"Velvet Clover","hex":"#656d63"},{"name":"Velvet Ears","hex":"#c5adb4"},{"name":"Velvet Green","hex":"#2f5d50"},{"name":"Velvet Morning","hex":"#60688d"},{"name":"Velvet Rose","hex":"#7e374c"},{"name":"Velvet Scarf","hex":"#e3dfec"},{"name":"Velvet Slipper","hex":"#846c76"},{"name":"Velvet Umber","hex":"#6b605a"},{"name":"Velvet Violet","hex":"#43354f"},{"name":"Velveteen Crush","hex":"#936064"},{"name":"Venetian","hex":"#928083"},{"name":"Venetian Nights","hex":"#7755ff"},{"name":"Venetian Pink","hex":"#bb8e84"},{"name":"Venetian Red","hex":"#c80815"},{"name":"Venetian Wall","hex":"#949486"},{"name":"Venice Blue","hex":"#2c5778"},{"name":"Venom Dart","hex":"#01ff01"},{"name":"Venom Wyrm","hex":"#607038"},{"name":"Venomous Green","hex":"#66ff22"},{"name":"Venus","hex":"#eed053"},{"name":"Venus Deva","hex":"#8f7974"},{"name":"Venus Flower","hex":"#9ea6cf"},{"name":"Venus Flytrap","hex":"#94b44c"},{"name":"Venus Mist","hex":"#5f606e"},{"name":"Venus Slipper Orchid","hex":"#df73ff"},{"name":"Venusian","hex":"#71384c"},{"name":"Veranda","hex":"#61a9a5"},{"name":"Veranda Gold","hex":"#af9968"},{"name":"Veranda Green","hex":"#8e977e"},{"name":"Veranda Hills","hex":"#ccb994"},{"name":"Verdant Green","hex":"#12674a"},{"name":"Verdant Views","hex":"#75794a"},{"name":"Verde","hex":"#7fb383"},{"name":"Verde Garrafa","hex":"#355e3b"},{"name":"Verde Tropa","hex":"#758000"},{"name":"Verdigris","hex":"#43b3ae"},{"name":"Verdigris Foncé","hex":"#62603e"},{"name":"Verditer","hex":"#00bbaa"},{"name":"Verditter Blue","hex":"#55aabb"},{"name":"Verdun Green","hex":"#48531a"},{"name":"Vermicelle","hex":"#dabe82"},{"name":"Vermilion","hex":"#f4320c"},{"name":"Vermilion Bird","hex":"#f24433"},{"name":"Vermilion Cinnabar","hex":"#e34244"},{"name":"Vermillion","hex":"#da3b1f"},{"name":"Vermillion Orange","hex":"#f9633b"},{"name":"Vermillion Seabass","hex":"#973a36"},{"name":"Vermin Brown","hex":"#8f7303"},{"name":"Verminlord Hide","hex":"#a16954"},{"name":"Verona Beach","hex":"#e9d3ba"},{"name":"Veronica","hex":"#a020ff"},{"name":"Vers de Terre","hex":"#acdfad"},{"name":"Verse Green","hex":"#18880d"},{"name":"Very Berry","hex":"#b73275"},{"name":"Very Blue","hex":"#0000aa"},{"name":"Very Cashmere","hex":"#ecdfad"},{"name":"Very Cherry","hex":"#dd3355"},{"name":"Very Dark Blue","hex":"#000133"},{"name":"Very Dark Brown","hex":"#1d0200"},{"name":"Very Dark Green","hex":"#062e03"},{"name":"Very Dark Purple","hex":"#2a0134"},{"name":"Very Grape","hex":"#927288"},{"name":"Very Light Azure","hex":"#74bbfb"},{"name":"Very Light Blue","hex":"#d5ffff"},{"name":"Very Light Brown","hex":"#d3b683"},{"name":"Very Light Green","hex":"#d1ffbd"},{"name":"Very Light Grey","hex":"#cfcdcf"},{"name":"Very Light Malachite Green","hex":"#64e986"},{"name":"Very Light Pink","hex":"#fff4f2"},{"name":"Very Light Purple","hex":"#f6cefc"},{"name":"Very Light Tangelo","hex":"#ffb077"},{"name":"Very Pale Blue","hex":"#d6fffe"},{"name":"Very Pale Green","hex":"#cffdbc"},{"name":"Very Pale Orange","hex":"#ffdfbf"},{"name":"Very Pale Yellow","hex":"#ffffbf"},{"name":"Very Terracotta","hex":"#a35732"},{"name":"Vestige","hex":"#937899"},{"name":"Vesuvius","hex":"#a85533"},{"name":"Vetiver","hex":"#807d6f"},{"name":"Viameter","hex":"#d9d140"},{"name":"Vibrant Blue","hex":"#0339f8"},{"name":"Vibrant Green","hex":"#0add08"},{"name":"Vibrant Honey","hex":"#ffbd31"},{"name":"Vibrant Hue","hex":"#544563"},{"name":"Vibrant Orange","hex":"#ff7420"},{"name":"Vibrant Orchid","hex":"#804b81"},{"name":"Vibrant Purple","hex":"#ad03de"},{"name":"Vibrant Vine","hex":"#4b373a"},{"name":"Vibrant Vision","hex":"#6c6068"},{"name":"Vibrant Yellow","hex":"#ffda29"},{"name":"VIC 20 Blue","hex":"#c7ffff"},{"name":"VIC 20 Creme","hex":"#ffffb2"},{"name":"VIC 20 Green","hex":"#94e089"},{"name":"VIC 20 Pink","hex":"#ea9ff6"},{"name":"VIC 20 Sky","hex":"#87d6dd"},{"name":"Vicarious Violet","hex":"#5f4d50"},{"name":"Vicious Violet","hex":"#8f509d"},{"name":"Victoria","hex":"#564985"},{"name":"Victoria Blue","hex":"#08589d"},{"name":"Victoria Peak","hex":"#007755"},{"name":"Victoria Red","hex":"#6a3c3a"},{"name":"Victorian Cottage","hex":"#d4c5ca"},{"name":"Victorian Crown","hex":"#c38b36"},{"name":"Victorian Greenhouse","hex":"#00b191"},{"name":"Victorian Lace","hex":"#efe1cd"},{"name":"Victorian Peacock","hex":"#104a65"},{"name":"Victorian Pewter","hex":"#828388"},{"name":"Victorian Plum","hex":"#8e6278"},{"name":"Victorian Rouge","hex":"#d28085"},{"name":"Victorian Valentine","hex":"#ae6aa1"},{"name":"Victorian Violet","hex":"#b079a7"},{"name":"Victoriana","hex":"#d6b2ad"},{"name":"Victory Blue","hex":"#3a405a"},{"name":"Victory Lake","hex":"#92abd8"},{"name":"Vida Loca","hex":"#549019"},{"name":"Vidalia","hex":"#a1ddd4"},{"name":"Viennese","hex":"#8c8185"},{"name":"Vietnamese Lantern","hex":"#eec172"},{"name":"Viking","hex":"#4db1c8"},{"name":"Viking Castle","hex":"#757266"},{"name":"Viking Diva","hex":"#cabae0"},{"name":"Vile Green","hex":"#8fcdb0"},{"name":"Village Crier","hex":"#ab9769"},{"name":"Village Square","hex":"#7b6f60"},{"name":"Villandry","hex":"#728f66"},{"name":"Vin Cuit","hex":"#b47463"},{"name":"Vin Rouge","hex":"#955264"},{"name":"Vinca","hex":"#5778a7"},{"name":"Vincotto","hex":"#483743"},{"name":"Vindaloo","hex":"#ae7579"},{"name":"Vineyard","hex":"#819e84"},{"name":"Vineyard Autumn","hex":"#ee4455"},{"name":"Vineyard Green","hex":"#5f7355"},{"name":"Vineyard Wine","hex":"#58363d"},{"name":"Vinho do Porto","hex":"#b31a38"},{"name":"Vining Ivy","hex":"#4b7378"},{"name":"Vino Tinto","hex":"#4c1c24"},{"name":"Vintage","hex":"#847592"},{"name":"Vintage Copper","hex":"#9d5f46"},{"name":"Vintage Ephemera","hex":"#d8ceb9"},{"name":"Vintage Indigo","hex":"#4a556b"},{"name":"Vintage Khaki","hex":"#9a9186"},{"name":"Vintage Lace","hex":"#f1e7d2"},{"name":"Vintage Plum","hex":"#675d62"},{"name":"Vintage Porcelain","hex":"#f2edec"},{"name":"Vintage Pottery","hex":"#a66c47"},{"name":"Vintage Red","hex":"#9e3641"},{"name":"Vintage Vibe","hex":"#888f4f"},{"name":"Vintage Violet","hex":"#634f62"},{"name":"Vintage Wine","hex":"#65344e"},{"name":"Viola","hex":"#966ebd"},{"name":"Viola Sororia","hex":"#b9a5bd"},{"name":"Violaceous","hex":"#bf8fc4"},{"name":"Violaceous Greti","hex":"#881188"},{"name":"Violent Violet","hex":"#7f00ff"},{"name":"Violet","hex":"#9a0eea"},{"name":"Violet Aura","hex":"#838ba4"},{"name":"Violet Blue","hex":"#510ac9"},{"name":"Violet Bouquet","hex":"#b9b1c8"},{"name":"Violet Clues","hex":"#efecef"},{"name":"Violet Crush","hex":"#d8d3e6"},{"name":"Violet Dawn","hex":"#a89b9c"},{"name":"Violet Echo","hex":"#dfdee5"},{"name":"Violet Eclipse","hex":"#a387ac"},{"name":"Violet Eggplant","hex":"#991199"},{"name":"Violet Extract","hex":"#dee2ec"},{"name":"Violet Frog","hex":"#926eae"},{"name":"Violet Gems","hex":"#c4c0e9"},{"name":"Violet Glow","hex":"#4422ee"},{"name":"Violet Hickey","hex":"#330099"},{"name":"Violet Hush","hex":"#e5e2e7"},{"name":"Violet Ice","hex":"#c2acb1"},{"name":"Violet Indigo","hex":"#3e285c"},{"name":"Violet Ink","hex":"#9400d3"},{"name":"Violet Intense","hex":"#4d4456"},{"name":"Violet Kiss","hex":"#f0a0d1"},{"name":"Violet Majesty","hex":"#644982"},{"name":"Violet Mix","hex":"#aca8cd"},{"name":"Violet Orchid","hex":"#ca7988"},{"name":"Violet Persuasion","hex":"#927b97"},{"name":"Violet Pink","hex":"#fb5ffc"},{"name":"Violet Poison","hex":"#8601bf"},{"name":"Violet Posy","hex":"#60394d"},{"name":"Violet Powder","hex":"#c7ccd8"},{"name":"Violet Quartz","hex":"#8b4963"},{"name":"Violet Red","hex":"#a50055"},{"name":"Violet Shadow","hex":"#4d4860"},{"name":"Violet Storm","hex":"#5c619d"},{"name":"Violet Sweet Pea","hex":"#c7c5dc"},{"name":"Violet Tulip","hex":"#9e91c3"},{"name":"Violet Tulle","hex":"#c193c0"},{"name":"Violet Vapor","hex":"#e5dae1"},{"name":"Violet Verbena","hex":"#898ca3"},{"name":"Violet Vixen","hex":"#883377"},{"name":"Violet Vogue","hex":"#e9e1e8"},{"name":"Violet Whimsey","hex":"#dad6df"},{"name":"Violets Are Blue","hex":"#7487c6"},{"name":"Violin Brown","hex":"#674403"},{"name":"Virgin Olive Oil","hex":"#e2dcab"},{"name":"Virgin Peach","hex":"#ecbdb0"},{"name":"Viric Green","hex":"#99cc00"},{"name":"Viridian","hex":"#1e9167"},{"name":"Viridian Green","hex":"#bcd7d4"},{"name":"Viridis","hex":"#00846b"},{"name":"Virtual Boy","hex":"#bb3311"},{"name":"Virtual Forest","hex":"#8aa56e"},{"name":"Virtual Pink","hex":"#c6174e"},{"name":"Virtuous","hex":"#9f7ba9"},{"name":"Vis Vis","hex":"#f9e496"},{"name":"Vision","hex":"#d2cce5"},{"name":"Vision Quest","hex":"#9b94c2"},{"name":"Visionary","hex":"#f6e0a9"},{"name":"Vista Blue","hex":"#97d5b3"},{"name":"Vista White","hex":"#e3dfd9"},{"name":"Vitalize","hex":"#2aaa45"},{"name":"Vitamin C","hex":"#ff9900"},{"name":"Viva La Bleu","hex":"#97bee2"},{"name":"Viva Las Vegas","hex":"#b39953"},{"name":"Vivacious","hex":"#a32857"},{"name":"Vivacious Violet","hex":"#804665"},{"name":"Vivaldi Red","hex":"#ef3939"},{"name":"Vivid Amber","hex":"#cc9900"},{"name":"Vivid Auburn","hex":"#922724"},{"name":"Vivid Blue","hex":"#152eff"},{"name":"Vivid Burgundy","hex":"#9f1d35"},{"name":"Vivid Cerise","hex":"#da1d81"},{"name":"Vivid Cerulean","hex":"#00aaee"},{"name":"Vivid Crimson","hex":"#cc0033"},{"name":"Vivid Green","hex":"#2fef10"},{"name":"Vivid Imagination","hex":"#5c9f59"},{"name":"Vivid Lime Green","hex":"#a6d608"},{"name":"Vivid Malachite","hex":"#00cc33"},{"name":"Vivid Mulberry","hex":"#b80ce3"},{"name":"Vivid Orange","hex":"#ff5f00"},{"name":"Vivid Orange Peel","hex":"#ffa102"},{"name":"Vivid Orchid","hex":"#cc00ff"},{"name":"Vivid Purple","hex":"#9900fa"},{"name":"Vivid Raspberry","hex":"#ff006c"},{"name":"Vivid Red","hex":"#f70d1a"},{"name":"Vivid Red Tangelo","hex":"#df6124"},{"name":"Vivid Sky Blue","hex":"#00ccff"},{"name":"Vivid Tangelo","hex":"#f07427"},{"name":"Vivid Tangerine","hex":"#ff9980"},{"name":"Vivid Vermilion","hex":"#e56024"},{"name":"Vivid Viola","hex":"#993c7c"},{"name":"Vivid Violet","hex":"#9f00ff"},{"name":"Vivid Yellow","hex":"#ffe302"},{"name":"Vixen","hex":"#573d37"},{"name":"Vizcaya Palm","hex":"#47644b"},{"name":"Vodka","hex":"#bfc0ee"},{"name":"Void","hex":"#050d25"},{"name":"Voila!","hex":"#af8ba8"},{"name":"Volcanic Ash","hex":"#6f7678"},{"name":"Volcanic Brick","hex":"#72453a"},{"name":"Volcanic Glass","hex":"#615c60"},{"name":"Volcanic Rock","hex":"#6b6965"},{"name":"Volcanic Sand","hex":"#404048"},{"name":"Volcano","hex":"#4e2728"},{"name":"Volt","hex":"#ceff00"},{"name":"Voltage","hex":"#3b4956"},{"name":"Vomit Green","hex":"#89a203"},{"name":"Voodoo","hex":"#443240"},{"name":"Voxatron Purple","hex":"#83769c"},{"name":"Voyager","hex":"#4d5062"},{"name":"Voysey Grey","hex":"#9a937f"},{"name":"Vulcan","hex":"#36383c"},{"name":"Vulcan Burgundy","hex":"#5f3e42"},{"name":"Vulcan Mud","hex":"#897f79"},{"name":"Waaagh! Flesh","hex":"#1f5429"},{"name":"Waddles Pink","hex":"#eeaacc"},{"name":"Wafer","hex":"#d4bbb1"},{"name":"Waffle Cone","hex":"#e2c779"},{"name":"Wafting Grey","hex":"#cdbdba"},{"name":"Wageningen Green","hex":"#34b233"},{"name":"Wagon Wheel","hex":"#c2b79e"},{"name":"Wahoo","hex":"#272d4e"},{"name":"Waikawa Grey","hex":"#5b6e91"},{"name":"Waikiki","hex":"#218ba0"},{"name":"Waiouru","hex":"#4c4e31"},{"name":"Waiting","hex":"#9d9d9d"},{"name":"Wakame Green","hex":"#00656e"},{"name":"Wakatake Green","hex":"#6b9362"},{"name":"Wake Me Up","hex":"#f6d559"},{"name":"Wakefield","hex":"#295468"},{"name":"Walden Pond","hex":"#789bb6"},{"name":"Walk in the Woods","hex":"#3bb08f"},{"name":"Walker Lake","hex":"#3d87bb"},{"name":"Walleye","hex":"#9b5953"},{"name":"Wallflower","hex":"#a0848a"},{"name":"Wallis","hex":"#c6bdbf"},{"name":"Walls of Santorini","hex":"#e9edf1"},{"name":"Walnut","hex":"#773f1a"},{"name":"Walnut Grove","hex":"#5c5644"},{"name":"Walnut Hull","hex":"#5d5242"},{"name":"Walnut Shell","hex":"#aa8344"},{"name":"Walrus","hex":"#999b9b"},{"name":"Wan Blue","hex":"#cbdcdf"},{"name":"Wan White","hex":"#e4e2dc"},{"name":"Wandering River","hex":"#73a4c6"},{"name":"Wandering Road","hex":"#876d5e"},{"name":"Wandering Willow","hex":"#a6a897"},{"name":"War God","hex":"#643530"},{"name":"Warboss Green","hex":"#32cd32"},{"name":"Warlock Purple","hex":"#b50038"},{"name":"Warlord Purple","hex":"#ba0033"},{"name":"Warm and Toasty","hex":"#cbb68f"},{"name":"Warm Apricot","hex":"#ffb865"},{"name":"Warm Ash","hex":"#cfc9c7"},{"name":"Warm Biscuits","hex":"#e3cdac"},{"name":"Warm Black","hex":"#004242"},{"name":"Warm Blue","hex":"#4b57db"},{"name":"Warm Brown","hex":"#964e02"},{"name":"Warm Buttercream","hex":"#e6d5ba"},{"name":"Warm Butterscotch","hex":"#d0b082"},{"name":"Warm Croissant","hex":"#e4ceb5"},{"name":"Warm Fuzzies","hex":"#f6e2ce"},{"name":"Warm Granite","hex":"#a49e97"},{"name":"Warm Grey","hex":"#978a84"},{"name":"Warm Grey Flannel","hex":"#aca49a"},{"name":"Warm Haze","hex":"#736967"},{"name":"Warm Hearth","hex":"#be9677"},{"name":"Warm Leather","hex":"#c89f59"},{"name":"Warm Light","hex":"#fff9d8"},{"name":"Warm Mahogany","hex":"#6d4741"},{"name":"Warm Neutral","hex":"#c1b19d"},{"name":"Warm Nutmeg","hex":"#8f6a50"},{"name":"Warm Olive","hex":"#c7b63c"},{"name":"Warm Pink","hex":"#fb5581"},{"name":"Warm Port","hex":"#513938"},{"name":"Warm Purple","hex":"#952e8f"},{"name":"Warm Sand","hex":"#c5ae91"},{"name":"Warm Spice","hex":"#987744"},{"name":"Warm Taupe","hex":"#af9483"},{"name":"Warm Up","hex":"#9e6654"},{"name":"Warm Wassail","hex":"#a66e68"},{"name":"Warm Waters","hex":"#7ebbc2"},{"name":"Warm Welcome","hex":"#ea9073"},{"name":"Warm Wetlands","hex":"#8d894a"},{"name":"Warm Winter","hex":"#d4ede3"},{"name":"Warm Woolen","hex":"#d0b55a"},{"name":"Warmed Wine","hex":"#5c3839"},{"name":"Warmstone","hex":"#e6d7cc"},{"name":"Warmth","hex":"#9f552d"},{"name":"Warp Drive","hex":"#eaf2f1"},{"name":"Warpfiend Grey","hex":"#6b6a74"},{"name":"Warplock Bronze","hex":"#515131"},{"name":"Warplock Bronze Metal","hex":"#927d7b"},{"name":"Warpstone Glow","hex":"#168340"},{"name":"Warrant","hex":"#b8966e"},{"name":"Warrior","hex":"#7d685b"},{"name":"Wasabi","hex":"#afd77f"},{"name":"Wasabi Nori","hex":"#333300"},{"name":"Wasabi Nuts","hex":"#849137"},{"name":"Wasabi Paste","hex":"#cae277"},{"name":"Wasabi Peanut","hex":"#b4c79c"},{"name":"Wasabi Zing","hex":"#d2cca0"},{"name":"Washed Blue","hex":"#94d1df"},{"name":"Washed Green","hex":"#ccd1c8"},{"name":"Washed Out Green","hex":"#bcf5a6"},{"name":"Washed-Out Crimson","hex":"#ffb3a7"},{"name":"Wasteland","hex":"#9c8855"},{"name":"Wasurenagusa Blue","hex":"#89c3eb"},{"name":"Watchet","hex":"#8fbabc"},{"name":"Water","hex":"#d4f1f9"},{"name":"Water Baby","hex":"#5ab5cb"},{"name":"Water Baptism","hex":"#cfdfdd"},{"name":"Water Blue","hex":"#0e87cc"},{"name":"Water Carrier","hex":"#4999a1"},{"name":"Water Chestnut","hex":"#ede4cf"},{"name":"Water Chi","hex":"#355873"},{"name":"Water Cooler","hex":"#75a7ad"},{"name":"Water Droplet","hex":"#e1e5dc"},{"name":"Water Fern","hex":"#75b790"},{"name":"Water Glitter","hex":"#76afb6"},{"name":"Water Iris","hex":"#e2e3eb"},{"name":"Water Leaf","hex":"#b6ecde"},{"name":"Water Lily","hex":"#dde3d5"},{"name":"Water Mist","hex":"#c7d8e3"},{"name":"Water Music","hex":"#6fb0be"},{"name":"Water Ouzel","hex":"#4f5156"},{"name":"Water Persimmon","hex":"#b56c60"},{"name":"Water Raceway","hex":"#0083c8"},{"name":"Water Reed","hex":"#b0ab80"},{"name":"Water Scrub","hex":"#949381"},{"name":"Water Spirit","hex":"#65a5d5"},{"name":"Water Wash","hex":"#acc7e5"},{"name":"Water Welt","hex":"#3994af"},{"name":"Water Wheel","hex":"#a28566"},{"name":"Water Wonder","hex":"#80d4d0"},{"name":"Watercourse","hex":"#006e4e"},{"name":"Watercress","hex":"#6e9377"},{"name":"Watercress Pesto","hex":"#c7c7a1"},{"name":"Watercress Spice","hex":"#748c69"},{"name":"Waterfall","hex":"#3ab0a2"},{"name":"Waterhen Back","hex":"#2f3f53"},{"name":"Waterline Blue","hex":"#436bad"},{"name":"Waterloo","hex":"#7b7c94"},{"name":"Watermark","hex":"#a2cdd2"},{"name":"Watermelon","hex":"#fd4659"},{"name":"Watermelon Candy","hex":"#fd5b78"},{"name":"Watermelon Milk","hex":"#dfcfca"},{"name":"Watermelon Pink","hex":"#c77690"},{"name":"Watermelon Red","hex":"#bf4147"},{"name":"Watermelon Water","hex":"#f05c85"},{"name":"Waterscape","hex":"#dcece7"},{"name":"Watershed","hex":"#b0cec2"},{"name":"Waterspout","hex":"#a4f4f9"},{"name":"Waterway","hex":"#7eb7bf"},{"name":"Waterwings","hex":"#afebde"},{"name":"Waterworld","hex":"#00718a"},{"name":"Watson Lake","hex":"#74aeba"},{"name":"Wattle","hex":"#d6ca3d"},{"name":"Watusi","hex":"#f2cdbb"},{"name":"Wave","hex":"#a5ced5"},{"name":"Wave Jumper","hex":"#6c919f"},{"name":"Wavecrest","hex":"#d6e1e4"},{"name":"Wavelet","hex":"#7dc4cd"},{"name":"Waves of Grain","hex":"#c7aa7c"},{"name":"Wax","hex":"#2b2b2b"},{"name":"Wax Flower","hex":"#eeb39e"},{"name":"Wax Poetic","hex":"#f1e6cc"},{"name":"Wax Way","hex":"#d3b667"},{"name":"Wax Wing","hex":"#f6ecd6"},{"name":"Wax Yellow","hex":"#ede9ad"},{"name":"Waxy Corn","hex":"#f8b500"},{"name":"Waystone Green","hex":"#00c000"},{"name":"Wayward Willow","hex":"#d9dcd1"},{"name":"Wayward Wind","hex":"#dedfe2"},{"name":"Waywatcher Green","hex":"#99cc04"},{"name":"Waza Bear","hex":"#5e5a59"},{"name":"Wazdakka Red","hex":"#b21b00"},{"name":"We Peep","hex":"#fdd7d8"},{"name":"Weapon Bronze","hex":"#b47b27"},{"name":"Weather Board","hex":"#9f947d"},{"name":"Weathered Bamboo","hex":"#593a27"},{"name":"Weathered Blue","hex":"#7b9093"},{"name":"Weathered Brown","hex":"#59504c"},{"name":"Weathered Coral","hex":"#ead0a9"},{"name":"Weathered Hide","hex":"#d5c6c2"},{"name":"Weathered Leather","hex":"#90614a"},{"name":"Weathered Saddle","hex":"#b5745c"},{"name":"Weathered Sandstone","hex":"#dfc0a6"},{"name":"Weathered Stone","hex":"#c4c4c4"},{"name":"Weathered Wicker","hex":"#97774d"},{"name":"Weathered Wood","hex":"#b19c86"},{"name":"Weaver's Spool","hex":"#bfb18a"},{"name":"Webcap Brown","hex":"#8f684b"},{"name":"Wedded Bliss","hex":"#edeadc"},{"name":"Wedding Cake","hex":"#eee2c9"},{"name":"Wedding Dress","hex":"#fefee7"},{"name":"Wedding Flowers","hex":"#bcb6cb"},{"name":"Wedge of Lime","hex":"#e1eca5"},{"name":"Wedgewood","hex":"#4c6b88"},{"name":"Weekend Gardener","hex":"#9fe4aa"},{"name":"Weeping Willow","hex":"#b3b17b"},{"name":"Weeping Wisteria","hex":"#d7ddec"},{"name":"Wèi Lán Azure","hex":"#5a06ef"},{"name":"Weird Green","hex":"#3ae57f"},{"name":"Weissbier","hex":"#b3833b"},{"name":"Weisswurst White","hex":"#e4f7e7"},{"name":"Welcome Home","hex":"#c09c6a"},{"name":"Weldon Blue","hex":"#7c98ab"},{"name":"Well Read","hex":"#8e3537"},{"name":"Wellington","hex":"#4f6364"},{"name":"Wells Grey","hex":"#b9b5a4"},{"name":"Welsh Onion","hex":"#22bb66"},{"name":"Wenge","hex":"#645452"},{"name":"Wentworth","hex":"#345362"},{"name":"West Coast","hex":"#5c512f"},{"name":"West Side","hex":"#e5823a"},{"name":"Westar","hex":"#d4cfc5"},{"name":"Westcar Papyrus","hex":"#a49d70"},{"name":"Western Red","hex":"#9b6959"},{"name":"Western Reserve","hex":"#8d876d"},{"name":"Western Sunrise","hex":"#daa36f"},{"name":"Wet Adobe","hex":"#a3623b"},{"name":"Wet Aloeswood","hex":"#5a6457"},{"name":"Wet Ash","hex":"#b2beb5"},{"name":"Wet Clay","hex":"#a49690"},{"name":"Wet Concrete","hex":"#353838"},{"name":"Wet Coral","hex":"#d1584c"},{"name":"Wet Crow's Wing","hex":"#000b00"},{"name":"Wet Latex","hex":"#001144"},{"name":"Wet Leaf","hex":"#b9a023"},{"name":"Wet Pottery Clay","hex":"#e0816f"},{"name":"Wet River Rock","hex":"#897870"},{"name":"Wet Sand","hex":"#ae8f60"},{"name":"Wet Sandstone","hex":"#786d5f"},{"name":"Wet Suit","hex":"#50493c"},{"name":"Wet Weather","hex":"#929090"},{"name":"Wetland Stone","hex":"#a49f80"},{"name":"Wewak","hex":"#f1919a"},{"name":"Whale Bone","hex":"#e5e7e5"},{"name":"Whale Shark","hex":"#607c8e"},{"name":"Whale Skin","hex":"#505a92"},{"name":"Whale Watching","hex":"#a5a495"},{"name":"Whale's Mouth","hex":"#c7d3d5"},{"name":"Whale's Tale","hex":"#115a82"},{"name":"Whaling Waters","hex":"#2e7176"},{"name":"Wharf View","hex":"#65737e"},{"name":"What's Left","hex":"#fff4e8"},{"name":"Wheat","hex":"#fbdd7e"},{"name":"Wheat Beer","hex":"#bf923b"},{"name":"Wheat Bread","hex":"#dfbb7e"},{"name":"Wheat Seed","hex":"#e3d1c8"},{"name":"Wheat Sheaf","hex":"#dfd4c4"},{"name":"Wheat Tortilla","hex":"#a49a79"},{"name":"Wheatacre","hex":"#ad935b"},{"name":"Wheaten White","hex":"#fbebbb"},{"name":"Wheatfield","hex":"#dfd7bd"},{"name":"Wheatmeal","hex":"#9e8451"},{"name":"When Blue Met Red","hex":"#584165"},{"name":"Where Buffalo Roam","hex":"#c19851"},{"name":"Whetstone Brown","hex":"#9f6f55"},{"name":"Whimsy","hex":"#ed9987"},{"name":"Whipped Citron","hex":"#f0edd2"},{"name":"Whipped Cream","hex":"#f2f0e7"},{"name":"Whipped Violet","hex":"#a1a8d5"},{"name":"Whippet","hex":"#cec1b5"},{"name":"Whirligig","hex":"#e6cdca"},{"name":"Whirligig Geyser","hex":"#dfd4c0"},{"name":"Whirlpool","hex":"#a5d8cd"},{"name":"Whirlwind","hex":"#e2d5d3"},{"name":"Whiskers","hex":"#f6f1e2"},{"name":"Whiskey","hex":"#d29062"},{"name":"Whiskey Sour","hex":"#d4915d"},{"name":"Whisky","hex":"#c2877b"},{"name":"Whisper","hex":"#efe6e6"},{"name":"Whisper Blue","hex":"#e5e8f2"},{"name":"Whisper Green","hex":"#e0e6d7"},{"name":"Whisper Grey","hex":"#e9e5da"},{"name":"Whisper of Grass","hex":"#cbede5"},{"name":"Whisper of Rose","hex":"#cda2ac"},{"name":"Whisper Pink","hex":"#dacbbe"},{"name":"Whisper Ridge","hex":"#c9c3b5"},{"name":"Whisper White","hex":"#ede6db"},{"name":"Whispered Secret","hex":"#3f4855"},{"name":"Whispering Blue","hex":"#c9dcdc"},{"name":"Whispering Grasslands","hex":"#ac9d64"},{"name":"Whispering Pine","hex":"#c8cab5"},{"name":"Whispering Rain","hex":"#ececda"},{"name":"Whispering Winds","hex":"#b7c3bf"},{"name":"Whistler Rose","hex":"#c49e8f"},{"name":"White","hex":"#ffffff"},{"name":"White Acorn","hex":"#d7a98c"},{"name":"White Alyssum","hex":"#efebe7"},{"name":"White Asparagus","hex":"#eceabe"},{"name":"White Bass","hex":"#e8efec"},{"name":"White Beach","hex":"#fff6d9"},{"name":"White Blaze","hex":"#e3e7e1"},{"name":"White Blossom","hex":"#f4ecdb"},{"name":"White Box","hex":"#bfd0cb"},{"name":"White Cabbage","hex":"#b0b49b"},{"name":"White Castle","hex":"#dbd5d1"},{"name":"White Chalk","hex":"#f6f4f1"},{"name":"White Chocolate","hex":"#f0e3c7"},{"name":"White Coffee","hex":"#e6e0d4"},{"name":"White Convulvulus","hex":"#f4f2f4"},{"name":"White Crest","hex":"#f9f8ef"},{"name":"White Currant","hex":"#f9ebc5"},{"name":"White Desert","hex":"#fdfaf1"},{"name":"White Duck","hex":"#cecaba"},{"name":"White Edgar","hex":"#ededed"},{"name":"White Fence","hex":"#f2e9d3"},{"name":"White Fever","hex":"#fbf4e8"},{"name":"White Flag","hex":"#c8c2c0"},{"name":"White Geranium","hex":"#f1f1e1"},{"name":"White Glaze","hex":"#ddeeee"},{"name":"White Gloss ","hex":"#ffeeee"},{"name":"White Granite","hex":"#c8d1c4"},{"name":"White Grapes","hex":"#bbcc99"},{"name":"White Green","hex":"#d6e9ca"},{"name":"White Heat","hex":"#fdf9ef"},{"name":"White Hot Chocolate","hex":"#ead8bb"},{"name":"White Ice","hex":"#d7eee4"},{"name":"White Jade","hex":"#d4dbb2"},{"name":"White Lake","hex":"#e2e7e7"},{"name":"White Lightning","hex":"#f9f3db"},{"name":"White Lilac","hex":"#e7e5e8"},{"name":"White Lily","hex":"#faf0db"},{"name":"White Linen","hex":"#eee7dd"},{"name":"White Mecca","hex":"#ecf3e1"},{"name":"White Mouse","hex":"#b9a193"},{"name":"White Nectar","hex":"#f8f6d8"},{"name":"White Oak","hex":"#ce9f6f"},{"name":"White Owl","hex":"#f5f3f5"},{"name":"White Pearl","hex":"#ede1d1"},{"name":"White Pepper","hex":"#b6a893"},{"name":"White Picket Fence","hex":"#f0efeb"},{"name":"White Pointer","hex":"#dad6cc"},{"name":"White Porcelain","hex":"#f8fbf8"},{"name":"White Primer","hex":"#c3bdab"},{"name":"White Rabbit","hex":"#f8eee7"},{"name":"White Rock","hex":"#d4cfb4"},{"name":"White Russian","hex":"#f0e0dc"},{"name":"White Sage","hex":"#d2d4c3"},{"name":"White Sand","hex":"#f5ebd8"},{"name":"White Scar","hex":"#8c9fa1"},{"name":"White Shadow","hex":"#d1d3e0"},{"name":"White Smoke","hex":"#f5f5f5"},{"name":"White Spruce","hex":"#9fbdad"},{"name":"White Sulfur","hex":"#f1faea"},{"name":"White Swan","hex":"#e4d7c5"},{"name":"White Tiger","hex":"#c5b8a8"},{"name":"White Truffle","hex":"#efdbcd"},{"name":"White Ultramarine","hex":"#83ccd2"},{"name":"White Vienna","hex":"#c5dcb3"},{"name":"White Whale","hex":"#edeeef"},{"name":"White Zin","hex":"#f8eee3"},{"name":"Whitecap Foam","hex":"#dee3de"},{"name":"Whitecap Grey","hex":"#e0d5c6"},{"name":"Whitest White","hex":"#f8f9f5"},{"name":"Whitewash","hex":"#fefffc"},{"name":"Whitewashed Fence","hex":"#faf2e3"},{"name":"Whitney Oaks","hex":"#b2a188"},{"name":"Who-Dun-It","hex":"#8b7181"},{"name":"Whole Wheat","hex":"#a48b73"},{"name":"Wholemeal Cookie","hex":"#aaa662"},{"name":"Wicked Green","hex":"#9bca47"},{"name":"Wicker Basket","hex":"#847567"},{"name":"Wiener Dog","hex":"#874e3c"},{"name":"Wiggle","hex":"#c9c844"},{"name":"Wild Aster","hex":"#92316f"},{"name":"Wild Axolotl","hex":"#63775a"},{"name":"Wild Beet Leaf","hex":"#6b8372"},{"name":"Wild Berry","hex":"#7e3a3c"},{"name":"Wild Bill Brown","hex":"#795745"},{"name":"Wild Blue Yonder","hex":"#7a89b8"},{"name":"Wild Caribbean Green","hex":"#1cd3a2"},{"name":"Wild Cattail","hex":"#916d5d"},{"name":"Wild Chestnut","hex":"#bc5d58"},{"name":"Wild Clary","hex":"#93a3c1"},{"name":"Wild Dove","hex":"#8b8c89"},{"name":"Wild Forest","hex":"#38914a"},{"name":"Wild Geranium","hex":"#986a79"},{"name":"Wild Ginger","hex":"#7c4c53"},{"name":"Wild Ginseng","hex":"#80805d"},{"name":"Wild Hemp","hex":"#9d7b74"},{"name":"Wild Honey","hex":"#eecc00"},{"name":"Wild Horses","hex":"#8d6747"},{"name":"Wild Iris","hex":"#2f2f4a"},{"name":"Wild Lilac","hex":"#beb8cd"},{"name":"Wild Lime","hex":"#c3d363"},{"name":"Wild Maple","hex":"#ffe2c7"},{"name":"Wild Mustang","hex":"#695649"},{"name":"Wild Nude","hex":"#beae8a"},{"name":"Wild Orchid","hex":"#d979a2"},{"name":"Wild Orchid Blue","hex":"#b4b6da"},{"name":"Wild Party","hex":"#b97a77"},{"name":"Wild Phlox","hex":"#9ea5c3"},{"name":"Wild Pigeon","hex":"#767c6b"},{"name":"Wild Plum","hex":"#83455d"},{"name":"Wild Rice","hex":"#d5bfb4"},{"name":"Wild Rider Red","hex":"#dc143c"},{"name":"Wild Rose","hex":"#ce8498"},{"name":"Wild Sand","hex":"#e7e4de"},{"name":"Wild Seaweed","hex":"#8a6f45"},{"name":"Wild Strawberry","hex":"#ff3399"},{"name":"Wild Thyme","hex":"#7e9c6f"},{"name":"Wild Truffle","hex":"#463f3c"},{"name":"Wild Watermelon","hex":"#fc6d84"},{"name":"Wild West","hex":"#7e5c52"},{"name":"Wild Wheat","hex":"#e0e1d1"},{"name":"Wild Wilderness","hex":"#91857c"},{"name":"Wild Willow","hex":"#beca60"},{"name":"Wild Wisteria","hex":"#686b93"},{"name":"Wildcat Grey","hex":"#f5eec0"},{"name":"Wilderness","hex":"#8f886c"},{"name":"Wildflower Honey","hex":"#c69c5d"},{"name":"Will","hex":"#179fa6"},{"name":"William","hex":"#53736f"},{"name":"Willow","hex":"#9a8b4f"},{"name":"Willow Blue","hex":"#293648"},{"name":"Willow Bough","hex":"#59754d"},{"name":"Willow Brook","hex":"#dfe6cf"},{"name":"Willow Dyed","hex":"#93b881"},{"name":"Willow Grey","hex":"#817b69"},{"name":"Willow Grove","hex":"#69755c"},{"name":"Willow Leaf","hex":"#a1a46d"},{"name":"Willow Sooty Bamboo","hex":"#5b6356"},{"name":"Willow Springs","hex":"#e7e6e0"},{"name":"Willow Tree","hex":"#9e8f66"},{"name":"Willow Tree Mouse","hex":"#c8d5bb"},{"name":"Willowherb","hex":"#8e4483"},{"name":"Willowside","hex":"#f3f2e8"},{"name":"Willpower Orange","hex":"#fd5800"},{"name":"Wilted Brown","hex":"#ab4c3d"},{"name":"Wimbledon","hex":"#626d5b"},{"name":"Wind Cave","hex":"#686c7b"},{"name":"Wind Chill","hex":"#eff3f0"},{"name":"Wind Chimes","hex":"#cac5c2"},{"name":"Wind Rose","hex":"#e8babd"},{"name":"Wind Weaver","hex":"#c5d1d8"},{"name":"Windfall","hex":"#84a7ce"},{"name":"Windflower","hex":"#bc9ca2"},{"name":"Windham Cream","hex":"#f5e6c9"},{"name":"Winding Path","hex":"#c6bba2"},{"name":"Windjammer","hex":"#62a5df"},{"name":"Windmill","hex":"#f5ece7"},{"name":"Windmill Park","hex":"#a79b83"},{"name":"Window Box","hex":"#bcafbb"},{"name":"Window Pane","hex":"#e4ecdf"},{"name":"Windows 95 Desktop","hex":"#018281"},{"name":"Windows Blue","hex":"#3778bf"},{"name":"Windrock","hex":"#5e6c62"},{"name":"Windsor","hex":"#462c77"},{"name":"Windsor Brown","hex":"#a75502"},{"name":"Windsor Haze","hex":"#a697a7"},{"name":"Windsor Purple","hex":"#c9afd0"},{"name":"Windsor Toffee","hex":"#ccb490"},{"name":"Windsor Way","hex":"#9fc9e4"},{"name":"Windsor Wine","hex":"#582b36"},{"name":"Windstorm","hex":"#6d98c4"},{"name":"Windsurfer","hex":"#d7e2de"},{"name":"Windswept","hex":"#d1f1f5"},{"name":"Windswept Beach","hex":"#e3e4e5"},{"name":"Windy City","hex":"#88a3c2"},{"name":"Windy Day","hex":"#8cb0cb"},{"name":"Windy Meadow","hex":"#b0a676"},{"name":"Windy Sky","hex":"#e8ebe7"},{"name":"Wine","hex":"#80013f"},{"name":"Wine Bottle","hex":"#d3d6c4"},{"name":"Wine Bottle Green","hex":"#254636"},{"name":"Wine Brown","hex":"#5f3e3e"},{"name":"Wine Cellar","hex":"#70403d"},{"name":"Wine Cork","hex":"#866d4c"},{"name":"Wine Crush","hex":"#96837d"},{"name":"Wine Dregs","hex":"#673145"},{"name":"Wine Frost","hex":"#e5d8e1"},{"name":"Wine Goblet","hex":"#643b46"},{"name":"Wine Grape","hex":"#941751"},{"name":"Wine Red","hex":"#7b0323"},{"name":"Wine Stain","hex":"#69444f"},{"name":"Wine Stroll","hex":"#8f7191"},{"name":"Wine Tasting","hex":"#492a34"},{"name":"Wine Tour","hex":"#653b66"},{"name":"Wineshade","hex":"#433748"},{"name":"Wing Commander","hex":"#0065ac"},{"name":"Wing Man","hex":"#5a6868"},{"name":"Wink","hex":"#7792af"},{"name":"Wink Pink","hex":"#ede3e7"},{"name":"Winner's Circle","hex":"#365771"},{"name":"Winning Ticket","hex":"#636653"},{"name":"Winsome Orchid","hex":"#d4b9cb"},{"name":"Winsome Rose","hex":"#c28ba1"},{"name":"Winter Bloom","hex":"#47243b"},{"name":"Winter Breath","hex":"#deeced"},{"name":"Winter Chill","hex":"#8eced8"},{"name":"Winter Chime","hex":"#83c7df"},{"name":"Winter Dusk","hex":"#b8b8cb"},{"name":"Winter Duvet","hex":"#ffffe0"},{"name":"Winter Escape","hex":"#b4e5ec"},{"name":"Winter Frost","hex":"#e4decd"},{"name":"Winter Haven","hex":"#e1e6eb"},{"name":"Winter Hazel","hex":"#d0c383"},{"name":"Winter Lite","hex":"#efe0c9"},{"name":"Winter Meadow","hex":"#b7fffa"},{"name":"Winter Mist","hex":"#e7fbec"},{"name":"Winter Morn","hex":"#d9d9d6"},{"name":"Winter Morning Mist","hex":"#a7b3b5"},{"name":"Winter Moss","hex":"#5b5a41"},{"name":"Winter Nap","hex":"#a99f97"},{"name":"Winter Oasis","hex":"#f2faed"},{"name":"Winter Orchid","hex":"#e7e3e7"},{"name":"Winter Palace","hex":"#41638a"},{"name":"Winter Park","hex":"#95928d"},{"name":"Winter Peach","hex":"#ebd9d0"},{"name":"Winter Pear","hex":"#b0b487"},{"name":"Winter Sea","hex":"#303e55"},{"name":"Winter Shamrock","hex":"#e3efdd"},{"name":"Winter Sky","hex":"#a9c0cb"},{"name":"Winter Solstice","hex":"#49545c"},{"name":"Winter Squash","hex":"#acb99f"},{"name":"Winter Storm","hex":"#4b7079"},{"name":"Winter Sunset","hex":"#ca6636"},{"name":"Winter Twig","hex":"#948a7a"},{"name":"Winter Waves","hex":"#21424d"},{"name":"Winter Wedding","hex":"#f1e4dc"},{"name":"Winter Wheat","hex":"#dfc09f"},{"name":"Winter White","hex":"#f5ecd2"},{"name":"Winter Willow Green","hex":"#c1d8ac"},{"name":"Winter Wizard","hex":"#a0e6ff"},{"name":"Winter's Breath","hex":"#d4dddd"},{"name":"Winter's Day","hex":"#def7fe"},{"name":"Wintergreen","hex":"#20f986"},{"name":"Wintergreen Dream","hex":"#56887d"},{"name":"Wintergreen Mint","hex":"#c6e5ca"},{"name":"Wintergreen Shadow","hex":"#4f9e81"},{"name":"Wintermint","hex":"#94d2bf"},{"name":"Wintessa","hex":"#8ba494"},{"name":"Wiped Out","hex":"#8b7180"},{"name":"Wire Wool","hex":"#676662"},{"name":"Wise Owl","hex":"#cdbba5"},{"name":"Wish","hex":"#b6bcdf"},{"name":"Wishard","hex":"#53786a"},{"name":"Wishful White","hex":"#f4f1e8"},{"name":"Wishing Star","hex":"#604f5a"},{"name":"Wishing Well","hex":"#d0d1c1"},{"name":"Wisley Pink","hex":"#f2a599"},{"name":"Wisp","hex":"#a9badd"},{"name":"Wisp of Smoke","hex":"#e5e7e9"},{"name":"Wisp Pink","hex":"#f9e8e2"},{"name":"Wispy Mauve","hex":"#c6aeaa"},{"name":"Wisteria","hex":"#a87dc2"},{"name":"Wisteria Blue","hex":"#84a2d4"},{"name":"Wisteria Fragrance","hex":"#bbbcde"},{"name":"Wisteria Powder","hex":"#e6c8ff"},{"name":"Wisteria Purple","hex":"#875f9a"},{"name":"Wisteria Trellis","hex":"#b2adbf"},{"name":"Wisteria Yellow","hex":"#f7c114"},{"name":"Wisteria-Wise","hex":"#b2a7cc"},{"name":"Wistful","hex":"#a29ecd"},{"name":"Wistful Beige","hex":"#eaddd7"},{"name":"Wistful Mauve","hex":"#946c74"},{"name":"Witch Haze","hex":"#fbf073"},{"name":"Witch Soup","hex":"#692746"},{"name":"Witch Wood","hex":"#7c4a33"},{"name":"Witchcraft","hex":"#474c50"},{"name":"Witches Cauldron","hex":"#35343f"},{"name":"With A Twist","hex":"#d1d1bb"},{"name":"With the Grain","hex":"#bca380"},{"name":"Withered Rose","hex":"#a26666"},{"name":"Witness","hex":"#90c0c9"},{"name":"Wizard","hex":"#4d5b88"},{"name":"Wizard Blue","hex":"#0073cf"},{"name":"Wizard Grey","hex":"#525e68"},{"name":"Wizard Time","hex":"#6d4660"},{"name":"Wizard White","hex":"#dff1fd"},{"name":"Wizard's Brew","hex":"#a090b8"},{"name":"Wizard's Spell","hex":"#584b4e"},{"name":"Woad Blue","hex":"#597fb9"},{"name":"Woad Purple","hex":"#584769"},{"name":"Wobbegong Brown","hex":"#c19a6b"},{"name":"Wolf Lichen","hex":"#a8ff04"},{"name":"Wolf's Bane","hex":"#3d343f"},{"name":"Wolf's Fur","hex":"#5c5451"},{"name":"Wolfram","hex":"#7d8574"},{"name":"Wolverine","hex":"#91989d"},{"name":"Wonder Lust","hex":"#ef8e9f"},{"name":"Wonder Wine","hex":"#635d63"},{"name":"Wonder Wish","hex":"#a97898"},{"name":"Wood Ash","hex":"#d7cab0"},{"name":"Wood Bark","hex":"#302621"},{"name":"Wood Brown","hex":"#554545"},{"name":"Wood Charcoal","hex":"#464646"},{"name":"Wood Chi","hex":"#90835e"},{"name":"Wood Garlic","hex":"#7a7229"},{"name":"Wood Lake","hex":"#a08475"},{"name":"Wood Pigeon","hex":"#aabbcc"},{"name":"Wood Stain Brown","hex":"#796a4e"},{"name":"Wood Thrush","hex":"#a47d43"},{"name":"Wood Violet","hex":"#75406a"},{"name":"Wood's Creek","hex":"#61633f"},{"name":"Woodbine","hex":"#7b7f32"},{"name":"Woodbridge","hex":"#847451"},{"name":"Woodbridge Trail","hex":"#b3987d"},{"name":"Woodburn","hex":"#463629"},{"name":"Woodchuck","hex":"#8e746c"},{"name":"Wooded Acre","hex":"#b59b7e"},{"name":"Wooden Peg","hex":"#a89983"},{"name":"Woodgrain","hex":"#996633"},{"name":"Woodland","hex":"#626746"},{"name":"Woodland Brown","hex":"#5f4737"},{"name":"Woodland Grass","hex":"#004400"},{"name":"Woodland Nymph","hex":"#69804b"},{"name":"Woodland Walk","hex":"#8b8d63"},{"name":"Woodlawn Green","hex":"#405b50"},{"name":"Woodrose","hex":"#ae8c8e"},{"name":"Woodrush","hex":"#45402b"},{"name":"Woodsmoke","hex":"#2b3230"},{"name":"Woodward Park","hex":"#755f4a"},{"name":"Wooed","hex":"#40446c"},{"name":"Woohringa","hex":"#5f655a"},{"name":"Wool Tweed","hex":"#917747"},{"name":"Woolen Mittens","hex":"#b59f55"},{"name":"Woolen Vest","hex":"#b0a582"},{"name":"Woolly Beige","hex":"#e7d5c9"},{"name":"Woolly Mammoth","hex":"#bb9c7c"},{"name":"Wooster Smoke","hex":"#a5a192"},{"name":"Workout Routine","hex":"#ffd789"},{"name":"World Peace","hex":"#005477"},{"name":"Worn Denim","hex":"#4282c6"},{"name":"Worn Olive","hex":"#6f6c0a"},{"name":"Worn Wooden","hex":"#634333"},{"name":"Woven Basket","hex":"#8e7b58"},{"name":"Woven Gold","hex":"#dcb639"},{"name":"Woven Navajo","hex":"#cead8e"},{"name":"Woven Reed","hex":"#dddcbf"},{"name":"Wrack White","hex":"#ecead0"},{"name":"Wreath","hex":"#76856a"},{"name":"Wren","hex":"#4a4139"},{"name":"Wrought Iron","hex":"#999e98"},{"name":"Wrought Iron Gate","hex":"#474749"},{"name":"Wulfenite","hex":"#ce7639"},{"name":"Wyvern Green","hex":"#86a96f"},{"name":"Xâkestari White","hex":"#fef2dc"},{"name":"Xanadu","hex":"#738678"},{"name":"Xanthous","hex":"#f1b42f"},{"name":"Xavier Blue","hex":"#6ab4e0"},{"name":"Xena","hex":"#847e54"},{"name":"Xenon Blue","hex":"#b7c0d7"},{"name":"Xereus Purple","hex":"#7d0061"},{"name":"Xiān Hóng Red","hex":"#e60626"},{"name":"Xiàng Yá Bái Ivory","hex":"#ece6d1"},{"name":"Xìng Huáng Yellow","hex":"#fce166"},{"name":"Xmas Candy","hex":"#990020"},{"name":"Xoxo","hex":"#f08497"},{"name":"XV-88","hex":"#72491e"},{"name":"Y7K Blue","hex":"#1560fb"},{"name":"Yacht Club","hex":"#566062"},{"name":"Yahoo","hex":"#fabba9"},{"name":"Yale Blue","hex":"#0f4d92"},{"name":"Yam","hex":"#d0893f"},{"name":"Yamabuki Gold","hex":"#ffa400"},{"name":"Yamabukicha Gold","hex":"#cb7e1f"},{"name":"Yān Hūi Smoke","hex":"#a8c3bc"},{"name":"Yanagicha","hex":"#9c8a4d"},{"name":"Yanagizome Green","hex":"#8c9e5e"},{"name":"Yáng Chéng Orange","hex":"#f1a141"},{"name":"Yang Mist","hex":"#ede8dd"},{"name":"Yankee Doodle","hex":"#4d5a6b"},{"name":"Yankees Blue","hex":"#1c2841"},{"name":"Yardbird","hex":"#9e826a"},{"name":"Yarrow","hex":"#d8ad39"},{"name":"Yawl","hex":"#547497"},{"name":"Yearning","hex":"#061088"},{"name":"Yellow","hex":"#ffff00"},{"name":"Yellow Acorn","hex":"#b68d4c"},{"name":"Yellow Brick Road","hex":"#eac853"},{"name":"Yellow Brown","hex":"#ae8b0c"},{"name":"Yellow Canary","hex":"#ffeaac"},{"name":"Yellow Cattleya","hex":"#fff44f"},{"name":"Yellow Chalk","hex":"#f5f9ad"},{"name":"Yellow Coneflower","hex":"#edb856"},{"name":"Yellow Cream","hex":"#efdc75"},{"name":"Yellow Currant","hex":"#f7c66b"},{"name":"Yellow Diamond","hex":"#f6f1d7"},{"name":"Yellow Dragon","hex":"#f8e47e"},{"name":"Yellow Endive","hex":"#d2cc81"},{"name":"Yellow Geranium","hex":"#ffe1a0"},{"name":"Yellow Green","hex":"#c8fd3d"},{"name":"Yellow Green Shade","hex":"#c5e384"},{"name":"Yellow Iris","hex":"#eee78e"},{"name":"Yellow Jacket","hex":"#ffcc3a"},{"name":"Yellow Jasper","hex":"#daa436"},{"name":"Yellow Maize","hex":"#c0a85a"},{"name":"Yellow Mandarin","hex":"#d28034"},{"name":"Yellow Mask","hex":"#f6d255"},{"name":"Yellow Metal","hex":"#73633e"},{"name":"Yellow Nile","hex":"#95804a"},{"name":"Yellow Ocher","hex":"#c39143"},{"name":"Yellow Ochre","hex":"#cb9d06"},{"name":"Yellow Orange","hex":"#fcb001"},{"name":"Yellow Pear","hex":"#ece99b"},{"name":"Yellow Powder","hex":"#fcfd74"},{"name":"Yellow Rose","hex":"#fff000"},{"name":"Yellow Salmonberry","hex":"#fff47c"},{"name":"Yellow Sand","hex":"#a28744"},{"name":"Yellow Sea","hex":"#f49f35"},{"name":"Yellow Submarine","hex":"#ffff14"},{"name":"Yellow Summer","hex":"#f9b500"},{"name":"Yellow Sunshine","hex":"#fff601"},{"name":"Yellow Tan","hex":"#ffe36e"},{"name":"Yellow Tang","hex":"#ffd300"},{"name":"Yellow Urn Orchid","hex":"#fffdd0"},{"name":"Yellow Varnish","hex":"#eab565"},{"name":"Yellow Warbler","hex":"#ffba6f"},{"name":"Yellow Yarn","hex":"#fef6be"},{"name":"Yellow-Green Grosbeak","hex":"#c8cd37"},{"name":"Yellow-Rumped Warbler","hex":"#eebb77"},{"name":"Yellowed Bone","hex":"#f6f1c4"},{"name":"Yellowish","hex":"#faee66"},{"name":"Yellowish Brown","hex":"#9b7a01"},{"name":"Yellowish Green","hex":"#b0dd16"},{"name":"Yellowish Orange","hex":"#ffab0f"},{"name":"Yellowish Tan","hex":"#fcfc81"},{"name":"Yellowstone","hex":"#ceb736"},{"name":"Yellowstone Park","hex":"#e4d6ba"},{"name":"Yellowy Green","hex":"#bff128"},{"name":"Yeti Footprint","hex":"#c7d7e0"},{"name":"Yín Bái Silver","hex":"#e0e1e2"},{"name":"Yin Hūi Silver","hex":"#848999"},{"name":"Yin Mist","hex":"#3b3c3c"},{"name":"Yín Sè Silver","hex":"#b1c4cb"},{"name":"Yíng Guāng Sè Green","hex":"#05ffa6"},{"name":"Yíng Guāng Sè Pink","hex":"#ff69af"},{"name":"Yíng Guāng Sè Purple","hex":"#632de9"},{"name":"YInMn Blue","hex":"#2e5090"},{"name":"Yolande","hex":"#d5a585"},{"name":"Yolk Yellow","hex":"#e2b051"},{"name":"York Pink","hex":"#d7837f"},{"name":"York Plum","hex":"#d3bfe5"},{"name":"York River Green","hex":"#67706d"},{"name":"Yoshi's Green","hex":"#55aa00"},{"name":"You're Blushing","hex":"#e2caaf"},{"name":"Young Apricot","hex":"#fcd8b5"},{"name":"Young At Heart","hex":"#d5a1a9"},{"name":"Young Bamboo","hex":"#68be8d"},{"name":"Young Bud","hex":"#86af38"},{"name":"Young Colt","hex":"#938c83"},{"name":"Young Cornflower","hex":"#bbffff"},{"name":"Young Crab","hex":"#f6a09d"},{"name":"Young Fawn","hex":"#c3b4b3"},{"name":"Young Fern","hex":"#71bc78"},{"name":"Young Gecko","hex":"#aac0ad"},{"name":"Young Grass","hex":"#c3d825"},{"name":"Young Green Onion","hex":"#aacf53"},{"name":"Young Greens","hex":"#d8e698"},{"name":"Young Leaf","hex":"#b0c86f"},{"name":"Young Leaves","hex":"#b9d08b"},{"name":"Young Mahogany","hex":"#ca3435"},{"name":"Young Night","hex":"#232323"},{"name":"Young Peach","hex":"#f2e1d2"},{"name":"Young Prince","hex":"#b28ebc"},{"name":"Young Purple","hex":"#bc64a4"},{"name":"Young Redwood","hex":"#ab4e52"},{"name":"Young Salmon","hex":"#ffb6b4"},{"name":"Young Tangerine","hex":"#ffa474"},{"name":"Young Turk","hex":"#c9afa9"},{"name":"Young Wheat","hex":"#e1e3a9"},{"name":"Your Majesty","hex":"#61496e"},{"name":"Your Pink","hex":"#ffc5bb"},{"name":"Your Shadow","hex":"#787e93"},{"name":"Youth","hex":"#e2c9c8"},{"name":"Yreka!","hex":"#a7b3b7"},{"name":"Yriel Yellow","hex":"#ffdb58"},{"name":"Yù Shí Bái White","hex":"#c0e2e1"},{"name":"Yucatan","hex":"#e9af78"},{"name":"Yucca","hex":"#75978f"},{"name":"Yucca Cream","hex":"#a1d7c9"},{"name":"Yuè Guāng Lán Blue","hex":"#2138ab"},{"name":"Yuè Guāng Lán Moonlight","hex":"#5959ab"},{"name":"Yukon Gold","hex":"#826a21"},{"name":"Yule Tree","hex":"#66b032"},{"name":"Yuma","hex":"#c7b882"},{"name":"Yuma Gold","hex":"#ffd678"},{"name":"Yuzu Jam","hex":"#fdd200"},{"name":"Yuzu Soy","hex":"#112200"},{"name":"Zaffre","hex":"#0014a8"},{"name":"Zahri Pink","hex":"#ec6d71"},{"name":"Zambezi","hex":"#6b5a5a"},{"name":"Zamesi Desert","hex":"#dda026"},{"name":"Zanah","hex":"#b2c6b1"},{"name":"Zanci","hex":"#d38977"},{"name":"Zandri Dust","hex":"#a39a61"},{"name":"Zangief's Chest","hex":"#823c3d"},{"name":"Zǎo Hóng Maroon","hex":"#c1264c"},{"name":"Zard Yellow","hex":"#fde634"},{"name":"Zatar Leaf","hex":"#60a448"},{"name":"Zebra Finch","hex":"#cec6bb"},{"name":"Zebra Grass","hex":"#9da286"},{"name":"Zeftron","hex":"#0090ad"},{"name":"Zelyony Green","hex":"#016612"},{"name":"Zen","hex":"#cfd9de"},{"name":"Zen Blue","hex":"#9fa9be"},{"name":"Zen Essence","hex":"#c6bfa7"},{"name":"Zen Garden","hex":"#d1dac0"},{"name":"Zenith Heights","hex":"#a6c8c7"},{"name":"Zephyr","hex":"#c89fa5"},{"name":"Zephyr Blue","hex":"#d3d9d1"},{"name":"Zephyr Green","hex":"#7cb083"},{"name":"Zest","hex":"#c6723b"},{"name":"Zeus","hex":"#3b3c38"},{"name":"Zeus Palace","hex":"#3c343d"},{"name":"Zeus Purple","hex":"#660077"},{"name":"Zeus'Temple","hex":"#6c94cd"},{"name":"Zhēn Zhū Bái Pearl","hex":"#f8f8f9"},{"name":"Zhohltyi Yellow","hex":"#e4c500"},{"name":"Zhū Hóng Vermillion","hex":"#cb464a"},{"name":"Zǐ Lúo Lán Sè Violet","hex":"#9f0fef"},{"name":"Zǐ Sè Purple","hex":"#c94cbe"},{"name":"Ziggurat","hex":"#81a6aa"},{"name":"Zimidar","hex":"#6a5287"},{"name":"Zin Cluster","hex":"#463b3a"},{"name":"Zinc","hex":"#92898a"},{"name":"Zinc Blend","hex":"#a3907e"},{"name":"Zinc Dust","hex":"#5b5c5a"},{"name":"Zinfandel","hex":"#5c2935"},{"name":"Zing","hex":"#fbc17b"},{"name":"Zingiber","hex":"#dac01a"},{"name":"Zinnia","hex":"#ffa010"},{"name":"Zinnwaldite","hex":"#ebc2af"},{"name":"Zinnwaldite Brown","hex":"#2c1608"},{"name":"Zircon","hex":"#dee3e3"},{"name":"Zodiac Constellation","hex":"#ee8844"},{"name":"Zombie","hex":"#595a5c"},{"name":"Zomp","hex":"#39a78e"},{"name":"Zōng Hóng Red","hex":"#ca6641"},{"name":"Zoom","hex":"#7b6c74"},{"name":"Zorba","hex":"#a29589"},{"name":"Zucchini","hex":"#17462e"},{"name":"Zucchini Cream","hex":"#97a98b"},{"name":"Zucchini Flower","hex":"#e8a64e"},{"name":"Zumthor","hex":"#cdd5d5"},{"name":"Zuni","hex":"#008996"},{"name":"Zürich Blue","hex":"#8080ff"}] \ No newline at end of file diff --git a/.venv/lib/python3.11/site-packages/colorful/data/rgb.txt b/.venv/lib/python3.11/site-packages/colorful/data/rgb.txt new file mode 100644 index 0000000000000000000000000000000000000000..b9e56c60236bcb02a5e1aac9f7fa2c98f408e977 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/colorful/data/rgb.txt @@ -0,0 +1,754 @@ +! $Xorg: rgb.txt,v 1.3 2000/08/17 19:54:00 cpqbld Exp $ +255 250 250 snow +248 248 255 ghost white +248 248 255 GhostWhite +245 245 245 white smoke +245 245 245 WhiteSmoke +220 220 220 gainsboro +255 250 240 floral white +255 250 240 FloralWhite +253 245 230 old lace +253 245 230 OldLace +250 240 230 linen +250 235 215 antique white +250 235 215 AntiqueWhite +255 239 213 papaya whip +255 239 213 PapayaWhip +255 235 205 blanched almond +255 235 205 BlanchedAlmond +255 228 196 bisque +255 218 185 peach puff +255 218 185 PeachPuff +255 222 173 navajo white +255 222 173 NavajoWhite +255 228 181 moccasin +255 248 220 cornsilk +255 255 240 ivory +255 250 205 lemon chiffon +255 250 205 LemonChiffon +255 245 238 seashell +240 255 240 honeydew +245 255 250 mint cream +245 255 250 MintCream +240 255 255 azure +240 248 255 alice blue +240 248 255 AliceBlue +230 230 250 lavender +255 240 245 lavender blush +255 240 245 LavenderBlush +255 228 225 misty rose +255 228 225 MistyRose +255 255 255 white + 0 0 0 black + 47 79 79 dark slate gray + 47 79 79 DarkSlateGray + 47 79 79 dark slate grey + 47 79 79 DarkSlateGrey +105 105 105 dim gray +105 105 105 DimGray +105 105 105 dim grey +105 105 105 DimGrey +112 128 144 slate gray +112 128 144 SlateGray +112 128 144 slate grey +112 128 144 SlateGrey +119 136 153 light slate gray +119 136 153 LightSlateGray +119 136 153 light slate grey +119 136 153 LightSlateGrey +190 190 190 gray +190 190 190 grey +211 211 211 light grey +211 211 211 LightGrey +211 211 211 light gray +211 211 211 LightGray + 25 25 112 midnight blue + 25 25 112 MidnightBlue + 0 0 128 navy + 0 0 128 navy blue + 0 0 128 NavyBlue +100 149 237 cornflower blue +100 149 237 CornflowerBlue + 72 61 139 dark slate blue + 72 61 139 DarkSlateBlue +106 90 205 slate blue +106 90 205 SlateBlue +123 104 238 medium slate blue +123 104 238 MediumSlateBlue +132 112 255 light slate blue +132 112 255 LightSlateBlue + 0 0 205 medium blue + 0 0 205 MediumBlue + 65 105 225 royal blue + 65 105 225 RoyalBlue + 0 0 255 blue + 30 144 255 dodger blue + 30 144 255 DodgerBlue + 0 191 255 deep sky blue + 0 191 255 DeepSkyBlue +135 206 235 sky blue +135 206 235 SkyBlue +135 206 250 light sky blue +135 206 250 LightSkyBlue + 70 130 180 steel blue + 70 130 180 SteelBlue +176 196 222 light steel blue +176 196 222 LightSteelBlue +173 216 230 light blue +173 216 230 LightBlue +176 224 230 powder blue +176 224 230 PowderBlue +175 238 238 pale turquoise +175 238 238 PaleTurquoise + 0 206 209 dark turquoise + 0 206 209 DarkTurquoise + 72 209 204 medium turquoise + 72 209 204 MediumTurquoise + 64 224 208 turquoise + 0 255 255 cyan +224 255 255 light cyan +224 255 255 LightCyan + 95 158 160 cadet blue + 95 158 160 CadetBlue +102 205 170 medium aquamarine +102 205 170 MediumAquamarine +127 255 212 aquamarine + 0 100 0 dark green + 0 100 0 DarkGreen + 85 107 47 dark olive green + 85 107 47 DarkOliveGreen +143 188 143 dark sea green +143 188 143 DarkSeaGreen + 46 139 87 sea green + 46 139 87 SeaGreen + 60 179 113 medium sea green + 60 179 113 MediumSeaGreen + 32 178 170 light sea green + 32 178 170 LightSeaGreen +152 251 152 pale green +152 251 152 PaleGreen + 0 255 127 spring green + 0 255 127 SpringGreen +124 252 0 lawn green +124 252 0 LawnGreen + 0 255 0 green +127 255 0 chartreuse + 0 250 154 medium spring green + 0 250 154 MediumSpringGreen +173 255 47 green yellow +173 255 47 GreenYellow + 50 205 50 lime green + 50 205 50 LimeGreen +154 205 50 yellow green +154 205 50 YellowGreen + 34 139 34 forest green + 34 139 34 ForestGreen +107 142 35 olive drab +107 142 35 OliveDrab +189 183 107 dark khaki +189 183 107 DarkKhaki +240 230 140 khaki +238 232 170 pale goldenrod +238 232 170 PaleGoldenrod +250 250 210 light goldenrod yellow +250 250 210 LightGoldenrodYellow +255 255 224 light yellow +255 255 224 LightYellow +255 255 0 yellow +255 215 0 gold +238 221 130 light goldenrod +238 221 130 LightGoldenrod +218 165 32 goldenrod +184 134 11 dark goldenrod +184 134 11 DarkGoldenrod +188 143 143 rosy brown +188 143 143 RosyBrown +205 92 92 indian red +205 92 92 IndianRed +139 69 19 saddle brown +139 69 19 SaddleBrown +160 82 45 sienna +205 133 63 peru +222 184 135 burlywood +245 245 220 beige +245 222 179 wheat +244 164 96 sandy brown +244 164 96 SandyBrown +210 180 140 tan +210 105 30 chocolate +178 34 34 firebrick +165 42 42 brown +233 150 122 dark salmon +233 150 122 DarkSalmon +250 128 114 salmon +255 160 122 light salmon +255 160 122 LightSalmon +255 165 0 orange +255 140 0 dark orange +255 140 0 DarkOrange +255 127 80 coral +240 128 128 light coral +240 128 128 LightCoral +255 99 71 tomato +255 69 0 orange red +255 69 0 OrangeRed +255 0 0 red +255 105 180 hot pink +255 105 180 HotPink +255 20 147 deep pink +255 20 147 DeepPink +255 192 203 pink +255 182 193 light pink +255 182 193 LightPink +219 112 147 pale violet red +219 112 147 PaleVioletRed +176 48 96 maroon +199 21 133 medium violet red +199 21 133 MediumVioletRed +208 32 144 violet red +208 32 144 VioletRed +255 0 255 magenta +238 130 238 violet +221 160 221 plum +218 112 214 orchid +186 85 211 medium orchid +186 85 211 MediumOrchid +153 50 204 dark orchid +153 50 204 DarkOrchid +148 0 211 dark violet +148 0 211 DarkViolet +138 43 226 blue violet +138 43 226 BlueViolet +160 32 240 purple +147 112 219 medium purple +147 112 219 MediumPurple +216 191 216 thistle +255 250 250 snow1 +238 233 233 snow2 +205 201 201 snow3 +139 137 137 snow4 +255 245 238 seashell1 +238 229 222 seashell2 +205 197 191 seashell3 +139 134 130 seashell4 +255 239 219 AntiqueWhite1 +238 223 204 AntiqueWhite2 +205 192 176 AntiqueWhite3 +139 131 120 AntiqueWhite4 +255 228 196 bisque1 +238 213 183 bisque2 +205 183 158 bisque3 +139 125 107 bisque4 +255 218 185 PeachPuff1 +238 203 173 PeachPuff2 +205 175 149 PeachPuff3 +139 119 101 PeachPuff4 +255 222 173 NavajoWhite1 +238 207 161 NavajoWhite2 +205 179 139 NavajoWhite3 +139 121 94 NavajoWhite4 +255 250 205 LemonChiffon1 +238 233 191 LemonChiffon2 +205 201 165 LemonChiffon3 +139 137 112 LemonChiffon4 +255 248 220 cornsilk1 +238 232 205 cornsilk2 +205 200 177 cornsilk3 +139 136 120 cornsilk4 +255 255 240 ivory1 +238 238 224 ivory2 +205 205 193 ivory3 +139 139 131 ivory4 +240 255 240 honeydew1 +224 238 224 honeydew2 +193 205 193 honeydew3 +131 139 131 honeydew4 +255 240 245 LavenderBlush1 +238 224 229 LavenderBlush2 +205 193 197 LavenderBlush3 +139 131 134 LavenderBlush4 +255 228 225 MistyRose1 +238 213 210 MistyRose2 +205 183 181 MistyRose3 +139 125 123 MistyRose4 +240 255 255 azure1 +224 238 238 azure2 +193 205 205 azure3 +131 139 139 azure4 +131 111 255 SlateBlue1 +122 103 238 SlateBlue2 +105 89 205 SlateBlue3 + 71 60 139 SlateBlue4 + 72 118 255 RoyalBlue1 + 67 110 238 RoyalBlue2 + 58 95 205 RoyalBlue3 + 39 64 139 RoyalBlue4 + 0 0 255 blue1 + 0 0 238 blue2 + 0 0 205 blue3 + 0 0 139 blue4 + 30 144 255 DodgerBlue1 + 28 134 238 DodgerBlue2 + 24 116 205 DodgerBlue3 + 16 78 139 DodgerBlue4 + 99 184 255 SteelBlue1 + 92 172 238 SteelBlue2 + 79 148 205 SteelBlue3 + 54 100 139 SteelBlue4 + 0 191 255 DeepSkyBlue1 + 0 178 238 DeepSkyBlue2 + 0 154 205 DeepSkyBlue3 + 0 104 139 DeepSkyBlue4 +135 206 255 SkyBlue1 +126 192 238 SkyBlue2 +108 166 205 SkyBlue3 + 74 112 139 SkyBlue4 +176 226 255 LightSkyBlue1 +164 211 238 LightSkyBlue2 +141 182 205 LightSkyBlue3 + 96 123 139 LightSkyBlue4 +198 226 255 SlateGray1 +185 211 238 SlateGray2 +159 182 205 SlateGray3 +108 123 139 SlateGray4 +202 225 255 LightSteelBlue1 +188 210 238 LightSteelBlue2 +162 181 205 LightSteelBlue3 +110 123 139 LightSteelBlue4 +191 239 255 LightBlue1 +178 223 238 LightBlue2 +154 192 205 LightBlue3 +104 131 139 LightBlue4 +224 255 255 LightCyan1 +209 238 238 LightCyan2 +180 205 205 LightCyan3 +122 139 139 LightCyan4 +187 255 255 PaleTurquoise1 +174 238 238 PaleTurquoise2 +150 205 205 PaleTurquoise3 +102 139 139 PaleTurquoise4 +152 245 255 CadetBlue1 +142 229 238 CadetBlue2 +122 197 205 CadetBlue3 + 83 134 139 CadetBlue4 + 0 245 255 turquoise1 + 0 229 238 turquoise2 + 0 197 205 turquoise3 + 0 134 139 turquoise4 + 0 255 255 cyan1 + 0 238 238 cyan2 + 0 205 205 cyan3 + 0 139 139 cyan4 +151 255 255 DarkSlateGray1 +141 238 238 DarkSlateGray2 +121 205 205 DarkSlateGray3 + 82 139 139 DarkSlateGray4 +127 255 212 aquamarine1 +118 238 198 aquamarine2 +102 205 170 aquamarine3 + 69 139 116 aquamarine4 +193 255 193 DarkSeaGreen1 +180 238 180 DarkSeaGreen2 +155 205 155 DarkSeaGreen3 +105 139 105 DarkSeaGreen4 + 84 255 159 SeaGreen1 + 78 238 148 SeaGreen2 + 67 205 128 SeaGreen3 + 46 139 87 SeaGreen4 +154 255 154 PaleGreen1 +144 238 144 PaleGreen2 +124 205 124 PaleGreen3 + 84 139 84 PaleGreen4 + 0 255 127 SpringGreen1 + 0 238 118 SpringGreen2 + 0 205 102 SpringGreen3 + 0 139 69 SpringGreen4 + 0 255 0 green1 + 0 238 0 green2 + 0 205 0 green3 + 0 139 0 green4 +127 255 0 chartreuse1 +118 238 0 chartreuse2 +102 205 0 chartreuse3 + 69 139 0 chartreuse4 +192 255 62 OliveDrab1 +179 238 58 OliveDrab2 +154 205 50 OliveDrab3 +105 139 34 OliveDrab4 +202 255 112 DarkOliveGreen1 +188 238 104 DarkOliveGreen2 +162 205 90 DarkOliveGreen3 +110 139 61 DarkOliveGreen4 +255 246 143 khaki1 +238 230 133 khaki2 +205 198 115 khaki3 +139 134 78 khaki4 +255 236 139 LightGoldenrod1 +238 220 130 LightGoldenrod2 +205 190 112 LightGoldenrod3 +139 129 76 LightGoldenrod4 +255 255 224 LightYellow1 +238 238 209 LightYellow2 +205 205 180 LightYellow3 +139 139 122 LightYellow4 +255 255 0 yellow1 +238 238 0 yellow2 +205 205 0 yellow3 +139 139 0 yellow4 +255 215 0 gold1 +238 201 0 gold2 +205 173 0 gold3 +139 117 0 gold4 +255 193 37 goldenrod1 +238 180 34 goldenrod2 +205 155 29 goldenrod3 +139 105 20 goldenrod4 +255 185 15 DarkGoldenrod1 +238 173 14 DarkGoldenrod2 +205 149 12 DarkGoldenrod3 +139 101 8 DarkGoldenrod4 +255 193 193 RosyBrown1 +238 180 180 RosyBrown2 +205 155 155 RosyBrown3 +139 105 105 RosyBrown4 +255 106 106 IndianRed1 +238 99 99 IndianRed2 +205 85 85 IndianRed3 +139 58 58 IndianRed4 +255 130 71 sienna1 +238 121 66 sienna2 +205 104 57 sienna3 +139 71 38 sienna4 +255 211 155 burlywood1 +238 197 145 burlywood2 +205 170 125 burlywood3 +139 115 85 burlywood4 +255 231 186 wheat1 +238 216 174 wheat2 +205 186 150 wheat3 +139 126 102 wheat4 +255 165 79 tan1 +238 154 73 tan2 +205 133 63 tan3 +139 90 43 tan4 +255 127 36 chocolate1 +238 118 33 chocolate2 +205 102 29 chocolate3 +139 69 19 chocolate4 +255 48 48 firebrick1 +238 44 44 firebrick2 +205 38 38 firebrick3 +139 26 26 firebrick4 +255 64 64 brown1 +238 59 59 brown2 +205 51 51 brown3 +139 35 35 brown4 +255 140 105 salmon1 +238 130 98 salmon2 +205 112 84 salmon3 +139 76 57 salmon4 +255 160 122 LightSalmon1 +238 149 114 LightSalmon2 +205 129 98 LightSalmon3 +139 87 66 LightSalmon4 +255 165 0 orange1 +238 154 0 orange2 +205 133 0 orange3 +139 90 0 orange4 +255 127 0 DarkOrange1 +238 118 0 DarkOrange2 +205 102 0 DarkOrange3 +139 69 0 DarkOrange4 +255 114 86 coral1 +238 106 80 coral2 +205 91 69 coral3 +139 62 47 coral4 +255 99 71 tomato1 +238 92 66 tomato2 +205 79 57 tomato3 +139 54 38 tomato4 +255 69 0 OrangeRed1 +238 64 0 OrangeRed2 +205 55 0 OrangeRed3 +139 37 0 OrangeRed4 +255 0 0 red1 +238 0 0 red2 +205 0 0 red3 +139 0 0 red4 +215 7 81 DebianRed +255 20 147 DeepPink1 +238 18 137 DeepPink2 +205 16 118 DeepPink3 +139 10 80 DeepPink4 +255 110 180 HotPink1 +238 106 167 HotPink2 +205 96 144 HotPink3 +139 58 98 HotPink4 +255 181 197 pink1 +238 169 184 pink2 +205 145 158 pink3 +139 99 108 pink4 +255 174 185 LightPink1 +238 162 173 LightPink2 +205 140 149 LightPink3 +139 95 101 LightPink4 +255 130 171 PaleVioletRed1 +238 121 159 PaleVioletRed2 +205 104 137 PaleVioletRed3 +139 71 93 PaleVioletRed4 +255 52 179 maroon1 +238 48 167 maroon2 +205 41 144 maroon3 +139 28 98 maroon4 +255 62 150 VioletRed1 +238 58 140 VioletRed2 +205 50 120 VioletRed3 +139 34 82 VioletRed4 +255 0 255 magenta1 +238 0 238 magenta2 +205 0 205 magenta3 +139 0 139 magenta4 +255 131 250 orchid1 +238 122 233 orchid2 +205 105 201 orchid3 +139 71 137 orchid4 +255 187 255 plum1 +238 174 238 plum2 +205 150 205 plum3 +139 102 139 plum4 +224 102 255 MediumOrchid1 +209 95 238 MediumOrchid2 +180 82 205 MediumOrchid3 +122 55 139 MediumOrchid4 +191 62 255 DarkOrchid1 +178 58 238 DarkOrchid2 +154 50 205 DarkOrchid3 +104 34 139 DarkOrchid4 +155 48 255 purple1 +145 44 238 purple2 +125 38 205 purple3 + 85 26 139 purple4 +171 130 255 MediumPurple1 +159 121 238 MediumPurple2 +137 104 205 MediumPurple3 + 93 71 139 MediumPurple4 +255 225 255 thistle1 +238 210 238 thistle2 +205 181 205 thistle3 +139 123 139 thistle4 + 0 0 0 gray0 + 0 0 0 grey0 + 3 3 3 gray1 + 3 3 3 grey1 + 5 5 5 gray2 + 5 5 5 grey2 + 8 8 8 gray3 + 8 8 8 grey3 + 10 10 10 gray4 + 10 10 10 grey4 + 13 13 13 gray5 + 13 13 13 grey5 + 15 15 15 gray6 + 15 15 15 grey6 + 18 18 18 gray7 + 18 18 18 grey7 + 20 20 20 gray8 + 20 20 20 grey8 + 23 23 23 gray9 + 23 23 23 grey9 + 26 26 26 gray10 + 26 26 26 grey10 + 28 28 28 gray11 + 28 28 28 grey11 + 31 31 31 gray12 + 31 31 31 grey12 + 33 33 33 gray13 + 33 33 33 grey13 + 36 36 36 gray14 + 36 36 36 grey14 + 38 38 38 gray15 + 38 38 38 grey15 + 41 41 41 gray16 + 41 41 41 grey16 + 43 43 43 gray17 + 43 43 43 grey17 + 46 46 46 gray18 + 46 46 46 grey18 + 48 48 48 gray19 + 48 48 48 grey19 + 51 51 51 gray20 + 51 51 51 grey20 + 54 54 54 gray21 + 54 54 54 grey21 + 56 56 56 gray22 + 56 56 56 grey22 + 59 59 59 gray23 + 59 59 59 grey23 + 61 61 61 gray24 + 61 61 61 grey24 + 64 64 64 gray25 + 64 64 64 grey25 + 66 66 66 gray26 + 66 66 66 grey26 + 69 69 69 gray27 + 69 69 69 grey27 + 71 71 71 gray28 + 71 71 71 grey28 + 74 74 74 gray29 + 74 74 74 grey29 + 77 77 77 gray30 + 77 77 77 grey30 + 79 79 79 gray31 + 79 79 79 grey31 + 82 82 82 gray32 + 82 82 82 grey32 + 84 84 84 gray33 + 84 84 84 grey33 + 87 87 87 gray34 + 87 87 87 grey34 + 89 89 89 gray35 + 89 89 89 grey35 + 92 92 92 gray36 + 92 92 92 grey36 + 94 94 94 gray37 + 94 94 94 grey37 + 97 97 97 gray38 + 97 97 97 grey38 + 99 99 99 gray39 + 99 99 99 grey39 +102 102 102 gray40 +102 102 102 grey40 +105 105 105 gray41 +105 105 105 grey41 +107 107 107 gray42 +107 107 107 grey42 +110 110 110 gray43 +110 110 110 grey43 +112 112 112 gray44 +112 112 112 grey44 +115 115 115 gray45 +115 115 115 grey45 +117 117 117 gray46 +117 117 117 grey46 +120 120 120 gray47 +120 120 120 grey47 +122 122 122 gray48 +122 122 122 grey48 +125 125 125 gray49 +125 125 125 grey49 +127 127 127 gray50 +127 127 127 grey50 +130 130 130 gray51 +130 130 130 grey51 +133 133 133 gray52 +133 133 133 grey52 +135 135 135 gray53 +135 135 135 grey53 +138 138 138 gray54 +138 138 138 grey54 +140 140 140 gray55 +140 140 140 grey55 +143 143 143 gray56 +143 143 143 grey56 +145 145 145 gray57 +145 145 145 grey57 +148 148 148 gray58 +148 148 148 grey58 +150 150 150 gray59 +150 150 150 grey59 +153 153 153 gray60 +153 153 153 grey60 +156 156 156 gray61 +156 156 156 grey61 +158 158 158 gray62 +158 158 158 grey62 +161 161 161 gray63 +161 161 161 grey63 +163 163 163 gray64 +163 163 163 grey64 +166 166 166 gray65 +166 166 166 grey65 +168 168 168 gray66 +168 168 168 grey66 +171 171 171 gray67 +171 171 171 grey67 +173 173 173 gray68 +173 173 173 grey68 +176 176 176 gray69 +176 176 176 grey69 +179 179 179 gray70 +179 179 179 grey70 +181 181 181 gray71 +181 181 181 grey71 +184 184 184 gray72 +184 184 184 grey72 +186 186 186 gray73 +186 186 186 grey73 +189 189 189 gray74 +189 189 189 grey74 +191 191 191 gray75 +191 191 191 grey75 +194 194 194 gray76 +194 194 194 grey76 +196 196 196 gray77 +196 196 196 grey77 +199 199 199 gray78 +199 199 199 grey78 +201 201 201 gray79 +201 201 201 grey79 +204 204 204 gray80 +204 204 204 grey80 +207 207 207 gray81 +207 207 207 grey81 +209 209 209 gray82 +209 209 209 grey82 +212 212 212 gray83 +212 212 212 grey83 +214 214 214 gray84 +214 214 214 grey84 +217 217 217 gray85 +217 217 217 grey85 +219 219 219 gray86 +219 219 219 grey86 +222 222 222 gray87 +222 222 222 grey87 +224 224 224 gray88 +224 224 224 grey88 +227 227 227 gray89 +227 227 227 grey89 +229 229 229 gray90 +229 229 229 grey90 +232 232 232 gray91 +232 232 232 grey91 +235 235 235 gray92 +235 235 235 grey92 +237 237 237 gray93 +237 237 237 grey93 +240 240 240 gray94 +240 240 240 grey94 +242 242 242 gray95 +242 242 242 grey95 +245 245 245 gray96 +245 245 245 grey96 +247 247 247 gray97 +247 247 247 grey97 +250 250 250 gray98 +250 250 250 grey98 +252 252 252 gray99 +252 252 252 grey99 +255 255 255 gray100 +255 255 255 grey100 +169 169 169 dark grey +169 169 169 DarkGrey +169 169 169 dark gray +169 169 169 DarkGray +0 0 139 dark blue +0 0 139 DarkBlue +0 139 139 dark cyan +0 139 139 DarkCyan +139 0 139 dark magenta +139 0 139 DarkMagenta +139 0 0 dark red +139 0 0 DarkRed +144 238 144 light green +144 238 144 LightGreen diff --git a/.venv/lib/python3.11/site-packages/colorful/styles.py b/.venv/lib/python3.11/site-packages/colorful/styles.py new file mode 100644 index 0000000000000000000000000000000000000000..aca53e0f469265019714079c5460d8cf2ca37d6a --- /dev/null +++ b/.venv/lib/python3.11/site-packages/colorful/styles.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- + +""" + colorful + ~~~~~~~~ + + Terminal string styling done right, in Python. + + :copyright: (c) 2017 by Timo Furrer + :license: MIT, see LICENSE for more details. +""" + + +#: Holds the solarized style +SOLARIZED = { + 'base03': '#002b36', + 'base02': '#073642', + 'base01': '#586e75', + 'base00': '#657b83', + 'base0': '#839496', + 'base1': '#93a1a1', + 'base2': '#eee8d5', + 'base3': '#fdf6e3', + 'yellow': '#b58900', + 'orange': '#cb4b16', + 'red': '#dc322f', + 'magenta': '#d33682', + 'violet': '#6c71c4', + 'blue': '#268bd2', + 'cyan': '#2aa198', + 'green': '#859900' +} + +#: Holds the monokai style +MONOKAI = { + 'ghostWhite': '#F8F8F0', + 'lightGhostWhite': '#F8F8F2', + 'lightGray': '#CCCCCC', + 'gray': '#888888', + 'brownGray': '#49483E', + 'darkGray': '#282828', + 'yellow': '#E6DB74', + 'blue': '#66D9EF', + 'magenta': '#F92672', + 'purple': '#AE81FF', + 'brown': '#75715E', + 'orange': '#FD971F', + 'lightOrange': '#FFD569', + 'green': '#A6E22E', + 'seaGreen': '#529B2F' +} diff --git a/.venv/lib/python3.11/site-packages/colorful/terminal.py b/.venv/lib/python3.11/site-packages/colorful/terminal.py new file mode 100644 index 0000000000000000000000000000000000000000..e0ffe76a19232b79a91ffb8ecdd5b89e63e27a90 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/colorful/terminal.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- + +""" + colorful + ~~~~~~~~ + + Terminal string styling done right, in Python. + + :copyright: (c) 2017 by Timo Furrer + :license: MIT, see LICENSE for more details. +""" + +import sys + + +# Valid color modes for colorful +NO_COLORS = 0 +ANSI_8_COLORS = 8 +ANSI_16_COLORS = 16 +ANSI_256_COLORS = 256 +TRUE_COLORS = 0xFFFFFF + + +def detect_color_support(env): # noqa + """ + Detect what color palettes are supported. + It'll return a valid color mode to use + with colorful. + + :param dict env: the environment dict like returned by ``os.envion`` + """ + if env.get('COLORFUL_DISABLE', '0') == '1': + return NO_COLORS + + if env.get('COLORFUL_FORCE_8_COLORS', '0') == '1': + return ANSI_8_COLORS + + if env.get('COLORFUL_FORCE_16_COLORS', '0') == '1': + return ANSI_16_COLORS + + if env.get('COLORFUL_FORCE_256_COLORS', '0') == '1': + return ANSI_256_COLORS + + if env.get('COLORFUL_FORCE_TRUE_COLORS', '0') == '1': + return TRUE_COLORS + + # if we are not a tty + if not sys.stdout.isatty(): + return NO_COLORS + + colorterm_env = env.get('COLORTERM') + if colorterm_env: + if colorterm_env in {'truecolor', '24bit'}: + return TRUE_COLORS + + if colorterm_env in {'8bit'}: + return ANSI_256_COLORS + + termprog_env = env.get('TERM_PROGRAM') + if termprog_env: + if termprog_env in {'iTerm.app', 'Hyper'}: + return TRUE_COLORS + + if termprog_env in {'Apple_Terminal'}: + return ANSI_256_COLORS + + term_env = env.get('TERM') + if term_env: + if term_env in {'screen-256', 'screen-256color', 'xterm-256', 'xterm-256color'}: + return ANSI_256_COLORS + + if term_env in {'screen', 'xterm', 'vt100', 'color', 'ansi', 'cygwin', 'linux'}: + return ANSI_16_COLORS + + if colorterm_env: + # if there was no match with $TERM either but we + # had one with $COLORTERM, we use it! + return ANSI_16_COLORS + + return ANSI_8_COLORS diff --git a/.venv/lib/python3.11/site-packages/colorful/utils.py b/.venv/lib/python3.11/site-packages/colorful/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..8b6bd7a073318cf39037255c2b0b63fdc376d3da --- /dev/null +++ b/.venv/lib/python3.11/site-packages/colorful/utils.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +""" + colorful + ~~~~~~~~ + + Terminal string styling done right, in Python. + + :copyright: (c) 2017 by Timo Furrer + :license: MIT, see LICENSE for more details. +""" +import re + + +def hex_to_rgb(value): + """ + Convert the given hex string to a + valid RGB channel triplet. + """ + value = value.lstrip('#') + check_hex(value) + + length = len(value) + step = int(length / 3) + return tuple(int(value[i:i+step], 16) for i in range(0, length, step)) + + +def check_hex(value): + """ + Check if the given hex value is a valid RGB color + + It should match the format: [0-9a-fA-F] + and be of length 3 or 6. + """ + length = len(value) + if length not in (3, 6): + raise ValueError('Hex string #{} is too long'.format(value)) + + regex = r'[0-9a-f]{{{length}}}'.format(length=length) + if not re.search(regex, value, re.I): + raise ValueError('Invalid Hex String: #{}'.format(value))